diff --git a/scipost/managers.py b/scipost/managers.py index b16b82034b11303f60ffa2074a90b55b3a51b86a..5ed6efd72c6b6dd4ee64791308fa36efafb79cfe 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 265d2d9b63ab269a8de20aebb859a63343c5ba8d..7666fdf99faf4ec9d2d9a1b0a806cd0af4037545 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 3b35663eb485e7b94ee30d7d0be5da41ef2be64a..a25a3b5022e656561dc64c6354b6f670f32546b3 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/partials/submissions/pool/submission_info_table.html b/submissions/templates/partials/submissions/pool/submission_info_table.html index 49ec884f6b0d51add7cdc85e399e81cf4fc808b5..d7cbb822007a1fa89613c4872a1669e633c595a7 100644 --- a/submissions/templates/partials/submissions/pool/submission_info_table.html +++ b/submissions/templates/partials/submissions/pool/submission_info_table.html @@ -3,6 +3,12 @@ <td style="min-width: 40%;">Version</td> <td>{{submission.arxiv_vn_nr}} ({% if submission.is_current %}current version{% else %}deprecated version {{submission.arxiv_vn_nr}}{% endif %})</td> </tr> + <tr> + <td>Arxiv Link:</td> + <td> + <a href="{{ submission.arxiv_link }}" target="_blank">{{ submission.arxiv_link }}</a> + </td> + </tr> <tr> <td>Submitted</td> <td>{{submission.submission_date}} to {{submission.get_submitted_to_journal_display}}</td> diff --git a/submissions/templates/submissions/assign_submission.html b/submissions/templates/submissions/assign_submission.html index ce677a88fe3d4413f8cff2bc61373a0532ce9a89..54574a668dbc3eee84644aaf5253beea98d93e53 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/templates/submissions/pool/pool.html b/submissions/templates/submissions/pool/pool.html index 5806e9d40bc7839f6cef44cc36e3a490039c5d37..a1112527805bd55a2242b181b9dcb4d99a96aab4 100644 --- a/submissions/templates/submissions/pool/pool.html +++ b/submissions/templates/submissions/pool/pool.html @@ -26,11 +26,11 @@ <h1>SciPost Submissions Pool</h1> {% if is_ECAdmin %} - {% if recommendations.voting_in_preparation.exists or recommendations.put_to_voting.exists or latest_submission_events %} + {% if recommendations.voting_in_preparation or recommendations.put_to_voting or latest_submission_events %} <div class="quote-border"> <h2 class="text-primary">Administrative Tasks</h2> - {% if recommendations.voting_in_preparation.exists %} + {% if recommendations.voting_in_preparation %} <h3>Recommendations to prepare for voting <i class="fa fa-exclamation-circle text-warning"></i></h3> <ul> {% for recommendation in recommendations.voting_in_preparation %} @@ -41,7 +41,7 @@ </ul> {% endif %} - {% if recommendations.put_to_voting.exists %} + {% if recommendations.put_to_voting %} <h3>Recommendations undergoing voting <i class="fa fa-exclamation-circle text-warning"></i></h3> <ul class="fa-ul"> {% for recommendation in recommendations.put_to_voting %} diff --git a/submissions/templates/submissions/pool/recommendation.html b/submissions/templates/submissions/pool/recommendation.html index e7f703eabbe8dc7d4e39f12660d7deabdcf14255..e4022613693d85d850eb27fe1f8d338c8bf6aad6 100644 --- a/submissions/templates/submissions/pool/recommendation.html +++ b/submissions/templates/submissions/pool/recommendation.html @@ -15,6 +15,9 @@ {% include 'partials/submissions/submission_title.html' with submission=recommendation.submission %} + + <a class="d-inline-block mb-3" href="{{ recommendation.submission.get_absolute_url }}" target="_blank">View Reports and Submission details</a> + {% include 'partials/submissions/pool/submission_info_table.html' with submission=recommendation.submission %} <br> diff --git a/submissions/urls.py b/submissions/urls.py index 139dc2528b6f002e32a1789830ee8492c9d0bf4d..c840e1c0d843ce035b1e2134e1082037d70576aa 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 5ab6f37ae2b273c31938240a2377223c3133d83f..ca61186bf2d3666eb0ef21c3a68a80624206198b 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