diff --git a/submissions/forms.py b/submissions/forms.py index 1e0a501abc1ecf08df0989fcf2c9a17b637b20f8..7c09ff971b437bd8bdab67c06dd3d939079d6330 100644 --- a/submissions/forms.py +++ b/submissions/forms.py @@ -103,17 +103,14 @@ class SubmissionService: Object to run checks for prefiller and submit manuscript forms. """ - arxiv_data = {} + metadata = {} def __init__(self, requested_by, preprint_server, identifier=None, resubmission_of_id=None): self.requested_by = requested_by self.preprint_server = preprint_server self.identifier = identifier self.resubmission_of_id = resubmission_of_id - - if self.preprint_server == 'arxiv': - # Do the call here to prevent multiple calls to the arXiv API in one request. - self._call_arxiv() + self._arxiv_data = None @property def latest_submission(self): @@ -138,19 +135,45 @@ class SubmissionService: self._latest_submission = None return self._latest_submission + @property + def arxiv_data(self): + if self._arxiv_data is None: + self._call_arxiv() + return self._arxiv_data + def run_checks(self): """ Do several pre-checks (using the arXiv API if needed). This is needed for both the prefill and submission forms. """ - self.arxiv_data = {} self._submission_already_exists() self._submission_previous_version_is_valid_for_submission() if self.preprint_server == 'arxiv': self._submission_is_already_published() + def _call_arxiv(self): + """ + Retrieve all data from the ArXiv database for `identifier`. + """ + if self.preprint_server != 'arxiv': + # Do the call here to prevent multiple calls to the arXiv API in one request. + self._arxiv_data = {} + return + if not self.identifier: + print('crap', self.identifier) + return + + caller = ArxivCaller(self.identifier) + + if caller.is_valid: + self._arxiv_data = caller.data + self.metadata = caller.metadata + else: + error_message = 'A preprint associated to this identifier does not exist.' + raise forms.ValidationError(error_message) + def get_latest_submission_data(self): """ Return initial form data originating from earlier Submission. @@ -277,18 +300,6 @@ class SubmissionService: 'before proceeding with a resubmission.') raise forms.ValidationError(error_message) - def _call_arxiv(self): - """ - Retrieve all data from the ArXiv database for `identifier`. - """ - caller = ArxivCaller(self.identifier) - if caller.is_valid: - self.arxiv_data = caller.data - self.metadata = caller.metadata - else: - error_message = 'A preprint associated to this identifier does not exist.' - raise forms.ValidationError(error_message) - def _submission_is_already_published(self): """ Check if preprint number is already registered with a DOI in the *ArXiv* database. @@ -360,15 +371,17 @@ class SubmissionForm(forms.ModelForm): self.preprint_server = kwargs.pop('preprint_server', 'arxiv') self.resubmission_preprint = kwargs['initial'].get('resubmission', False) + data = args[0] if len(args) > 1 else kwargs.get('data', {}) + identifier = kwargs['initial'].get('identifier_w_vn_nr', None) or data.get('identifier_w_vn_nr') + self.service = SubmissionService( self.requested_by, self.preprint_server, - identifier=kwargs['initial'].get('identifier_w_vn_nr', None), + identifier=identifier, resubmission_of_id=self.resubmission_preprint) if self.preprint_server == 'scipost': kwargs['initial'] = self.service.get_latest_submission_data() super().__init__(*args, **kwargs) - # self.service.run_checks() if not self.preprint_server == 'arxiv': # No arXiv-specific data required. @@ -418,6 +431,7 @@ class SubmissionForm(forms.ModelForm): cleaned_data = super().clean(*args, **kwargs) # SciPost preprints are auto-generated here. + self.scipost_identifier = None if 'identifier_w_vn_nr' not in cleaned_data: self.service.identifier, self.scipost_identifier = generate_new_scipost_identifier( cleaned_data.get('resubmission', None)) @@ -524,11 +538,13 @@ class SubmissionIdentifierForm(forms.Form): self.requested_by = kwargs.pop('requested_by') return super().__init__(*args, **kwargs) + def clean_identifier_w_vn_nr(self): """ Do basic prechecks based on the arXiv ID only. """ - identifier = self.cleaned_data['identifier_w_vn_nr'] + identifier = self.cleaned_data.get('identifier_w_vn_nr', None) + self.service = SubmissionService(self.requested_by, 'arxiv', identifier=identifier) self.service.run_checks() return identifier diff --git a/submissions/views.py b/submissions/views.py index e09dad4fcdf2e395dae5e7395e60b4832ebf83b1..372989d1ec82084db63453ede72174e6addf18b0 100644 --- a/submissions/views.py +++ b/submissions/views.py @@ -132,7 +132,7 @@ class RequestSubmissionView(LoginRequiredMixin, PermissionRequiredMixin, CreateV 'Your Submission will soon be handled by an Editor.') messages.success(self.request, text) - if form.submission_is_resubmission(): + if form.is_resubmission(): # Send emails SubmissionUtils.load({'submission': submission}, self.request) SubmissionUtils.send_authors_resubmission_ack_email() @@ -154,20 +154,22 @@ class RequestSubmissionUsingArXivView(RequestSubmissionView): """Formview to submit a new Submission using arXiv.""" def get(self, request): - """Redirect to the arXiv prefill form if arXiv ID is not known.""" + """ + Redirect to the arXiv prefill form if arXiv ID is not known. + """ form = SubmissionIdentifierForm(request.GET or None, requested_by=self.request.user) if form.is_valid(): # Gather data from ArXiv API if prefill form is valid self.initial_data = form.get_initial_submission_data() return super().get(request) else: - raise + for code, err in form.errors.items(): + messages.warning(request, err[0]) return redirect('submissions:prefill_using_identifier') def get_form_kwargs(self): """Form requires extra kwargs.""" kwargs = super().get_form_kwargs() - # kwargs['use_arxiv_preprint'] = True kwargs['preprint_server'] = 'arxiv' return kwargs