From d439fbf63d85b0dccd9b62c153577c076d6b4613 Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Fri, 17 Jul 2020 21:31:25 +0200
Subject: [PATCH] Partial work on refactoring submission

---
 journals/converters.py                        |  14 ++
 journals/managers.py                          |   3 +
 .../0089_journal_submission_allowed.py        |  18 ++
 journals/models/journal.py                    |   1 +
 .../journals/journal_landing_page.html        |   2 +-
 scipost/converters.py                         |  14 ++
 .../scipost/personal_page/submissions.html    |   4 +-
 submissions/admin.py                          |   5 +-
 submissions/forms.py                          |  89 +++++----
 submissions/migrations/0084_preprintserver.py |  26 +++
 submissions/models/__init__.py                |   2 +
 submissions/models/preprint_server.py         |  25 +++
 .../submissions/submission_prefill_form.html  |  61 +++++-
 .../submission_resubmission_candidates.html   |   4 +-
 .../submissions/submit_choose_journal.html    |  69 +++++++
 .../submit_choose_preprint_server.html        |  78 ++++++++
 .../submissions/submit_manuscript.html        | 113 +++++++++++
 submissions/tests/test_views.py               |  14 +-
 submissions/urls.py                           |  77 ++++++--
 submissions/views.py                          | 177 ++++++++++++------
 20 files changed, 667 insertions(+), 129 deletions(-)
 create mode 100644 journals/converters.py
 create mode 100644 journals/migrations/0089_journal_submission_allowed.py
 create mode 100644 scipost/converters.py
 create mode 100644 submissions/migrations/0084_preprintserver.py
 create mode 100644 submissions/models/preprint_server.py
 create mode 100644 submissions/templates/submissions/submit_choose_journal.html
 create mode 100644 submissions/templates/submissions/submit_choose_preprint_server.html
 create mode 100644 submissions/templates/submissions/submit_manuscript.html

diff --git a/journals/converters.py b/journals/converters.py
new file mode 100644
index 000000000..1d6f27296
--- /dev/null
+++ b/journals/converters.py
@@ -0,0 +1,14 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from .regexes import JOURNAL_DOI_LABEL_REGEX
+
+class JournalDOILabelConverter:
+    regex = JOURNAL_DOI_LABEL_REGEX
+
+    def to_python(self, value):
+        return value
+
+    def to_url(self, value):
+        return value
diff --git a/journals/managers.py b/journals/managers.py
index c875c548f..de97b5201 100644
--- a/journals/managers.py
+++ b/journals/managers.py
@@ -14,6 +14,9 @@ class JournalQuerySet(models.QuerySet):
     def active(self):
         return self.filter(active=True)
 
+    def submission_allowed(self):
+        return self.filter(submission_allowed=True)
+
     def has_issues(self):
         return self.filter(structure__in=(ISSUES_AND_VOLUMES, ISSUES_ONLY))
 
diff --git a/journals/migrations/0089_journal_submission_allowed.py b/journals/migrations/0089_journal_submission_allowed.py
new file mode 100644
index 000000000..9b16a01ed
--- /dev/null
+++ b/journals/migrations/0089_journal_submission_allowed.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.11 on 2020-07-17 12:08
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('journals', '0088_auto_20200707_1542'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='journal',
+            name='submission_allowed',
+            field=models.BooleanField(default=True),
+        ),
+    ]
diff --git a/journals/models/journal.py b/journals/models/journal.py
index bdbc5747d..8b2cea9c9 100644
--- a/journals/models/journal.py
+++ b/journals/models/journal.py
@@ -34,6 +34,7 @@ class Journal(models.Model):
                                  validators=[doi_journal_validator])
     issn = models.CharField(max_length=16, default='2542-4653', blank=True)
     active = models.BooleanField(default=True)
+    submission_allowed = models.BooleanField(default=True)
     structure = models.CharField(max_length=2,
                                  choices=JOURNAL_STRUCTURE, default=ISSUES_AND_VOLUMES)
     refereeing_period = models.DurationField(default=datetime.timedelta(days=28))
diff --git a/journals/templates/journals/journal_landing_page.html b/journals/templates/journals/journal_landing_page.html
index cab396879..6f2c5db0f 100644
--- a/journals/templates/journals/journal_landing_page.html
+++ b/journals/templates/journals/journal_landing_page.html
@@ -59,7 +59,7 @@
               </li>
             {% empty %}
               <li class="list-group-item">
-                <p>All recently accepted Submissions to SciPost Physics have been published.</p>
+                <p>All recently accepted Submissions to {{ journal }} have been published.</p>
               </li>
             {% endfor %}
           </ul>
diff --git a/scipost/converters.py b/scipost/converters.py
new file mode 100644
index 000000000..f6090bda1
--- /dev/null
+++ b/scipost/converters.py
@@ -0,0 +1,14 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from .constants import DISCIPLINES_REGEX
+
+class DisciplineConverter:
+    regex = DISCIPLINES_REGEX
+
+    def to_python(self, value):
+        return value
+
+    def to_url(self, value):
+        return value
diff --git a/scipost/templates/partials/scipost/personal_page/submissions.html b/scipost/templates/partials/scipost/personal_page/submissions.html
index e088270da..1248fa733 100644
--- a/scipost/templates/partials/scipost/personal_page/submissions.html
+++ b/scipost/templates/partials/scipost/personal_page/submissions.html
@@ -7,7 +7,7 @@
           {% if nr_submission_authorships_to_claim > 0 %}
             <li><a href="{% url 'scipost:claim_authorships' %}">Potential authorships to claim (auto-detected: {{ nr_submission_authorships_to_claim }})</a></li>
           {% endif %}
-          <li><a href="{% url 'submissions:submit_manuscript' %}">Submit an arXiv preprint to a SciPost Journal</a></li>
+          <li><a href="{% url 'submissions:submit_manuscript' %}">Submit to a SciPost Journal</a></li>
         </ul>
       </div>
     </div>
@@ -31,7 +31,7 @@
               <p class="card-text mt-1">
 		<ul>
                   {% if sub.open_for_resubmission %}
-                    <li>To resubmit, go to the <a href="{% url 'submissions:resubmit_manuscript' %}">resubmission page</a></li>
+                    <li><a href="{% url 'submissions:submit_choose_journal' discipline=sub.discipline thread_hash=sub.thread_hash %}"><i class="fa fa-arrow-right"></i> resubmit</a></li>
                   {% endif %}
 		  {% if sub.under_consideration %}
                     {% if sub.editor_in_charge %}
