From fab944216e19ee6afc06f4a5377a7eadce6c8ac6 Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Sat, 27 Jan 2018 14:18:26 +0100
Subject: [PATCH] Improve EditorialAssignment actions

---
 scipost/managers.py                           |  7 ++-
 scipost/models.py                             |  4 +-
 submissions/forms.py                          | 23 ++++++---
 .../submissions/assign_submission.html        |  2 +-
 submissions/urls.py                           |  2 -
 submissions/views.py                          | 51 +++++--------------
 6 files changed, 38 insertions(+), 51 deletions(-)

diff --git a/scipost/managers.py b/scipost/managers.py
index b16b82034..5ed6efd72 100644
--- a/scipost/managers.py
+++ b/scipost/managers.py
@@ -18,10 +18,15 @@ class FellowManager(models.Manager):
             ).order_by('contributor__user__last_name')
 
 
-class ContributorManager(models.Manager):
+class ContributorQuerySet(models.QuerySet):
     def active(self):
         return self.filter(user__is_active=True, status=CONTRIBUTOR_NORMAL)
 
+    def available(self):
+        return self.exclude(
+            unavailability_periods__start__lte=today,
+            unavailability_periods__end__lte=today)
+
     def awaiting_validation(self):
         return self.filter(user__is_active=False, status=CONTRIBUTOR_NEWLY_REGISTERED)
 
diff --git a/scipost/models.py b/scipost/models.py
index 265d2d9b6..7666fdf99 100644
--- a/scipost/models.py
+++ b/scipost/models.py
@@ -16,7 +16,7 @@ from .constants import SCIPOST_DISCIPLINES, SCIPOST_SUBJECT_AREAS,\
                        INVITATION_CONTRIBUTOR, INVITATION_FORMAL,\
                        AUTHORSHIP_CLAIM_PENDING, AUTHORSHIP_CLAIM_STATUS
 from .fields import ChoiceArrayField
-from .managers import FellowManager, ContributorManager, RegistrationInvitationManager,\
+from .managers import FellowManager, ContributorQuerySet, RegistrationInvitationManager,\
                       UnavailabilityPeriodManager, AuthorshipClaimQuerySet
 
 today = timezone.now().date()
@@ -61,7 +61,7 @@ class Contributor(models.Model):
         default=True,
         verbose_name="I accept to receive SciPost emails")
 
-    objects = ContributorManager()
+    objects = ContributorQuerySet.as_manager()
 
     def __str__(self):
         return '%s, %s' % (self.user.last_name, self.user.first_name)
diff --git a/submissions/forms.py b/submissions/forms.py
index 3b35663eb..a25a3b502 100644
--- a/submissions/forms.py
+++ b/submissions/forms.py
@@ -423,16 +423,23 @@ class SubmissionReportsForm(forms.ModelForm):
 # Editorial workflow #
 ######################
 
-class AssignSubmissionForm(forms.Form):
+class EditorialAssignmentForm(forms.ModelForm):
+    class Meta:
+        model = EditorialAssignment
+        fields = ('to',)
+        labels = {
+            'to': 'Fellow',
+        }
 
     def __init__(self, *args, **kwargs):
-        discipline = kwargs.pop('discipline')
-        super(AssignSubmissionForm, self).__init__(*args, **kwargs)
-        self.fields['editor_in_charge'] = forms.ModelChoiceField(
-            queryset=Contributor.objects.filter(user__groups__name='Editorial College',
-                                                user__contributor__discipline=discipline,
-                                                ).order_by('user__last_name'),
-            required=True, label='Select an Editor-in-charge')
+        self.submission = kwargs.pop('submission')
+        super().__init__(*args, **kwargs)
+        self.fields['to'].queryset = Contributor.objects.available().filter(
+            fellowships__pool=self.submission).distinct()
+
+    def save(self, commit=True):
+        self.instance.submission = self.submission
+        return super().save(commit)
 
 
 class ConsiderAssignmentForm(forms.Form):
diff --git a/submissions/templates/submissions/assign_submission.html b/submissions/templates/submissions/assign_submission.html
index ce677a88f..54574a668 100644
--- a/submissions/templates/submissions/assign_submission.html
+++ b/submissions/templates/submissions/assign_submission.html
@@ -54,7 +54,7 @@
 <div class="row mb-md-4">
     <div class="col-12">
       <h2 class="highlight">Send a new assignment request:</h2>
-      <form action="{% url 'submissions:assign_submission_ack' arxiv_identifier_w_vn_nr=submission_to_assign.arxiv_identifier_w_vn_nr %}" method="post">
+      <form action="{% url 'submissions:assign_submission' arxiv_identifier_w_vn_nr=submission_to_assign.arxiv_identifier_w_vn_nr %}" method="post">
         {% csrf_token %}
         {{ form|bootstrap }}
         <input class="btn btn-secondary" type="submit" value="Submit" />
