diff --git a/scipost/permissions.py b/scipost/permissions.py new file mode 100644 index 0000000000000000000000000000000000000000..a9a936925fa6dc6560fc94c8f4d3340c2b9e6cff --- /dev/null +++ b/scipost/permissions.py @@ -0,0 +1,6 @@ + +def is_tester(user): + """ + This method checks if user is member of the Test Group. + """ + return user.groups.filter(name='Testers').exists() diff --git a/scipost/static/scipost/assets/css/_pool.scss b/scipost/static/scipost/assets/css/_pool.scss new file mode 100644 index 0000000000000000000000000000000000000000..e5e62bc3dc4a8b1994cdc4d1a26bd945bc677538 --- /dev/null +++ b/scipost/static/scipost/assets/css/_pool.scss @@ -0,0 +1,20 @@ +$pool-icons-width: 40px; +$pool-flex-width: calc(100% - 40px); + + +.pool .pool-item { + .icons { + padding-left: 10px; + padding-right: 10px; + position: relative; + min-height: 1px; + flex: 0 0 $pool-icons-width; + max-width: $pool-icons-width; + } + + .item { + flex: 0 0 $pool-flex-width; + width: $pool-flex-width; + max-width: none; + } +} diff --git a/scipost/static/scipost/assets/css/_type.scss b/scipost/static/scipost/assets/css/_type.scss index 9f21c44547325bbbf1055366f00574a18cc4a3b2..056fe6dcb5bb8c21f77aee7affb8a68a0cfec105 100644 --- a/scipost/static/scipost/assets/css/_type.scss +++ b/scipost/static/scipost/assets/css/_type.scss @@ -112,28 +112,6 @@ hr.hr12 { margin-bottom: 0; } -.circle, -.circle-clickable { - display: inline-block; - background: #fff; - border: 2px solid #333; - color: #333; - border-radius: 100%; - width: 17px; - height: 17px; - line-height: 16px; - text-align: center; - font-size: 9px; - transition: 0.1s; -} - -.circle-clickable { - cursor: pointer; - color: #bbb; - border-color: #bbb; - - &:hover { - border-color: #333; - color: #333; - } +.fa[data-toggle="tooltip"] { + font-size: 1.5em; } diff --git a/scipost/static/scipost/assets/css/style.scss b/scipost/static/scipost/assets/css/style.scss index 5c8bb75eef61d1059c45fa6a2e6d1f86d20e8b1f..be68d319863f3b5d962c823aca10301be2f28b73 100644 --- a/scipost/static/scipost/assets/css/style.scss +++ b/scipost/static/scipost/assets/css/style.scss @@ -31,6 +31,7 @@ @import "navbar"; @import "nav"; @import "page_header"; +@import "pool"; @import "popover"; @import "tables"; @import "tooltip"; diff --git a/scipost/static/scipost/assets/js/scripts.js b/scipost/static/scipost/assets/js/scripts.js index e16263ae7d94b480e54096a08385c61e00e893ba..d39b0efcdf4d29a96e39d92830aba631b833a6d3 100644 --- a/scipost/static/scipost/assets/js/scripts.js +++ b/scipost/static/scipost/assets/js/scripts.js @@ -42,7 +42,7 @@ $(function(){ }); // Auto-submit hook for general form elements - $("form .auto-submit input").on('change', function(){ + $("form .auto-submit input, form.auto-submit input, form.auto-submit select").on('change', function(){ $(this).parents('form').submit() }); }); diff --git a/submissions/forms.py b/submissions/forms.py index fe47475e57d4c1f80e52bd8bb1c246dddab27ba0..7cf9c9c1db4f4a87ce0b24e5db9dcba0d5688386 100644 --- a/submissions/forms.py +++ b/submissions/forms.py @@ -12,7 +12,7 @@ from .constants import ASSIGNMENT_BOOL, ASSIGNMENT_REFUSAL_REASONS, STATUS_RESUB REPORT_ACTION_CHOICES, REPORT_REFUSAL_CHOICES, STATUS_REVISION_REQUESTED,\ STATUS_REJECTED, STATUS_REJECTED_VISIBLE, STATUS_RESUBMISSION_INCOMING,\ STATUS_DRAFT, STATUS_UNVETTED, REPORT_ACTION_ACCEPT, REPORT_ACTION_REFUSE,\ - STATUS_VETTED, EXPLICIT_REGEX_MANUSCRIPT_CONSTRAINTS + STATUS_VETTED, EXPLICIT_REGEX_MANUSCRIPT_CONSTRAINTS, SUBMISSION_STATUS from . import exceptions, helpers from .models import Submission, RefereeInvitation, Report, EICRecommendation, EditorialAssignment,\ iThenticateReport @@ -42,6 +42,17 @@ class SubmissionSearchForm(forms.Form): ) +class SubmissionPoolFilterForm(forms.Form): + status = forms.ChoiceField(choices=((None, 'All statuses'),) + SUBMISSION_STATUS, + required=False) + + def search(self, queryset): + if self.cleaned_data.get('status'): + # Do extra check on non-required field to never show errors on template + return queryset.filter(status=self.cleaned_data['status']) + return queryset + + ############################### # Submission and resubmission # ############################### diff --git a/submissions/managers.py b/submissions/managers.py index ca6bf98c7215811cffda6278abe18d7aa54fb85b..5708f37f64af239999ea1bd1f3dda9c5f8feb268 100644 --- a/submissions/managers.py +++ b/submissions/managers.py @@ -199,6 +199,9 @@ class EditorialAssignmentQuerySet(models.QuerySet): def ongoing(self): return self.filter(completed=False).accepted() + def open(self): + return self.filter(accepted=None, deprecated=False) + class EICRecommendationManager(models.Manager): def get_for_user_in_pool(self, user): diff --git a/submissions/templates/partials/submissions/admin/submission_tooltip.html b/submissions/templates/partials/submissions/admin/submission_tooltip.html index c2968b9a79145bbd96ea69ada144e497ee8f85a3..bdd541b910663d2361fb20b7bf4c1e85aa1ad565 100644 --- a/submissions/templates/partials/submissions/admin/submission_tooltip.html +++ b/submissions/templates/partials/submissions/admin/submission_tooltip.html @@ -1,4 +1,4 @@ -<span class="circle-clickable no-break" data-toggle="tooltip" data-html="true" +<i class="fa fa-info-circle" data-toggle="tooltip" data-html="true" title=" {{submission.arxiv_identifier_w_vn_nr}}<hr>Status: {{submission.get_status_display}}<br>Latest activity: {{submission.latest_activity}} -">?</span> +"></i> diff --git a/submissions/templates/partials/submissions/pool/submission_li.html b/submissions/templates/partials/submissions/pool/submission_li.html new file mode 100644 index 0000000000000000000000000000000000000000..bff3e4448e2cf1e4dc01ce82c27a2624f5b455c3 --- /dev/null +++ b/submissions/templates/partials/submissions/pool/submission_li.html @@ -0,0 +1,23 @@ +<div class="row pool-item mb-0"> + <div class="icons{% if is_current %} text-info{% endif %}"> + {% include 'partials/submissions/admin/submission_tooltip.html' with submission=submission %} + {% if submission.editor_in_charge == request.user.contributor %} + <i class="fa fa-gavel mt-1{% if not is_current %} text-primary{% endif %}" data-toggle="tooltip" data-html="true" title="You are editor-in-charge"></i> + {% elif not submission.editor_in_charge %} + <i class="fa fa-exclamation mt-1 px-1 text-danger" data-toggle="tooltip" data-html="true" title="You can volunteer to become Editor-in-charge"></i> + {% endif %} + </div> + <div class="item col-auto"> + {% if is_current %} + <strong> + {% endif %} + <p class="mb-2"> + <a href="{% url 'submissions:pool' submission.arxiv_identifier_w_vn_nr %}">{{ submission.title }}</a><br> + <em>by {{ submission.author_list }}</em> + </p> + <p class="label label-{% if submission.status == 'unassigned' %}outline-danger{% else %}secondary{% endif %} label-sm">{{ submission.get_status_display }}</p> + {% if is_current %} + </strong> + {% endif %} + </div> +</div> diff --git a/submissions/templates/submissions/_submission_assignment_request.html b/submissions/templates/submissions/_submission_assignment_request.html index cceb540850b6a489ae5161372e3c018177ad76dd..4f274474ef169f87858842bf39fdadcec8618868 100644 --- a/submissions/templates/submissions/_submission_assignment_request.html +++ b/submissions/templates/submissions/_submission_assignment_request.html @@ -8,7 +8,7 @@ <h1>Accept or Decline this Assignment</h1> <h3 class="mb-2">By accepting, you will be required to start a refereeing round on the next screen.</h3> - <form action="{% url 'submissions:accept_or_decline_assignment_ack' assignment_id=assignment.id %}" method="post"> + <form action="{% url 'submissions:assignment_request' assignment_id=assignment.id %}" method="post"> {% csrf_token %} <div class="form-group row"> <div class="col-12"> diff --git a/submissions/templates/submissions/accept_or_decline_assignment_ack.html b/submissions/templates/submissions/accept_or_decline_assignment_ack.html deleted file mode 100644 index 67a7551cca06e5c12e852c533d727220874f89e1..0000000000000000000000000000000000000000 --- a/submissions/templates/submissions/accept_or_decline_assignment_ack.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends 'scipost/base.html' %} - -{% block pagetitle %}: accept or decline assignment (ack){% endblock pagetitle %} - -{% block content %} - - - {% if errormessage %} - <p>{{ errormessage }}</p> - <p>Return to the <a href="{% url 'submissions:pool' %}">Submissions Pool</a>.</p> - - {% elif assignment.accepted %} - <h1>Thank you for becoming Editor-in-charge of this submission.</h1> - <p>Please go to the <a href="{% url 'submissions:editorial_page' arxiv_identifier_w_vn_nr=assignment.submission.arxiv_identifier_w_vn_nr %}">Submission's editorial page</a> and select referees now.</p> - {% else %} - <h1>Thank you for considering.</h1> - <p>Return to the <a href="{% url 'submissions:pool' %}">Submissions Pool</a>.</p> - {% endif %} - -{% endblock content %} diff --git a/submissions/templates/submissions/pool/assignment_request.html b/submissions/templates/submissions/pool/assignment_request.html new file mode 100644 index 0000000000000000000000000000000000000000..a01954b9f109d98ef7b6ce2c5497d07229598fa5 --- /dev/null +++ b/submissions/templates/submissions/pool/assignment_request.html @@ -0,0 +1,20 @@ +{% extends 'submissions/pool/base.html' %} + +{% load bootstrap %} +{% load guardian_tags %} +{% load scipost_extras %} +{% load submissions_extras %} + +{% block breadcrumb_items %} + {{ block.super }} + <span class="breadcrumb-item">Assignment Request</span> +{% endblock %} + +{% block pagetitle %}: Assignment Request{% endblock pagetitle %} + +{% block content %} + <h1>Assignment request</h1> + <h3>Can you act as Editor-in-charge? (see below to accept/decline)</h3> + + {% include 'submissions/_submission_assignment_request.html' with assignment=assignment consider_assignment_form=form %} +{% endblock %} diff --git a/submissions/templates/submissions/pool/base.html b/submissions/templates/submissions/pool/base.html new file mode 100644 index 0000000000000000000000000000000000000000..ca638eb5ab558e81c5911ad27e2788d812086d5a --- /dev/null +++ b/submissions/templates/submissions/pool/base.html @@ -0,0 +1,13 @@ +{% extends 'scipost/base.html' %} + +{% block body_class %}{{ block.super }} pool{% endblock %} + +{% block breadcrumb %} + <nav class="breadcrumb py-md-2 px-0"> + <div class="container"> + {% block breadcrumb_items %} + <a href="{% url 'submissions:pool' %}" class="breadcrumb-item">Pool</a> + {% endblock %} + </div> + </nav> +{% endblock %} diff --git a/submissions/templates/submissions/pool/pool.html b/submissions/templates/submissions/pool/pool.html new file mode 100644 index 0000000000000000000000000000000000000000..12bef8d6c0f2ad76fe2b981eeaeaf9397d65d16e --- /dev/null +++ b/submissions/templates/submissions/pool/pool.html @@ -0,0 +1,87 @@ +{% extends 'submissions/pool/base.html' %} + +{% load bootstrap %} +{% load guardian_tags %} +{% load scipost_extras %} +{% load submissions_extras %} + +{% block breadcrumb_items %} + <a href="{% url 'scipost:personal_page' %}" class="breadcrumb-item">Personal Page</a> + {% if submission %} + <a href="{% url 'submissions:pool' %}" class="breadcrumb-item">Pool</a> + <span class="breadcrumb-item">{{ submission.arxiv_identifier_w_vn_nr }}</span> + {% else %} + <span class="breadcrumb-item">Pool</span> + {% endif %} +{% endblock %} + +{% block pagetitle %}: Submissions Pool{% endblock pagetitle %} + +{% block content %} + {% with is_ECAdmin=request.user|is_in_group:'Editorial Administrators' %} + <a href="{% url 'submissions:pool' %}?test=1">See old pool layout</a> + <div class="row"> + <div class="col-md-7"> + <h1>SciPost Submissions Pool</h1> + + {% if assignments_to_consider %} + <h3>Your open Assignment Requests <i class="fa fa-exclamation-circle text-warning"></i></h3> + <ul> + {% for assignment in assignments_to_consider %} + <li>On submission: {{ assignment.submission }}<br> + <a href="{% url 'submissions:assignment_request' assignment.id %}">Accept or decline here</a> + </li> + {% endfor %} + </ul> + {% endif %} + + {% if recs_to_vote_on %} + <h3>Recommendations to vote on <i class="fa fa-exclamation-circle text-warning"></i></h3> + <ul> + {% for recommendation in recs_to_vote_on %} + <li>On Editorial Recommendation of: {{ recommendation.submission }}<br> + <a href="{% url 'submissions:vote_on_rec' rec_id=recommendation.id %}">See the Editorial Recommendation</a> + </li> + {% endfor %} + </ul> + {% endif %} + + {% if assignments_to_consider or recs_to_vote_on %} + <hr> + {% endif %} + + {% if search_form %} + <h3>Filter by status</h3> + <form method="get" class="auto-submit mb-3"> + {{ search_form|bootstrap_inline }} + </form> + {% endif %} + + <ul class="list-unstyled"> + <!-- Submissions list --> + {% for sub in submissions_in_pool %} + <li class="p-2{% if sub == submission %} bg-light{% endif %}"> + {% if sub == submission %} + {% include 'partials/submissions/pool/submission_li.html' with submission=sub is_current=1 %} + {% else %} + {% include 'partials/submissions/pool/submission_li.html' with submission=sub is_current=0 %} + {% endif %} + </li> + {% empty %} + <li> + <h3 class="text-center"><i class="fa fa-question fa-2x"></i><br>No Submissions found.</h3> + </li> + {% endfor %} + </ul> + </div><!-- End page content --> + + <div class="col-md-5"> + {% if submission %} + {% include 'submissions/_submission_card_in_pool.html' with submission=submission remark_form=remark_form is_ECAdmin=is_ECAdmin user=request.user %} + {% else %} + <h3><em>Click on a submission to see its summary and actions</em></h3> + {% endif %} + </div> + </div> + {% endwith %} +{% endblock %} diff --git a/submissions/templates/submissions/pool/recommendation.html b/submissions/templates/submissions/pool/recommendation.html new file mode 100644 index 0000000000000000000000000000000000000000..fd05c4be4d6a89ee92cb2b9a2e1ecd8e0de4a0cf --- /dev/null +++ b/submissions/templates/submissions/pool/recommendation.html @@ -0,0 +1,31 @@ +{% extends 'submissions/pool/base.html' %} + +{% load bootstrap %} + +{% block breadcrumb_items %} + {{ block.super }} + <span class="breadcrumb-item">Editorial Recommendation</span> +{% endblock %} + +{% block pagetitle %}: Editorial Recommendation{% endblock pagetitle %} + +{% block content %} + <h1>Editorial Recommendation to vote on</h1> + + {# <div class="card card-outline-secondary">#} + {% include 'submissions/_submission_card_fellow_content.html' with submission=recommendation.submission %} + {# </div>#} + + {# <div class="card card-outline-secondary">#} + {% include 'submissions/_recommendation_fellow_content.html' with recommendation=recommendation %} + <div class="card-footer"> + <h3>Your position on this recommendation</h3> + <form action="{% url 'submissions:vote_on_rec' rec_id=recommendation.id %}" method="post"> + {% csrf_token %} + {{ form|bootstrap:'0,12' }} + <input type="submit" name="submit" value="Cast your vote" class="btn btn-primary submitButton" id="submit-id-submit"> + </form> + </div> + {# </div>#} + +{% endblock %} diff --git a/submissions/urls.py b/submissions/urls.py index c1f46c9ab3839e1758c764de519a0ae91a24eecf..432335b1f3b62669f986e7ccb9c75985c74a1a9f 100644 --- a/submissions/urls.py +++ b/submissions/urls.py @@ -44,9 +44,10 @@ urlpatterns = [ url(r'^submit_manuscript$', views.RequestSubmission.as_view(), name='submit_manuscript'), url(r'^submit_manuscript/prefill$', views.prefill_using_arxiv_identifier, name='prefill_using_identifier'), - url(r'^pool$', views.pool, name='pool'), + url(r'^pool/$', views.pool, name='pool'), + url(r'^pool/{regex}/$'.format(regex=SUBMISSIONS_COMPLETE_REGEX), views.pool, name='pool'), url(r'^submissions_by_status/(?P<status>[a-zA-Z_]+)$', - views.submissions_by_status, name='submissions_by_status'), + views.submissions_by_status, name='submissions_by_status'), # DEPRECATED url(r'^add_remark/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX), views.add_remark, name='add_remark'), @@ -55,8 +56,8 @@ urlpatterns = [ 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'^accept_or_decline_assignment_ack/(?P<assignment_id>[0-9]+)$', - views.accept_or_decline_assignment_ack, name='accept_or_decline_assignment_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), views.volunteer_as_EIC, name='volunteer_as_EIC'), url(r'^assignment_failed/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX), diff --git a/submissions/views.py b/submissions/views.py index 7f53451343204d046ff2f976e5e9fb5a96faee4f..47df6ea5571449bcdaf7acd7b8d6a00f01baf434 100644 --- a/submissions/views.py +++ b/submissions/views.py @@ -31,13 +31,14 @@ from .forms import SubmissionIdentifierForm, RequestSubmissionForm, SubmissionSe ConsiderRefereeInvitationForm, EditorialCommunicationForm,\ EICRecommendationForm, ReportForm, VetReportForm, VotingEligibilityForm,\ SubmissionCycleChoiceForm, ReportPDFForm, SubmissionReportsForm,\ - iThenticateReportForm + iThenticateReportForm, SubmissionPoolFilterForm from .utils import SubmissionUtils from mails.views import MailEditingSubView from scipost.forms import ModifyPersonalMessageForm, RemarkForm from scipost.models import Contributor, Remark, RegistrationInvitation from scipost.utils import Utils +from scipost.permissions import is_tester from comments.forms import CommentForm from production.models import ProductionStream @@ -324,7 +325,7 @@ def editorial_workflow(request): @login_required @permission_required('scipost.can_view_pool', raise_exception=True) -def pool(request): +def pool(request, arxiv_identifier_w_vn_nr=None): """ The Submissions pool contains all submissions which are undergoing the editorial process, from submission @@ -341,8 +342,7 @@ def pool(request): .filter( submission__status__in=['voting_in_preparation'])) contributor = Contributor.objects.get(user=request.user) - assignments_to_consider = EditorialAssignment.objects.filter( - to=contributor, accepted=None, deprecated=False) + assignments_to_consider = EditorialAssignment.objects.open().filter(to=contributor) consider_assignment_form = ConsiderAssignmentForm() recs_to_vote_on = (EICRecommendation.objects.get_for_user_in_pool(request.user) .filter(eligible_to_vote=contributor) @@ -362,12 +362,38 @@ def pool(request): 'recs_to_vote_on': recs_to_vote_on, 'rec_vote_form': rec_vote_form, 'remark_form': remark_form, } - return render(request, 'submissions/pool.html', context) + + # The following is in test phase. Update if test is done + # -- + + # Search + search_form = SubmissionPoolFilterForm(request.GET or None) + if search_form.is_valid(): + context['submissions_in_pool'] = search_form.search(context['submissions_in_pool']) + context['search_form'] = search_form + + # Show specific submission in the pool + if arxiv_identifier_w_vn_nr: + try: + context['submission'] = context['submissions_in_pool'].get( + arxiv_identifier_w_vn_nr=arxiv_identifier_w_vn_nr) + except Submission.DoesNotExist: + context['submission'] = None + + # Temporary test logic: only testers see the new Pool + if is_tester(request.user) and not request.GET.get('test'): + template = 'submissions/pool/pool.html' + else: + template = 'submissions/pool.html' + return render(request, template, context) @login_required @permission_required('scipost.can_view_pool', raise_exception=True) def submissions_by_status(request, status): + # --- + # DEPRECATED AS PER NEW POOL + # --- status_dict = dict(SUBMISSION_STATUS) if status not in status_dict.keys(): errormessage = 'Unknown status.' @@ -448,56 +474,76 @@ def assign_submission_ack(request, arxiv_identifier_w_vn_nr): @login_required @permission_required('scipost.can_take_charge_of_submissions', raise_exception=True) @transaction.atomic -def accept_or_decline_assignment_ack(request, assignment_id): - contributor = Contributor.objects.get(user=request.user) - assignment = get_object_or_404(EditorialAssignment, pk=assignment_id) +def assignment_request(request, assignment_id): + """ + Process EditorialAssignment acceptance/denial form or show if not submitted. + """ + assignment = get_object_or_404(EditorialAssignment.objects.open(), + to=request.user.contributor, pk=assignment_id) + errormessage = None if assignment.submission.status == 'assignment_failed': errormessage = 'This Submission has failed pre-screening and has been rejected.' - context = {'errormessage': errormessage} - return render(request, 'submissions/accept_or_decline_assignment_ack.html', context) - if assignment.submission.editor_in_charge: + + elif assignment.submission.editor_in_charge: errormessage = (assignment.submission.editor_in_charge.get_title_display() + ' ' + assignment.submission.editor_in_charge.user.last_name + ' has already agreed to be Editor-in-charge of this Submission.') - context = {'errormessage': errormessage} - return render(request, 'submissions/accept_or_decline_assignment_ack.html', context) - if request.method == 'POST': - form = ConsiderAssignmentForm(request.POST) - if form.is_valid(): - assignment.date_answered = timezone.now() - if form.cleaned_data['accept'] == 'True': - assignment.accepted = True - assignment.to = contributor - assignment.submission.status = 'EICassigned' - assignment.submission.editor_in_charge = contributor - assignment.submission.open_for_reporting = True - deadline = timezone.now() + datetime.timedelta(days=28) # for papers - if assignment.submission.submitted_to_journal == 'SciPost Physics Lecture Notes': - deadline += datetime.timedelta(days=28) - assignment.submission.reporting_deadline = deadline - assignment.submission.open_for_commenting = True - assignment.submission.latest_activity = timezone.now() - - SubmissionUtils.load({'assignment': assignment}) - SubmissionUtils.deprecate_other_assignments() - assign_perm('can_take_editorial_actions', contributor.user, assignment.submission) - ed_admins = Group.objects.get(name='Editorial Administrators') - assign_perm('can_take_editorial_actions', ed_admins, assignment.submission) - SubmissionUtils.send_EIC_appointment_email() - SubmissionUtils.send_author_prescreening_passed_email() - - # Add SubmissionEvents - assignment.submission.add_general_event('The Editor-in-charge has been assigned.') - else: - assignment.accepted = False - assignment.refusal_reason = form.cleaned_data['refusal_reason'] - assignment.submission.status = 'unassigned' - assignment.save() - assignment.submission.save() - - context = {'assignment': assignment} - return render(request, 'submissions/accept_or_decline_assignment_ack.html', context) + + if errormessage: + # Assignments can get stuck here, + # if errormessage is given the contributor can't close the assignment!! + messages.warning(request, errormessage) + return redirect(reverse('submissions:pool')) + + form = ConsiderAssignmentForm(request.POST or None) + if form.is_valid(): + assignment.date_answered = timezone.now() + if form.cleaned_data['accept'] == 'True': + assignment.accepted = True + assignment.to = request.user.contributor + assignment.submission.status = 'EICassigned' + assignment.submission.editor_in_charge = request.user.contributor + assignment.submission.open_for_reporting = True + deadline = timezone.now() + datetime.timedelta(days=28) # for papers + if assignment.submission.submitted_to_journal == 'SciPost Physics Lecture Notes': + deadline += datetime.timedelta(days=28) + assignment.submission.reporting_deadline = deadline + assignment.submission.open_for_commenting = True + assignment.submission.latest_activity = timezone.now() + + SubmissionUtils.load({'assignment': assignment}) + SubmissionUtils.deprecate_other_assignments() + assign_perm('can_take_editorial_actions', request.user, assignment.submission) + ed_admins = Group.objects.get(name='Editorial Administrators') + assign_perm('can_take_editorial_actions', ed_admins, assignment.submission) + SubmissionUtils.send_EIC_appointment_email() + SubmissionUtils.send_author_prescreening_passed_email() + + # Add SubmissionEvents + assignment.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=(assignment.submission.arxiv_identifier_w_vn_nr,)) + else: + assignment.accepted = False + assignment.refusal_reason = form.cleaned_data['refusal_reason'] + assignment.submission.status = 'unassigned' + msg = 'Thank you for considering' + url = reverse('submissions:pool') + # Save assignment and submission + assignment.save() + assignment.submission.save() + + # Form submitted, redirect user + messages.success(request, msg) + return redirect(url) + + context = { + 'assignment': assignment, + 'form': form + } + return render(request, 'submissions/pool/assignment_request.html', context) @login_required @@ -506,7 +552,7 @@ def accept_or_decline_assignment_ack(request, assignment_id): def volunteer_as_EIC(request, arxiv_identifier_w_vn_nr): """ Called when a Fellow volunteers while perusing the submissions pool. - This is an adapted version of the accept_or_decline_assignment_ack method. + This is an adapted version of the assignment_request method. """ submission = get_object_or_404(Submission.objects.get_pool(request.user), arxiv_identifier_w_vn_nr=arxiv_identifier_w_vn_nr) @@ -1350,9 +1396,14 @@ def vote_on_rec(request, rec_id): remark=form.cleaned_data['remark']) remark.save() recommendation.save() + messages.success(request, 'Thank you for your vote.') return redirect(reverse('submissions:pool')) - return redirect(reverse('submissions:pool')) + context = { + 'recommendation': recommendation, + 'form': form + } + return render(request, 'submissions/pool/recommendation.html', context) @permission_required('scipost.can_prepare_recommendations_for_voting', raise_exception=True)