diff --git a/submissions/admin.py b/submissions/admin.py
index bc833ca12..3341746ba 100644
--- a/submissions/admin.py
+++ b/submissions/admin.py
@@ -11,7 +11,7 @@ from guardian.admin import GuardedModelAdmin
 from submissions.models import (
     Submission, EditorialAssignment, RefereeInvitation, Report, EditorialCommunication,
     EICRecommendation, SubmissionTiering, AlternativeRecommendation, EditorialDecision,
-    SubmissionEvent, iThenticateReport)
+    SubmissionEvent, iThenticateReport, PreprintServer)
 from scipost.models import Contributor
 from colleges.models import Fellowship
 
@@ -20,6 +20,9 @@ def submission_short_title(obj):
     return obj.submission.title[:30]
 
 
+admin.site.register(PreprintServer)
+
+
 class iThenticateReportAdmin(admin.ModelAdmin):
     list_display = ['doc_id', 'to_submission', 'status']
     list_filter = ['status']
diff --git a/submissions/forms.py b/submissions/forms.py
index 1d8c0269c..efa75356d 100644
--- a/submissions/forms.py
+++ b/submissions/forms.py
@@ -47,7 +47,7 @@ import strings
 
 import iThenticate
 
-IDENTIFIER_PATTERN_NEW = r'^[0-9]{4,}\.[0-9]{4,5}v[0-9]{1,2}$'
+ARXIV_IDENTIFIER_PATTERN_NEW = r'^[0-9]{4,}\.[0-9]{4,5}v[0-9]{1,2}$'
 
 
 class SubmissionSearchForm(forms.Form):
@@ -101,6 +101,7 @@ class SubmissionPoolFilterForm(forms.Form):
 # Submission and resubmission #
 ###############################
 
+
 class SubmissionService:
     """
     Object to run checks for prefiller and submit manuscript forms.
@@ -108,37 +109,43 @@ class SubmissionService:
 
     metadata = {}
 
-    def __init__(self, requested_by, preprint_server, identifier=None, resubmission_of_id=None):
+    def __init__(self, requested_by, preprint_server, identifier=None, thread_hash=None):
         self.requested_by = requested_by
         self.preprint_server = preprint_server
         self.identifier = identifier
-        self.resubmission_of_id = resubmission_of_id
+        self.thread_hash = thread_hash
         self._arxiv_data = None
 
-    @property
-    def latest_submission(self):
-        """
-        Return latest version of preprint series or None.
-        """
-        if hasattr(self, '_latest_submission'):
-            return self._latest_submission
-
-        if self.identifier:
-            # Check if is resubmission when identifier data is submitted.
-            identifier = self.identifier.rpartition('v')[0]
-            self._latest_submission = Submission.objects.filter(
-                preprint__identifier_wo_vn_nr=identifier).order_by(
-                '-preprint__vn_nr').first()
-        elif self.resubmission_of_id:
-            # Resubmission (submission id) is selected by user.
-            try:
-                self._latest_submission = Submission.objects.filter(
-                    id=int(self.resubmission_of_id)).order_by('-preprint__vn_nr').first()
-            except ValueError:
-                self._latest_submission = None
+        if self.thread_hash:
+            # Resubmission
+            self.latest_submission = Submission.objects.filter(
+                thread_hash=self.thread_hash).order_by(
+                    '-submission_date', '-preprint__vn_nr').first()
         else:
-            self._latest_submission = None
-        return self._latest_submission
+            self.latest_submission = None
+
+    # @property
+    # def latest_submission(self):
+    #     """
+    #     Return latest version of preprint series or None.
+    #     """
+    #     if hasattr(self, '_latest_submission'):
+    #         return self._latest_submission
+
+    #     # if self.identifier:
+    #     #     # Check if is resubmission when identifier data is submitted.
+    #     #     identifier = self.identifier.rpartition('v')[0]
+    #     #     self._latest_submission = Submission.objects.filter(
+    #     #         preprint__identifier_wo_vn_nr=identifier).order_by(
+    #     #         '-preprint__vn_nr').first()
+    #     if self.thread_hash:
+    #         # Resubmission
+    #         self._latest_submission = Submission.objects.filter(
+    #             thread_hash=self.thread_hash).order_by(
+    #                 '-submission_date', '-preprint__vn_nr').first()
+    #     else:
+    #         self._latest_submission = None
+    #     return self._latest_submission
 
     @property
     def arxiv_data(self):
@@ -196,6 +203,7 @@ class SubmissionService:
                 'subject_area': self.latest_submission.subject_area,
                 'submitted_to': self.latest_submission.submitted_to,
                 'submission_type': self.latest_submission.submission_type,
+                'thread_hash': self.latest_submission.thread_hash,
             }
         return {}
 
@@ -326,7 +334,7 @@ class SubmissionForm(forms.ModelForm):
     """
     Form to submit a new (re)Submission.
     """
-
+    thread_hash = forms.UUIDField(required=False)
     identifier_w_vn_nr = forms.CharField(widget=forms.HiddenInput())
     preprint_file = forms.FileField(
         help_text=('Please submit the processed .pdf (not the source files; '
@@ -376,15 +384,15 @@ class SubmissionForm(forms.ModelForm):
     def __init__(self, *args, **kwargs):
         self.requested_by = kwargs.pop('requested_by')
         self.preprint_server = kwargs.pop('preprint_server', 'arxiv')
-        self.resubmission_preprint = kwargs['initial'].get('resubmission', False)
 
         data = args[0] if len(args) > 1 else kwargs.get('data', {})
         identifier = kwargs['initial'].get('identifier_w_vn_nr', None) or data.get('identifier_w_vn_nr')
+        thread_hash = kwargs['initial'].get('thread_hash', None)
 
         self.service = SubmissionService(
             self.requested_by, self.preprint_server,
             identifier=identifier,
-            resubmission_of_id=self.resubmission_preprint)
+            thread_hash=thread_hash)
         if self.preprint_server == 'scipost':
             kwargs['initial'] = self.service.get_latest_submission_data()
 
@@ -537,31 +545,33 @@ class SubmissionForm(forms.ModelForm):
         return submission
 
 
-class SubmissionIdentifierForm(forms.Form):
+class ArXivPrefillForm(forms.Form):
     """
-    Prefill SubmissionForm using this form that takes an arXiv ID only.
+    Prefill SubmissionForm using an arXiv identifier with version nr.
     """
 
-    IDENTIFIER_PLACEHOLDER = 'new style (with version nr) ####.####(#)v#(#)'
-
     identifier_w_vn_nr = forms.RegexField(
-        label='arXiv identifier with version number',
-        regex=IDENTIFIER_PATTERN_NEW, strip=True,
+        label='',
+        regex=ARXIV_IDENTIFIER_PATTERN_NEW, strip=True,
         error_messages={'invalid': strings.arxiv_query_invalid},
-        widget=forms.TextInput({'placeholder': IDENTIFIER_PLACEHOLDER}))
+        widget=forms.TextInput()
+    )
 
     def __init__(self, *args, **kwargs):
         self.requested_by = kwargs.pop('requested_by')
