diff --git a/scipost_django/SciPost_v1/settings/base.py b/scipost_django/SciPost_v1/settings/base.py index f9a0c84ddc36dc5197f0e24df05c4d2d31742100..01174ec236bb2b2bb8544046961f8e1662e64511 100644 --- a/scipost_django/SciPost_v1/settings/base.py +++ b/scipost_django/SciPost_v1/settings/base.py @@ -278,6 +278,7 @@ TEMPLATES = [ 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'journals.context_processors.journals_processor', + 'ontology.context_processors.ontology_processor', ], }, }, diff --git a/scipost_django/ontology/context_processors.py b/scipost_django/ontology/context_processors.py index 99a1a6dfbf2367bb7655f63355d0c828cbe0bdeb..bf92c16b23c8c93399febe23237b793a9163d072 100644 --- a/scipost_django/ontology/context_processors.py +++ b/scipost_django/ontology/context_processors.py @@ -1,7 +1,9 @@ __copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)" __license__ = "AGPL v3" + from .models import Branch, AcademicField, Specialty +from .forms import SessionAcademicFieldForm def ontology_processor(request): @@ -13,10 +15,13 @@ def ontology_processor(request): 'branches': Branch.objects.all(), 'acad_fields': AcademicField.objects.all(), } - if request.session.get('acad_field_slug', None): + initial = {} + if request.session.get('session_acad_field_slug', None): context['session_acad_field'] = AcademicField.objects.get( - slug=request.session.get('acad_field_slug')) - if request.session.get('specialty_slug', None): + slug=request.session.get('session_acad_field_slug')) + initial['acad_field'] = context['session_acad_field'] + if request.session.get('session_specialty_slug', None): context['session_specialty'] = Specialty.objects.get( - slug=request.session.get('specialty_slug')) + slug=request.session.get('session_specialty_slug')) + context['session_acad_field_form'] = SessionAcademicFieldForm(initial=initial) return context diff --git a/scipost_django/ontology/forms.py b/scipost_django/ontology/forms.py index 55d690ff574558be10f8aa0556bfafb29457cf7b..37a69732d143c2e069627d12a608b47bebb74db2 100644 --- a/scipost_django/ontology/forms.py +++ b/scipost_django/ontology/forms.py @@ -4,10 +4,29 @@ __license__ = "AGPL v3" from django import forms +from crispy_forms.helper import FormHelper +from crispy_forms.layout import Layout, Div +from crispy_bootstrap5.bootstrap5 import FloatingField from dal import autocomplete from .constants import TOPIC_RELATIONS_ASYM -from .models import Tag, Topic +from .models import AcademicField, Tag, Topic + + +class SessionAcademicFieldForm(forms.Form): + acad_field = forms.ModelChoiceField( + queryset=AcademicField.objects.all(), + label='Academic Field' + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.helper = FormHelper(self) + self.helper.disable_csrf = True + self.helper.show_errors = True + self.helper.layout = Layout( + Div(FloatingField('acad_field')) + ) class SelectTagsForm(forms.Form): diff --git a/scipost_django/ontology/templates/ontology/session_acad_field_form.html b/scipost_django/ontology/templates/ontology/session_acad_field_form.html new file mode 100644 index 0000000000000000000000000000000000000000..edd146ff69eff113a5a34820b64dc57fdaeceb28 --- /dev/null +++ b/scipost_django/ontology/templates/ontology/session_acad_field_form.html @@ -0,0 +1,8 @@ +{% load crispy_forms_tags %} +<form id="session_acad_field_form" + hx-get="{% url 'ontology:set_session_acad_field' %}" + hx-trigger="change" + hx-swap="outerHTML" +> + {% crispy session_acad_field_form %} +</form> diff --git a/scipost_django/ontology/urls.py b/scipost_django/ontology/urls.py index f9b9bef54e6044129992018cbfa5fe8420eee37d..1f504a004c32add51d08373de83adfb963bb2bb0 100644 --- a/scipost_django/ontology/urls.py +++ b/scipost_django/ontology/urls.py @@ -34,6 +34,11 @@ urlpatterns = [ views.TopicLinkedAutocompleteView.as_view(), name='topic-linked-autocomplete', ), + path( + 'set_session_acad_field', + views.set_session_acad_field, + name='set_session_acad_field' + ), path( '', views.ontology, diff --git a/scipost_django/ontology/views.py b/scipost_django/ontology/views.py index 24924b82d1fa10437cdede3b1fe71580b0bc2b83..1cb8e698bf6eeaaf72948897014a2d7d192ae61e 100644 --- a/scipost_django/ontology/views.py +++ b/scipost_django/ontology/views.py @@ -3,6 +3,7 @@ __license__ = "AGPL v3" from django.contrib import messages +from django.http import HttpResponse from django.urls import reverse, reverse_lazy from django.db.models import Q from django.shortcuts import get_object_or_404, redirect, render @@ -15,12 +16,33 @@ from dal import autocomplete from guardian.decorators import permission_required from .models import AcademicField, Specialty, Tag, Topic, RelationAsym -from .forms import SelectTagsForm, SelectLinkedTopicForm, AddRelationAsymForm +from .forms import ( + SessionAcademicFieldForm, + SelectTagsForm, SelectLinkedTopicForm, + AddRelationAsymForm +) from scipost.forms import SearchTextForm from scipost.mixins import PaginationMixin, PermissionsMixin +def set_session_acad_field(request): + """Set the Academic Field to be viewed in the current user session.""" + form = SessionAcademicFieldForm(request.GET or None) + if form.is_valid(): + request.session['session_acad_field_slug'] = form.cleaned_data['acad_field'].slug + form = SessionAcademicFieldForm(initial={ + 'acad_field': AcademicField.objects.get(slug=request.session['session_acad_field_slug']) + }) + response = render( + request, + 'ontology/session_acad_field_form.html', + context={ 'session_acad_field_form': form} + ) + response['HX-Trigger'] = 'session-acad-field-set' + return response + + def ontology(request): context = { 'select_linked_topic_form': SelectLinkedTopicForm(), diff --git a/scipost_django/scipost/static/scipost/assets/css/_navbar.scss b/scipost_django/scipost/static/scipost/assets/css/_navbar.scss index d1973870c101f64aa8d2e9d88cc1689e7ed38fe3..199a79f4f918c6d4d3b587bfead41201bd3e532e 100644 --- a/scipost_django/scipost/static/scipost/assets/css/_navbar.scss +++ b/scipost_django/scipost/static/scipost/assets/css/_navbar.scss @@ -284,3 +284,18 @@ header .nav-item { } } } + +#session_acad_field_form { + + div #div_id_acad_field { + margin: 0rem !important; + + #id_acad_field { + border: 2px solid $scipost-lightblue; + border-radius: 2px; + background-color: $scipost-darkblue; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); + color: $white; + } + } +} diff --git a/scipost_django/scipost/templates/scipost/_index_publications.html b/scipost_django/scipost/templates/scipost/_index_publications.html index 4e65e24c28d97acef4f2d3dcdae04d4af1e054e8..6d297de0da94a26a75554ac449aa7091ab075222 100644 --- a/scipost_django/scipost/templates/scipost/_index_publications.html +++ b/scipost_django/scipost/templates/scipost/_index_publications.html @@ -3,5 +3,9 @@ <li class="list-group-item py-2"> {% include 'journals/_publication_li_content.html' with publication=publication %} </li> + {% empty %} + <li class="list-group-item py-2"> + No publications yet + </li> {% endfor %} </ul> diff --git a/scipost_django/scipost/templates/scipost/_index_submissions.html b/scipost_django/scipost/templates/scipost/_index_submissions.html index 3bd5f7aee615c5936f8370fe7cf93d348d58f734..3462e01cf4b815850a8f168f6b26381a469e1204 100644 --- a/scipost_django/scipost/templates/scipost/_index_submissions.html +++ b/scipost_django/scipost/templates/scipost/_index_submissions.html @@ -3,5 +3,9 @@ <li class="list-group-item py-2"> {% include 'submissions/_submission_card_content_homepage.html' with submission=submission %} </li> + {% empty %} + <li class="list-group-item py-2"> + No submissions yet + </li> {% endfor %} </ul> diff --git a/scipost_django/scipost/templates/scipost/header.html b/scipost_django/scipost/templates/scipost/header.html index 9f27397d006ff6436050b011b73a757e190e2e92..2118464901da243dcd7ae3ef2729bf003a161cf3 100644 --- a/scipost_django/scipost/templates/scipost/header.html +++ b/scipost_django/scipost/templates/scipost/header.html @@ -1,4 +1,5 @@ {% load static %} +{% load crispy_forms_tags %} <header> <div class="container"> @@ -7,6 +8,17 @@ <a href="{% url 'scipost:index' %}"><img src="{% static 'scipost/images/logo_scipost_RGB_HTML_groot.png' %}" alt="SciPost logo" width="180" /></a> </div> + <ul class="navbar-nav"> + <li class="nav-item"> + <form id="session_acad_field_form" + hx-get="{% url 'ontology:set_session_acad_field' %}" + hx-trigger="change" + hx-swap="outerHTML" + > + {% crispy session_acad_field_form %} + </form> + </li> + </ul> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link" id="header-search-button" href="{% url 'scipost:search' %}"> diff --git a/scipost_django/scipost/templates/scipost/index.html b/scipost_django/scipost/templates/scipost/index.html index 61f15951796c884a485bdc68cead2b2528f4b38d..012ab3db9e25b48703bf48088c22905fee692304 100644 --- a/scipost_django/scipost/templates/scipost/index.html +++ b/scipost_django/scipost/templates/scipost/index.html @@ -34,7 +34,7 @@ <hr class="sm mb-0 mt-2"> </div> <div hx-get="{% url 'scipost:_index_publications' %}" - hx-trigger="load" + hx-trigger="load, session-acad-field-set from:body" > </div> <p class="mb-3 px-3"><a href="{% url 'journals:publications' %}">View all Publications</a></p> @@ -49,7 +49,7 @@ <hr class="sm mb-0 mt-2"> </div> <div hx-get="{% url 'scipost:_index_submissions' %}" - hx-trigger="load" + hx-trigger="load, session-acad-field-set from:body" > </div> <p class="mb-3 px-3"><a href="{% url 'submissions:submissions' %}">View all Submissions</a></p> diff --git a/scipost_django/scipost/views.py b/scipost_django/scipost/views.py index a0479e0a98e79f53b40af4e01956bcfc80a11ddf..5e7c9f8c0e199e584adc9eadf0450d7792691d08 100644 --- a/scipost_django/scipost/views.py +++ b/scipost_django/scipost/views.py @@ -171,16 +171,23 @@ def index(request): def _index_submissions(request): + submissions = Submission.objects.public() + session_acad_field_slug = request.session.get('session_acad_field_slug', None) + if session_acad_field_slug and session_acad_field_slug != 'multidisciplinary': + submissions = submissions.filter(acad_field__slug=session_acad_field_slug) context = { - 'submissions': Submission.objects.public().order_by('-submission_date')[:3], + 'submissions': submissions.order_by('-submission_date')[:3], } return render(request, 'scipost/_index_submissions.html', context) def _index_publications(request): + publications = Publication.objects.published() + session_acad_field_slug = request.session.get('session_acad_field_slug', None) + if session_acad_field_slug and session_acad_field_slug != 'multidisciplinary': + publications = publications.filter(acad_field__slug=session_acad_field_slug) context = { - 'publications': Publication.objects.published().order_by('-publication_date', - '-paper_nr')[:3], + 'publications': publications.order_by('-publication_date', '-paper_nr')[:3], } return render(request, 'scipost/_index_publications.html', context) @@ -495,6 +502,12 @@ class SciPostLoginView(LoginView): def get_initial(self): return self.request.GET + def get_success_url(self): + """Add the `acad_field_view` item to session.""" + self.request.session['session_acad_field_slug'] = \ + self.request.user.contributor.profile.acad_field.slug + return super().get_success_url() + def get_redirect_url(self): """Redirect to the requested url if safe, otherwise to personal page or org dashboard.""" redirect_to = self.request.POST.get(