diff --git a/notifications/models.py b/notifications/models.py index 3f0d1dd553cfac820324b9030c688b2d5558b251..eb0947cf320bfb04f7ddb13a5b8b84a2697251f3 100644 --- a/notifications/models.py +++ b/notifications/models.py @@ -71,6 +71,8 @@ class Notification(models.Model): # of notifications. internal_type = models.CharField(max_length=255, blank=True, choices=NOTIFICATION_TYPES) + url_code = models.CharField(max_length=255, blank=True) + objects = NotificationQuerySet.as_manager() class Meta: diff --git a/submissions/forms.py b/submissions/forms.py index ecce7bf133c5e85cd7cf8ba9482745d4f707f3c8..7d7ff7be497a047bd29a1f31c11c60de863681c5 100644 --- a/submissions/forms.py +++ b/submissions/forms.py @@ -263,6 +263,10 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm): scipost_identifier = None + resubmission = forms.ModelChoiceField( + # to_field_name='preprint__identifier_w_vn_nr', + queryset=Submission.objects.all(), required=False, widget=forms.HiddenInput()) + identifier_w_vn_nr = forms.CharField(widget=forms.HiddenInput()) arxiv_link = forms.URLField( widget=forms.TextInput(attrs={'placeholder': 'ex.: arxiv.org/abs/1234.56789v1'})) @@ -305,6 +309,10 @@ class RequestSubmissionForm(SubmissionChecks, forms.ModelForm): super().__init__(*args, **kwargs) # Alter resubmission-dependent fields + # self.fields['resubmission'].queryset = Submission.objects.candidate_for_resubmission( + # self.requested_by.contributor) # This is auto-filled by the resubmit_manuscript view. + # r = self.fields['resubmission'].initial = self.fields['resubmission'].queryset.get + # raise if not self.submission_is_resubmission(): # These fields are only available for resubmissions del self.fields['author_comments'] diff --git a/submissions/managers.py b/submissions/managers.py index edb98934913597f183e1c515ae3d331bbcb0f8cf..cfbe1afec7fe21795767bb2cdd2f4415adf9e6e3 100644 --- a/submissions/managers.py +++ b/submissions/managers.py @@ -209,6 +209,20 @@ class SubmissionQuerySet(models.QuerySet): """Return Submissions that have EditorialAssignments that still need to be sent.""" return self.filter(editorial_assignments__status=constants.STATUS_PREASSIGNED) + def candidate_for_resubmission(self, contributor): + """ + Return all Submissions that are open for resubmission specialised + for a certain Contributor. + """ + if not contributor: + return self.none() + + return self.filter(is_current=True, status__in=[ + constants.STATUS_INCOMING, + constants.STATUS_UNASSIGNED, + constants.STATUS_EIC_ASSIGNED, + ], submitted_by=contributor) + class SubmissionEventQuerySet(models.QuerySet): def for_author(self): diff --git a/submissions/templates/submissions/submission_form.html b/submissions/templates/submissions/submission_form.html index 1e314ea136b45e02b96556a9fe77cba68bee94b4..9306c39b951f6acc61933e14916c8ebdb4925971 100644 --- a/submissions/templates/submissions/submission_form.html +++ b/submissions/templates/submissions/submission_form.html @@ -48,6 +48,9 @@ <p> Please prepare your manuscript according to the <a href="{% url 'submissions:author_guidelines' %}">author guidelines</a>. </p> + {% if form.fields.resubmission %} + {{ form.fields.resubmission.initial }} + {% endif %} </div> </div> diff --git a/submissions/templates/submissions/submission_resubmission_candidates.html b/submissions/templates/submissions/submission_resubmission_candidates.html new file mode 100644 index 0000000000000000000000000000000000000000..446835d474aec78a479363cf07fc14254366d3e4 --- /dev/null +++ b/submissions/templates/submissions/submission_resubmission_candidates.html @@ -0,0 +1,35 @@ +{% extends 'scipost/base.html' %} + +{% load bootstrap %} + +{% block pagetitle %}: submit manuscript{% endblock pagetitle %} + +{% block content %} + +<div class="row"> + <div class="col-12"> + <form method="post"> + {% csrf_token %} + <h1 class="highlight">Possible Resubmissions</h1> + <p>The system has found {{ submissions|length|pluralize:'a Submission,Submissions' }} for which you are a verified author. If you wish to submit a new version for {{ submissions|length|pluralize:'this Submission,one of these Submissions' }}, please use the "Resubmit this Submission" buttton below.</p> + <ul> + {% for submission in submissions %} + <li class="py-2"> + <strong>{{ submission.title }}</strong> + <br> + {{ submission.author_list }} + <br> + Preprint number: {{ submission.preprint.identifier_w_vn_nr }} + <br> + <button type="submit" name="submission" value="{{ submission.preprint.identifier_w_vn_nr }}"class="btn btn-primary py-1 mt-1">Resubmit this Submission</button> + </li> + {% endfor %} + </ul> + <p> + If you wish to submit a new Submission, please <button type="submit" name="submission" value="new" class="btn btn-primary py-1 mr-1">submit a new Submission here</button>. + </p> + </form> + </div> +</div> + +{% endblock content %} diff --git a/submissions/urls.py b/submissions/urls.py index 9b2f9985cbf8c22e4f8c9bd2600efb1c94925991..5591c3ff0cb1661be5172ecc0563d6057c21da2e 100644 --- a/submissions/urls.py +++ b/submissions/urls.py @@ -68,6 +68,7 @@ urlpatterns = [ url(r'^admin/reports/(?P<report_id>[0-9]+)/compile$', views.report_pdf_compile, name='report_pdf_compile'), + url(r'^resubmit_manuscript$', views.resubmit_manuscript, name='resubmit_manuscript'), url(r'^submit_manuscript$', views.prefill_using_arxiv_identifier, name='submit_manuscript'), url(r'^submit_manuscript/scipost$', views.RequestSubmissionUsingSciPostView.as_view(), name='submit_manuscript_scipost'), diff --git a/submissions/views.py b/submissions/views.py index cb1a21fa7d7ab812988c719977d7f385e580e21f..7b977706e48b9e28127756cfc106e7c929f2b09e 100644 --- a/submissions/views.py +++ b/submissions/views.py @@ -55,16 +55,46 @@ from production.forms import ProofsDecisionForm from profiles.models import Profile from profiles.forms import SimpleProfileForm from scipost.constants import INVITATION_REFEREEING +from scipost.decorators import is_contributor_user from scipost.forms import RemarkForm from scipost.mixins import PaginationMixin from scipost.models import Contributor, Remark -# from notifications.views import is_test_user # Temporarily until release - ############### # SUBMISSIONS: ############### +@login_required +@is_contributor_user() +def resubmit_manuscript(request): + """ + Choose which Submission to resubmit if Submission is available. + + On POST, redirect to submit page. + """ + submissions = get_list_or_404( + Submission.objects.candidate_for_resubmission(request.user.contributor)) + if request.POST and request.POST.get('submission'): + if request.POST['submission'] == 'new': + return redirect(reverse('submissions:submit_manuscript_scipost') + '?resubmission=false') + try: + last_submission = Submission.objects.candidate_for_resubmission( + request.user.contributor).get( + preprint__identifier_w_vn_nr=request.POST['submission']) + extra_param = '?resubmission={}'.format(request.POST['submission']) + + if last_submission.preprint.scipost_preprint_identifier: + # Determine right preprint-view. + return redirect(reverse('submissions:submit_manuscript_scipost') + extra_param) + return redirect(reverse('submissions:submit_manuscript') + extra_param) + except Submission.DoesNotExist: + # POST request invalid. Try again with GET request. + return redirect('submissions:resubmit_manuscript') + context = { + 'submissions': submissions, + } + return render(request, 'submissions/submission_resubmission_candidates.html', context) + class RequestSubmissionView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): """Formview to submit a new manuscript (Submission).""" @@ -74,9 +104,6 @@ class RequestSubmissionView(LoginRequiredMixin, PermissionRequiredMixin, CreateV form_class = RequestSubmissionForm template_name = 'submissions/submission_form.html' - # def dispatch(self, *args, **kwargs): - # candidate_for_resubmission - def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) context['id_SciPostPhys'] = get_object_or_404(Journal, doi_label='SciPostPhys').id @@ -87,8 +114,8 @@ class RequestSubmissionView(LoginRequiredMixin, PermissionRequiredMixin, CreateV """Form requires extra kwargs.""" kwargs = super().get_form_kwargs() kwargs['requested_by'] = self.request.user - if hasattr(self, 'initial_data'): - kwargs['initial'] = self.initial_data + kwargs['initial'] = getattr(self, 'initial_data', {}) + kwargs['initial']['resubmission'] = self.request.GET.get('resubmission') return kwargs @transaction.atomic @@ -143,11 +170,12 @@ class RequestSubmissionUsingArXivView(RequestSubmissionView): class RequestSubmissionUsingSciPostView(RequestSubmissionView): """Formview to submit a new Submission using SciPost's preprint server.""" - def dispatch(self, request, *args, **kwargs): - """TEMPORARY: Not accessible unless in test group.""" - # if not is_test_user(request.user): - # raise Http404 - return super().dispatch(request, *args, **kwargs) + def get(self, request): + """Check for possible Resubmissions before dispatching.""" + if Submission.objects.candidate_for_resubmission(request.user.contributor).exists(): + if not request.GET.get('resubmission'): + return redirect('submissions:resubmit_manuscript') + return super().get(request) def get_form_kwargs(self): """Form requires extra kwargs."""