+        self.thread_hash = kwargs.pop('thread_hash')
+        self.journal = Journal.objects.get(doi_label=kwargs.pop('journal_doi_label'))
         return super().__init__(*args, **kwargs)
 
-
     def clean_identifier_w_vn_nr(self):
         """
         Do basic prechecks based on the arXiv ID only.
         """
         identifier = self.cleaned_data.get('identifier_w_vn_nr', None)
 
-        self.service = SubmissionService(self.requested_by, 'arxiv', identifier=identifier)
+        self.service = SubmissionService(
+            self.requested_by, 'arxiv',
+            identifier=identifier, thread_hash=self.thread_hash)
         self.service.run_checks()
         return identifier
 
@@ -579,8 +589,9 @@ class SubmissionIdentifierForm(forms.Form):
                 'referees_suggested': self.service.latest_submission.referees_suggested,
                 'secondary_areas': self.service.latest_submission.secondary_areas,
                 'subject_area': self.service.latest_submission.subject_area,
-                'submitted_to': self.service.latest_submission.submitted_to,
+                'submitted_to': self.journal,
                 'submission_type': self.service.latest_submission.submission_type,
+                'thread_hash': self.service.latest_submission.thread_hash
             })
         return form_data
 
diff --git a/submissions/migrations/0084_preprintserver.py b/submissions/migrations/0084_preprintserver.py
new file mode 100644
index 000000000..bcd564dd1
--- /dev/null
+++ b/submissions/migrations/0084_preprintserver.py
@@ -0,0 +1,26 @@
+# Generated by Django 2.2.11 on 2020-07-17 14:59
+
+from django.db import migrations, models
+import scipost.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('submissions', '0083_auto_20200627_1944'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='PreprintServer',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=256)),
+                ('url', models.URLField()),
+                ('disciplines', scipost.fields.ChoiceArrayField(base_field=models.CharField(choices=[('Multidisciplinary', (('multidisciplinary', 'Multidisciplinary'),)), ('Formal Sciences', (('mathematics', 'Mathematics'), ('computerscience', 'Computer Science'))), ('Natural Sciences', (('physics', 'Physics'), ('astronomy', 'Astronomy'), ('biology', 'Biology'), ('chemistry', 'Chemistry'), ('earthscience', 'Earth and Environmental Sciences'))), ('Engineering', (('civileng', 'Civil Engineering'), ('electricaleng', 'Electrical Engineering'), ('mechanicaleng', 'Mechanical Engineering'), ('chemicaleng', 'Chemical Engineering'), ('materialseng', 'Materials Engineering'), ('medicaleng', 'Medical Engineering'), ('environmentaleng', 'Environmental Engineering'), ('industrialeng', 'Industrial Engineering'))), ('Medical Sciences', (('medicine', 'Basic Medicine'), ('clinical', 'Clinical Medicine'), ('health', 'Health Sciences'))), ('Agricultural Sciences', (('agricultural', 'Agriculture, Forestry and Fisheries'), ('veterinary', 'Veterinary Science'))), ('Social Sciences', (('economics', 'Economics'), ('geography', 'Geography'), ('law', 'Law'), ('media', 'Media and Communications'), ('pedagogy', 'Pedagogy and Educational Sciences'), ('politicalscience', 'Political Science'), ('psychology', 'Psychology'), ('sociology', 'Sociology'))), ('Humanities', (('art', 'Art (arts, history or arts, performing arts, music)'), ('history', 'History and Archeology'), ('literature', 'Language and Literature'), ('philosophy', 'Philosophy, Ethics and Religion')))], max_length=32), size=None)),
+            ],
+            options={
+                'ordering': ['name'],
+            },
+        ),
+    ]
diff --git a/submissions/models/__init__.py b/submissions/models/__init__.py
index 39ffd0034..aea07c0a8 100644
--- a/submissions/models/__init__.py
+++ b/submissions/models/__init__.py
@@ -10,6 +10,8 @@ from .assignment import EditorialAssignment
 
 from .communication import EditorialCommunication
 
+from .preprint_server import PreprintServer
+
 from .referee_invitation import RefereeInvitation
 
 from .report import Report
diff --git a/submissions/models/preprint_server.py b/submissions/models/preprint_server.py
new file mode 100644
index 000000000..801d363d5
--- /dev/null
+++ b/submissions/models/preprint_server.py
@@ -0,0 +1,25 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from django.db import models
+
+from scipost.constants import SCIPOST_DISCIPLINES
+from scipost.fields import ChoiceArrayField
+
+
+class PreprintServer(models.Model):
+    """
+    Representation of a SciPost-integrated preprint server which can be used upon submission.
+    """
+    name = models.CharField(max_length=256)
+    url = models.URLField()
+    disciplines = ChoiceArrayField(
+        models.CharField(max_length=32, choices=SCIPOST_DISCIPLINES)
+    )
+
+    class Meta:
+        ordering = ['name',]
+
+    def __str__(self):
+        return self.name
diff --git a/submissions/templates/submissions/submission_prefill_form.html b/submissions/templates/submissions/submission_prefill_form.html
index 102eea846..d4b1a8226 100644
--- a/submissions/templates/submissions/submission_prefill_form.html
+++ b/submissions/templates/submissions/submission_prefill_form.html
@@ -33,19 +33,60 @@
 
   {% if perms.scipost.can_submit_manuscript %}
 
+    <h2 class="mb-4">Please choose one of the following routes:</h2>
+    <div class="card-columns">
+      {% if expected_resubmissions %}
+	<div class="card">
+	  <div class="card-header">
+	    <h3 class="p-2 bg-primary text-white"><em>Ongoing Submission Stream</em></h3>
+	    <h3>Resubmit</h3>
+	  </div>
+	  <div class="card-body">
+	    Submissions for which a revision is expected,
+	    and for which you are marked as submitting author:
+	    <ul class="p-2">
+	      {% for sub in expected_resubmissions %}
+		<li>
+		  <p class="mb-0"><a href="{{ sub.get_absolute_url }}">{{ sub }}</a></p>
+		  <p><a class="btn btn-outline-primary p-1 mt-0" role="button" href="{% url 'submissions:resubmit_manuscript' identifier_w_vn_nr=sub.preprint.identifier_w_vn_nr %}"><i class="fa fa-arrow-right"></i> resubmit</a></p>
+		</li>
+	      {% endfor %}
+	    </ul>
+	  </div>
+	</div>
+      {% endif %}
+      <div class="card">
+	<div class="card-header">
+	  <h3 class="p-2 bg-success text-white"><em>New Submission</em></h3>
+	  <h3>Submit via arXiv</h3>
+	</div>
+	<div class="card-body">
+	  <p><em class="text-danger">Please do not use this route for a resubmission!</em></p>
+          <h3>arXiv identifier for your new Submission</h3>
+          <p><em>Give the identifier without prefix but with version number, ####.####(#)v#(#)</em></p>
+          <form action="{% url 'submissions:submit_manuscript' %}" method="post">
+            {% csrf_token %}
+            {{ form }}
+            <i class="fa fa-arrow-right"></i>
+	    <input type="submit" class="btn btn-outline-success" value="Query arXiv"/>
+          </form>
+	</div>
+      </div>
+      <div class="card">
+	<div class="card-header">
+	  <h3 class="p-2 bg-success text-white"><em>New Submission</em></h3>
+	  <h3>Submit directly to SciPost</h3>
+	</div>
+	<div class="card-body">
+	  <p><em class="text-danger">Please do not use this route for a resubmission!</em></p>
+	  <a class="btn btn-outline-success" role="button" href="{% url 'submissions:submit_manuscript_scipost' %}"><i class="fa fa-arrow-right"></i> Go to the direct submission form</a>
+	</div>
+      </div>
+    </div>
+
     <div class="row">
       <div class="col-12">
         <div class="border p-3 bg-light">
