From c174cf0cf007545b94c4f4bc666bb0b436e08ed4 Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Tue, 19 Jun 2018 08:28:01 +0200
Subject: [PATCH] Preprint server in progress

---
 .../migrations/0004_auto_20180619_0821.py     | 30 +++++++++
 .../migrations/0005_auto_20180619_0822.py     | 32 ++++++++++
 .../0006_remove_preprint_submission.py        | 19 ++++++
 preprints/models.py                           |  2 -
 scipost/templates/scipost/bare_base.html      |  4 +-
 submissions/admin.py                          |  7 +--
 submissions/forms.py                          | 62 ++++++++++++-------
 .../migrations/0026_auto_20180619_0821.py     | 22 +++++++
 .../migrations/0027_auto_20180619_0825.py     | 21 +++++++
 .../migrations/0028_auto_20180619_0826.py     | 21 +++++++
 submissions/models.py                         | 15 +++--
 .../submissions/submission_form.html          |  4 +-
 submissions/views.py                          |  3 +-
 13 files changed, 201 insertions(+), 41 deletions(-)
 create mode 100644 preprints/migrations/0004_auto_20180619_0821.py
 create mode 100644 preprints/migrations/0005_auto_20180619_0822.py
 create mode 100644 preprints/migrations/0006_remove_preprint_submission.py
 create mode 100644 submissions/migrations/0026_auto_20180619_0821.py
 create mode 100644 submissions/migrations/0027_auto_20180619_0825.py
 create mode 100644 submissions/migrations/0028_auto_20180619_0826.py

