diff --git a/submissions/exceptions.py b/submissions/exceptions.py index 0e8794a8cc841af0df2896138ce2ec0209ee0c7e..a6e26c2d6c946fec39d3b402415bd0110e63378a 100644 --- a/submissions/exceptions.py +++ b/submissions/exceptions.py @@ -1,4 +1,4 @@ -class CycleUpdateDeadlineError(Exception): +class BaseCustomException(Exception): def __init__(self, name): self.name = name @@ -6,9 +6,9 @@ class CycleUpdateDeadlineError(Exception): return self.name -class InvalidReportVettingValue(Exception): - def __init__(self, name): - self.name = name +class CycleUpdateDeadlineError(BaseCustomException): + pass - def __str__(self): - return self.name + +class InvalidReportVettingValue(BaseCustomException): + pass diff --git a/submissions/forms.py b/submissions/forms.py index 7f2d39772f1086f15e09c39ef36facb7bda4cb61..8500b892e96a1fd3ae9eb414c0aa7e99111cbb32 100644 --- a/submissions/forms.py +++ b/submissions/forms.py @@ -420,6 +420,17 @@ class ReportForm(forms.ModelForm): 'recommendation', 'remarks_for_editors', 'anonymous'] def __init__(self, *args, **kwargs): + if kwargs.get('instance'): + if kwargs['instance'].is_followup_report: + # Prefill data from latest report in the series + latest_report = kwargs['instance'].latest_report_from_series() + kwargs.update({ + 'initial': { + 'qualification': latest_report.qualification, + 'anonymous': latest_report.anonymous + } + }) + super(ReportForm, self).__init__(*args, **kwargs) self.fields['strengths'].widget.attrs.update({ 'placeholder': ('Give a point-by-point ' @@ -440,7 +451,28 @@ class ReportForm(forms.ModelForm): 'cols': 100 }) - def save(self, submission, current_contributor): + # If the Report is not a followup: Explicitly assign more fields as being required! + if not self.instance.is_followup_report: + required_fields = [ + 'strengths', + 'weaknesses', + 'requested_changes', + 'validity', + 'significance', + 'originality', + 'clarity', + 'formatting', + 'grammar' + ] + for field in required_fields: + self.fields[field].required = True + + # Let user know the field is required! + for field in self.fields: + if self.fields[field].required: + self.fields[field].label += ' *' + + def save(self, submission): """ Update meta data if ModelForm is submitted (non-draft). Possibly overwrite the default status if user asks for saving as draft. @@ -448,7 +480,6 @@ class ReportForm(forms.ModelForm): report = super().save(commit=False) report.submission = submission - report.author = current_contributor report.date_submitted = timezone.now() # Save with right status asked by user @@ -458,7 +489,7 @@ class ReportForm(forms.ModelForm): report.status = STATUS_UNVETTED # Update invitation and report meta data if exist - invitation = submission.referee_invitations.filter(referee=current_contributor).first() + invitation = submission.referee_invitations.filter(referee=report.author).first() if invitation: invitation.fulfilled = True invitation.save() @@ -466,7 +497,7 @@ class ReportForm(forms.ModelForm): # Check if report author if the report is being flagged on the submission if submission.referees_flagged: - if current_contributor.user.last_name in submission.referees_flagged: + if report.author.user.last_name in submission.referees_flagged: report.flagged = True report.save() return report diff --git a/submissions/managers.py b/submissions/managers.py index 7e8a148b350b085842210c73263aba07e4e7832c..4af4e221c2c9c30bbc3a861bdf5b166c1538aa39 100644 --- a/submissions/managers.py +++ b/submissions/managers.py @@ -129,3 +129,6 @@ class ReportManager(models.Manager): def in_draft(self): return self.filter(status=STATUS_DRAFT) + + def non_draft(self): + return self.exclude(status=STATUS_DRAFT) diff --git a/submissions/templates/submissions/submit_report.html b/submissions/templates/submissions/submit_report.html index 63f80e447b69a04de026d1a51db389b58df83e29..fb4029c449a0df7ba6ebd109247bdb01de5e6255 100644 --- a/submissions/templates/submissions/submit_report.html +++ b/submissions/templates/submissions/submit_report.html @@ -81,13 +81,20 @@ <div class="col-12"> <div class="card card-grey"> <div class="card-block"> - <h1>Your report:</h1> - <p class="mb-0">A preview of text areas will appear below as you type (you can use LaTeX \$...\$ for in-text equations or \ [ ... \ ] for on-line equations).</p> + <h1>Your {% if form.instance.is_followup_report %}followup {% endif %}report:</h1> + <p>A preview of text areas will appear below as you type (you can use LaTeX \$...\$ for in-text equations or \ [ ... \ ] for on-line equations).</p> + <p class="mb-0">Any fields with an asterisk (*) are required.</p> + {% if form.instance.is_followup_report %} + <p class="mb-0"> + Because you have already submitted a Report for this Submission series, not all fields are required. + </p> + {% endif %} </div> </div> <form action="{% url 'submissions:submit_report' arxiv_identifier_w_vn_nr=submission.arxiv_identifier_w_vn_nr %}" method="post"> {% csrf_token %} {{ form|bootstrap:'3,9' }} + <p>Any fields with an asterisk (*) are required.</p> <input class="btn btn-primary" type="submit" name="save_submit" value="Submit your report"/> <input class="btn btn-secondary ml-2" type="submit" name="save_draft" value="Save your report as draft"/> <div class="my-4"> diff --git a/submissions/utils.py b/submissions/utils.py index 908f7f35c9a12bfd2a592b2a712b31952f468bce..385dbfc3402e25ff730686360b4f49f6561e8428 100644 --- a/submissions/utils.py +++ b/submissions/utils.py @@ -126,7 +126,6 @@ class BaseSubmissionCycle: self.submission.reporting_deadline = deadline self.submission.save() - def get_required_actions(self): '''Return list of the submission its required actions''' if not self.updated_action: diff --git a/submissions/views.py b/submissions/views.py index dbe926c6d43fff757dc1943d7400f2fe395de3c6..9c1ac57086fefaf1db2a119e88794ebd3b95afb2 100644 --- a/submissions/views.py +++ b/submissions/views.py @@ -1032,6 +1032,10 @@ def submit_report(request, arxiv_identifier_w_vn_nr): errormessage = ('The system flagged you as a potential author of this Submission. ' 'Please go to your personal page under the Submissions tab' ' to clarify this.') + # if submission.reports.non_draft().filter(author=current_contributor).exists(): + # errormessage = ('You have already submitted a Report for this Submission. You cannot' + # ' submit an additional Report.') + if errormessage: messages.warning(request, errormessage) return redirect(reverse('scipost:personal_page')) @@ -1040,12 +1044,12 @@ def submit_report(request, arxiv_identifier_w_vn_nr): try: report_in_draft = submission.reports.in_draft().get(author=current_contributor) except Report.DoesNotExist: - report_in_draft = None + report_in_draft = Report(author=current_contributor, submission=submission) form = ReportForm(request.POST or None, instance=report_in_draft) # Check if data sent is valid if form.is_valid(): - newreport = form.save(submission, current_contributor) + newreport = form.save(submission) if newreport.status == STATUS_DRAFT: messages.success(request, ('Your Report has been saved. ' 'You may carry on working on it,'