-          <h3>Please provide the arXiv identifier for your Submission</h3>
-          <p><em>(give the identifier without prefix but with version number, as per the placeholder)</em></p>
-          <form action="{% url 'submissions:prefill_using_identifier' %}" method="post">
-            {% csrf_token %}
-            {{ form|bootstrap }}
-            <input type="submit" class="btn btn-outline-secondary" value="Query arXiv"/>
-            <br>
-            <br>
-            <a href="{% url 'submissions:submit_manuscript_scipost' %}">Submit manuscript without arXiv instead</a>
-          </form>
         </div>
   {% else %}
         <h3>You are currently not allowed to submit a manuscript.</h3>
diff --git a/submissions/templates/submissions/submission_resubmission_candidates.html b/submissions/templates/submissions/submission_resubmission_candidates.html
index d166b87a2..a288ef953 100644
--- a/submissions/templates/submissions/submission_resubmission_candidates.html
+++ b/submissions/templates/submissions/submission_resubmission_candidates.html
@@ -11,7 +11,7 @@
       <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>
+        <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 associated "Resubmit this Submission" buttton below.</p>
         <ul>
           {% for submission in submissions %}
             <li class="py-2">
@@ -24,7 +24,7 @@
               {% if not submission.open_for_resubmission %}
                 <strong class="text-danger">This submission is still undergoing peer refereeing. A resubmission can only be performed after request from the Editor-in-charge. Please wait until the closing of the previous refereeing round and formulation of the Editorial Recommendation before proceeding with a resubmission.</strong>
               {% else %}
-                <button type="submit" name="submission" value="{{ submission.id }}"class="btn btn-primary py-1 mt-1">Resubmit this Submission</button>
+                <button type="submit" name="submission" value="{{ submission.id }}" class="btn btn-primary py-1 mt-1">Resubmit this Submission</button>
               {% endif %}
             </li>
           {% endfor %}