diff --git a/preprints/migrations/0004_auto_20180619_0821.py b/preprints/migrations/0004_auto_20180619_0821.py
new file mode 100644
index 000000000..fcd835a44
--- /dev/null
+++ b/preprints/migrations/0004_auto_20180619_0821.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-06-19 06:21
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('preprints', '0003_auto_20180610_2020'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='preprint',
+            name='_file',
+            field=models.FileField(blank=True, help_text='Preprint file for SciPost standalone preprints', max_length=200, upload_to='UPLOADS/PREPRINTS/%Y/%m/', verbose_name='Preprint file'),
+        ),
+        migrations.AlterField(
+            model_name='preprint',
+            name='scipost_preprint_identifier',
+            field=models.PositiveIntegerField(blank=True, help_text='Unique identifier for SciPost standalone preprints', null=True, verbose_name='SciPost preprint ID'),
+        ),
+        migrations.AlterField(
+            model_name='preprint',
+            name='vn_nr',
+            field=models.PositiveSmallIntegerField(default=1, verbose_name='Version number'),
+        ),
+    ]
diff --git a/preprints/migrations/0005_auto_20180619_0822.py b/preprints/migrations/0005_auto_20180619_0822.py
new file mode 100644
index 000000000..812dd9ebd
--- /dev/null
+++ b/preprints/migrations/0005_auto_20180619_0822.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-06-19 06:22
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+def remove_all_preprints(apps, schema_editor):
+    Preprint = apps.get_model('preprints', 'Preprint')
+    Preprint.objects.all().delete()
+    return
+
+
+def move_preprint_relations(apps, schema_editor):
+    """Move fk relation to Submission table."""
+    Preprint = apps.get_model('preprints', 'Preprint')
+    Submission = apps.get_model('submissions', 'Submission')
+
+    for preprint in Preprint.objects.all():
+        Submission.objects.filter(id=preprint.submission.id).update(preprint2=preprint)
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('preprints', '0004_auto_20180619_0821'),
+        ('submissions', '0026_auto_20180619_0821'),
+    ]
+
+    operations = [
+        migrations.RunPython(move_preprint_relations, remove_all_preprints),
+    ]
diff --git a/preprints/migrations/0006_remove_preprint_submission.py b/preprints/migrations/0006_remove_preprint_submission.py
new file mode 100644
index 000000000..d9d132732
--- /dev/null
+++ b/preprints/migrations/0006_remove_preprint_submission.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-06-19 06:25
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('preprints', '0005_auto_20180619_0822'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='preprint',
+            name='submission',
+        ),
+    ]
diff --git a/preprints/models.py b/preprints/models.py
index 75735cfd1..6a10c06a6 100644
--- a/preprints/models.py
+++ b/preprints/models.py
@@ -14,8 +14,6 @@ class Preprint(models.Model):
     should be filled. Else, these fields should be left blank.
     """
 
-    submission = models.OneToOneField('submissions.Submission', related_name='preprint')
-
     # (ArXiv) identifiers with/without version number
     identifier_w_vn_nr = models.CharField(max_length=25)
     identifier_wo_vn_nr = models.CharField(max_length=25)
diff --git a/scipost/templates/scipost/bare_base.html b/scipost/templates/scipost/bare_base.html
index 5efb4b3ae..c8ea52e70 100644
--- a/scipost/templates/scipost/bare_base.html
+++ b/scipost/templates/scipost/bare_base.html
@@ -9,8 +9,8 @@
     <link href="https://fonts.googleapis.com/css?family=Merriweather+Sans:300,400,700" rel="stylesheet">
     <link rel="stylesheet" type="text/css" href="{% static 'scipost/SciPost.css' %}" />
     <link rel="stylesheet" type="text/css" href="{% static 'fa/css/font-awesome.min.css' %}" />
-    <script async src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
-    <script async src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
+    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
+    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
 
     {% render_bundle 'main' 'css' %}
 
diff --git a/submissions/admin.py b/submissions/admin.py
index 98fcdee2c..0093b68d4 100644
--- a/submissions/admin.py
+++ b/submissions/admin.py
@@ -22,11 +22,6 @@ def submission_short_title(obj):
 admin.site.register(iThenticateReport)
 
 
-class PreprintInline(admin.TabularInline):
-    model = Preprint
-    extra = 0
-
-
 class SubmissionAdminForm(forms.ModelForm):
     authors = forms.ModelMultipleChoiceField(
         required=False,
@@ -46,7 +41,6 @@ class SubmissionAdminForm(forms.ModelForm):
 class SubmissionAdmin(GuardedModelAdmin):
     date_hierarchy = 'submission_date'
     form = SubmissionAdminForm
-    inlines = [PreprintInline]
     list_display = ('title', 'author_list', 'status', 'submission_date', 'publication')
     list_filter = ('status', 'discipline', 'submission_type', 'submitted_to_journal')
     search_fields = ['submitted_by__user__last_name', 'title', 'author_list', 'abstract']
@@ -63,6 +57,7 @@ class SubmissionAdmin(GuardedModelAdmin):
     fieldsets = (
         (None, {
             'fields': (
+                'preprint',
                 'publication',
                 'title',
                 'abstract',
diff --git a/submissions/forms.py b/submissions/forms.py
index 9b60ad98e..ff206f004 100644
--- a/submissions/forms.py
+++ b/submissions/forms.py
@@ -29,6 +29,7 @@ from common.helpers import get_new_secrets_key
 from colleges.models import Fellowship
 from invitations.models import RegistrationInvitation
 from journals.constants import SCIPOST_JOURNAL_PHYSICS_PROC, SCIPOST_JOURNAL_PHYSICS
+from preprints.models import Preprint
 from production.utils import get_or_create_production_stream
 from scipost.constants import SCIPOST_SUBJECT_AREAS, INVITATION_REFEREEING
 from scipost.services import ArxivCaller
@@ -118,8 +119,8 @@ class SubmissionChecks:
     def _call_arxiv(self, identifier):
         caller = ArxivCaller(identifier)
         if caller.is_valid:
-            self.arxiv_data = ArxivCaller(identifier).data
-            self.metadata = ArxivCaller(identifier).metadata
+            self.arxiv_data = caller.data
+            self.metadata = caller.metadata
         else:
             error_message = 'A preprint associated to this identifier does not exist.'
             raise forms.ValidationError(error_message)
@@ -141,7 +142,7 @@ class SubmissionChecks:
         """Check if previous submitted versions have the appropriate status."""
         identifiers = self.identifier_into_parts(identifier)
         submission = (Submission.objects
-                      .filter(preprint__identifier_wo_vn_nr=identifiers['arxiv_identifier_wo_vn_nr'])
+                      .filter(preprint__identifier_wo_vn_nr=identifiers['identifier_wo_vn_nr'])
                       .order_by('preprint__vn_nr').last())
 
         # If submissions are found; check their statuses
@@ -193,9 +194,9 @@ class SubmissionChecks:
     def identifier_into_parts(self, identifier):
         """Split the arXiv identifier into parts."""
         data = {
-            'arxiv_identifier_w_vn_nr': identifier,
-            'arxiv_identifier_wo_vn_nr': identifier.rpartition('v')[0],
-            'arxiv_vn_nr': int(identifier.rpartition('v')[2])
+            'identifier_w_vn_nr': identifier,
+            'identifier_wo_vn_nr': identifier.rpartition('v')[0],
+            'vn_nr': int(identifier.rpartition('v')[2])
         }
         return data
 
@@ -211,14 +212,14 @@ class SubmissionIdentifierForm(SubmissionChecks, forms.Form):
     """Prefill SubmissionForm using this form that takes an arXiv ID only."""
     IDENTIFIER_PLACEHOLDER = 'new style (with version nr) ####.####(#)v#(#)'
 
-    identifier = forms.RegexField(regex=IDENTIFIER_PATTERN_NEW, strip=True,
-                                  #   help_text=strings.arxiv_query_help_text,
-                                  error_messages={'invalid': strings.arxiv_query_invalid},
-                                  widget=forms.TextInput({'placeholder': IDENTIFIER_PLACEHOLDER}))
+    identifier_w_vn_nr = forms.RegexField(
+        regex=IDENTIFIER_PATTERN_NEW, strip=True,
+        error_messages={'invalid': strings.arxiv_query_invalid},
+        widget=forms.TextInput({'placeholder': IDENTIFIER_PLACEHOLDER}))
 
-    def clean_identifier(self):
+    def clean_identifier_w_vn_nr(self):
         """Do basic prechecks based on the arXiv ID only."""
-        identifier = self.cleaned_data['identifier']
+        identifier = self.cleaned_data['identifier_w_vn_nr']
         self.do_pre_checks(identifier)
         return identifier
 
@@ -241,7 +242,8 @@ class SubmissionIdentifierForm(SubmissionChecks, forms.Form):
     def request_arxiv_preprint_form_prefill_data(self):
         """Return dictionary to prefill `RequestSubmissionForm`."""
         form_data = self.arxiv_data
-        form_data.update(self.identifier_into_parts(self.cleaned_data['identifier']))
+        form_data['identifier_w_vn_nr'] = self.cleaned_data['identifier_w_vn_nr']
+        # form_data.update(self.identifier_into_parts(self.cleaned_data['identifier']))
         if self.submission_is_resubmission():
             form_data.update(self._gather_data_from_last_submission())
         return form_data
@@ -250,9 +252,10 @@ class SubmissionIdentifierForm(SubmissionChecks, forms.Form):
 class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
     """Form to submit a new Submission."""
 
-    arxiv_identifier_w_vn_nr = 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'}))
+    preprint_file = forms.FileField()
 
     class Meta:
         model = Submission
@@ -280,7 +283,7 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
             'is_resubmission': forms.HiddenInput(),
             'secondary_areas': forms.SelectMultiple(choices=SCIPOST_SUBJECT_AREAS),
             'remarks_for_editors': forms.TextInput(
-                attrs={'placeholder': 'Any private remarks (for the editors only)'}),
+                attrs={'placeholder': 'Any private remarks (for the editors only)', 'rows': 3}),
             'referees_suggested': forms.TextInput(
                 attrs={'placeholder': 'Optional: names of suggested referees', 'rows': 3}),
             'referees_flagged': forms.TextInput(
@@ -288,8 +291,11 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
         }
 
     def __init__(self, *args, **kwargs):
+        self.use_arxiv_preprint = kwargs.pop('use_arxiv_preprint', True)
+
         super().__init__(*args, **kwargs)
 
+        # Alter resubmission-dependent fields
         if not self.submission_is_resubmission():
             # These fields are only available for resubmissions
             del self.fields['author_comments']
@@ -300,6 +306,12 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
             self.fields['list_of_changes'].widget.attrs.update({
                 'placeholder': 'Give a point-by-point list of changes (will be viewable online)'})
 
+        # ArXiv or SciPost preprint fields
+        if self.use_arxiv_preprint:
+            del self.fields['preprint_file']
+        else:
+            del self.fields['arxiv_link']
+
         # Proceedings submission fields
         qs = self.fields['proceedings'].queryset.open_for_submission()
         self.fields['proceedings'].queryset = qs
@@ -319,9 +331,9 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
     def clean(self, *args, **kwargs):
         """Do all prechecks which are also done in the prefiller."""
         cleaned_data = super().clean(*args, **kwargs)
-        self.do_pre_checks(cleaned_data['arxiv_identifier_w_vn_nr'])
-        self.arxiv_meets_regex(cleaned_data['arxiv_identifier_w_vn_nr'],
-                               cleaned_data['submitted_to_journal'])
+        self.do_pre_checks(cleaned_data['identifier_w_vn_nr'])
+        self.arxiv_meets_regex(
+            cleaned_data['identifier_w_vn_nr'], cleaned_data['submitted_to_journal'])
 
         if self.cleaned_data['submitted_to_journal'] != SCIPOST_JOURNAL_PHYSICS_PROC:
             try:
@@ -413,11 +425,6 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
         # Save metadata directly from ArXiv call without possible user interception
         submission.metadata = self.metadata
 
-        # Update identifiers
-        identifiers = self.identifier_into_parts(submission.arxiv_identifier_w_vn_nr)
-        submission.arxiv_identifier_wo_vn_nr = identifiers['arxiv_identifier_wo_vn_nr']
-        submission.arxiv_vn_nr = identifiers['arxiv_vn_nr']
-
         if self.submission_is_resubmission():
             # Reset Refereeing Cycle. EIC needs to pick a cycle on resubmission.
             submission.refereeing_cycle = CYCLE_UNDETERMINED
@@ -428,6 +435,15 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm):
             # Save!
             submission.save()
 
+        # Save identifiers
+        identifiers = self.identifier_into_parts(self.cleaned_data['identifier_w_vn_nr'])
+        Preprint.objects.get_or_create(
+            submission=submission,
+            identifier_w_vn_nr=identifiers['identifier_w_vn_nr'],
+            identifier_wo_vn_nr=identifiers['identifier_wo_vn_nr'],
+            vn_nr=identifiers['vn_nr'],
+            url=self.cleaned_data['arxiv_link'])
+
         # Gather first known author and Fellows.
         submission.authors.add(self.requested_by.contributor)
         self.set_pool(submission)
diff --git a/submissions/migrations/0026_auto_20180619_0821.py b/submissions/migrations/0026_auto_20180619_0821.py
new file mode 100644
index 000000000..2bbef1451
--- /dev/null
+++ b/submissions/migrations/0026_auto_20180619_0821.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-06-19 06:21
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('preprints', '0004_auto_20180619_0821'),
+        ('submissions', '0025_auto_20180520_1430'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='submission',
+            name='preprint2',
+            field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='submission2', to='preprints.Preprint'),
+        ),
+    ]
diff --git a/submissions/migrations/0027_auto_20180619_0825.py b/submissions/migrations/0027_auto_20180619_0825.py
new file mode 100644
index 000000000..bfd12c1b5
--- /dev/null
+++ b/submissions/migrations/0027_auto_20180619_0825.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-06-19 06:25
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('submissions', '0026_auto_20180619_0821'),
+        ('preprints', '0006_remove_preprint_submission'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='submission',
+            old_name='preprint2',
+            new_name='preprint',
+        ),
+    ]
diff --git a/submissions/migrations/0028_auto_20180619_0826.py b/submissions/migrations/0028_auto_20180619_0826.py
new file mode 100644
index 000000000..c15b27d78
--- /dev/null
+++ b/submissions/migrations/0028_auto_20180619_0826.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-06-19 06:26
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('submissions', '0027_auto_20180619_0825'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='submission',
+            name='preprint',
+            field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='submission', to='preprints.Preprint'),
+        ),
+    ]
diff --git a/submissions/models.py b/submissions/models.py
index 748bd274c..f7d34928e 100644
--- a/submissions/models.py
+++ b/submissions/models.py
@@ -48,6 +48,8 @@ class Submission(models.Model):
     will directly be related to the latest Submission in the thread.
     """
 
