SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 4e1f1586 authored by Jorran de Wit's avatar Jorran de Wit
Browse files

Merge branch 'poolfeedback' into development

parents 4761a623 b7f3da32
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
......@@ -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)
......
......@@ -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):
......
......@@ -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>
......
......@@ -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" />
......
......@@ -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 %}
......
......@@ -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>
......
......@@ -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),
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment