From 360e200e95c924aff0e3d619e623f1e97dea77d2 Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Thu, 15 Nov 2018 21:37:27 +0100
Subject: [PATCH] Not done.

---
 notifications/models.py                       |  2 +
 submissions/forms.py                          |  8 +++
 submissions/managers.py                       | 14 +++++
 .../submissions/submission_form.html          |  3 ++
 .../submission_resubmission_candidates.html   | 35 +++++++++++++
 submissions/urls.py                           |  1 +
 submissions/views.py                          | 52 ++++++++++++++-----
 7 files changed, 103 insertions(+), 12 deletions(-)
 create mode 100644 submissions/templates/submissions/submission_resubmission_candidates.html

diff --git a/notifications/models.py b/notifications/models.py
index 3f0d1dd55..eb0947cf3 100644
--- a/notifications/models.py
+++ b/notifications/models.py
@@ -71,6 +71,8 @@ class Notification(models.Model):
     # of notifications.
     internal_type = models.CharField(max_length=255, blank=True, choices=NOTIFICATION_TYPES)
 
+    url_code = models.CharField(max_length=255, blank=True)
+
     objects = NotificationQuerySet.as_manager()
 
     class Meta:
diff --git a/submissions/forms.py b/submissions/forms.py
index ecce7bf13..7d7ff7be4 100644
--- a/submissions/forms.py
+++ b/submissions/forms.py
@@ -263,6 +263,10 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
 
     scipost_identifier = None
 
+    resubmission = forms.ModelChoiceField(
+        # to_field_name='preprint__identifier_w_vn_nr',
+        queryset=Submission.objects.all(), required=False, widget=forms.HiddenInput())
+
     identifier_w_vn_nr = forms.CharField(widget=forms.HiddenInput())
     arxiv_link = forms.URLField(
         widget=forms.TextInput(attrs={'placeholder': 'ex.:  arxiv.org/abs/1234.56789v1'}))
@@ -305,6 +309,10 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
         super().__init__(*args, **kwargs)
 
         # Alter resubmission-dependent fields
+        # self.fields['resubmission'].queryset = Submission.objects.candidate_for_resubmission(
+        #     self.requested_by.contributor)  # This is auto-filled by the resubmit_manuscript view.
+        # r = self.fields['resubmission'].initial = self.fields['resubmission'].queryset.get
+        # raise
         if not self.submission_is_resubmission():
             # These fields are only available for resubmissions
             del self.fields['author_comments']
diff --git a/submissions/managers.py b/submissions/managers.py
index edb989349..cfbe1afec 100644
--- a/submissions/managers.py
+++ b/submissions/managers.py
@@ -209,6 +209,20 @@ class SubmissionQuerySet(models.QuerySet):
         """Return Submissions that have EditorialAssignments that still need to be sent."""
         return self.filter(editorial_assignments__status=constants.STATUS_PREASSIGNED)
 
+    def candidate_for_resubmission(self, contributor):
+        """
+        Return all Submissions that are open for resubmission specialised
+        for a certain Contributor.
+        """
+        if not contributor:
+            return self.none()
+
+        return self.filter(is_current=True, status__in=[
+            constants.STATUS_INCOMING,
+            constants.STATUS_UNASSIGNED,
+            constants.STATUS_EIC_ASSIGNED,
+            ], submitted_by=contributor)
+
 
 class SubmissionEventQuerySet(models.QuerySet):
     def for_author(self):
diff --git a/submissions/templates/submissions/submission_form.html b/submissions/templates/submissions/submission_form.html
index 1e314ea13..9306c39b9 100644
--- a/submissions/templates/submissions/submission_form.html
+++ b/submissions/templates/submissions/submission_form.html
@@ -48,6 +48,9 @@
         <p>
             Please prepare your manuscript according to the <a href="{% url 'submissions:author_guidelines' %}">author guidelines</a>.
         </p>
+        {% if form.fields.resubmission %}
+            {{ form.fields.resubmission.initial }}
+        {% endif %}
     </div>
 </div>
 