diff --git a/submissions/templates/submissions/submit_choose_journal.html b/submissions/templates/submissions/submit_choose_journal.html
new file mode 100644
index 000000000..de75e388c
--- /dev/null
+++ b/submissions/templates/submissions/submit_choose_journal.html
@@ -0,0 +1,69 @@
+{% extends 'submissions/base.html' %}
+
+{% load static %}
+{% load bootstrap %}
+{% load journals_extras %}
+
+{% block headsup %}
+  <style>{% for journal in journals %}{% if journal.style %}{{ journal.style }}{% endif %}{% endfor %}</style>
+{% endblock headsup %}
+
+{% block pagetitle %}: submit manuscript{% endblock pagetitle %}
+
+{% block breadcrumb_items %}
+  {{ block.super }}
+  <span class="breadcrumb-item">Submit a manuscript</span>
+{% endblock %}
+
+{% block content %}
+  <div class="row">
+    <div class="col-12">
+      <h1 class="highlight">Submit a manuscript to SciPost</h1>
+    </div>
+
+    <div class="col-12">
+      <p class="mb-1">
+        Before submitting, make sure you agree with the <a href="{% url 'journals:journals_terms_and_conditions' %}">SciPost Journals Terms and Conditions</a>.
+      </p>
+      <p class="mb-1">
+        You should also make sure you understand the <a href="{% url 'submissions:sub_and_ref_procedure' %}#pwr">refereeing procedure</a> and its open aspect.
+      </p>
+      <p class="mb-1">
+        In particular, make sure you are familiar with the <a href="{% url 'journals:journals_terms_and_conditions' %}#license_and_copyright_agreement">license and copyright agreement</a> and the <a href="{% url 'journals:journals_terms_and_conditions' %}#author_obligations"> author obligations</a>.
+      </p>
+      <p>
+        Please prepare your manuscript according to the <a href="{% url 'submissions:author_guidelines' %}">author guidelines</a>.
+      </p>
+    </div>
+  </div>
+
+  {% if perms.scipost.can_submit_manuscript %}
+
+    <h2>Which Journal do you wish to submit to?</h2>
+    <br>
+    <div class="card-columns">
+      {% for journal in journals %}
+	<div class="card">
+	  <div class="card-header {{ journal.doi_label }}">
+	    <h3 class="m-2"><a href="{{ journal.get_absolute_url }}">{{ journal.name }}</a>
+	      {% if journal.has_DOAJ_Seal %}
+		<a href="https://doaj.org" class="float-right"><img src="{% static 'scipost/images/DOAJ_Seal_logo_big.png' %}" alt="DOAJ Seal" width="20em"></a>
+	      {% endif %}
+	    </h3>
+	  </div>
+	  <div class="card-body">
+	    <a class="btn btn-outline-primary m-2" role="button" href="{{ journal.get_absolute_url }}/about" target="_blank"><em>View Description, Scope, Content and Acceptance Criteria</em></a>
+	    {% if thread_hash %}
+	      <a class="btn btn-primary m-2" role="button" href="{% url 'submissions:submit_choose_preprint_server' journal_doi_label=journal.doi_label thread_hash=thread_hash %}"><i class="fa fa-arrow-right"></i> Submit to {{ journal.name }}</a>
+	    {% else %}
+	      <a class="btn btn-primary m-2" role="button" href="{% url 'submissions:submit_choose_preprint_server' journal_doi_label=journal.doi_label %}"><i class="fa fa-arrow-right"></i> Submit to {{ journal.name }}</a>
+	    {% endif %}
+	  </div>
+	</div>
+      {% endfor %}
+    </div>
+
+  {% else %}
+      <h3>You are currently not allowed to submit a manuscript.</h3>
+  {% endif %}
+{% endblock content %}
diff --git a/submissions/templates/submissions/submit_choose_preprint_server.html b/submissions/templates/submissions/submit_choose_preprint_server.html
new file mode 100644
index 000000000..1e558a37b
--- /dev/null
+++ b/submissions/templates/submissions/submit_choose_preprint_server.html
@@ -0,0 +1,78 @@
+{% extends 'submissions/base.html' %}
+
+{% load static %}
+{% load bootstrap %}
+{% load journals_extras %}
+
+{% block pagetitle %}: submit manuscript{% endblock pagetitle %}
+
+{% block breadcrumb_items %}
+  {{ block.super }}
+  <span class="breadcrumb-item">Submit a manuscript</span>
+{% endblock %}
+
+{% block content %}
+  <div class="row">
+    <div class="col-12">
+      <h1 class="highlight">Submit a manuscript to SciPost</h1>
+    </div>
+
+    <div class="col-12">
+      <p class="mb-1">
+        Before submitting, make sure you agree with the <a href="{% url 'journals:journals_terms_and_conditions' %}">SciPost Journals Terms and Conditions</a>.
+      </p>
+      <p class="mb-1">
+        You should also make sure you understand the <a href="{% url 'submissions:sub_and_ref_procedure' %}#pwr">refereeing procedure</a> and its open aspect.
+      </p>
+      <p class="mb-1">
+        In particular, make sure you are familiar with the <a href="{% url 'journals:journals_terms_and_conditions' %}#license_and_copyright_agreement">license and copyright agreement</a> and the <a href="{% url 'journals:journals_terms_and_conditions' %}#author_obligations"> author obligations</a>.
+      </p>
+      <p>
+        Please prepare your manuscript according to the <a href="{% url 'submissions:author_guidelines' %}">author guidelines</a>.
+      </p>
+    </div>
+  </div>
+
+  {% if perms.scipost.can_submit_manuscript %}
+
+    {% if preprint_servers|length > 1 %}
+      <h2>Which preprint server do you wish to use?</h2>
+    {% else %}
+      <h2>TODO: proceed directly, only SciPost server is available</h2>
+    {% endif %}
+    <br>
+    <div class="card-columns">
+      {% for server in preprint_servers %}
+	<div class="card">
+	  <div class="card-header">
+	    <h3>Submit via {{ server }}</h3>
+	  </div>
+	  <div class="card-body">
+	    {% if server.name == 'SciPost' %}
+	      {% if thread_hash %}
+		<a class="btn btn-success text-white" role="button" href="{% url 'submissions:submit_manuscript_scipost' journal_doi_label=journal.doi_label thread_hash=thread_hash %}"><i class="fa fa-arrow-right"></i> Go to the SciPost submission form</a>
+	      {% else %}
+		<a class="btn btn-success text-white" role="button" href="{% url 'submissions:submit_manuscript_scipost' journal_doi_label=journal.doi_label %}"><i class="fa fa-arrow-right"></i> Go to the SciPost submission form</a>
+	      {% endif %}
+	    {% elif server.name == 'arXiv' %}
+              <h3>arXiv identifier for your Submission</h3>
+              <p><em>Give the identifier without prefix but with version number, ####.####(#)v#(#)</em></p>
+	      {% if thread_hash %}
+		<form action="{% url 'submissions:submit_manuscript_arxiv' journal_doi_label=journal.doi_label thread_hash=thread_hash %}" method="get">
+	      {% else %}
+		  <form action="{% url 'submissions:submit_manuscript_arxiv' journal_doi_label=journal.doi_label %}" method="get">
+	      {% endif %}
+	      {{ arxiv_query_form }}
+	          <i class="fa fa-arrow-right"></i>
+		<input type="submit" class="btn btn-success text-white" value="Query arXiv"/>
+              </form>
+	    {% endif %}
+	  </div>
+	</div>
+      {% endfor %}
+    </div>
+
+  {% else %}
+      <h3>You are currently not allowed to submit a manuscript.</h3>
+  {% endif %}
+{% endblock content %}
diff --git a/submissions/templates/submissions/submit_manuscript.html b/submissions/templates/submissions/submit_manuscript.html
new file mode 100644
index 000000000..d4c1a8959
--- /dev/null
+++ b/submissions/templates/submissions/submit_manuscript.html
@@ -0,0 +1,113 @@
+{% extends 'submissions/base.html' %}
+
+{% load bootstrap %}
+{% load journals_extras %}
+
+{% block pagetitle %}: submit manuscript{% endblock pagetitle %}
+
+{% block breadcrumb_items %}
+  {{ block.super }}
+  <span class="breadcrumb-item">Submit a manuscript</span>
+{% endblock %}
+
+{% block content %}
+  <div class="row">
+    <div class="col-12">
+      <h1 class="highlight">Submit a manuscript to SciPost</h1>
+    </div>
+
+    <div class="col-12">
+      <p class="mb-1">
+        Before submitting, make sure you agree with the <a href="{% url 'journals:journals_terms_and_conditions' %}">SciPost Journals Terms and Conditions</a>.
+      </p>
+      <p class="mb-1">
+        You should also make sure you understand the <a href="{% url 'submissions:sub_and_ref_procedure' %}#pwr">refereeing procedure</a> and its open aspect.
+      </p>
+      <p class="mb-1">
+        In particular, make sure you are familiar with the <a href="{% url 'journals:journals_terms_and_conditions' %}#license_and_copyright_agreement">license and copyright agreement</a> and the <a href="{% url 'journals:journals_terms_and_conditions' %}#author_obligations"> author obligations</a>.
+      </p>
+      <p>
+        Please prepare your manuscript according to the <a href="{% url 'submissions:author_guidelines' %}">author guidelines</a>.
+      </p>
+    </div>
+  </div>
+
+  {% if perms.scipost.can_submit_manuscript %}
+
+    <h2 class="mb-4">Please choose one of the following routes:</h2>
+    <div class="card-columns">
+      {% if resubmission_candidates %}
+	<div class="card">
+	  <div class="card-header bg-primary text-white">
+	    <h3 class="p-2 m-0"><em>Resubmit</em></h3>
+	  </div>
+	  <div class="card-body">
+            <p>The system has found {{ resubmission_candidates|length|pluralize:'a Submission,Submissions' }} currently under evaluation, for which you are a verified author. If you wish to submit a new version of {{ resubmission_candidates|length|pluralize:'this Submission,one of these Submissions' }}, please use the associated "Resubmit" buttton below.</p>
+            <ul class="px-3 py-2">
+              {% for submission in resubmission_candidates %}
+		<li>
+		  <a href="{{ submission.get_absolute_url }}">{{ submission.title }}</a>
+		  <br>
+		  {{ submission.author_list }}
+		  <br>
+		  Preprint {{ submission.preprint.identifier_w_vn_nr }}
+		  <br>
+		  {% if not submission.open_for_resubmission %}
+                    <strong class="text-warning">This submission is still undergoing peer refereeing. Please wait until the closing of the previous refereeing round and formulation of the Editorial Recommendation before proceeding with a resubmission.</strong>
+		  {% else %}
+		    <a class="btn btn-outline-primary p-1 mt-0" role="button" href="{% url 'submissions:submit_choose_journal' discipline=submission.discipline thread_hash=submission.thread_hash %}"><i class="fa fa-arrow-right"></i> Resubmit</a>
+		  {% endif %}
+		</li>
+              {% endfor %}
+            </ul>
+	  </div>
+	</div>
+      {% endif %}
+
+
+      <div class="card">
+	<div class="card-header bg-success text-white">
+	  <h3 class="p-2 m-0">New Submission</h3>
+	</div>
+	<div class="card-body">
+	  {% for branch in scipost_disciplines %}
+	    {% with journals|journals_in_branch:branch.0 as journals_branch %}
+	      {% if journals_branch|length > 0%}
+		<h3>{{ branch.0 }}</h3>
+		<ul class="list list-unstyled">
+		  {% for discipline in branch.1 %}
+		    {% with journals_branch|journals_in_discipline:discipline.0 as journals_disc %}
+		      {% if journals_disc|length > 0 %}
+			<li class="list-unstyled-item m-2"><a class="btn btn-success text-white" role="button" href="{% url 'submissions:submit_choose_journal' discipline=discipline.0 %}"><i class="fa fa-arrow-right"></i> New submission in {{ discipline.1 }}</a></li>
+		      {% endif %}
+		    {% endwith %}
+		  {% endfor %}
+		</ul>
+	      {% endif %}
+	    {% endwith %}
+	  {% endfor %}
+	</div>
+      </div>
+
+      <!-- <div class="card">
+	   <div class="card-header">
+	   <h3 class="p-2 bg-success text-white"><em>New Submission</em></h3>
+	   <h3>Submit an arXiv preprint</h3>
+	   </div>
+	   <div class="card-body">
+	   </div>
+	   </div>
+	   <div class="card">
+	   <div class="card-header">
+	   <h3 class="p-2 bg-success text-white"><em>New Submission</em></h3>
+	   <h3>Submit directly to SciPost</h3>
+	   </div>
+	   <div class="card-body">
+	   </div>
+	   </div>
+	   </div> -->
+
+  {% else %}
+      <h3>You are currently not allowed to submit a manuscript.</h3>
+  {% endif %}
+{% endblock content %}
diff --git a/submissions/tests/test_views.py b/submissions/tests/test_views.py
index 3e9ef75ed..aabb128d2 100644
--- a/submissions/tests/test_views.py
+++ b/submissions/tests/test_views.py
@@ -16,7 +16,7 @@ from ..factories import UnassignedSubmissionFactory, EICassignedSubmissionFactor
                        ResubmittedSubmissionFactory, ResubmissionFactory,\
                        PublishedSubmissionFactory, DraftReportFactory,\
                        AcceptedRefereeInvitationFactory
