diff --git a/journals/migrations/0027_auto_20180414_1627.py b/journals/migrations/0027_auto_20180414_1627.py new file mode 100644 index 0000000000000000000000000000000000000000..de6436d562ae0b80a2dc9b2474e08bc14d1ac3ca --- /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 ba3f07bc800272d6c77c8504342f8cb50545d9a4..3c75469a628f126e2eecd6123930f95864f9177d 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 299d132dd96e1d95c9dbef6cf972ff79f7efacf6..1bdf2153dd2ad606f2fcfd1490a4226728b030b0 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 ff3e92c924778b67d47ec6a1e1e83cc92e3e53d9..de6399008ad0643653d11a8c5a9d12355fbf075d 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 0000000000000000000000000000000000000000..7e613135d5c48aa049a2314fd18e9a6c37f424c0 --- /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 0000000000000000000000000000000000000000..cf30632a0a955820822153e8d8de8d7bc2100579 --- /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 0000000000000000000000000000000000000000..dc8ae084238a00265fc54aa347f1947dd947def2 --- /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 0000000000000000000000000000000000000000..2884c401b2a835109f49d63023889f83ef26b7c4 --- /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 0000000000000000000000000000000000000000..8e876b3e896cea422847ab9957b6895c41cb87f5 --- /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 0000000000000000000000000000000000000000..f70fbb575ff7f9421528c93ad62f13aee1b36e04 --- /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 7152bbec356f59dc5205e5ec592027ca642857aa..4f704ce629d484af7b342e8bdde8c4cd4b915d0c 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)