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