-from ..forms import SubmissionIdentifierForm, ReportForm, SubmissionForm
+from ..forms import ArXivPrefillForm, ReportForm, SubmissionForm
 from ..models import Submission, Report, RefereeInvitation
 
 from journals.models import Journal
@@ -69,11 +69,11 @@ class BaseContributorTestCase(TestCase):
         )
 
 
-class PrefillUsingIdentifierTest(BaseContributorTestCase):
+class PrefillUsingArXivIdentifierTest(BaseContributorTestCase):
     def setUp(self):
         super().setUp()
         self.client = Client()
-        self.url = reverse('submissions:prefill_using_identifier')
+        self.url = reverse('submissions:submit_manuscript')
         self.assertTrue(self.client.login(username="Test", password="testpw"))
 
     # NOTED AS BROKEN 2019-11-08
@@ -89,7 +89,7 @@ class PrefillUsingIdentifierTest(BaseContributorTestCase):
 
     #     # Registered Contributor should get 200
     #     response = self.client.get(self.url)
-    #     self.assertIsInstance(response.context['form'], SubmissionIdentifierForm)
+    #     self.assertIsInstance(response.context['form'], ArXivPrefillForm)
     #     self.assertFalse(response.context['form'].is_valid())
     #     self.assertEqual(response.status_code, 200)
 
@@ -136,13 +136,13 @@ class PrefillUsingIdentifierTest(BaseContributorTestCase):
 #         client = Client()
 
 #         # Unauthorized request shouldn't be possible
-#         response = client.post(reverse('submissions:prefill_using_identifier'),
+#         response = client.post(reverse('submissions:submit_manuscript'),
 #                                {'identifier': TEST_SUBMISSION['identifier_w_vn_nr']})
 #         self.assertEqual(response.status_code, 403)
 
 #         # Registered Contributor should get 200; assuming prefiller is working properly
 #         self.assertTrue(client.login(username="Test", password="testpw"))
-#         response = client.post(reverse('submissions:prefill_using_identifier'),
+#         response = client.post(reverse('submissions:submit_manuscript'),
 #                                {'identifier': TEST_SUBMISSION['identifier_w_vn_nr']})
 #         self.assertEqual(response.status_code, 200)
 
@@ -184,7 +184,7 @@ class PrefillUsingIdentifierTest(BaseContributorTestCase):
     #     # Eventually this call should already give an error. Waiting for
     #     # Arxiv caller which is under construction [Jorran de Wit, 12 May 2017]
     #     self.assertTrue(client.login(username="Test", password="testpw"))
-    #     response = client.post(reverse('submissions:prefill_using_identifier'),
+    #     response = client.post(reverse('submissions:submit_manuscript'),
     #                            {'identifier': '1603.04689v1'})
     #     self.assertEqual(response.status_code, 200)
 
diff --git a/submissions/urls.py b/submissions/urls.py
index 01c0c5410..d6f13fdd3 100644
--- a/submissions/urls.py
+++ b/submissions/urls.py
@@ -3,14 +3,23 @@ __license__ = "AGPL v3"
 
 
 from django.conf.urls import url
-from django.urls import path
+from django.urls import path, register_converter
 from django.views.generic import TemplateView
 
+from scipost.constants import DISCIPLINES_REGEX
+from scipost.converters import DisciplineConverter
+from journals.converters import JournalDOILabelConverter
+from journals.regexes import JOURNAL_DOI_LABEL_REGEX
+
 from . import views
 from .constants import SUBMISSIONS_NO_VN_REGEX, SUBMISSIONS_COMPLETE_REGEX
 
 app_name = 'submissions'
 
