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