diff --git a/submissions/templates/submissions/submission_resubmission_candidates.html b/submissions/templates/submissions/submission_resubmission_candidates.html
new file mode 100644
index 000000000..446835d47
--- /dev/null
+++ b/submissions/templates/submissions/submission_resubmission_candidates.html
@@ -0,0 +1,35 @@
+{% extends 'scipost/base.html' %}
+
+{% load bootstrap %}
+
+{% block pagetitle %}: submit manuscript{% endblock pagetitle %}
+
+{% block content %}
+
+<div class="row">
+    <div class="col-12">
+        <form method="post">
+            {% csrf_token %}
+            <h1 class="highlight">Possible Resubmissions</h1>
+            <p>The system has found {{ submissions|length|pluralize:'a Submission,Submissions' }} for which you are a verified author. If you wish to submit a new version for {{ submissions|length|pluralize:'this Submission,one of these Submissions' }}, please use the "Resubmit this Submission" buttton below.</p>
+            <ul>
+                {% for submission in submissions %}
+                    <li class="py-2">
+                        <strong>{{ submission.title }}</strong>
+                        <br>
+                        {{ submission.author_list }}
+                        <br>
+                        Preprint number: {{ submission.preprint.identifier_w_vn_nr }}
+                        <br>
+                        <button type="submit" name="submission" value="{{ submission.preprint.identifier_w_vn_nr }}"class="btn btn-primary py-1 mt-1">Resubmit this Submission</button>
+                    </li>
+                {% endfor %}
+            </ul>
+            <p>
+                If you wish to submit a new Submission, please <button type="submit" name="submission" value="new" class="btn btn-primary py-1 mr-1">submit a new Submission here</button>.
+            </p>
+        </form>
+    </div>
+</div>
+
+{% endblock content %}
diff --git a/submissions/urls.py b/submissions/urls.py
index 9b2f9985c..5591c3ff0 100644
--- a/submissions/urls.py
+++ b/submissions/urls.py
@@ -68,6 +68,7 @@ urlpatterns = [
     url(r'^admin/reports/(?P<report_id>[0-9]+)/compile$',
         views.report_pdf_compile, name='report_pdf_compile'),
 
+    url(r'^resubmit_manuscript$', views.resubmit_manuscript, name='resubmit_manuscript'),
     url(r'^submit_manuscript$', views.prefill_using_arxiv_identifier, name='submit_manuscript'),
     url(r'^submit_manuscript/scipost$',
         views.RequestSubmissionUsingSciPostView.as_view(), name='submit_manuscript_scipost'),
diff --git a/submissions/views.py b/submissions/views.py
index cb1a21fa7..7b977706e 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -55,16 +55,46 @@ from production.forms import ProofsDecisionForm
 from profiles.models import Profile
 from profiles.forms import SimpleProfileForm
 from scipost.constants import INVITATION_REFEREEING
+from scipost.decorators import is_contributor_user
 from scipost.forms import RemarkForm
 from scipost.mixins import PaginationMixin
 from scipost.models import Contributor, Remark
 
-# from notifications.views import is_test_user  # Temporarily until release
-
 
 ###############
 # SUBMISSIONS:
 ###############
+@login_required
+@is_contributor_user()
+def resubmit_manuscript(request):
+    """
+    Choose which Submission to resubmit if Submission is available.
+
+    On POST, redirect to submit page.
+    """
+    submissions = get_list_or_404(
+        Submission.objects.candidate_for_resubmission(request.user.contributor))
+    if request.POST and request.POST.get('submission'):
+        if request.POST['submission'] == 'new':
+            return redirect(reverse('submissions:submit_manuscript_scipost') + '?resubmission=false')
+        try:
+            last_submission = Submission.objects.candidate_for_resubmission(
+                request.user.contributor).get(
+                preprint__identifier_w_vn_nr=request.POST['submission'])
+            extra_param = '?resubmission={}'.format(request.POST['submission'])
+
+            if last_submission.preprint.scipost_preprint_identifier:
+                # Determine right preprint-view.
+                return redirect(reverse('submissions:submit_manuscript_scipost') + extra_param)
+            return redirect(reverse('submissions:submit_manuscript') + extra_param)
+        except Submission.DoesNotExist:
+            # POST request invalid. Try again with GET request.
+            return redirect('submissions:resubmit_manuscript')
+    context = {
+        'submissions': submissions,
+    }
+    return render(request, 'submissions/submission_resubmission_candidates.html', context)
+
 
 class RequestSubmissionView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
     """Formview to submit a new manuscript (Submission)."""
@@ -74,9 +104,6 @@ class RequestSubmissionView(LoginRequiredMixin, PermissionRequiredMixin, CreateV
     form_class = RequestSubmissionForm
     template_name = 'submissions/submission_form.html'
 
-    # def dispatch(self, *args, **kwargs):
-    #     candidate_for_resubmission
-
     def get_context_data(self, *args, **kwargs):
         context = super().get_context_data(*args, **kwargs)
         context['id_SciPostPhys'] = get_object_or_404(Journal, doi_label='SciPostPhys').id
@@ -87,8 +114,8 @@ class RequestSubmissionView(LoginRequiredMixin, PermissionRequiredMixin, CreateV
         """Form requires extra kwargs."""
         kwargs = super().get_form_kwargs()
         kwargs['requested_by'] = self.request.user
-        if hasattr(self, 'initial_data'):
-            kwargs['initial'] = self.initial_data
+        kwargs['initial'] = getattr(self, 'initial_data', {})
+        kwargs['initial']['resubmission'] = self.request.GET.get('resubmission')
         return kwargs
 
     @transaction.atomic
@@ -143,11 +170,12 @@ class RequestSubmissionUsingArXivView(RequestSubmissionView):
 class RequestSubmissionUsingSciPostView(RequestSubmissionView):
     """Formview to submit a new Submission using SciPost's preprint server."""
 
-    def dispatch(self, request, *args, **kwargs):
-        """TEMPORARY: Not accessible unless in test group."""
-        # if not is_test_user(request.user):
-        #     raise Http404
-        return super().dispatch(request, *args, **kwargs)
+    def get(self, request):
+        """Check for possible Resubmissions before dispatching."""
+        if Submission.objects.candidate_for_resubmission(request.user.contributor).exists():
+            if not request.GET.get('resubmission'):
+                return redirect('submissions:resubmit_manuscript')
+        return super().get(request)
 
     def get_form_kwargs(self):
         """Form requires extra kwargs."""
-- 
GitLab