From a96ec5ef5a3447d140245760e7f7dffab0fd5afa Mon Sep 17 00:00:00 2001 From: "J.-S. Caux" <J.S.Caux@uva.nl> Date: Mon, 28 Sep 2020 05:57:49 +0200 Subject: [PATCH] Add autocomplete for AcadField, Specialty; update personal data form --- ontology/urls.py | 16 +++++++-- ontology/views.py | 20 ++++++++++- scipost/forms.py | 35 +++++++++++++++++-- .../scipost/update_personal_data.html | 5 +++ 4 files changed, 69 insertions(+), 7 deletions(-) diff --git a/ontology/urls.py b/ontology/urls.py index c2a950f07..dba3e54cb 100644 --- a/ontology/urls.py +++ b/ontology/urls.py @@ -10,21 +10,31 @@ from . import views app_name = 'ontology' urlpatterns = [ + path( + 'acad_field-autocomplete/', + views.AcademicFieldAutocompleteView.as_view(), + name='acad_field-autocomplete', + ), + path( + 'specialty-autocomplete/', + views.SpecialtyAutocompleteView.as_view(), + name='specialty-autocomplete', + ), path( 'tag-autocomplete/', views.TagAutocompleteView.as_view(), name='tag-autocomplete', - ), + ), path( 'topic-autocomplete/', views.TopicAutocompleteView.as_view(), name='topic-autocomplete', - ), + ), path( 'topic-linked-autocomplete/', views.TopicLinkedAutocompleteView.as_view(), name='topic-linked-autocomplete', - ), + ), url( r'^$', views.ontology, diff --git a/ontology/views.py b/ontology/views.py index 43e5e9151..4c15f76bc 100644 --- a/ontology/views.py +++ b/ontology/views.py @@ -14,7 +14,7 @@ from django.views.generic.list import ListView from dal import autocomplete from guardian.decorators import permission_required -from .models import Tag, Topic, RelationAsym +from .models import AcademicField, Specialty, Tag, Topic, RelationAsym from .forms import SelectTagsForm, SelectLinkedTopicForm, AddRelationAsymForm from scipost.forms import SearchTextForm @@ -28,6 +28,24 @@ def ontology(request): return render(request, 'ontology/ontology.html', context=context) +class AcademicFieldAutocompleteView(autocomplete.Select2QuerySetView): + """To feed the Select2 widget.""" + def get_queryset(self): + qs = AcademicField.objects.all() + if self.q: + qs = qs.filter(name__icontains=self.q) + return qs + + +class SpecialtyAutocompleteView(autocomplete.Select2QuerySetView): + """To feed the Select2 widget.""" + def get_queryset(self): + qs = Specialty.objects.all() + if self.q: + qs = qs.filter(name__icontains=self.q) + return qs + + class TagAutocompleteView(autocomplete.Select2QuerySetView): """To feed the Select2 widget.""" def get_queryset(self): diff --git a/scipost/forms.py b/scipost/forms.py index c2d6a724a..56191453c 100644 --- a/scipost/forms.py +++ b/scipost/forms.py @@ -36,6 +36,7 @@ from funders.models import Grant from invitations.models import CitationNotification from journals.models import PublicationAuthorsTable, Publication from mails.utils import DirectMailUtil +from ontology.models import AcademicField, Specialty from organizations.models import Organization from profiles.models import Profile, ProfileEmail, Affiliation from submissions.models import Submission, EditorialAssignment, RefereeInvitation, Report, \ @@ -250,18 +251,46 @@ class UpdateUserDataForm(forms.ModelForm): class UpdatePersonalDataForm(forms.ModelForm): + acad_field = forms.ModelChoiceField( + queryset=AcademicField.objects.all(), + widget=autocomplete.ModelSelect2( + url='/ontology/acad_field-autocomplete' + ), + label='Academic field', + help_text='Your main field of activity' + ) + specialties = forms.ModelMultipleChoiceField( + queryset=Specialty.objects.all(), + widget=autocomplete.ModelSelect2Multiple( + url='/ontology/specialty-autocomplete', + attrs={'data-html': True} + ), + label='Specialties', + help_text='Type to search, click to include' + ) class Meta: model = Contributor fields = [ 'title', - 'discipline', - 'expertises', + 'acad_field', + 'specialties', 'orcid_id', 'address', 'personalwebpage', 'accepts_SciPost_emails', ] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['acad_field'].initial = self.instance.profile.acad_field.id + self.fields['specialties'].initial = [s.id for s in self.instance.profile.specialties.all()] + + def save(self): + self.instance.profile.acad_field = self.cleaned_data['acad_field'] + self.instance.profile.save() + self.instance.profile.specialties.set(self.cleaned_data['specialties']) + return super().save() + def sync_lists(self): """ Pseudo U/S; do not remove @@ -270,7 +299,7 @@ class UpdatePersonalDataForm(forms.ModelForm): def propagate_orcid(self): """ - This method is called if a Contributor updates his/her personal data, + This method is called if a Contributor updates their personal data, and changes the orcid_id. It marks all Publications, Reports and Comments authored by this Contributor with a deposit_requires_update == True. """ diff --git a/scipost/templates/scipost/update_personal_data.html b/scipost/templates/scipost/update_personal_data.html index f7ec37af9..65e1efa3c 100644 --- a/scipost/templates/scipost/update_personal_data.html +++ b/scipost/templates/scipost/update_personal_data.html @@ -54,3 +54,8 @@ </form> {% endblock content %} + +{% block footer_script %} + {{ block.super }} + {{ cont_form.media }} +{% endblock footer_script %} -- GitLab