diff --git a/scipost_django/scipost/templates/feeds/latest_submissions_description.html b/scipost_django/scipost/templates/feeds/latest_submissions_description.html index f5e3b9494cf1a74404324f159e90ba0affd4dd28..8cc67b88a163ca2b7162d6a9855bcf226b2ea583 100644 --- a/scipost_django/scipost/templates/feeds/latest_submissions_description.html +++ b/scipost_django/scipost/templates/feeds/latest_submissions_description.html @@ -1 +1 @@ -Submitted on {{ obj.submission_date|date:'Y-m-d' }}, refereeing deadline {{ obj.reporting_deadline|date:'Y-m-d' }}. +Submitted on {{ obj.submission_date|date:'Y-m-d' }}{% if obj.reporting_deadline %}, refereeing deadline {{ obj.reporting_deadline|date:'Y-m-d' }}{% endif %}. diff --git a/scipost_django/scipost/templates/scipost/portal/_hx_tasklist.html b/scipost_django/scipost/templates/scipost/portal/_hx_tasklist.html index 95e5cd5d5d6f6ee8221813138aae0cbf96d90cc1..f4bc9fdba4bf2f2ff7b96a11e11f24bea5b9aa1c 100644 --- a/scipost_django/scipost/templates/scipost/portal/_hx_tasklist.html +++ b/scipost_django/scipost/templates/scipost/portal/_hx_tasklist.html @@ -57,7 +57,13 @@ <a class="text-nowrap" href="{% url 'submissions:editorial_page' submission.preprint.identifier_w_vn_nr %}">Editorial page</a> </td> - <td class="text-nowrap">{{ submission.reporting_deadline|date:"Y-m-d" }}</td> + <td class="text-nowrap"> + {% if submission.reporting_deadline %} + {{ submission.reporting_deadline|date:"Y-m-d" }} + {% else %} + No deadline + {% endif %} + </td> <td> <ul class="m-0"> diff --git a/scipost_django/submissions/forms/__init__.py b/scipost_django/submissions/forms/__init__.py index f7db2c6e400a5a1bfc55ac70f1f510fa09d0d433..933b54067ef5d749762d77ec3d2d704c5e68b927 100644 --- a/scipost_django/submissions/forms/__init__.py +++ b/scipost_django/submissions/forms/__init__.py @@ -556,6 +556,7 @@ class SubmissionPoolSearchForm(forms.Form): submissions = ( submissions.in_refereeing() .filter( + reporting_deadline__isnull=False, reporting_deadline__lt=timezone.now(), ) .exclude(eicrecommendations__isnull=False) @@ -1799,12 +1800,6 @@ class SubmissionForm(forms.ModelForm): """ submission = super().save(commit=False) submission.submitted_by = self.requested_by.contributor - submission.reporting_deadline = ( - # give 8 days for Admission, Preassignment and Assignment stages - timezone.now() - + datetime.timedelta(days=8) - + self.cleaned_data["submitted_to"].refereeing_period - ) # Save expectations if fulfilled_expectations := self.cleaned_data.get("fulfilled_expectations"): diff --git a/scipost_django/submissions/management/commands/send_refereeing_reminders.py b/scipost_django/submissions/management/commands/send_refereeing_reminders.py index 5530e7d956949277d39df1a785833a31164b0739..2d02d89433df76d72a473878c934c1016aa2c52f 100644 --- a/scipost_django/submissions/management/commands/send_refereeing_reminders.py +++ b/scipost_django/submissions/management/commands/send_refereeing_reminders.py @@ -64,7 +64,10 @@ class Command(BaseCommand): ) mail_sender.send_mail() # one week before refereeing deadline: auto email reminder to ref - if workdays_between(timezone.now(), submission.reporting_deadline) == 5: + if ( + submission.reporting_deadline is not None + and workdays_between(timezone.now(), submission.reporting_deadline) == 5 + ): for ( invitation ) in ( diff --git a/scipost_django/submissions/managers/assignment.py b/scipost_django/submissions/managers/assignment.py index effce0a17a241909c176f0ae5672d6b13404c5ae..691397069489cb851b63c0e4788ce235873e4320 100644 --- a/scipost_django/submissions/managers/assignment.py +++ b/scipost_django/submissions/managers/assignment.py @@ -20,9 +20,10 @@ class EditorialAssignmentQuerySet(models.QuerySet): def refereeing_deadline_within(self, days=7): now = timezone.now() - return self.exclude( - submission__reporting_deadline__gt=now + timezone.timedelta(days=days) - ).exclude(submission__reporting_deadline__lt=now) + return self.exclude(submission__reporting_deadline__isnull=True).filter( + submission__reporting_deadline__lt=now + timezone.timedelta(days=days), + submission__reporting_deadline__gt=now, + ) def next_invitation_to_be_sent(self, submission_id): """Return EditorialAssignment that needs to be sent next.""" diff --git a/scipost_django/submissions/managers/referee_invitation.py b/scipost_django/submissions/managers/referee_invitation.py index 9d26fcfeae7f4c53d77201551853bdf98370e755..0510888310281926e0324d8f5c8adb3ab7198945 100644 --- a/scipost_django/submissions/managers/referee_invitation.py +++ b/scipost_django/submissions/managers/referee_invitation.py @@ -48,14 +48,16 @@ class RefereeInvitationQuerySet(models.QuerySet): 1. not responded to invite in more than 3 days. 2. not fulfilled (but accepted) with deadline within 7 days. """ - compare_3_days = timezone.now() + datetime.timedelta(days=3) - compare_7_days = timezone.now() + datetime.timedelta(days=7) + in_3_days = timezone.now() + datetime.timedelta(days=3) + in_7_days = timezone.now() + datetime.timedelta(days=7) return ( self.filter(cancelled=False, fulfilled=False) .filter( - models.Q(accepted=None, date_last_reminded__lt=compare_3_days) + models.Q(accepted=None, date_last_reminded__lt=in_3_days) | models.Q( - accepted=True, submission__reporting_deadline__lt=compare_7_days + accepted=True, + submission__reporting_deadline__isnull=False, + submission__reporting_deadline__lt=in_7_days, ) ) .distinct() @@ -66,7 +68,7 @@ class RefereeInvitationQuerySet(models.QuerySet): qs = self.in_process() pseudo_deadline = timezone.now() + datetime.timedelta(days) deadline = timezone.now() - qs = qs.filter( + qs = qs.exclude(submision__reporting_deadline__isnull=True).filter( submission__reporting_deadline__lte=pseudo_deadline, submission__reporting_deadline__gte=deadline, ) @@ -75,4 +77,8 @@ class RefereeInvitationQuerySet(models.QuerySet): def overdue(self): """Filter non-fulfilled invitations that are overdue.""" now = timezone.now() - return self.in_process().filter(submission__reporting_deadline__lte=now) + return ( + self.in_process() + .exclude(submision__reporting_deadline__isnull=True) + .filter(submission__reporting_deadline__lte=now) + ) diff --git a/scipost_django/submissions/migrations/0159_alter_submission_reporting_deadline.py b/scipost_django/submissions/migrations/0159_alter_submission_reporting_deadline.py new file mode 100644 index 0000000000000000000000000000000000000000..bd16307cf529d3153c26af254385e7c1ae7e3c5d --- /dev/null +++ b/scipost_django/submissions/migrations/0159_alter_submission_reporting_deadline.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.15 on 2024-09-18 13:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("submissions", "0158_submission_on_hold"), + ] + + operations = [ + migrations.AlterField( + model_name="submission", + name="reporting_deadline", + field=models.DateTimeField(blank=True, default=None, null=True), + ), + ] diff --git a/scipost_django/submissions/models/referee_invitation.py b/scipost_django/submissions/models/referee_invitation.py index 20e643dc31a100a8f33f9ec7651091cafcc09a11..d4b3c26a00ef94529580d60234afa9bb83e8531f 100644 --- a/scipost_django/submissions/models/referee_invitation.py +++ b/scipost_django/submissions/models/referee_invitation.py @@ -151,7 +151,12 @@ class RefereeInvitation(SubmissionRelatedObjectMixin, models.Model): @property def needs_fulfillment_reminder(self): """Check if isn't fullfilled but deadline is closing in.""" - if self.accepted and not self.cancelled and not self.fulfilled: + if ( + self.accepted + and not self.cancelled + and not self.fulfilled + and self.submission.reporting_deadline is not None + ): # Refereeing deadline closing in/overdue, but invitation isn't fulfilled yet. return (self.submission.reporting_deadline - timezone.now()).days < 7 return False @@ -159,7 +164,12 @@ class RefereeInvitation(SubmissionRelatedObjectMixin, models.Model): @property def is_overdue(self): """Check if isn't fullfilled but deadline has expired.""" - if self.accepted and not self.cancelled and not self.fulfilled: + if ( + self.accepted + and not self.cancelled + and not self.fulfilled + and self.submission.reporting_deadline is not None + ): # Refereeing deadline closing in/overdue, but invitation isn't fulfilled yet. return (self.submission.reporting_deadline - timezone.now()).days < 0 return False diff --git a/scipost_django/submissions/models/submission.py b/scipost_django/submissions/models/submission.py index ff97fa9aaa4699af3a7faa5bc9f9384ad78d3ac0..3a58ab3f6444cf467341cdd4722ae8aad522eb53 100644 --- a/scipost_django/submissions/models/submission.py +++ b/scipost_django/submissions/models/submission.py @@ -304,7 +304,7 @@ class Submission(models.Model): referees_flagged = models.TextField(blank=True) referees_suggested = models.TextField(blank=True) remarks_for_editors = models.TextField(blank=True) - reporting_deadline = models.DateTimeField(default=timezone.now) + reporting_deadline = models.DateTimeField(null=True, blank=True, default=None) # Submission status fields status = models.CharField( @@ -626,7 +626,7 @@ class Submission(models.Model): return qs.distinct() @property - def cycle(self): + def cycle(self) -> ShortCycle | DirectCycle | RegularCycle: """Get cycle object relevant for the Submission.""" if not hasattr(self, "_cycle"): self.set_cycle() @@ -743,11 +743,16 @@ class Submission(models.Model): @property def reporting_deadline_has_passed(self): """Check if Submission has passed its reporting deadline.""" + if self.reporting_deadline is None: + return False return timezone.now() > self.reporting_deadline @property def reporting_deadline_approaching(self): """Check if reporting deadline is within 7 days from now but not passed yet.""" + if self.reporting_deadline is None: + return False + if self.status != self.IN_REFEREEING: # These statuses do not have a deadline return False diff --git a/scipost_django/submissions/refereeing_cycles.py b/scipost_django/submissions/refereeing_cycles.py index 8824f1195cec966a56f20f93656d250566901315..cc6f47cf9417cc39d3d639d452adc5528694019e 100644 --- a/scipost_django/submissions/refereeing_cycles.py +++ b/scipost_django/submissions/refereeing_cycles.py @@ -93,9 +93,10 @@ class BaseAction: if hasattr(obj, "date_invited") and obj.date_invited: timedelta = timezone.now() - obj.date_invited - if hasattr(obj, "submission"): - print + if hasattr(obj, "submission") and obj.submission.reporting_deadline: deadline = obj.submission.reporting_deadline - timezone.now() + else: + deadline = None # Add the domain name to the url so that it is clickable in the email if self.url.startswith("/"): @@ -109,8 +110,8 @@ class BaseAction: author=obj.author.formal_str if getattr(obj, "author", None) else "", referee=getattr(obj, "referee_str", ""), days=timedelta.days, - deadline=deadline.days, - deadline_min=-deadline.days, + deadline=deadline.days if deadline else "-", + deadline_min=-deadline.days if deadline else "-", url=base_url, url2=self.url2, ) diff --git a/scipost_django/submissions/templates/submissions/_refereeing_invitations_ongoing.html b/scipost_django/submissions/templates/submissions/_refereeing_invitations_ongoing.html index aa8e42ab20f0577a9678f1b97a33a040409f51ed..0e645057eafb97db645ffbbed533aba055a6c641 100644 --- a/scipost_django/submissions/templates/submissions/_refereeing_invitations_ongoing.html +++ b/scipost_django/submissions/templates/submissions/_refereeing_invitations_ongoing.html @@ -32,7 +32,11 @@ <table> <tr> <th style='min-width: 100px;'>Due:</th> - <td>{{ invitation.submission.reporting_deadline|date:'d F Y' }}{% if invitation.submission.reporting_deadline_has_passed %} <span class="label label-sm label-danger ms-2 px-3">overdue</span> {% endif %}<td> + {% if invitation.submission.reporting_deadline %} + <td>{{ invitation.submission.reporting_deadline|date:'d F Y' }}{% if invitation.submission.reporting_deadline_has_passed %} <span class="label label-sm label-danger ms-2 px-3">overdue</span> {% endif %}</td> + {% else %} + <td>Not set</td> + {% endif %} </tr> <tr> <th>Status:</th> diff --git a/scipost_django/submissions/templates/submissions/_refereeing_status_card.html b/scipost_django/submissions/templates/submissions/_refereeing_status_card.html index 72092d1eabd417ade05689acd4c74fe48e8ac968..758e7ae8f558bf12e9a5b4ddb0a9c0fc56c5a4ab 100644 --- a/scipost_django/submissions/templates/submissions/_refereeing_status_card.html +++ b/scipost_django/submissions/templates/submissions/_refereeing_status_card.html @@ -27,7 +27,7 @@ {% if invitation.related_report.is_in_draft %} You have a Report in draft, <a href="{% url 'submissions:submit_report' invitation.submission.preprint.identifier_w_vn_nr %}">finish your Report</a>. {% else %} - <a href="{% url 'submissions:submit_report' invitation.submission.preprint.identifier_w_vn_nr %}">Submit your Report</a> due on {{ invitation.submission.reporting_deadline }}. + <a href="{% url 'submissions:submit_report' invitation.submission.preprint.identifier_w_vn_nr %}">Submit your Report</a>{% if invitation.submission.reporting_deadline %} due on {{ invitation.submission.reporting_deadline }}{% endif %}. {% endif %} {% endif %} </li> diff --git a/scipost_django/submissions/templates/submissions/_submission_author_information.html b/scipost_django/submissions/templates/submissions/_submission_author_information.html index 58fbbf75ef5fa3c2ef440281f0c9384210edaeea..cab88d7bd8dd02e599a6487e61fef176fde61cff 100644 --- a/scipost_django/submissions/templates/submissions/_submission_author_information.html +++ b/scipost_django/submissions/templates/submissions/_submission_author_information.html @@ -13,7 +13,7 @@ {% if not submission.editor_in_charge %} No Editor-in-charge is assigned yet. The SciPost administration will inform you as soon as one is assigned. {% elif submission.in_stage_in_refereeing %} - The refereeing round has started. The current deadline is set to {{ submission.reporting_deadline|date:'j F Y' }}. + The refereeing round has started{% if submission.reporting_deadline %} The current deadline is set to {{ submission.reporting_deadline|date:'j F Y' }}{% endif %}. {% elif submission.recommendation %} An Editorial Recommendation has been formulated. See its status details below. {% elif not submission.open_for_reporting %} diff --git a/scipost_django/submissions/templates/submissions/_submission_quick_actions.html b/scipost_django/submissions/templates/submissions/_submission_quick_actions.html index 54745ac3d74132fa9af00d522bfcfb9a27157c6f..4284ef39bf20ab9f5395c8666a3e8e2bdfc52ebe 100644 --- a/scipost_django/submissions/templates/submissions/_submission_quick_actions.html +++ b/scipost_django/submissions/templates/submissions/_submission_quick_actions.html @@ -22,7 +22,9 @@ <h4 class="mb-0"> <a href="{% url 'submissions:submit_report' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr %}">{% if unfinished_report_for_user %}Finish your report{% else %}Contribute a Report{% endif %}</a> </h4> - <div class="text-danger mt-1 mb-3">Deadline for reporting: {{ submission.reporting_deadline|date:"Y-m-d" }}</div> + {% if submission.reporting_deadline %} + <div class="text-danger mt-1 mb-3">Deadline for reporting: {{ submission.reporting_deadline|date:"Y-m-d" }}</div> + {% endif %} </li> {% elif is_author_unchecked %} <li> diff --git a/scipost_django/submissions/templates/submissions/admin/refereeing_overview.html b/scipost_django/submissions/templates/submissions/admin/refereeing_overview.html index 69a4135da4356f9264ffb44e1c4314354e2d9de1..fe5ab2df7a1ceb386c7b5d5873c86c5144be4ff9 100644 --- a/scipost_django/submissions/templates/submissions/admin/refereeing_overview.html +++ b/scipost_django/submissions/templates/submissions/admin/refereeing_overview.html @@ -24,7 +24,7 @@ <div> Editor-in-charge: {{ submission.editor_in_charge }}<br> - Refereeing deadline: {{ submission.reporting_deadline }}<br> + Refereeing deadline: {% if submission.reporting_deadline %}{{ submission.reporting_deadline|date:"Y-m-d" }}{% else %}not set{% endif %}<br> <br> Refereeing status summary:<br> {% include 'submissions/pool/_referee_invitations_status.html' with submission=submission %} diff --git a/scipost_django/submissions/templates/submissions/author_referee_invitation_email.html b/scipost_django/submissions/templates/submissions/author_referee_invitation_email.html index daeaddb0f43462da13a73b2dfd162b1c95f079fd..7f9fcbc78a79cf9139b0477bdcd96bc988f963e0 100644 --- a/scipost_django/submissions/templates/submissions/author_referee_invitation_email.html +++ b/scipost_django/submissions/templates/submissions/author_referee_invitation_email.html @@ -12,9 +12,11 @@ by {{ submission.author_list }}%0D%0A (see https://{{ request.get_host }}{{ submission.get_absolute_url }} ). %0D%0A %0D%0A +{% if submission.reporting_deadline %} The refereeing deadline is currently set at {{ submission.reporting_deadline|date:"d M Y" }}. %0D%0A %0D%0A +{% endif %} Since SciPost runs an open peer-witnessed refereeing process, your input could help in the evaluation of this manuscript. To provide your expert opinion, after logging in, you can simply follow the "Contribute a Report" link on the submission page linked above. You will find refereeing guidelines at https://{{ request.get_host }}{% url 'submissions:referee_guidelines' %} and further links therein. %0D%0A %0D%0A diff --git a/scipost_django/submissions/templates/submissions/contributor_referee_invitation_email.html b/scipost_django/submissions/templates/submissions/contributor_referee_invitation_email.html index 8444e93cdf30331e0d28ca686d1ee39f779c0081..2fd6304d426f518d818fb0ea1d1b315cce6580cb 100644 --- a/scipost_django/submissions/templates/submissions/contributor_referee_invitation_email.html +++ b/scipost_django/submissions/templates/submissions/contributor_referee_invitation_email.html @@ -12,9 +12,11 @@ by {{ submission.author_list }}%0D%0A (see https://{{ request.get_host }}{{ submission.get_absolute_url }} ). %0D%0A %0D%0A +{% if submission.reporting_deadline %} The refereeing deadline is currently set at {{ submission.reporting_deadline|date:"d M Y" }}. %0D%0A %0D%0A +{% endif %} Since SciPost runs an open peer-witnessed refereeing process, your input could help in the evaluation of this manuscript. To provide your expert opinion, after logging in, you can simply follow the "Contribute a Report" link on the submission page linked above. You will find refereeing guidelines at https://{{ request.get_host }}{% url 'submissions:referee_guidelines' %} and further links therein. %0D%0A %0D%0A diff --git a/scipost_django/submissions/templates/submissions/pool/_submission_info_table.html b/scipost_django/submissions/templates/submissions/pool/_submission_info_table.html index e57a5bd7c088b195776bf5feae4f2a7772ada091..ae2c0284ff81e4844db59eaefe67f10be41d04fc 100644 --- a/scipost_django/submissions/templates/submissions/pool/_submission_info_table.html +++ b/scipost_django/submissions/templates/submissions/pool/_submission_info_table.html @@ -89,7 +89,9 @@ <tr> <td>Reporting deadline</td> <td> - {% if submission.reporting_deadline > now %} + {% if submission.reporting_deadline is None %} + not set + {% elif submission.reporting_deadline > now %} in {{ submission.reporting_deadline|timeuntil }} {% else %} {{ submission.reporting_deadline|timesince }} ago diff --git a/scipost_django/submissions/templates/submissions/pool/editorial_page.html b/scipost_django/submissions/templates/submissions/pool/editorial_page.html index e786939d0a4c9bc5a5dbe1d9d1a502511779bdb1..966970b8977505b483bd04b4be468904eea79144 100644 --- a/scipost_django/submissions/templates/submissions/pool/editorial_page.html +++ b/scipost_django/submissions/templates/submissions/pool/editorial_page.html @@ -206,7 +206,7 @@ container border border-warning border-3 <td> {% if submission.is_open_for_reporting_within_deadline %} <span class="text-success" aria-hidden="true">{% include 'bi/check-circle-fill.html' %}</span> - <span class="text-muted">Open for refereeing. Deadline: {{ submission.reporting_deadline|date:"SHORT_DATE_FORMAT" }}.</span> + <span class="text-muted">Open for refereeing.{% if submission.reporting_deadline %} Deadline: {{ submission.reporting_deadline|date:"SHORT_DATE_FORMAT" }}.{% endif %}</span> {% else %} <span class="text-danger" aria-hidden="true">{% include 'bi/x-circle-fill.html' %}</span> <span class="text-muted"> @@ -232,7 +232,7 @@ container border border-warning border-3 {% endif %} {% if submission.can_reset_reporting_deadline %} - {% if submission.is_open_for_reporting_within_deadline %} + {% if submission.is_open_for_reporting_within_deadline and submission.reporting_deadline is not None %} <div class="my-1"> You may extend the refereeing deadline by <a href="{% url 'submissions:extend_refereeing_deadline' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr days=2 %}">2 days</a>, @@ -255,7 +255,7 @@ container border border-warning border-3 </div> {% else %} <div class="mt-1"> - Open the refereeing round by setting a refereeing deadline: + Set a refereeing deadline: <form class="d-inline-block" action="{% url 'submissions:set_refereeing_deadline' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr %}" method="post"> {% csrf_token %} <div class="row mx-2"> @@ -338,11 +338,13 @@ container border border-warning border-3 <a href="{% url 'submissions:select_referee' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr %}">Invite the first referee here</a> {% endif %} </li> - <li>Extend the refereeing deadline (currently {{ submission.reporting_deadline|date:'Y-m-d' }}{% if submission.reporting_deadline_has_passed %} <span class="ms-1 label label-sm label-outline-danger text-uppercase">The reporting deadline has passed</span>{% endif %}) by - <a href="{% url 'submissions:extend_refereeing_deadline' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr days=2 %}">2 days</a>, - <a href="{% url 'submissions:extend_refereeing_deadline' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr days=7 %}">1 week</a> or - <a href="{% url 'submissions:extend_refereeing_deadline' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr days=14 %}">2 weeks</a> - </li> + {% if submission.reporting_deadline %} + <li>Extend the refereeing deadline (currently {{ submission.reporting_deadline|date:'Y-m-d' }}{% if submission.reporting_deadline_has_passed %} <span class="ms-1 label label-sm label-outline-danger text-uppercase">The reporting deadline has passed</span>{% endif %}) by + <a href="{% url 'submissions:extend_refereeing_deadline' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr days=2 %}">2 days</a>, + <a href="{% url 'submissions:extend_refereeing_deadline' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr days=7 %}">1 week</a> or + <a href="{% url 'submissions:extend_refereeing_deadline' identifier_w_vn_nr=submission.preprint.identifier_w_vn_nr days=14 %}">2 weeks</a> + </li> + {% endif %} {% endif %} {% if submission.can_reset_reporting_deadline %} <li> diff --git a/scipost_django/submissions/templates/submissions/referee_invitations_form.html b/scipost_django/submissions/templates/submissions/referee_invitations_form.html index de1a49fbc47b190b6e860fef911711228c5fa1a9..11912fe867e151de858b2c9ffa0525b87fb2cc3f 100644 --- a/scipost_django/submissions/templates/submissions/referee_invitations_form.html +++ b/scipost_django/submissions/templates/submissions/referee_invitations_form.html @@ -30,7 +30,9 @@ <div class="col-12"> <h2 class="highlight">Accept or Decline this Refereeing Invitation</h2> <h3>Please let us know if you can provide us with a Report for this Submission:</h3> - <p>We will expect your report by <b>{{invitation.submission.reporting_deadline}}</b></p> + {% if invitation.submission.reporting_deadline %} + <p>We will expect your report by <b>{{invitation.submission.reporting_deadline}}</b></p> + {% endif %} <form action="{% url 'submissions:accept_or_decline_ref_invitations' invitation_id=invitation.id %}" method="post"> {% csrf_token %} {{ form|bootstrap:'4,8' }} diff --git a/scipost_django/submissions/utils.py b/scipost_django/submissions/utils.py index 5eddd8967e553b026d035aac54d02a7d3ca60e63..e4ba7386964a5b6cccb005657bc2a604b39324e9 100644 --- a/scipost_django/submissions/utils.py +++ b/scipost_django/submissions/utils.py @@ -124,10 +124,14 @@ class SubmissionUtils(BaseMailUtil): "\n\nA Submission Page has been activated at " f"https://{domain}/submission/" + cls.assignment.submission.preprint.identifier_w_vn_nr - + " and a refereeing round has been started, with deadline " - "currently set at " - + datetime.datetime.strftime( - cls.assignment.submission.reporting_deadline, "%Y-%m-%d" + + ( + " and a refereeing round has been started, with deadline " + "currently set at " + + datetime.datetime.strftime( + cls.assignment.submission.reporting_deadline, "%Y-%m-%d" + ) + if cls.assignment.submission.reporting_deadline + else "" ) + ".\n\n" "During the refereeing round, you are welcome to provide replies to any " @@ -153,10 +157,14 @@ class SubmissionUtils(BaseMailUtil): "\n<p>has successfully passed the assignment stage.</p>" f'\n<p>A <a href="https://{domain}/submission/' + '{{ identifier_w_vn_nr }}">' - "Submission Page</a> has been activated " - "and a refereeing round has been started, with deadline " - "currently set at {{ deadline }}.</p>" - "<h3>Further procedure</h3>" + "Submission Page</a> has been activated" + + ( + " and a refereeing round has been started, with deadline " + "currently set at {{ deadline }}.</p>" + if cls.assignment.submission.reporting_deadline + else "" + ) + + "<h3>Further procedure</h3>" "<p>During the refereeing round, you are welcome to provide replies to any " "Report or Comment posted on your Submission (you can do so from the " "Submission Page; you will be informed by email of any such Report or " @@ -180,8 +188,12 @@ class SubmissionUtils(BaseMailUtil): "sub_title": cls.assignment.submission.title, "author_list": cls.assignment.submission.author_list, "identifier_w_vn_nr": cls.assignment.submission.preprint.identifier_w_vn_nr, - "deadline": datetime.datetime.strftime( - cls.assignment.submission.reporting_deadline, "%Y-%m-%d" + "deadline": ( + datetime.datetime.strftime( + cls.assignment.submission.reporting_deadline, "%Y-%m-%d" + ) + if cls.assignment.submission.reporting_deadline + else "" ), } email_text_html += "<br/>" + EMAIL_FOOTER @@ -252,9 +264,13 @@ class SubmissionUtils(BaseMailUtil): 'the "Contribute a Report" link at ' f"https://{domain}/submission/" + cls.invitation.submission.preprint.identifier_w_vn_nr - + " before the reporting deadline (currently set at " - + datetime.datetime.strftime( - cls.invitation.submission.reporting_deadline, "%Y-%m-%d" + + ( + " before the reporting deadline (currently set at " + + datetime.datetime.strftime( + cls.invitation.submission.reporting_deadline, "%Y-%m-%d" + ) + if cls.invitation.submission.reporting_deadline + else "" ) + "; your report will be automatically recognized as an invited report). " "You might want to make sure you are familiar with our refereeing code of conduct " @@ -285,8 +301,13 @@ class SubmissionUtils(BaseMailUtil): "Your report can thereafter be submitted by simply clicking on " 'the "Contribute a Report" link at ' f'the <a href="https://{domain}' + '/submission/{{ identifier_w_vn_nr }}">' - "Submission's page</a> before the reporting deadline (currently set at " - "{{ deadline }}; your report will be automatically recognized as an invited report).</p>" + "Submission's page</a>" + + ( + " before the reporting deadline (currently set at " "{{ deadline }}" + if cls.invitation.submission.reporting_deadline + else "" + ) + + "; your report will be automatically recognized as an invited report).</p>" "\n<p>You might want to make sure you are familiar with our " f'<a href="https://{domain}/journals/journals_terms_and_conditions">' "refereeing code of conduct</a> and with the " @@ -305,8 +326,12 @@ class SubmissionUtils(BaseMailUtil): "sub_title": cls.invitation.submission.title, "author_list": cls.invitation.submission.author_list, "identifier_w_vn_nr": cls.invitation.submission.preprint.identifier_w_vn_nr, - "deadline": datetime.datetime.strftime( - cls.invitation.submission.reporting_deadline, "%Y-%m-%d" + "deadline": ( + datetime.datetime.strftime( + cls.invitation.submission.reporting_deadline, "%Y-%m-%d" + ) + if cls.invitation.submission.reporting_deadline + else "" ), "invitation_key": cls.invitation.invitation_key, } @@ -378,9 +403,13 @@ class SubmissionUtils(BaseMailUtil): 'the "Contribute a Report" link at ' f"https://{domain}/submission/" + cls.invitation.submission.preprint.identifier_w_vn_nr - + " before the reporting deadline (currently set at " - + datetime.datetime.strftime( - cls.invitation.submission.reporting_deadline, "%Y-%m-%d" + + ( + " before the reporting deadline (currently set at " + + datetime.datetime.strftime( + cls.invitation.submission.reporting_deadline, "%Y-%m-%d" + ) + if cls.invitation.submission.reporting_deadline + else "" ) + "; your report will be automatically recognized as an invited report). " "You might want to make sure you are familiar with our refereeing code of conduct " @@ -414,7 +443,8 @@ class SubmissionUtils(BaseMailUtil): "author_list": cls.invitation.submission.author_list, "identifier_w_vn_nr": cls.invitation.submission.preprint.identifier_w_vn_nr, "deadline": datetime.datetime.strftime( - cls.invitation.submission.reporting_deadline, "%Y-%m-%d" + cls.invitation.submission.reporting_deadline, + "%Y-%m-%d" if cls.invitation.submission.reporting_deadline else "", ), } email_text_html += "<br/>" + EMAIL_FOOTER diff --git a/scipost_django/submissions/views/__init__.py b/scipost_django/submissions/views/__init__.py index 52ab7969b5d8a2cd884d2ca33eac6370d2628135..5289dc82efe2ff0ee48f3842728735472030fbff 100644 --- a/scipost_django/submissions/views/__init__.py +++ b/scipost_django/submissions/views/__init__.py @@ -29,6 +29,7 @@ from django.template import Template, Context from django.urls import reverse, reverse_lazy from django.utils import timezone from django.utils.html import format_html +from django.utils.timezone import timedelta from django.views.generic.base import RedirectView from django.views.generic.detail import SingleObjectMixin, DetailView from django.views.generic.edit import CreateView, UpdateView @@ -1305,7 +1306,7 @@ def select_referee(request, identifier_w_vn_nr): Search for a referee in the set of Profiles, and if none is found, create a new Profile and return to this page for further processing. """ - submission = get_object_or_404( + submission: Submission = get_object_or_404( Submission.objects.in_pool_filter_for_eic(request.user), preprint__identifier_w_vn_nr=identifier_w_vn_nr, ) @@ -1323,11 +1324,16 @@ def select_referee(request, identifier_w_vn_nr): ) ) + # If an explicit refereeing deadline does not exist, assume the cycle's default deadline + refereeing_deadline = submission.reporting_deadline or ( + timezone.now() + timedelta(days=submission.cycle.days_for_refereeing) + ) + context = { "submission": submission, "new_profile_form": SimpleProfileForm(), "workdays_left_to_report": workdays_between( - timezone.now(), submission.reporting_deadline + timezone.now(), refereeing_deadline ), } return render(request, "submissions/select_referee.html", context) @@ -1980,6 +1986,16 @@ def extend_refereeing_deadline(request, identifier_w_vn_nr, days): preprint__identifier_w_vn_nr=identifier_w_vn_nr, ) + # Guard against null reporting_deadline + if submission.reporting_deadline is None: + messages.warning(request, "Reporting deadline is not set.") + return redirect( + reverse( + "submissions:editorial_page", + kwargs={"identifier_w_vn_nr": identifier_w_vn_nr}, + ) + ) + Submission.objects.filter(pk=submission.id).update( reporting_deadline=submission.reporting_deadline + datetime.timedelta(days=int(days)), diff --git a/scipost_django/templates/email/fellows/email_fellow_tasklist.html b/scipost_django/templates/email/fellows/email_fellow_tasklist.html index 60e3d45b3e30532ab88644e78586ebf316a5f1e8..8147866f852f2e7b943dbfe00eb0a468e74062a7 100644 --- a/scipost_django/templates/email/fellows/email_fellow_tasklist.html +++ b/scipost_django/templates/email/fellows/email_fellow_tasklist.html @@ -86,7 +86,7 @@ <p> <em>by {{ assignment.submission.author_list }}</em> </p> - <p>Refereeing deadline: {{ assignment.submission.reporting_deadline|date:"Y-m-d" }}.</p> + <p>Refereeing deadline: {% if assignment.submission.reporting_deadline %}{{ assignment.submission.reporting_deadline|date:"Y-m-d" }}{% else %}not set{% endif %} .</p> <p><em>You can manage this Submission from its </em><a href="https://{{ domain }}{% url 'submissions:editorial_page' assignment.submission.preprint.identifier_w_vn_nr %}">Editorial page</a>.</p> </li> {% endfor %} diff --git a/scipost_django/templates/email/referees/confirmation_invitation_response.html b/scipost_django/templates/email/referees/confirmation_invitation_response.html index ee689c770997f1bb295e1dd5044e5f2d354c68e7..663e5612721d7230e0ff469e347b4f14ec9c2e95 100644 --- a/scipost_django/templates/email/referees/confirmation_invitation_response.html +++ b/scipost_django/templates/email/referees/confirmation_invitation_response.html @@ -16,7 +16,10 @@ <p> {% if invitation.accepted %} - We will look forward to receiving your Report by the reporting deadline {{ invitation.submission.reporting_deadline|date:'Y-m-d' }}. + We will look forward to receiving your Report + {% if invitation.submission.reporting_deadline %} + by the reporting deadline {{ invitation.submission.reporting_deadline|date:'Y-m-d' }} + {% endif %}. <br/> Many thanks for your collaboration, {% else %} diff --git a/scipost_django/templates/email/referees/invite_contributor_to_referee.html b/scipost_django/templates/email/referees/invite_contributor_to_referee.html index 1fb8ff8cf6903bfb12de015df8df2a46a4190296..1b8cb6d476a28725650153647f787fa7aefb9133 100644 --- a/scipost_django/templates/email/referees/invite_contributor_to_referee.html +++ b/scipost_django/templates/email/referees/invite_contributor_to_referee.html @@ -15,7 +15,7 @@ Please <a href="https://{{ domain }}{% url 'submissions:accept_or_decline_ref_invitations' %}">accept or decline</a> (login required) this invitation as soon as possible (ideally within the next 2 working days). </p> <p> - If you accept, your report can be submitted by simply clicking on the "Contribute a Report" link on <a href="https://{{ domain }}{{ invitation.submission.get_absolute_url }}">the Submission Page</a> before the reporting deadline (currently set at {{ invitation.submission.reporting_deadline|date:'d-m-Y' }}; your report will be automatically recognized as an invited report). + If you accept, your report can be submitted by simply clicking on the "Contribute a Report" link on <a href="https://{{ domain }}{{ invitation.submission.get_absolute_url }}">the Submission Page</a>{% if invitation.submission.reporting_deadline %} before the reporting deadline (currently set at {{ invitation.submission.reporting_deadline|date:'d-m-Y' }}){% endif %}; your report will be automatically recognized as an invited report. </p> <p> You might want to make sure you are familiar with our <a href="https://{{ domain }}{% url 'submissions:editorial_procedure' %}">editorial procedure</a>, <a href="https://{{ domain }}{% url 'submissions:referee_guidelines' %}">referee guidelines</a> and <a href="https://{{ domain }}{% url 'journals:journals_terms_and_conditions' %}#referee_code_of_conduct">referee code of conduct</a>. diff --git a/scipost_django/templates/email/referees/invite_contributor_to_referee_reminder1.html b/scipost_django/templates/email/referees/invite_contributor_to_referee_reminder1.html index 9db976533b6ed8e5624b41f9894a127ac1e08ec4..4807472f3e2ddac1e390b9c2c5924937fe8c8a87 100644 --- a/scipost_django/templates/email/referees/invite_contributor_to_referee_reminder1.html +++ b/scipost_django/templates/email/referees/invite_contributor_to_referee_reminder1.html @@ -23,7 +23,7 @@ Please <a href="https://{{ domain }}{% url 'submissions:accept_or_decline_ref_invitations' %}">accept or decline</a> (login required) this invitation. </p> <p> - If you accept, your report can be submitted by simply clicking on the "Contribute a Report" link on <a href="https://{{ domain }}{{ invitation.submission.get_absolute_url }}">the Submission Page</a> before the reporting deadline (currently set at {{ invitation.submission.reporting_deadline|date:'d M Y' }}; your report will be automatically recognized as an invited report). + If you accept, your report can be submitted by simply clicking on the "Contribute a Report" link on <a href="https://{{ domain }}{{ invitation.submission.get_absolute_url }}">the Submission Page</a>{% if invitation.submission.reporting_deadline %} before the reporting deadline (currently set at {{ invitation.submission.reporting_deadline|date:'d-m-Y' }}){% endif %}; your report will be automatically recognized as an invited report. </p> <p> You might want to make sure you are familiar with our <a href="https://{{ domain }}{% url 'submissions:editorial_procedure' %}">editorial procedure</a>, <a href="https://{{ domain }}{% url 'submissions:referee_guidelines' %}">referee guidelines</a> and <a href="https://{{ domain }}{% url 'journals:journals_terms_and_conditions' %}#referee_code_of_conduct">referee code of conduct</a>. diff --git a/scipost_django/templates/email/referees/invite_contributor_to_referee_reminder2.html b/scipost_django/templates/email/referees/invite_contributor_to_referee_reminder2.html index 4475fdd077a6d007b8c3bc3ff0b127c01118a71a..e1331c55e223ab014ce0f20b11d23c3b9348b53b 100644 --- a/scipost_django/templates/email/referees/invite_contributor_to_referee_reminder2.html +++ b/scipost_django/templates/email/referees/invite_contributor_to_referee_reminder2.html @@ -23,7 +23,7 @@ Please <a href="https://{{ domain }}{% url 'submissions:accept_or_decline_ref_invitations' %}">accept or decline</a> (login required) this invitation. </p> <p> - If you accept, your report can be submitted by simply clicking on the "Contribute a Report" link on <a href="https://{{ domain }}{{ invitation.submission.get_absolute_url }}">the Submission Page</a> before the reporting deadline (currently set at {{ invitation.submission.reporting_deadline|date:'d M Y' }}; your report will be automatically recognized as an invited report). + If you accept, your report can be submitted by simply clicking on the "Contribute a Report" link on <a href="https://{{ domain }}{{ invitation.submission.get_absolute_url }}">the Submission Page</a>{% if invitation.submission.reporting_deadline %} before the reporting deadline (currently set at {{ invitation.submission.reporting_deadline|date:'d-m-Y' }}){% endif %}; your report will be automatically recognized as an invited report. </p> <p> You might want to make sure you are familiar with our <a href="https://{{ domain }}{% url 'submissions:editorial_procedure' %}">editorial procedure</a>, <a href="https://{{ domain }}{% url 'submissions:referee_guidelines' %}">referee guidelines</a> and <a href="https://{{ domain }}{% url 'journals:journals_terms_and_conditions' %}#referee_code_of_conduct">referee code of conduct</a>. diff --git a/scipost_django/templates/email/referees/reinvite_contributor_to_referee.html b/scipost_django/templates/email/referees/reinvite_contributor_to_referee.html index ed5c67906d95f0d0c31cec8e9f08b62ab8e7d663..8c13f3af94ee290d2000fe0a7b5dbfb026f82649 100644 --- a/scipost_django/templates/email/referees/reinvite_contributor_to_referee.html +++ b/scipost_django/templates/email/referees/reinvite_contributor_to_referee.html @@ -14,7 +14,7 @@ have submitted a new (revised) version of their manuscript to SciPost. On behalf of the Editor-in-charge {{ invitation.submission.editor_in_charge.profile.get_title_display }} {{ invitation.submission.editor_in_charge.user.first_name }} {{ invitation.submission.editor_in_charge.user.last_name }}, we would like to invite you to review this new version. </p> <p> - Your report can be submitted by clicking on the <a href="https://{{ domain }}{% url 'submissions:submit_report' identifier_w_vn_nr=invitation.submission.preprint.identifier_w_vn_nr %}">Contribute a Report</a> link on the <a href="https://{{ domain }}{{ invitation.submission.get_absolute_url }}">Submission's Page</a> before the reporting deadline (currently set at {{ invitation.submission.reporting_deadline|date:'N j, Y' }}). + Your report can be submitted by clicking on the <a href="https://{{ domain }}{% url 'submissions:submit_report' identifier_w_vn_nr=invitation.submission.preprint.identifier_w_vn_nr %}">Contribute a Report</a> link on the <a href="https://{{ domain }}{{ invitation.submission.get_absolute_url }}">Submission's Page</a>{% if invitation.submission.reporting_deadline %} before the reporting deadline (currently set at {{ invitation.submission.reporting_deadline|date:'N j, Y' }}){% endif %}. </p> <p> You might want to make sure you are familiar with our <a href="https://{{ domain }}{% url 'submissions:editorial_procedure' %}">editorial procedure</a>, <a href="https://{{ domain }}{% url 'submissions:referee_guidelines' %}">referee guidelines</a> and <a href="https://{{ domain }}{% url 'journals:journals_terms_and_conditions' %}#referee_code_of_conduct">referee code of conduct</a>.