From 345cde25ebbebac3d542f05b95a12fb249d5f4d6 Mon Sep 17 00:00:00 2001 From: Jorran de Wit <jorrandewit@outlook.com> Date: Sat, 14 Apr 2018 18:28:30 +0200 Subject: [PATCH] Step 1: Update of fields. Contemplation required. --- .../migrations/0027_auto_20180414_1627.py | 21 ++++++++++ submissions/admin.py | 1 + submissions/constants.py | 37 ++++++++-------- submissions/managers.py | 7 +--- .../migrations/0011_auto_20180414_1627.py | 25 +++++++++++ .../migrations/0012_auto_20180414_1627.py | 38 +++++++++++++++++ .../migrations/0013_auto_20180414_1729.py | 30 +++++++++++++ .../migrations/0014_auto_20180414_1729.py | 42 +++++++++++++++++++ .../migrations/0015_auto_20180414_1742.py | 42 +++++++++++++++++++ .../migrations/0016_auto_20180414_1825.py | 20 +++++++++ submissions/models.py | 13 ++++-- 11 files changed, 250 insertions(+), 26 deletions(-) create mode 100644 journals/migrations/0027_auto_20180414_1627.py create mode 100644 submissions/migrations/0011_auto_20180414_1627.py create mode 100644 submissions/migrations/0012_auto_20180414_1627.py create mode 100644 submissions/migrations/0013_auto_20180414_1729.py create mode 100644 submissions/migrations/0014_auto_20180414_1729.py create mode 100644 submissions/migrations/0015_auto_20180414_1742.py create mode 100644 submissions/migrations/0016_auto_20180414_1825.py diff --git a/journals/migrations/0027_auto_20180414_1627.py b/journals/migrations/0027_auto_20180414_1627.py new file mode 100644 index 000000000..de6436d56 --- /dev/null +++ b/journals/migrations/0027_auto_20180414_1627.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-04-14 14:27 +from __future__ import unicode_literals + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('journals', '0026_auto_20180327_1937'), + ] + + operations = [ + migrations.AlterField( + model_name='publication', + name='doi_label', + field=models.CharField(db_index=True, max_length=200, unique=True, validators=[django.core.validators.RegexValidator('^(SciPostPhysProc|SciPostPhysSel|SciPostPhysLectNotes|SciPostPhys).[0-9]+(.[0-9]+.[0-9]{3,})?$', 'Only valid DOI expressions are allowed (`[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,}` or `[a-zA-Z]+.[0-9]+`)')]), + ), + ] diff --git a/submissions/admin.py b/submissions/admin.py index ba3f07bc8..3c75469a6 100644 --- a/submissions/admin.py +++ b/submissions/admin.py @@ -107,6 +107,7 @@ class SubmissionAdmin(GuardedModelAdmin): 'fields': ( 'editor_in_charge', 'status', + ('visible_public', 'visible_pool'), 'refereeing_cycle', ('open_for_commenting', 'open_for_reporting'), 'reporting_deadline', diff --git a/submissions/constants.py b/submissions/constants.py index 299d132dd..1bdf2153d 100644 --- a/submissions/constants.py +++ b/submissions/constants.py @@ -24,31 +24,24 @@ STATUS_PUT_TO_EC_VOTING = 'put_to_EC_voting' STATUS_EC_VOTE_COMPLETED = 'EC_vote_completed' STATUS_WITHDRAWN = 'withdrawn' +# New: +STATUS_NEW_INCOMING = 'unassigned_incoming' +STATUS_EIC_REC_FORMULATED = 'recommendation_formulated' + +# All possible Submission statuses SUBMISSION_STATUS = ( - (STATUS_UNASSIGNED, 'Unassigned, undergoing pre-screening'), - (STATUS_RESUBMISSION_INCOMING, 'Resubmission incoming'), + (STATUS_NEW_INCOMING, 'Unassigned, undergoing pre-screening'), (STATUS_ASSIGNMENT_FAILED, 'Failed to assign Editor-in-charge; manuscript rejected'), - (STATUS_EIC_ASSIGNED, 'Editor-in-charge assigned, manuscript under review'), - (STATUS_REVIEW_CLOSED, 'Review period closed, editorial recommendation pending'), - # If revisions required: resubmission creates a new Submission object - (STATUS_REVISION_REQUESTED, 'Editor-in-charge has requested revision'), - (STATUS_RESUBMITTED, 'Has been resubmitted'), - (STATUS_RESUBMITTED_REJECTED, 'Has been resubmitted and subsequently rejected'), - (STATUS_RESUBMITTED_REJECTED_VISIBLE, - 'Has been resubmitted and subsequently rejected (still publicly visible)'), - # If acceptance/rejection: - (STATUS_VOTING_IN_PREPARATION, 'Voting in preparation (eligible Fellows being selected)'), - (STATUS_PUT_TO_EC_VOTING, 'Undergoing voting at the Editorial College'), + (STATUS_EIC_REC_FORMULATED, 'Editorial Recommendation formulated'), (STATUS_AWAITING_ED_REC, 'Awaiting Editorial Recommendation'), - (STATUS_EC_VOTE_COMPLETED, 'Editorial College voting rounded up'), + (STATUS_RESUBMITTED, 'Has been resubmitted'), (STATUS_ACCEPTED, 'Publication decision taken: accept'), (STATUS_REJECTED, 'Publication decision taken: reject'), - (STATUS_REJECTED_VISIBLE, 'Publication decision taken: reject (still publicly visible)'), - (STATUS_PUBLISHED, 'Published'), - # If withdrawn: (STATUS_WITHDRAWN, 'Withdrawn by the Authors'), + (STATUS_PUBLISHED, 'Published'), ) + SUBMISSION_HTTP404_ON_EDITORIAL_PAGE = [ STATUS_ASSIGNMENT_FAILED, STATUS_PUBLISHED, @@ -248,6 +241,16 @@ EVENT_TYPES = ( (EVENT_FOR_AUTHOR, 'Comment for author'), ) +VOTING_IN_PREP, PUT_TO_VOTING, VOTE_COMPLETED = 'voting_in_prep', 'put_to_voting', 'vote_completed' +DECISION_FIXED, DEPRECATED = 'decision_fixed', 'deprecated' +EIC_REC_STATUSES = ( + (VOTING_IN_PREP, 'Voting in preparation'), + (PUT_TO_VOTING, 'Undergoing voting at the Editorial College'), + (VOTE_COMPLETED, 'Editorial College voting rounded up'), + (DECISION_FIXED, 'Editorial Recommendation fixed'), + (DEPRECATED, 'Editorial Recommendation deprecated'), +) + # Use `.format()` https://docs.python.org/3.5/library/string.html#format-string-syntax # In your regex multiple brackets may occur; # Please make sure to double them in that case as per instructions in the reference! diff --git a/submissions/managers.py b/submissions/managers.py index ff3e92c92..de6399008 100644 --- a/submissions/managers.py +++ b/submissions/managers.py @@ -75,16 +75,13 @@ class SubmissionQuerySet(models.QuerySet): return self.filter(fellows__in=qs) def pool(self, user): - """ - Return the pool for a certain user: filtered to "in active referee phase". - """ + """Return the pool for a certain user: filtered to "in active referee phase".""" qs = self._pool(user) qs = qs.exclude(is_current=False).exclude(status__in=SUBMISSION_STATUS_OUT_OF_POOL) return qs def pool_editable(self, user): - """ - Return the editable pool for a certain user. + """Return the editable pool for a certain user. This is similar to the regular pool, however it also contains submissions that are hidden in the regular pool, but should still be able to be opened by for example diff --git a/submissions/migrations/0011_auto_20180414_1627.py b/submissions/migrations/0011_auto_20180414_1627.py new file mode 100644 index 000000000..7e613135d --- /dev/null +++ b/submissions/migrations/0011_auto_20180414_1627.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-04-14 14:27 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('submissions', '0010_auto_20180314_1607'), + ] + + operations = [ + migrations.AddField( + model_name='submission', + name='visible_pool', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='submission', + name='visible_public', + field=models.BooleanField(default=False), + ), + ] diff --git a/submissions/migrations/0012_auto_20180414_1627.py b/submissions/migrations/0012_auto_20180414_1627.py new file mode 100644 index 000000000..cf30632a0 --- /dev/null +++ b/submissions/migrations/0012_auto_20180414_1627.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-04-14 14:27 +from __future__ import unicode_literals + +from django.db import migrations + + +def update_visibility_booleans(apps, schema_editor): + Submission = apps.get_model('submissions', 'Submission') + + # Publicly show Submissions if status is correct. + Submission.objects.exclude(status__in=[ + 'unassigned', + 'assignment_failed', + 'resubmitted_incoming', + 'rejected', + 'resubmitted_and_rejected', + 'withdrawn']).update(visible_public=True) + + # Hide from pool if decision is taken. + Submission.objects.filter(status__in=[ + 'rejected_visible', + 'rejected', + 'withdrawn', + 'published', + 'assignment_failed', + 'resubmitted']).update(visible_pool=False) + + +class Migration(migrations.Migration): + + dependencies = [ + ('submissions', '0011_auto_20180414_1627'), + ] + + operations = [ + migrations.RunPython(update_visibility_booleans), + ] diff --git a/submissions/migrations/0013_auto_20180414_1729.py b/submissions/migrations/0013_auto_20180414_1729.py new file mode 100644 index 000000000..dc8ae0842 --- /dev/null +++ b/submissions/migrations/0013_auto_20180414_1729.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-04-14 15:29 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('submissions', '0012_auto_20180414_1627'), + ] + + operations = [ + migrations.AddField( + model_name='eicrecommendation', + name='status', + field=models.CharField(choices=[('voting_in_prep', 'Voting in preparation'), ('put_to_voting', 'Undergoing voting at the Editorial College'), ('vote_completed', 'Editorial College voting rounded up'), ('decision_fixed', 'Editorial Recommendation fixed'), ('deprecated', 'Editorial Recommendation deprecated')], default='voting_in_prep', max_length=32), + ), + migrations.AlterField( + model_name='submission', + name='visible_pool', + field=models.BooleanField(default=True, verbose_name='Is visible in the Pool'), + ), + migrations.AlterField( + model_name='submission', + name='visible_public', + field=models.BooleanField(default=False, verbose_name='Is publicly visible'), + ), + ] diff --git a/submissions/migrations/0014_auto_20180414_1729.py b/submissions/migrations/0014_auto_20180414_1729.py new file mode 100644 index 000000000..2884c401b --- /dev/null +++ b/submissions/migrations/0014_auto_20180414_1729.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-04-14 15:29 +from __future__ import unicode_literals + +from django.db import migrations + + +def update_eic_rec_statuses(apps, schema_editor): + Submission = apps.get_model('submissions', 'Submission') + EICRecommendation = apps.get_model('submissions', 'EICRecommendation') + + # Update EICRecommendation statuses + for sub in Submission.objects.filter(status='voting_in_preparation'): + EICRecommendation.objects.filter(submission__id=sub.id).update(status='voting_in_prep') + + for sub in Submission.objects.filter(status='put_to_EC_voting'): + EICRecommendation.objects.filter(submission__id=sub.id).update(status='put_to_voting') + + for sub in Submission.objects.filter(status='EC_vote_completed'): + EICRecommendation.objects.filter(submission__id=sub.id).update(status='vote_completed') + + for sub in Submission.objects.filter(status__in=[ + 'accepted', + 'published', + 'rejected', + 'rejected_visible', + 'resubmitted', + 'resubmitted_and_rejected', + 'resubmitted_and_rejected_visible', + 'revision_requested']): + EICRecommendation.objects.filter(submission__id=sub.id).update(status='decision_fixed') + + +class Migration(migrations.Migration): + + dependencies = [ + ('submissions', '0013_auto_20180414_1729'), + ] + + operations = [ + migrations.RunPython(update_eic_rec_statuses), + ] diff --git a/submissions/migrations/0015_auto_20180414_1742.py b/submissions/migrations/0015_auto_20180414_1742.py new file mode 100644 index 000000000..8e876b3e8 --- /dev/null +++ b/submissions/migrations/0015_auto_20180414_1742.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-04-14 15:42 +from __future__ import unicode_literals + +from django.db import migrations + +def merge_submission_statuses(apps, schema_editor): + Submission = apps.get_model('submissions', 'Submission') + + # Rejected Submissions + Submission.objects.filter(status='rejected_visible').update(status='rejected') + + # Resubmitted Submissions + Submission.objects.filter(status__in=[ + 'resubmitted_and_rejected', + 'resubmitted_and_rejected_visible']).update(status='resubmitted') + + # Rec. formulated Submissions + Submission.objects.filter(status__in=[ + 'voting_in_preparation', + 'put_to_EC_voting', + 'EC_vote_completed', + 'revision_requested']).update(status='recommendation_formulated') + + # Closed formulated Submissions + Submission.objects.filter(status='review_closed').update(status='awaiting_ed_rec') + + # Incoming Submissions + Submission.objects.filter(status__in=[ + 'unassigned', + 'resubmitted_incoming']).update(status='unassigned_incoming') + + +class Migration(migrations.Migration): + + dependencies = [ + ('submissions', '0014_auto_20180414_1729'), + ] + + operations = [ + migrations.RunPython(merge_submission_statuses), + ] diff --git a/submissions/migrations/0016_auto_20180414_1825.py b/submissions/migrations/0016_auto_20180414_1825.py new file mode 100644 index 000000000..f70fbb575 --- /dev/null +++ b/submissions/migrations/0016_auto_20180414_1825.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-04-14 16:25 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('submissions', '0015_auto_20180414_1742'), + ] + + operations = [ + migrations.AlterField( + model_name='submission', + name='status', + field=models.CharField(choices=[('unassigned_incoming', 'Unassigned, undergoing pre-screening'), ('assignment_failed', 'Failed to assign Editor-in-charge; manuscript rejected'), ('recommendation_formulated', 'Editorial Recommendation formulated'), ('awaiting_ed_rec', 'Awaiting Editorial Recommendation'), ('resubmitted', 'Has been resubmitted'), ('accepted', 'Publication decision taken: accept'), ('rejected', 'Publication decision taken: reject'), ('withdrawn', 'Withdrawn by the Authors'), ('published', 'Published')], default='unassigned', max_length=30), + ), + ] diff --git a/submissions/models.py b/submissions/models.py index 7152bbec3..4f704ce62 100644 --- a/submissions/models.py +++ b/submissions/models.py @@ -20,7 +20,7 @@ from .constants import ( SUBMISSION_EIC_RECOMMENDATION_REQUIRED, SUBMISSION_CYCLES, CYCLE_DEFAULT, CYCLE_SHORT, CYCLE_DIRECT_REC, EVENT_GENERAL, EVENT_TYPES, EVENT_FOR_AUTHOR, EVENT_FOR_EIC, REPORT_TYPES, REPORT_NORMAL, STATUS_DRAFT, STATUS_VETTED, STATUS_VOTING_IN_PREPARATION, - STATUS_PUT_TO_EC_VOTING) + STATUS_PUT_TO_EC_VOTING, EIC_REC_STATUSES, VOTING_IN_PREP) from .managers import ( SubmissionQuerySet, EditorialAssignmentQuerySet, EICRecommendationQuerySet, ReportQuerySet, SubmissionEventQuerySet, RefereeInvitationQuerySet, EditorialCommunicationQueryset) @@ -51,8 +51,7 @@ class Submission(models.Model): domain = models.CharField(max_length=3, choices=SCIPOST_JOURNALS_DOMAINS) editor_in_charge = models.ForeignKey('scipost.Contributor', related_name='EIC', blank=True, null=True, on_delete=models.CASCADE) - is_current = models.BooleanField(default=True) - is_resubmission = models.BooleanField(default=False) + list_of_changes = models.TextField(blank=True) open_for_commenting = models.BooleanField(default=False) open_for_reporting = models.BooleanField(default=False) @@ -64,10 +63,15 @@ class Submission(models.Model): models.CharField(max_length=10, choices=SCIPOST_SUBJECT_AREAS), blank=True, null=True) - # Refereeing fields + # Submission status fields status = models.CharField(max_length=30, choices=SUBMISSION_STATUS, default=STATUS_UNASSIGNED) + is_current = models.BooleanField(default=True) + visible_public = models.BooleanField("Is publicly visible", default=False) + visible_pool = models.BooleanField("Is visible in the Pool", default=True) + is_resubmission = models.BooleanField(default=False) refereeing_cycle = models.CharField(max_length=30, choices=SUBMISSION_CYCLES, default=CYCLE_DEFAULT) + fellows = models.ManyToManyField('colleges.Fellowship', blank=True, related_name='pool') subject_area = models.CharField(max_length=10, choices=SCIPOST_SUBJECT_AREAS, @@ -665,6 +669,7 @@ class EICRecommendation(SubmissionRelatedObjectMixin, models.Model): verbose_name='optional remarks for the' ' Editorial College') recommendation = models.SmallIntegerField(choices=REPORT_REC) + status = models.CharField(max_length=32, choices=EIC_REC_STATUSES, default=VOTING_IN_PREP) version = models.SmallIntegerField(default=1) active = models.BooleanField(default=True) -- GitLab