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