From 8fa2f99ed3ca29c05405cde83fc8b30b0036b006 Mon Sep 17 00:00:00 2001
From: George Katsikas <giorgakis.katsikas@gmail.com>
Date: Tue, 26 Mar 2024 16:42:24 +0100
Subject: [PATCH] make submission form fields requirement clearer

fix #39
---
 .../scipost/assets/config/preconfig.scss      |  5 ++
 scipost_django/submissions/forms/__init__.py  | 62 ++++++++++++++-----
 2 files changed, 50 insertions(+), 17 deletions(-)

diff --git a/scipost_django/scipost/static/scipost/assets/config/preconfig.scss b/scipost_django/scipost/static/scipost/assets/config/preconfig.scss
index ed517ef68..aca63bbad 100644
--- a/scipost_django/scipost/static/scipost/assets/config/preconfig.scss
+++ b/scipost_django/scipost/static/scipost/assets/config/preconfig.scss
@@ -100,6 +100,11 @@ $input-border-radius: $border-radius-base;
 $input-border-radius-lg: $border-radius-base;
 $enable-rounded: true !important;
 
+label.required-asterisk::after {
+    content: "*";
+    font-size: 0.8rem;
+}
+
 $input-height: calc(1.5rem + 2px);
 $input-height-lg: calc(2.0rem + 2px);
 
diff --git a/scipost_django/submissions/forms/__init__.py b/scipost_django/submissions/forms/__init__.py
index 826b343dc..0365555c6 100644
--- a/scipost_django/submissions/forms/__init__.py
+++ b/scipost_django/submissions/forms/__init__.py
@@ -1237,6 +1237,8 @@ class SubmissionForm(forms.ModelForm):
     Form to submit a new (re)Submission.
     """
 
+    required_css_class = "required-asterisk"
+
     collection = forms.ChoiceField(
         choices=[(None, "None")]
         + list(
@@ -1279,7 +1281,8 @@ class SubmissionForm(forms.ModelForm):
             },
         ),
         required=False,
-        help_text="<strong>Does this Submission follow up on some of your earlier publications?<br>(for example: this Submission is a new codebase release for a previous Codebases publication)<br>If so, select them here.</strong><br><strong>This is NOT FOR SPECIFYING A RESUBMISSION: to resubmit a manuscript, choose the resubmission route after clicking the Submit button in the navbar.",
+        help_text="If this Submission follows up on some of your earlier publications, e.g. this Submission is a new release for a previous Codebases publication, select it here.<br>"
+        "<strong>This is NOT FOR SPECIFYING A RESUBMISSION</strong>: to resubmit a manuscript, choose the resubmission route after clicking the Submit button in the navbar.",
     )
     preprint_server = forms.ModelChoiceField(
         queryset=PreprintServer.objects.all(), widget=forms.HiddenInput()
@@ -1328,6 +1331,7 @@ class SubmissionForm(forms.ModelForm):
             "thread_hash",
             "submitted_to",
             "proceedings",
+            "collection",
             "acad_field",
             "specialties",
             "topics",
@@ -1336,18 +1340,17 @@ class SubmissionForm(forms.ModelForm):
             "author_list",
             "abstract",
             "followup_of",
-            "data_repository_url",
-            "code_repository_url",
-            "code_name",
-            "code_version",
-            "code_license",
             "author_comments",
             "list_of_changes",
             "remarks_for_editors",
             "referees_suggested",
             "referees_flagged",
             "preprint_file",
-            "collection",
+            "data_repository_url",
+            "code_repository_url",
+            "code_name",
+            "code_version",
+            "code_license",
             "agree_to_terms",
         ]
         widgets = {
@@ -1438,17 +1441,45 @@ class SubmissionForm(forms.ModelForm):
                 + str(kwargs["initial"].get("acad_field").id)
             )
 
-        # Codebases-only fields
-        if "Codeb" not in self.submitted_to_journal.doi_label:
+        object_types = self.submitted_to_journal.submission_object_types["options"]
+
+        def require_type(str):
+            """Check if a publishable object type is required for this journal."""
+            return map(lambda x: str in x, object_types)
+
+        # Define field option flags
+        code_allowed = any(require_type(PUBLISHABLE_OBJECT_TYPE_CODEBASE))
+        code_required = all(require_type(PUBLISHABLE_OBJECT_TYPE_CODEBASE))
+        data_allowed = any(require_type(PUBLISHABLE_OBJECT_TYPE_DATASET))
+        data_required = all(require_type(PUBLISHABLE_OBJECT_TYPE_DATASET))
+        proceedings_allowed = "Proc" in self.submitted_to_journal.doi_label
+        proceedings_required = proceedings_allowed
+        collection_allowed = "LectNotes" in self.submitted_to_journal.doi_label
+        collection_required = False
+
+        # Mandate special submission fields if required by the journal
+        if code_required:
+            self.fields["code_repository_url"].required = True
+        else:
             del self.fields["code_name"]
             del self.fields["code_version"]
             del self.fields["code_license"]
 
-        # Proceedings & Collection submission fields
-        if "LectNotes" not in self.submitted_to_journal.doi_label:
+        self.fields["data_repository_url"].required = data_required
+        self.fields["collection"].required = collection_required
+        self.fields["proceedings"].required = proceedings_required
+
+        # Delete special submission fields if not allowed by the journal
+        if not code_allowed:
+            del self.fields["code_repository_url"]
+
+        if not data_allowed:
+            del self.fields["data_repository_url"]
+
+        if not collection_allowed:
             del self.fields["collection"]
 
-        if "Proc" not in self.submitted_to_journal.doi_label:
+        if not proceedings_allowed:
             del self.fields["proceedings"]
         else:
             # Filter the list of proceedings to those open for submission
@@ -1458,10 +1489,8 @@ class SubmissionForm(forms.ModelForm):
             if self.is_resubmission():
                 resubmission = Submission.objects.get(id=self.is_resubmission_of)
                 qs = qs | Proceedings.objects.filter(id=resubmission.proceedings.id)
-            if not qs.exists():
-                del self.fields["proceedings"]
-            else:
-                self.fields["proceedings"].queryset = qs
+
+            self.fields["proceedings"].queryset = qs
 
     def is_resubmission(self):
         return self.is_resubmission_of is not None
@@ -1700,7 +1729,6 @@ class SubmissionForm(forms.ModelForm):
         submission.metadata = self.metadata
         submission.preprint = preprint
 
-
         # Codebases-only fields
         if "Codeb" in submission.submitted_to.doi_label:
             submission.code_metadata = {
-- 
GitLab