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