diff --git a/submissions/urls.py b/submissions/urls.py index 6191c3b6638edf6933853c961bcfc033ef83a840..6e776fcf71b60a8500c7f7fc8657ac7eb0f9e8e2 100644 --- a/submissions/urls.py +++ b/submissions/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import include, url +from django.conf.urls import url from django.views.generic import TemplateView from . import views @@ -6,7 +6,8 @@ from . import views urlpatterns = [ # Submissions url(r'^$', views.SubmissionListView.as_view(), name='submissions'), - url(r'^browse/(?P<discipline>[a-z]+)/(?P<nrweeksback>[0-9]{1,3})/$', views.SubmissionListView.as_view(), name='browse'), + url(r'^browse/(?P<discipline>[a-z]+)/(?P<nrweeksback>[0-9]{1,3})/$', + views.SubmissionListView.as_view(), name='browse'), url(r'^sub_and_ref_procedure$', TemplateView.as_view(template_name='submissions/sub_and_ref_procedure.html'), name='sub_and_ref_procedure'), @@ -69,17 +70,12 @@ urlpatterns = [ views.communication, name='communication'), url(r'^eic_recommendation/(?P<arxiv_identifier_w_vn_nr>[0-9]{4,}.[0-9]{5,}v[0-9]{1,2})$', views.eic_recommendation, name='eic_recommendation'), - url(r'^cycle/(?P<arxiv_identifier_w_vn_nr>[0-9]{4,}.[0-9]{5,}v[0-9]{1,2})/submit$', views.cycle_form_submit, - name='cycle_confirmation'), + url(r'^cycle/(?P<arxiv_identifier_w_vn_nr>[0-9]{4,}.[0-9]{5,}v[0-9]{1,2})/submit$', + views.cycle_form_submit, name='cycle_confirmation'), # Reports url(r'^submit_report/(?P<arxiv_identifier_w_vn_nr>[0-9]{4,}.[0-9]{5,}v[0-9]{1,2})$', views.submit_report, name='submit_report'), - url(r'^submit_report_ack$', - TemplateView.as_view(template_name='submissions/submit_report_ack.html'), name='submit_report_ack'), - url(r'^vet_submitted_reports$', - views.vet_submitted_reports, name='vet_submitted_reports'), - url(r'^vet_submitted_report_ack/(?P<report_id>[0-9]+)$', - views.vet_submitted_report_ack, name='vet_submitted_report_ack'), + url(r'^vet_submitted_reports$', views.vet_submitted_reports, name='vet_submitted_reports'), # Voting url(r'^prepare_for_voting/(?P<rec_id>[0-9]+)$', views.prepare_for_voting, name='prepare_for_voting'), url(r'^vote_on_rec/(?P<rec_id>[0-9]+)$', views.vote_on_rec, name='vote_on_rec'), diff --git a/submissions/views.py b/submissions/views.py index 4484ba0062fe2a3526f70b674a741fe23e7b0c1f..74471e8fed238e8a427083eeaa1e7e48a7f24084 100644 --- a/submissions/views.py +++ b/submissions/views.py @@ -989,25 +989,42 @@ def eic_recommendation(request, arxiv_identifier_w_vn_nr): ########### # Reports ########### - @login_required @permission_required('scipost.can_referee', raise_exception=True) @transaction.atomic def submit_report(request, arxiv_identifier_w_vn_nr): + """ + A form to submit a report on a submission will be shown and processed here. + + Important checks to be aware of include an author check for the submission, + has the reporting deadline not been reached yet and does there exist any invitation + for the current user on this submission. + """ submission = get_object_or_404(Submission.objects.all(), arxiv_identifier_w_vn_nr=arxiv_identifier_w_vn_nr) # Check whether the user can submit a report: - is_author = request.user.contributor in submission.authors.all() + current_contributor = request.user.contributor + is_author = current_contributor in submission.authors.all() is_author_unchecked = (not is_author and not - (request.user.contributor in submission.authors_false_claims.all()) and + (current_contributor in submission.authors_false_claims.all()) and (request.user.last_name in submission.author_list)) - invitation = submission.referee_invitations.filter(referee=request.user.contributor).first() + invitation = submission.referee_invitations.filter(referee=current_contributor).first() errormessage = None - if not invitation and timezone.now() > submission.reporting_deadline + datetime.timedelta(days=1): - errormessage = ('The reporting deadline has passed. You cannot submit' - ' a Report anymore.') - # Also, delete possible report in draft here? + if not invitation: + if timezone.now() > submission.reporting_deadline + datetime.timedelta(days=1): + errormessage = ('The reporting deadline has passed. You cannot submit' + ' a Report anymore.') + elif not submission.open_for_reporting: + errormessage = ('Reporting for this submission has closed. You cannot submit' + ' a Report anymore.') + + if errormessage: + # Remove old drafts from the database + reports_in_draft_to_remove = (submission.reports.in_draft() + .filter(author=current_contributor)) + if reports_in_draft_to_remove: + reports_in_draft_to_remove.delete() if is_author: errormessage = 'You are an author of this Submission and cannot submit a Report.' if is_author_unchecked: @@ -1018,37 +1035,23 @@ def submit_report(request, arxiv_identifier_w_vn_nr): messages.warning(request, errormessage) return redirect(reverse('scipost:personal_page')) + # Find and fill earlier version of report try: - report_in_draft = submission.reports.in_draft().get(author=request.user.contributor) + report_in_draft = submission.reports.in_draft().get(author=current_contributor) except Report.DoesNotExist: report_in_draft = None form = ReportForm(request.POST or None, instance=report_in_draft) - if form.is_valid(): - author = request.user.contributor - newreport = form.save(commit=False) - newreport.submission = submission - newreport.author = author - newreport.date_submitted = timezone.now() - newreport.save() + # Check if data sent is valid + if form.is_valid(): + newreport = form.save(submission, current_contributor) if newreport.status == STATUS_DRAFT: messages.success(request, ('Your Report has been saved. ' 'You may leave the page and finish it later.')) context = {'submission': submission, 'form': form} return render(request, 'submissions/submit_report.html', context) - if invitation: - invitation.fulfilled = True - invitation.save() - newreport.invited = True - - # Check if author if the report is being flagged on the submission - if submission.referees_flagged: - if author.user.last_name in submission.referees_flagged: - newreport.flagged = True - newreport.save() - - # Update user stats + # Send mails if report is submitted SubmissionUtils.load({'report': newreport}, request) SubmissionUtils.email_EIC_report_delivered() SubmissionUtils.email_referee_report_delivered() @@ -1066,42 +1069,39 @@ def submit_report(request, arxiv_identifier_w_vn_nr): @login_required @permission_required('scipost.can_take_charge_of_submissions', raise_exception=True) def vet_submitted_reports(request): + """ + Reports with status `unvetted` will be shown one-by-one. An user may only + vet reports of submissions he/she is EIC of. + + After vetting an email is sent to the report author, bcc EIC. If report + has not been refused, the submission author is also mailed. + """ contributor = Contributor.objects.get(user=request.user) report_to_vet = (Report.objects.awaiting_vetting() + .select_related('submission') .filter(submission__editor_in_charge=contributor).first()) - form = VetReportForm() - context = {'contributor': contributor, 'report_to_vet': report_to_vet, 'form': form} - return(render(request, 'submissions/vet_submitted_reports.html', context)) - -@permission_required('scipost.can_take_charge_of_submissions', raise_exception=True) -@transaction.atomic -def vet_submitted_report_ack(request, report_id): - report = get_object_or_404(Report.objects.awaiting_vetting(), pk=report_id, - submission__editor_in_charge=request.user.contributor) - form = VetReportForm(request.POST or None) + form = VetReportForm(request.POST or None, initial={'report': report_to_vet}) if form.is_valid(): - report.vetted_by = request.user.contributor - if form.cleaned_data['action_option'] == '1': - # accept the report as is - report.status = STATUS_VETTED - report.save() - report.submission.latest_activity = timezone.now() - report.submission.save() - elif form.cleaned_data['action_option'] == '2': - # the report is simply rejected - report.status = form.cleaned_data['refusal_reason'] - report.save() + report = form.process_vetting(request.user.contributor) + # email report author SubmissionUtils.load({'report': report, 'email_response': form.cleaned_data['email_response_field']}) SubmissionUtils.acknowledge_report_email() # email report author, bcc EIC if report.status == STATUS_VETTED: SubmissionUtils.send_author_report_received_email() - messages.success(request, 'Submitted Report vetted.') - return redirect(reverse('submissions:editorial_page', - args=[report.submission.arxiv_identifier_w_vn_nr])) - return redirect(reverse('submissions:vet_submitted_reports')) + + message = 'Submitted Report vetted for <a href="%s">%s</a>.' % ( + reverse('submissions:editorial_page', + args=(report.submission.arxiv_identifier_w_vn_nr,)), + report.submission.arxiv_identifier_w_vn_nr + ) + messages.success(request, message) + # Redirect instead of render to loose the POST call and make it a GET + return redirect(reverse('submissions:vet_submitted_reports')) + context = {'contributor': contributor, 'report_to_vet': report_to_vet, 'form': form} + return render(request, 'submissions/vet_submitted_reports.html', context) @permission_required('scipost.can_prepare_recommendations_for_voting', raise_exception=True)