From 9459863c9912d9d07c8777362274b6033b3e7af2 Mon Sep 17 00:00:00 2001 From: George Katsikas <giorgakis.katsikas@gmail.com> Date: Tue, 25 Mar 2025 16:42:20 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=9A=B8=20convert=20specialties/to?= =?UTF-8?q?pics=20fields=20to=20select2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also prettifies form with use of Crispy forms. --- scipost_django/profiles/forms.py | 42 +++++++++++++++++++ .../templates/profiles/profile_form.html | 30 +++++++++---- scipost_django/profiles/views.py | 1 - 3 files changed, 64 insertions(+), 9 deletions(-) diff --git a/scipost_django/profiles/forms.py b/scipost_django/profiles/forms.py index f5dfd4367..17025507a 100644 --- a/scipost_django/profiles/forms.py +++ b/scipost_django/profiles/forms.py @@ -16,6 +16,8 @@ from django.urls import reverse from common.forms import ModelChoiceFieldwithid from invitations.models import RegistrationInvitation +from ontology.models.specialty import Specialty +from ontology.models.topic import Topic from organizations.models import Organization from scipost.models import Contributor from submissions.models import RefereeInvitation @@ -47,12 +49,52 @@ class ProfileForm(forms.ModelForm): "instance_from_type", "instance_pk", ] + widgets = { + "specialties": autocomplete.ModelSelect2Multiple( + url="/ontology/specialty-autocomplete", + attrs={"data-html": True}, + ), + "topics": autocomplete.ModelSelect2Multiple( + url="/ontology/topic-autocomplete", + attrs={"data-html": True}, + forward=["specialties"], + ), + } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["instance_from_type"].widget = forms.HiddenInput() self.fields["instance_pk"].widget = forms.HiddenInput() + self.helper = FormHelper() + self.helper.layout = Layout( + Div( + Div(Field("title"), css_class="col-12 col-md-3"), + Div(Field("first_name"), css_class="col-12 col-md"), + Div(Field("last_name"), css_class="col-12 col-md"), + css_class="row mb-0", + ), + Div( + Div(Field("acad_field"), css_class="col-12 col-md-3 order-3 order-md-1"), + Div(Field("first_name_original"), css_class="col-12 order-1 col-md order-md-2"), + Div(Field("last_name_original"), css_class="col-12 order-2 col-md order-md-3"), + css_class="row mb-0", + ), + Div( + Div(Field("specialties"), css_class="col-12 col-md"), + Div(Field("topics"), css_class="col-12 col-md"), + css_class="row mb-0", + ), + Div( + Div(Field("orcid_id"), css_class="col-12 col-md"), + Div(Field("webpage"), css_class="col-12 col-md"), + css_class="row mb-0", + ), + Div( + Submit("submit", "Save", css_class="btn btn-primary"), + ) + ) + def clean_email(self): """Check that the email isn't yet associated to an existing Profile.""" cleaned_email = self.cleaned_data["email"] diff --git a/scipost_django/profiles/templates/profiles/profile_form.html b/scipost_django/profiles/templates/profiles/profile_form.html index 1511c824b..8cd86ffc1 100644 --- a/scipost_django/profiles/templates/profiles/profile_form.html +++ b/scipost_django/profiles/templates/profiles/profile_form.html @@ -1,17 +1,32 @@ {% extends 'profiles/base.html' %} -{% load bootstrap %} +{% load scipost_extras %} +{% load crispy_forms_tags %} {% block breadcrumb_items %} {{ block.super }} - <span class="breadcrumb-item">{% if form.instance.id %}Update {{ form.instance }}{% else %}Add new Profile {% if from_type %}(from {{ from_type }}){% endif %}{% endif %}</span> + {% if form.instance.id %} + <span class="breadcrumb-item"><a href="{{ form.instance.get_absolute_url }}">{{ form.instance }}</a></span> + <span class="breadcrumb-item"><a href="#" class="active">Update</a></span> + {% else %} + <span class="breadcrumb-item"><a href="#" class="active">Create {% if from_type %}(from {{ from_type }}){% endif %}</a></span> + {% endif %} {% endblock %} {% block pagetitle %}: Profiles{% endblock pagetitle %} + {% block content %} - <div class="row"> - <div class="col-12"> +<div class="row"> + <div class="col-12"> + <hgroup class="highlight p-3 mb-3"> + <h1>{% if form.instance.id %}Update{% else %}Create {{ form.instance|object_name }}{% endif %} Form</h1> + {% if form.instance.id %} + <p class="m-0 fs-4"><a href="{{ form.instance.get_absolute_url }}">{{ form.instance }}</a></p> + {% endif %} + </hgroup> + + {% if matching_profiles %} <h4>Matching profiles found for this {{ from_type }}</h4> <ul> @@ -23,10 +38,9 @@ {% endif %} - <form action="" method="post"> - {% csrf_token %} - {{ form|bootstrap }} - <input type="submit" value="Submit" class="btn btn-primary"> + <form class="mt-4" id="profile_edit_form" method="post" enctype="multipart/form-data"> + {% csrf_token %} + {% crispy form %} </form> </div> </div> diff --git a/scipost_django/profiles/views.py b/scipost_django/profiles/views.py index 1f1222e99..a4b8cc250 100644 --- a/scipost_django/profiles/views.py +++ b/scipost_django/profiles/views.py @@ -244,7 +244,6 @@ class ProfileUpdateView(PermissionsMixin, UpdateView): model = Profile form_class = ProfileForm template_name = "profiles/profile_form.html" - success_url = reverse_lazy("profiles:profiles") class ProfileDeleteView(PermissionsMixin, DeleteView): -- GitLab