From 7d39d649b621adaafd5401f8868af485f892ec3c Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Sun, 24 Sep 2017 21:15:33 +0200
Subject: [PATCH] Restrict resubmission permissions

Contributors will now only be permitted to do a
resubmission if the current contributor is already
assigned as an author on the previous submission.

This will prevent other contributors be able to read
information which is meant for the EdCol+EIC only,
coming from the previous submission.
---
 submissions/forms.py   | 7 ++++++-
 submissions/signals.py | 7 ++++++-
 submissions/views.py   | 5 +++--
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/submissions/forms.py b/submissions/forms.py
index 37f07e08e..1fd5527db 100644
--- a/submissions/forms.py
+++ b/submissions/forms.py
@@ -71,6 +71,7 @@ class SubmissionChecks:
     last_submission = None
 
     def __init__(self, *args, **kwargs):
+        self.requested_by = kwargs.pop('requested_by', None)
         super().__init__(*args, **kwargs)
         # Prefill `is_resubmission` property if data is coming from initial data
         if kwargs.get('initial', None):
@@ -121,6 +122,11 @@ class SubmissionChecks:
             self.last_submission = submission
             if submission.status == STATUS_REVISION_REQUESTED:
                 self.is_resubmission = True
+                if self.requested_by.contributor not in submission.authors.all():
+                    error_message = ('There exists a preprint with this arXiv identifier '
+                                     'but an earlier version number. Resubmission is only possible'
+                                     ' if you are a registered author of this manuscript.')
+                    raise forms.ValidationError(error_message)
             elif submission.status in [STATUS_REJECTED, STATUS_REJECTED_VISIBLE]:
                 error_message = ('This arXiv preprint has previously undergone refereeing '
                                  'and has been rejected. Resubmission is only possible '
@@ -238,7 +244,6 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
         }
 
     def __init__(self, *args, **kwargs):
-        self.requested_by = kwargs.pop('requested_by', None)
         super().__init__(*args, **kwargs)
 
         if not self.submission_is_resubmission():
diff --git a/submissions/signals.py b/submissions/signals.py
index 53461d84c..664ff585d 100644
--- a/submissions/signals.py
+++ b/submissions/signals.py
@@ -32,8 +32,13 @@ def notify_new_editorial_assignment(sender, instance, created, **kwargs):
     """
     if created:
         administration = Group.objects.get(name='Editorial Administrators')
+        if instance.accepted:
+            # A new assignment is auto-accepted if user assigned himself or on resubmission.
+            text = ' assigned you Editor-in-charge.'
+        else:
+            text = ' invited you to become Editor-in-charge.'
         notify.send(sender=sender, recipient=instance.to.user, actor=administration,
-                    verb=' invited you to become Editor-in-charge.', target=instance)
+                    verb=text, target=instance)
 
 
 def notify_new_referee_invitation(sender, instance, created, **kwargs):
diff --git a/submissions/views.py b/submissions/views.py
index 9d9fafc72..b91cff2ff 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -96,10 +96,11 @@ class RequestSubmission(CreateView):
 @login_required
 @permission_required('scipost.can_submit_manuscript', raise_exception=True)
 def prefill_using_arxiv_identifier(request):
-    query_form = SubmissionIdentifierForm(request.POST or None, initial=request.GET or None)
+    query_form = SubmissionIdentifierForm(request.POST or None, initial=request.GET or None,
+                                          requested_by=request.user)
     if query_form.is_valid():
         prefill_data = query_form.request_arxiv_preprint_form_prefill_data()
-        form = RequestSubmissionForm(initial=prefill_data)
+        form = RequestSubmissionForm(initial=prefill_data, requested_by=request.user)
 
         # Submit message to user
         if query_form.submission_is_resubmission():
-- 
GitLab