From 1b095010b5fa6c20548476ca5b4f06ebc1f8ec7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20Caux?= <git@jscaux.org> Date: Fri, 9 Dec 2022 07:03:56 +0100 Subject: [PATCH] Change submissions.views from module to package --- scipost_django/submissions/urls/pool.py | 18 +- .../{views.py => views/__init__.py} | 214 +---------------- scipost_django/submissions/views/pool.py | 227 ++++++++++++++++++ 3 files changed, 242 insertions(+), 217 deletions(-) rename scipost_django/submissions/{views.py => views/__init__.py} (93%) create mode 100644 scipost_django/submissions/views/pool.py diff --git a/scipost_django/submissions/urls/pool.py b/scipost_django/submissions/urls/pool.py index e801e6108..4a1cc7be7 100644 --- a/scipost_django/submissions/urls/pool.py +++ b/scipost_django/submissions/urls/pool.py @@ -4,7 +4,7 @@ __license__ = "AGPL v3" from django.urls import include, path -from .. import views +import submissions.views.pool as views_pool app_name = "pool" @@ -13,12 +13,12 @@ app_name = "pool" urlpatterns = [ # building on /submissions/pool/ path( "", - views.pool, + views_pool.pool, name="pool", ), path( # <identifier>/ "<identifier:identifier_w_vn_nr>/", - views.pool, + views_pool.pool, name="pool", ), path( @@ -26,25 +26,25 @@ urlpatterns = [ # building on /submissions/pool/ include([ path( "", - views.pool_hx_submissions_list, + views_pool.pool_hx_submissions_list, name="_hx_submissions_list", ), path( "<identifier:identifier_w_vn_nr>", - views.pool_hx_submission_li_details, + views_pool.pool_hx_submission_li_details, name="_hx_submission_li_details", ), ]), ), path( "add_remark/<identifier:identifier_w_vn_nr>", - views.add_remark, + views_pool.add_remark, name="add_remark", ), # Assignment of Editor-in-charge path( "assignment_request/<int:assignment_id>", - views.assignment_request, + views_pool.assignment_request, name="assignment_request", ), path( @@ -52,12 +52,12 @@ urlpatterns = [ # building on /submissions/pool/ include([ path( "", - views.editorial_assignment, + views_pool.editorial_assignment, name="editorial_assignment", ), path( "<int:assignment_id>/", - views.editorial_assignment, + views_pool.editorial_assignment, name="editorial_assignment", ), ]), diff --git a/scipost_django/submissions/views.py b/scipost_django/submissions/views/__init__.py similarity index 93% rename from scipost_django/submissions/views.py rename to scipost_django/submissions/views/__init__.py index 3961d2bbd..1665c4c43 100644 --- a/scipost_django/submissions/views.py +++ b/scipost_django/submissions/views/__init__.py @@ -37,7 +37,7 @@ from django.views.generic.list import ListView from dal import autocomplete -from .constants import ( +from ..constants import ( STATUS_VETTED, STATUS_DRAFT, CYCLE_DIRECT_REC, @@ -48,8 +48,8 @@ from .constants import ( DECISION_FIXED, FIGSHARE_PREPRINT_SERVERS, ) -from .helpers import check_verified_author, check_unverified_author -from .models import ( +from ..helpers import check_verified_author, check_unverified_author +from ..models import ( Submission, PreprintServer, EICRecommendation, @@ -61,8 +61,8 @@ from .models import ( Report, SubmissionEvent, ) -from .mixins import SubmissionMixin, SubmissionAdminViewMixin -from .forms import ( +from ..mixins import SubmissionMixin, SubmissionAdminViewMixin +from ..forms import ( SciPostPrefillForm, ArXivPrefillForm, ChemRxivPrefillForm, @@ -88,7 +88,6 @@ from .forms import ( ReportPDFForm, SubmissionReportsForm, EICRecommendationForm, - # FixCollegeDecisionForm, EditorialDecisionForm, SubmissionTargetJournalForm, SubmissionTargetProceedingsForm, @@ -97,7 +96,7 @@ from .forms import ( PreassignEditorsFormSet, SubmissionReassignmentForm, ) -from .utils import SubmissionUtils +from ..utils import SubmissionUtils from colleges.models import PotentialFellowship, Fellowship from colleges.permissions import ( @@ -852,89 +851,6 @@ def editorial_workflow(request): return render(request, "submissions/editorial_workflow.html") -@login_required -@fellowship_or_admin_required() -def pool(request, identifier_w_vn_nr=None): - """ - Listing of Submissions for purposes of editorial handling. - """ - nr_potfels_to_vote_on = PotentialFellowship.objects.to_vote_on( - request.user.contributor - ).count() - recs_to_vote_on = EICRecommendation.objects.user_must_vote_on(request.user) - recs_current_voted = EICRecommendation.objects.user_current_voted(request.user) - assignments_to_consider = EditorialAssignment.objects.invited().filter( - to=request.user.contributor - ) - initial = {"status": Submission.SEEKING_ASSIGNMENT} - if identifier_w_vn_nr: - initial = {"identifier": identifier_w_vn_nr} - context = { - "nr_potfels_to_vote_on": nr_potfels_to_vote_on, - "recs_to_vote_on": recs_to_vote_on, - "recs_current_voted": recs_current_voted, - "assignments_to_consider": assignments_to_consider, - "form": SubmissionPoolSearchForm(initial=initial, request=request), - } - return render(request, "submissions/pool/pool.html", context) - - -@login_required -@fellowship_or_admin_required() -def pool_hx_submissions_list(request): - form = SubmissionPoolSearchForm(request.POST or None, request=request) - if form.is_valid(): - submissions = form.search_results(request.user) - else: - submissions = Submission.objects.in_pool(request.user)[:16] - paginator = Paginator(submissions, 16) - page_nr = request.GET.get("page") - page_obj = paginator.get_page(page_nr) - count = paginator.count - start_index = page_obj.start_index - context = {"count": count, "page_obj": page_obj, "start_index": start_index,} - return render(request, "submissions/pool/_hx_submissions_list.html", context) - - -@login_required -@fellowship_or_admin_required() -def pool_hx_submission_li_details(request, identifier_w_vn_nr): - submission = get_object_or_404( - Submission.objects.in_pool(request.user, historical=True), - preprint__identifier_w_vn_nr=identifier_w_vn_nr, - ) - context = {"remark_form": RemarkForm(), "submission": submission} - return render(request, "submissions/pool/_hx_submission_li_details.html", context) - - -@login_required -@fellowship_or_admin_required() -def add_remark(request, identifier_w_vn_nr): - """Form view to add a Remark to a Submission. - - With this method, an Editorial Fellow or Board Member - is adding a remark on a Submission. - """ - submission = get_object_or_404( - Submission.objects.in_pool(request.user), - preprint__identifier_w_vn_nr=identifier_w_vn_nr, - ) - - remark_form = RemarkForm(request.POST or None) - if remark_form.is_valid(): - remark = Remark( - contributor=request.user.contributor, - submission=submission, - date=timezone.now(), - remark=remark_form.cleaned_data["remark"], - ) - remark.save() - messages.success(request, "Your remark has succesfully been posted") - else: - messages.warning(request, "The form was invalidly filled.") - return redirect(reverse("submissions:pool:pool", args=(identifier_w_vn_nr,))) - - @permission_required("scipost.can_manage_ontology", raise_exception=True) def submission_add_topic(request, identifier_w_vn_nr): """ @@ -984,124 +900,6 @@ def submission_remove_topic(request, identifier_w_vn_nr, slug): return redirect(submission.get_absolute_url()) -@login_required -@fellowship_required() -@transaction.atomic -def editorial_assignment(request, identifier_w_vn_nr, assignment_id=None): - """Editorial Assignment form view.""" - submission = get_object_or_404( - Submission.objects.seeking_assignment().in_pool(request.user), - preprint__identifier_w_vn_nr=identifier_w_vn_nr, - ) - - # Check if Submission is still valid for a new assignment. - if submission.editor_in_charge: - messages.success( - request, - "{} {} has already agreed to be Editor-in-charge of this Submission.".format( - submission.editor_in_charge.profile.get_title_display(), - submission.editor_in_charge.user.last_name, - ), - ) - return redirect("submissions:pool:pool") - elif submission.status == submission.ASSIGNMENT_FAILED: - messages.success( - request, - ( - "Thank you for considering." - " This Submission has failed assignment and has been rejected." - ), - ) - return redirect("submissions:pool:pool") - - if assignment_id: - # Process existing EditorialAssignment. - assignment = get_object_or_404( - submission.editorial_assignments.invited(), - to=request.user.contributor, - pk=assignment_id, - ) - else: - # Get or create EditorialAssignment for user. - try: - assignment = ( - submission.editorial_assignments.invited() - .filter(to__user=request.user) - .first() - ) - except EditorialAssignment.DoesNotExist: - assignment = EditorialAssignment() - - form = EditorialAssignmentForm( - request.POST or None, - submission=submission, - instance=assignment, - request=request, - ) - if form.is_valid(): - assignment = form.save() - if form.has_accepted_invite(): - # Fellow accepted to do a normal refereeing cycle. - SubmissionUtils.load({"assignment": assignment}) - SubmissionUtils.send_EIC_appointment_email() - - if form.is_normal_cycle(): - # Inform authors about new status. - SubmissionUtils.send_author_assignment_passed_email() - else: - # Inform authors about new status. - mail_sender = DirectMailUtil( - "authors/inform_authors_eic_assigned_direct_rec", - assignment=assignment, - ) - mail_sender.send_mail() - - submission.add_general_event("The Editor-in-charge has been assigned.") - msg = "Thank you for becoming Editor-in-charge of this submission." - url = reverse( - "submissions:editorial_page", - args=(submission.preprint.identifier_w_vn_nr,), - ) - else: - # Fellow declined the invitation. - msg = "Thank you for considering" - url = reverse("submissions:pool:pool") - - # Form submitted; redirect user - messages.success(request, msg) - return redirect(url) - - context = { - "form": form, - "submission": submission, - "assignment": assignment, - } - return render(request, "submissions/pool/editorial_assignment.html", context) - - -@login_required -@fellowship_required() -def assignment_request(request, assignment_id): - """Redirect to Editorial Assignment form view. - - Exists for historical reasons; email are sent with this url construction. - """ - assignment = get_object_or_404( - EditorialAssignment.objects.invited(), - to=request.user.contributor, - pk=assignment_id, - ) - return redirect( - reverse( - "submissions:pool:editorial_assignment", - kwargs={ - "identifier_w_vn_nr": assignment.submission.preprint.identifier_w_vn_nr, - "assignment_id": assignment.id, - }, - ) - ) - - @login_required @permission_required("scipost.can_assign_submissions", raise_exception=True) def update_authors_assignment(request, identifier_w_vn_nr, nrweeks): diff --git a/scipost_django/submissions/views/pool.py b/scipost_django/submissions/views/pool.py new file mode 100644 index 000000000..97dcff532 --- /dev/null +++ b/scipost_django/submissions/views/pool.py @@ -0,0 +1,227 @@ +__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" +__license__ = "AGPL v3" + + +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.core.paginator import Paginator +from django.db import transaction +from django.shortcuts import get_object_or_404, render, redirect +from django.urls import reverse + +from scipost.models import Remark +from scipost.forms import RemarkForm +from colleges.models import PotentialFellowship, Fellowship +from colleges.permissions import ( + fellowship_required, + fellowship_or_admin_required, +) + +from submissions.models import ( + EditorialAssignment, + EICRecommendation, + Submission, +) +from submissions.forms import SubmissionPoolSearchForm +from submissions.utils import SubmissionUtils + + +@login_required +@fellowship_or_admin_required() +def pool(request, identifier_w_vn_nr=None): + """ + Listing of Submissions for purposes of editorial handling. + """ + nr_potfels_to_vote_on = PotentialFellowship.objects.to_vote_on( + request.user.contributor + ).count() + recs_to_vote_on = EICRecommendation.objects.user_must_vote_on(request.user) + recs_current_voted = EICRecommendation.objects.user_current_voted(request.user) + assignments_to_consider = EditorialAssignment.objects.invited().filter( + to=request.user.contributor + ) + initial = {"status": Submission.SEEKING_ASSIGNMENT} + if identifier_w_vn_nr: + initial = {"identifier": identifier_w_vn_nr} + context = { + "nr_potfels_to_vote_on": nr_potfels_to_vote_on, + "recs_to_vote_on": recs_to_vote_on, + "recs_current_voted": recs_current_voted, + "assignments_to_consider": assignments_to_consider, + "form": SubmissionPoolSearchForm(initial=initial, request=request), + } + return render(request, "submissions/pool/pool.html", context) + + +@login_required +@fellowship_or_admin_required() +def pool_hx_submissions_list(request): + form = SubmissionPoolSearchForm(request.POST or None, request=request) + if form.is_valid(): + submissions = form.search_results(request.user) + else: + submissions = Submission.objects.in_pool(request.user)[:16] + paginator = Paginator(submissions, 16) + page_nr = request.GET.get("page") + page_obj = paginator.get_page(page_nr) + count = paginator.count + start_index = page_obj.start_index + context = {"count": count, "page_obj": page_obj, "start_index": start_index,} + return render(request, "submissions/pool/_hx_submissions_list.html", context) + + +@login_required +@fellowship_or_admin_required() +def pool_hx_submission_li_details(request, identifier_w_vn_nr): + submission = get_object_or_404( + Submission.objects.in_pool(request.user, historical=True), + preprint__identifier_w_vn_nr=identifier_w_vn_nr, + ) + context = {"remark_form": RemarkForm(), "submission": submission} + return render(request, "submissions/pool/_hx_submission_li_details.html", context) + + +@login_required +@fellowship_or_admin_required() +def add_remark(request, identifier_w_vn_nr): + """Form view to add a Remark to a Submission. + + With this method, an Editorial Fellow or Board Member + is adding a remark on a Submission. + """ + submission = get_object_or_404( + Submission.objects.in_pool(request.user), + preprint__identifier_w_vn_nr=identifier_w_vn_nr, + ) + + remark_form = RemarkForm(request.POST or None) + if remark_form.is_valid(): + remark = Remark( + contributor=request.user.contributor, + submission=submission, + date=timezone.now(), + remark=remark_form.cleaned_data["remark"], + ) + remark.save() + messages.success(request, "Your remark has succesfully been posted") + else: + messages.warning(request, "The form was invalidly filled.") + return redirect(reverse("submissions:pool:pool", args=(identifier_w_vn_nr,))) + + +@login_required +@fellowship_required() +def assignment_request(request, assignment_id): + """Redirect to Editorial Assignment form view. + + Exists for historical reasons; email are sent with this url construction. + """ + assignment = get_object_or_404( + EditorialAssignment.objects.invited(), + to=request.user.contributor, + pk=assignment_id, + ) + return redirect( + reverse( + "submissions:pool:editorial_assignment", + kwargs={ + "identifier_w_vn_nr": assignment.submission.preprint.identifier_w_vn_nr, + "assignment_id": assignment.id, + }, + ) + ) + + +@login_required +@fellowship_required() +@transaction.atomic +def editorial_assignment(request, identifier_w_vn_nr, assignment_id=None): + """Editorial Assignment form view.""" + submission = get_object_or_404( + Submission.objects.seeking_assignment().in_pool(request.user), + preprint__identifier_w_vn_nr=identifier_w_vn_nr, + ) + + # Check if Submission is still valid for a new assignment. + if submission.editor_in_charge: + messages.success( + request, + "{} {} has already agreed to be Editor-in-charge of this Submission.".format( + submission.editor_in_charge.profile.get_title_display(), + submission.editor_in_charge.user.last_name, + ), + ) + return redirect("submissions:pool:pool") + elif submission.status == submission.ASSIGNMENT_FAILED: + messages.success( + request, + ( + "Thank you for considering." + " This Submission has failed assignment and has been rejected." + ), + ) + return redirect("submissions:pool:pool") + + if assignment_id: + # Process existing EditorialAssignment. + assignment = get_object_or_404( + submission.editorial_assignments.invited(), + to=request.user.contributor, + pk=assignment_id, + ) + else: + # Get or create EditorialAssignment for user. + try: + assignment = ( + submission.editorial_assignments.invited() + .filter(to__user=request.user) + .first() + ) + except EditorialAssignment.DoesNotExist: + assignment = EditorialAssignment() + + form = EditorialAssignmentForm( + request.POST or None, + submission=submission, + instance=assignment, + request=request, + ) + if form.is_valid(): + assignment = form.save() + if form.has_accepted_invite(): + # Fellow accepted to do a normal refereeing cycle. + SubmissionUtils.load({"assignment": assignment}) + SubmissionUtils.send_EIC_appointment_email() + + if form.is_normal_cycle(): + # Inform authors about new status. + SubmissionUtils.send_author_assignment_passed_email() + else: + # Inform authors about new status. + mail_sender = DirectMailUtil( + "authors/inform_authors_eic_assigned_direct_rec", + assignment=assignment, + ) + mail_sender.send_mail() + + submission.add_general_event("The Editor-in-charge has been assigned.") + msg = "Thank you for becoming Editor-in-charge of this submission." + url = reverse( + "submissions:editorial_page", + args=(submission.preprint.identifier_w_vn_nr,), + ) + else: + # Fellow declined the invitation. + msg = "Thank you for considering" + url = reverse("submissions:pool:pool") + + # Form submitted; redirect user + messages.success(request, msg) + return redirect(url) + + context = { + "form": form, + "submission": submission, + "assignment": assignment, + } + return render(request, "submissions/pool/editorial_assignment.html", context) -- GitLab