diff --git a/ontology/urls.py b/ontology/urls.py index c2a950f0743c56461ced0e243902b4412e7c54e6..dba3e54cb66b9d39f1a53c317023135bc695b9dc 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 43e5e9151a7a8933086b9de664dc77862352fe28..4c15f76bcdb911e6bd8edfb38e7b40eb64d08ee3 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 c2d6a724a7c7c0fef62929ce5d56371adc2a38f5..56191453c83b5271c7fa1cd1365ccd0f8f8eebc0 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 f7ec37af9eda9e6a03566e17d11a211f7b50757b..65e1efa3cc9e3c09328a973fa22147fdbf293529 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 %}