+    preprint = models.OneToOneField('preprints.Preprint', related_name='submission')
+
     author_comments = models.TextField(blank=True)
     author_list = models.CharField(max_length=1000, verbose_name="author list")
     discipline = models.CharField(max_length=20, choices=SCIPOST_DISCIPLINES, default='physics')
@@ -127,15 +129,18 @@ class Submission(models.Model):
 
     objects = SubmissionQuerySet.as_manager()
 
+    # Temporary
+    needs_conflicts_update = models.BooleanField(default=False)
+
     class Meta:
         app_label = 'submissions'
 
     def save(self, *args, **kwargs):
         """Prefill some fields before saving."""
-        arxiv_w_vn = '{arxiv}v{version}'.format(
-            arxiv=self.arxiv_identifier_wo_vn_nr,
-            version=self.arxiv_vn_nr)
-        self.arxiv_identifier_w_vn_nr = arxiv_w_vn
+        # arxiv_w_vn = '{arxiv}v{version}'.format(
+        #     arxiv=self.arxiv_identifier_wo_vn_nr,
+        #     version=self.arxiv_vn_nr)
+        # self.arxiv_identifier_w_vn_nr = arxiv_w_vn
 
         obj = super().save(*args, **kwargs)
         if hasattr(self, 'cycle'):
