From ca0f703c215d92d595e992faa6eec4b57d9ec596 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20Caux?= <git@jscaux.org> Date: Sat, 21 Jan 2023 17:33:52 +0100 Subject: [PATCH] Add Submission.followup_of, update submission form --- scipost_django/journals/urls/general.py | 5 +++++ scipost_django/journals/views.py | 16 ++++++++++++++++ scipost_django/preprints/models.py | 3 +-- scipost_django/submissions/forms/__init__.py | 15 ++++++++++++++- .../migrations/0139_submission_followup_of.py | 19 +++++++++++++++++++ .../submissions/models/submission.py | 8 ++++++++ .../submissions/submission_detail.html | 4 +++- .../submissions/submission_form.html | 15 --------------- 8 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 scipost_django/submissions/migrations/0139_submission_followup_of.py diff --git a/scipost_django/journals/urls/general.py b/scipost_django/journals/urls/general.py index 7c9f164e8..83b0d91fc 100644 --- a/scipost_django/journals/urls/general.py +++ b/scipost_django/journals/urls/general.py @@ -19,6 +19,11 @@ urlpatterns = [ journals_views.PublicationAutocompleteView.as_view(), name="publication-autocomplete", ), + path( + "own-publication-autocomplete", + journals_views.OwnPublicationAutocompleteView.as_view(), + name="own-publication-autocomplete", + ), path( "_hx_publication_dynsel_list", journals_views._hx_publication_dynsel_list, diff --git a/scipost_django/journals/views.py b/scipost_django/journals/views.py index 5eefbb98f..8814e5586 100644 --- a/scipost_django/journals/views.py +++ b/scipost_django/journals/views.py @@ -125,6 +125,22 @@ class PublicationAutocompleteView(autocomplete.Select2QuerySetView): ) +class OwnPublicationAutocompleteView(PublicationAutocompleteView): + """ + View to feed the Select2 widget, specialized to user's own publications. + """ + + def get_queryset(self): + qs = self.request.user.contributor.profile.publications() + if self.q: + qs = qs.filter( + Q(title__icontains=self.q) + | Q(doi_label__icontains=self.q) + | Q(author_list__icontains=self.q) + ) + return qs.order_by("-publication_date") + + def _hx_publication_dynsel_list(request): form = PublicationDynSelForm(request.POST or None) if form.is_valid(): diff --git a/scipost_django/preprints/models.py b/scipost_django/preprints/models.py index 4d7d911dc..2b3ae2f85 100644 --- a/scipost_django/preprints/models.py +++ b/scipost_django/preprints/models.py @@ -6,7 +6,6 @@ import requests from django.urls import reverse from django.db import models -from django.http import Http404 from common.utils import get_current_domain from submissions.exceptions import PreprintDocumentNotFoundError @@ -48,7 +47,7 @@ class Preprint(models.Model): return self.url if self._file: return reverse("preprints:pdf", args=(self.identifier_w_vn_nr,)) - raise Http404 + return None def get_document(self): """ diff --git a/scipost_django/submissions/forms/__init__.py b/scipost_django/submissions/forms/__init__.py index 8d26eb144..4f16da435 100644 --- a/scipost_django/submissions/forms/__init__.py +++ b/scipost_django/submissions/forms/__init__.py @@ -64,7 +64,7 @@ from ..regexes import CHEMRXIV_DOI_PATTERN from colleges.models import Fellowship from common.utils import Q_with_alternative_spellings -from journals.models import Journal +from journals.models import Journal, Publication from journals.constants import ( PUBLISHABLE_OBJECT_TYPE_ARTICLE, PUBLISHABLE_OBJECT_TYPE_CODEBASE, @@ -1137,6 +1137,18 @@ class SubmissionForm(forms.ModelForm): label="Specialties", help_text="Type to search, click to include", ) + followup_of = forms.ModelMultipleChoiceField( + queryset=Publication.objects.all(), + widget=autocomplete.ModelSelect2Multiple( + url="/journals/own-publication-autocomplete", + attrs={ + "data-html": True, + "data-placeholder": "Optional", + } + ), + 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>" + ) preprint_server = forms.ModelChoiceField( queryset=PreprintServer.objects.all(), widget=forms.HiddenInput() ) @@ -1163,6 +1175,7 @@ class SubmissionForm(forms.ModelForm): "title", "author_list", "abstract", + "followup_of", "code_repository_url", "data_repository_url", "author_comments", diff --git a/scipost_django/submissions/migrations/0139_submission_followup_of.py b/scipost_django/submissions/migrations/0139_submission_followup_of.py new file mode 100644 index 000000000..9d9b78526 --- /dev/null +++ b/scipost_django/submissions/migrations/0139_submission_followup_of.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.16 on 2023-01-21 15:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('journals', '0128_populate_submission_object_types'), + ('submissions', '0138_auto_20230120_2100'), + ] + + operations = [ + migrations.AddField( + model_name='submission', + name='followup_of', + field=models.ManyToManyField(blank=True, related_name='followups', to='journals.Publication'), + ), + ] diff --git a/scipost_django/submissions/models/submission.py b/scipost_django/submissions/models/submission.py index 5c3ac7c30..4624e8cd1 100644 --- a/scipost_django/submissions/models/submission.py +++ b/scipost_django/submissions/models/submission.py @@ -249,6 +249,8 @@ class Submission(models.Model): ) visible_public = models.BooleanField("Is publicly visible", default=False) visible_pool = models.BooleanField("Is visible in the Pool", default=False) + + # Link to previous Submission, or existing bundle member is_resubmission_of = models.ForeignKey( "self", blank=True, @@ -257,6 +259,12 @@ class Submission(models.Model): related_name="successor", ) thread_hash = models.UUIDField(default=uuid.uuid4) + followup_of = models.ManyToManyField( + "journals.Publication", + blank=True, + related_name="followups", + ) + refereeing_cycle = models.CharField( max_length=30, choices=SUBMISSION_CYCLES, default=CYCLE_DEFAULT, blank=True ) diff --git a/scipost_django/submissions/templates/submissions/submission_detail.html b/scipost_django/submissions/templates/submissions/submission_detail.html index 1d0476e66..3f9f56faa 100644 --- a/scipost_django/submissions/templates/submissions/submission_detail.html +++ b/scipost_django/submissions/templates/submissions/submission_detail.html @@ -20,7 +20,9 @@ <meta name="citation_author" content="{{ author }}"/> {% endfor %} <meta name="citation_online_date" content="{{ submission.submission_date|date:'Y/m/d' }}"/> - <meta name="citation_pdf_url" content="{{ submission.preprint.citation_pdf_url }}"/> + {% if submission.preprint.citation_pdf_url %} + <meta name="citation_pdf_url" content="{{ submission.preprint.citation_pdf_url }}"/> + {% endif %} {% endblock headsup %} diff --git a/scipost_django/submissions/templates/submissions/submission_form.html b/scipost_django/submissions/templates/submissions/submission_form.html index 5bf9dc5e0..33d3fe2e3 100644 --- a/scipost_django/submissions/templates/submissions/submission_form.html +++ b/scipost_django/submissions/templates/submissions/submission_form.html @@ -38,21 +38,6 @@ {% if form %} <h2>Please provide these last bits of information, and carefully check all prefilled fields</h2> - {% if form.errors %} - {% for field in form %} - {% for error in field.errors %} - <div class="alert alert-danger"> - <strong>{{ field.name }} - {{ error|escape }}</strong> - </div> - {% endfor %} - {% endfor %} - {% for error in form.non_field_errors %} - <div class="alert alert-danger"> - <strong>{{ error|escape }}</strong> - </div> - {% endfor %} - {% endif %} - <form class="mt-4" id="full_submission_form" method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form|bootstrap }} -- GitLab