diff --git a/submissions/urls.py b/submissions/urls.py
index 139dc2528..c840e1c0d 100644
--- a/submissions/urls.py
+++ b/submissions/urls.py
@@ -51,8 +51,6 @@ urlpatterns = [
     # Assignment of Editor-in-charge
     url(r'^assign_submission/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
         views.assign_submission, name='assign_submission'),
-    url(r'^assign_submission_ack/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.assign_submission_ack, name='assign_submission_ack'),
     url(r'^pool/assignment_request/(?P<assignment_id>[0-9]+)$',
         views.assignment_request, name='assignment_request'),
     url(r'^volunteer_as_EIC/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
diff --git a/submissions/views.py b/submissions/views.py
index 5ab6f37ae..ca61186bf 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -27,7 +27,7 @@ from .models import Submission, EICRecommendation, EditorialAssignment,\
                     RefereeInvitation, Report, SubmissionEvent
 from .mixins import SubmissionAdminViewMixin
 from .forms import SubmissionIdentifierForm, RequestSubmissionForm, SubmissionSearchForm,\
-                   RecommendationVoteForm, ConsiderAssignmentForm, AssignSubmissionForm,\
+                   RecommendationVoteForm, ConsiderAssignmentForm, EditorialAssignmentForm,\
                    SetRefereeingDeadlineForm, RefereeSelectForm, RefereeRecruitmentForm,\
                    ConsiderRefereeInvitationForm, EditorialCommunicationForm,\
                    EICRecommendationForm, ReportForm, VetReportForm, VotingEligibilityForm,\
@@ -428,48 +428,25 @@ def add_remark(request, arxiv_identifier_w_vn_nr):
 @login_required
 @permission_required('scipost.can_assign_submissions', raise_exception=True)
 def assign_submission(request, arxiv_identifier_w_vn_nr):
-    """
-    Assign Editor-in-charge to Submission.
-    Action done by SciPost Administration or Editorial College Administration.
-    """
-    submission_to_assign = get_object_or_404(Submission.objects.pool_editable(request.user),
-                                             arxiv_identifier_w_vn_nr=arxiv_identifier_w_vn_nr)
-    form = AssignSubmissionForm(discipline=submission_to_assign.discipline)
-    context = {'submission_to_assign': submission_to_assign,
-               'form': form}
-    return render(request, 'submissions/assign_submission.html', context)
-
-
-@login_required
-@permission_required('scipost.can_assign_submissions', raise_exception=True)
-def assign_submission_ack(request, arxiv_identifier_w_vn_nr):
     """
     Assign Editor-in-charge to Submission.
     Action done by SciPost Administration or Editorial College Administration.
     """
     submission = get_object_or_404(Submission.objects.pool_editable(request.user),
                                    arxiv_identifier_w_vn_nr=arxiv_identifier_w_vn_nr)
-    if request.method == 'POST':
-        form = AssignSubmissionForm(request.POST, discipline=submission.discipline)
-        if form.is_valid():
-            suggested_editor_in_charge = form.cleaned_data['editor_in_charge']
-            # TODO: check for possible co-authorships, disqualifying this suggested EIC
-            if not suggested_editor_in_charge.is_currently_available:
-                errormessage = ('This Fellow is marked as currently unavailable. '
-                                'Please go back and select another one.')
-                return render(request, 'scipost/error.html', {'errormessage': errormessage})
-            ed_assignment = EditorialAssignment(submission=submission,
-                                                to=suggested_editor_in_charge,
-                                                date_created=timezone.now())
-            ed_assignment.save()
-            SubmissionUtils.load({'assignment': ed_assignment})
-            SubmissionUtils.send_assignment_request_email()
-
-    context = {'ack_header': 'Your assignment request has been sent successfully.',
-               'followup_message': 'Return to the ',
-               'followup_link': reverse('submissions:pool'),
-               'followup_link_label': 'Submissions pool'}
-    return render(request, 'scipost/acknowledgement.html', context)
+    form = EditorialAssignmentForm(request.POST or None, submission=submission)
+
+    if form.is_valid():
+        ed_assignment = form.save()
+        SubmissionUtils.load({'assignment': ed_assignment})
+        SubmissionUtils.send_assignment_request_email()
+        messages.success(request, 'Your assignment request has been sent successfully.')
+        return redirect('submissions:pool')
+    context = {
+        'submission_to_assign': submission,
+        'form': form
+    }
+    return render(request, 'submissions/assign_submission.html', context)
 
 
 @login_required
-- 
GitLab