@@ -227,7 +232,7 @@ class Submission(models.Model):
         return Submission.objects.filter(
             preprint__identifier_wo_vn_nr=self.preprint.identifier_wo_vn_nr).first().submission_date
 
-    @cached_property
+    @property
     def thread(self):
         """Return all (public) Submissions in the database in this ArXiv identifier series."""
         return Submission.objects.public().filter(
diff --git a/submissions/templates/submissions/submission_form.html b/submissions/templates/submissions/submission_form.html
index e223e2447..7c6391020 100644
--- a/submissions/templates/submissions/submission_form.html
+++ b/submissions/templates/submissions/submission_form.html
@@ -8,7 +8,7 @@
     <div class="container-outside header">
         <div class="container">
             <h1>Submit a manuscript to SciPost
-            {% if form.arxiv_identifier_w_vn_nr.value %} <span class="my-1 py-0 text-blue">{{form.arxiv_identifier_w_vn_nr.value}}{% if form.submission_is_resubmission %} <small>(resubmission)</small>{% endif %}</span>{% endif %}
+            {% if form.identifier_w_vn_nr.value %} <span class="my-1 py-0 text-blue">{{form.identifier_w_vn_nr.value}}{% if form.submission_is_resubmission %} <small>(resubmission)</small>{% endif %}</span>{% endif %}
             </h1>
         </div>
     </div>
@@ -62,7 +62,7 @@
             {% if form.arxiv_link %}
                 <form id="full_submission_form" action="{% url 'submissions:submit_manuscript' %}" method="post">
                     {% csrf_token %}
-                    {{form|bootstrap}}
+                    {{ form|bootstrap }}
                     <p>
                         By clicking on Submit, you state that you have read and agree with the <a href="{% url 'journals:journals_terms_and_conditions' %}">SciPost Journals Terms and Conditions</a>, 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>
diff --git a/submissions/views.py b/submissions/views.py
index 0386a09e7..af201f349 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -109,7 +109,8 @@ def prefill_using_arxiv_identifier(request):
                                           requested_by=request.user)
     if query_form.is_valid():
         prefill_data = query_form.request_arxiv_preprint_form_prefill_data()
-        form = RequestSubmissionForm(initial=prefill_data, requested_by=request.user)
+        form = RequestSubmissionForm(
+            initial=prefill_data, requested_by=request.user, use_arxiv_preprint=True)
 
         # Submit message to user
         if query_form.submission_is_resubmission():
-- 
GitLab