+register_converter(DisciplineConverter, 'discipline')
+register_converter(JournalDOILabelConverter, 'journal_doi_label')
+
+
 urlpatterns = [
     # Autocomplete
     path(
@@ -120,16 +129,62 @@ urlpatterns = [
         views.report_pdf_compile, name='report_pdf_compile'),
 
     # Submission, resubmission, withdrawal
-    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'),
-    url(r'^submit_manuscript/arxiv$',
-        views.RequestSubmissionUsingArXivView.as_view(), name='submit_manuscript_arxiv'),
-    url(r'^submit_manuscript/prefill$',
-        views.prefill_using_arxiv_identifier, name='prefill_using_identifier'),
-    url(r'^withdraw_manuscript/{regex}/$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.withdraw_manuscript, name='withdraw_manuscript'),
+    path( # Start a new submission process; choose between resubmission or new submission
+        'submit_manuscript',
+        views.submit_manuscript,
+        name='submit_manuscript'
+    ),
+    path( # Choose journal
+        'submit/<discipline:discipline>',
+        views.submit_choose_journal,
+        name='submit_choose_journal'
+    ),
+    path( # Choose journal (resubmission)
+        'submit/<discipline:discipline>/<uuid:thread_hash>',
+        views.submit_choose_journal,
+        name='submit_choose_journal'
+    ),
+    path( # Choose preprint server
+        'submit/<journal_doi_label:journal_doi_label>',
+        views.submit_choose_preprint_server,
+        name='submit_choose_preprint_server'
+    ),
+    path( # Choose preprint server (resubmission)
+        'submit/<journal_doi_label:journal_doi_label>/<uuid:thread_hash>',
+        views.submit_choose_preprint_server,
+        name='submit_choose_preprint_server'
+    ),
+
+    path( # Submit using the SciPost preprint server (new submission)
+        'submit_manuscript/<journal_doi_label:journal_doi_label>/scipost',
+        views.RequestSubmissionUsingSciPostView.as_view(),
+        name='submit_manuscript_scipost'
+    ),
+    path( # Submit using the SciPost preprint server (resubmission)
+        'submit_manuscript/<journal_doi_label:journal_doi_label>/scipost/<uuid:thread_hash>',
+        views.RequestSubmissionUsingSciPostView.as_view(),
+        name='submit_manuscript_scipost'
+    ),
+    path( # Submit or resubmit using arXiv
+        'submit_manuscript/<journal_doi_label:journal_doi_label>/arxiv',
+        views.RequestSubmissionUsingArXivView.as_view(),
+        name='submit_manuscript_arxiv'
+    ),
+    path( # Submit or resubmit using arXiv (resubmission)
+        'submit_manuscript/<journal_doi_label:journal_doi_label>/arxiv/<uuid:thread_hash>',
+        views.RequestSubmissionUsingArXivView.as_view(),
+        name='submit_manuscript_arxiv'
+    ),
+    url( # Redirects to the appropriate Submit page, prefilling form
+        r'^resubmit_manuscript/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
+        views.resubmit_manuscript,
+        name='resubmit_manuscript'
+    ),
+    url(
+        r'^withdraw_manuscript/{regex}/$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
+        views.withdraw_manuscript,
+        name='withdraw_manuscript'
+    ),
 
     # Pool
     url(r'^pool/$', views.pool, name='pool'),
diff --git a/submissions/views.py b/submissions/views.py
index dfc14d062..c9098fb8a 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -34,12 +34,13 @@ from .constants import (
     EIC_REC_PUBLISH, EIC_REC_REJECT, DECISION_FIXED)
 from .helpers import check_verified_author, check_unverified_author
 from .models import (
-    Submission, EICRecommendation, SubmissionTiering, AlternativeRecommendation,
+    Submission, PreprintServer,
+    EICRecommendation, SubmissionTiering, AlternativeRecommendation,
     EditorialDecision,
     EditorialAssignment, RefereeInvitation, Report, SubmissionEvent)
 from .mixins import SubmissionMixin, SubmissionAdminViewMixin
 from .forms import (
-    SubmissionIdentifierForm, SubmissionForm, SubmissionSearchForm, RecommendationVoteForm,
+    ArXivPrefillForm, SubmissionForm, SubmissionSearchForm, RecommendationVoteForm,
     ConsiderAssignmentForm, InviteEditorialAssignmentForm, EditorialAssignmentForm, VetReportForm,
     SetRefereeingDeadlineForm, RefereeSearchForm,
     iThenticateReportForm, VotingEligibilityForm, WithdrawSubmissionForm,
@@ -116,39 +117,83 @@ class SubmissionAutocompleteView(autocomplete.Select2QuerySetView):
 ###############
 # SUBMISSIONS:
 ###############
+
 @login_required
-@is_contributor_user()
-def resubmit_manuscript(request):
+@permission_required('scipost.can_submit_manuscript', raise_exception=True)
+def submit_manuscript(request):
     """
-    Choose which Submission to resubmit if Submission is available.
-
-    On POST, redirect to submit page.
+    Initiate submission by choosing either resubmission or new submission process.
     """
-    submissions = get_list_or_404(
-        Submission.objects.candidate_for_resubmission(request.user))
-    if request.POST and request.POST.get('submission'):
-        if request.POST['submission'] == 'new':
-            return redirect(reverse('submissions:submit_manuscript_scipost') + '?resubmission=false')
+    # For each integrated preprint server, redirect to appropriate view
+    context = {
+        'journals': Journal.objects.submission_allowed(),
+        'resubmission_candidates': Submission.objects.candidate_for_resubmission(request.user)
+    }
+    return render(request, 'submissions/submit_manuscript.html', context)
 
-        last_submission = Submission.objects.candidate_for_resubmission(request.user).filter(
-            id=request.POST['submission']).first()
 
-        if last_submission:
-            if last_submission.preprint.scipost_preprint_identifier:
-                # Determine right preprint-view.
-                extra_param = '?resubmission={}'.format(request.POST['submission'])
-                return redirect(reverse('submissions:submit_manuscript_scipost') + extra_param)
-            else:
-                extra_param = '?identifier_w_vn_nr={}'.format(
-                    last_submission.preprint.identifier_w_vn_nr)
-                return redirect(reverse('submissions:submit_manuscript') + extra_param)
+@login_required
+@permission_required('scipost.can_submit_manuscript', raise_exception=True)
+def submit_choose_journal(request, discipline=None, thread_hash=None):
+    journals = Journal.objects.submission_allowed()
+    if discipline:
+        journals = journals.filter(discipline=discipline)
+    context = {
+        'journals': journals,
+    }
+    if thread_hash:
+        context['thread_hash'] = thread_hash
+    return render(request, 'submissions/submit_choose_journal.html', context)
+
+
+@login_required
+@permission_required('scipost.can_submit_manuscript', raise_exception=True)
+def submit_choose_preprint_server(request, journal_doi_label, thread_hash=None):
+    journal = get_object_or_404(Journal, doi_label=journal_doi_label)
+    preprint_servers = PreprintServer.objects.filter(disciplines__contains=[journal.discipline])
+    arxiv_query_form = ArXivPrefillForm(
+        requested_by=request.user, thread_hash=thread_hash, journal_doi_label=journal_doi_label)
+    context = {
+        'journal': journal,
+        'preprint_servers': preprint_servers,
+        'arxiv_query_form': arxiv_query_form,
+    }
+    if thread_hash:
+        context['thread_hash'] = thread_hash
+    return render(request, 'submissions/submit_choose_preprint_server.html', context)
+
+
+@login_required
+@permission_required('scipost.can_submit_manuscript', raise_exception=True)
+def submit_manuscript_DEPREC(request):
+    """Form view asking for the arXiv ID related to the new Submission to submit."""
+    query_form = ArXivPrefillForm(
+        request.POST or None, initial=request.GET or None,
+        requested_by=request.user)
+
+    if query_form.is_valid():
+        # Submit message to user
+        if query_form.service.is_resubmission():
+            resubmessage = ('There already exists a preprint with this arXiv identifier '
+                            'but a different version number. \nYour Submission will be '
+                            'handled as a resubmission.')
+            messages.success(request, resubmessage, fail_silently=True)
         else:
-            # POST request invalid. Try again with GET request.
-            return redirect('submissions:resubmit_manuscript')
+            messages.success(request, strings.acknowledge_arxiv_query, fail_silently=True)
+
+        response = redirect('submissions:submit_manuscript_arxiv')
+        response['location'] += '?identifier_w_vn_nr={}'.format(
+            query_form.cleaned_data['identifier_w_vn_nr'])
+        return response
+
     context = {
-        'submissions': submissions,
+        'form': query_form,
+        'expected_resubmissions': \
+        #request.user.contributor.submitted_submissions.revision_requested()
+        Submission.objects.public_newest().revision_requested()[:4]
+        #Submission.objects.candidate_for_resubmission(request.user)
     }
-    return render(request, 'submissions/submission_resubmission_candidates.html', context)
+    return render(request, 'submissions/submission_prefill_form.html', context)
 
 
 class RequestSubmissionView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
@@ -206,19 +251,35 @@ class RequestSubmissionView(LoginRequiredMixin, PermissionRequiredMixin, CreateV
 class RequestSubmissionUsingArXivView(RequestSubmissionView):
     """Formview to submit a new Submission using arXiv."""
 
-    def get(self, request):
+    def get(self, request, journal_doi_label, thread_hash=None):
         """
         Redirect to the arXiv prefill form if arXiv ID is not known.
         """
-        form = SubmissionIdentifierForm(request.GET or None, requested_by=self.request.user)
+        form = ArXivPrefillForm(
+            request.GET or None,
+            requested_by=self.request.user,
+            journal_doi_label=journal_doi_label,
+            thread_hash=thread_hash)
         if form.is_valid():
+            if form.service.is_resubmission():
+                resubmessage = ('An earlier preprint was found within this submission thread.'
+                                '\nYour Submission will be handled as a resubmission.')
+                messages.success(request, resubmessage, fail_silently=True)
+            else:
+                messages.success(request, strings.acknowledge_arxiv_query, fail_silently=True)
             # Gather data from ArXiv API if prefill form is valid
             self.initial_data = form.get_initial_submission_data()
             return super().get(request)
         else:
             for code, err in form.errors.items():
                 messages.warning(request, err[0])
-            return redirect('submissions:prefill_using_identifier')
+            kwargs = { 'journal_doi_label': journal_doi_label }
+            if thread_hash:
+                kwargs['thread_hash'] = thread_hash
+            return redirect(
+                'submissions:submit_choose_preprint_server',
+                **kwargs
+            )
 
     def get_form_kwargs(self):
         """Form requires extra kwargs."""
@@ -230,47 +291,51 @@ class RequestSubmissionUsingArXivView(RequestSubmissionView):
 class RequestSubmissionUsingSciPostView(RequestSubmissionView):
     """Formview to submit a new Submission using SciPost's preprint server."""
 
-    def get(self, request):
-        """Check for possible Resubmissions before dispatching."""
-        if Submission.objects.candidate_for_resubmission(request.user).exists():
-            if not request.GET.get('resubmission'):
-                return redirect('submissions:resubmit_manuscript')
+    def get(self, request, journal_doi_label, thread_hash=None):
         return super().get(request)
 
     def get_form_kwargs(self):
         """Form requires extra kwargs."""
         kwargs = super().get_form_kwargs()
-        # kwargs['use_arxiv_preprint'] = False
+        if hasattr(self, 'thread_hash'):
+            kwargs['initial']['thread_hash'] = self.thread_hash
         kwargs['preprint_server'] = 'scipost'
         return kwargs
 
 
 @login_required
-@permission_required('scipost.can_submit_manuscript', raise_exception=True)
-def prefill_using_arxiv_identifier(request):
-    """Form view asking for the arXiv ID related to the new Submission to submit."""
-    query_form = SubmissionIdentifierForm(request.POST or None, initial=request.GET or None,
-                                          requested_by=request.user)
+@is_contributor_user()
+def resubmit_manuscript(request, identifier_w_vn_nr):
+    """
+    Choose which Submission to resubmit if Submission is available.
 
-    if query_form.is_valid():
-        # Submit message to user
-        if query_form.service.is_resubmission():
-            resubmessage = ('There already exists a preprint with this arXiv identifier '
-                            'but a different version number. \nYour Submission will be '
-                            'handled as a resubmission.')
-            messages.success(request, resubmessage, fail_silently=True)
-        else:
-            messages.success(request, strings.acknowledge_arxiv_query, fail_silently=True)
+    On POST, redirect to submit page.
+    """
+    submissions = get_list_or_404(
+        Submission.objects.candidate_for_resubmission(request.user))
+    if request.POST and request.POST.get('submission'):
+        if request.POST['submission'] == 'new':
+            return redirect(reverse('submissions:submit_manuscript_scipost') + '?resubmission=false')
 
-        response = redirect('submissions:submit_manuscript_arxiv')
-        response['location'] += '?identifier_w_vn_nr={}'.format(
-            query_form.cleaned_data['identifier_w_vn_nr'])
-        return response
+        last_submission = Submission.objects.candidate_for_resubmission(request.user).filter(
+            id=request.POST['submission']).first()
 
+        if last_submission:
+            if last_submission.preprint.scipost_preprint_identifier:
+                # Determine right preprint-view.
+                extra_param = '?resubmission={}'.format(request.POST['submission'])
+                return redirect(reverse('submissions:submit_manuscript_scipost') + extra_param)
+            else:
+                extra_param = '?identifier_w_vn_nr={}'.format(
+                    last_submission.preprint.identifier_w_vn_nr)
+                return redirect(reverse('submissions:submit_manuscript') + extra_param)
+        else:
+            # POST request invalid. Try again with GET request.
+            return redirect('submissions:resubmit_manuscript')
     context = {
-        'form': query_form,
+        'submissions': submissions,
     }
-    return render(request, 'submissions/submission_prefill_form.html', context)
+    return render(request, 'submissions/submission_resubmission_candidates.html', context)
 
 
 @login_required
-- 
GitLab