diff --git a/commentaries/forms.py b/commentaries/forms.py index 660d8d74ff21abf19c1fbd24dbe515980fc0e906..5fd67a38dba9217f7bd873f6a1435ccff4e49a46 100644 --- a/commentaries/forms.py +++ b/commentaries/forms.py @@ -9,6 +9,8 @@ from .models import Commentary from scipost.services import DOICaller from scipost.models import Contributor +def commentary_exists(input_doi): + return Commentary.objects.filter(pub_DOI=input_doi).exists() class DOIToQueryForm(forms.Form): VALID_DOI_REGEXP = r'^(?i)10.\d{4,9}/[-._;()/:A-Z0-9]+$' @@ -18,7 +20,7 @@ class DOIToQueryForm(forms.Form): def clean_doi(self): input_doi = self.cleaned_data['doi'] - if self.commentary_exists(input_doi): + if commentary_exists(input_doi): error_message = 'There already exists a Commentary Page on this publication.' raise forms.ValidationError(error_message) @@ -31,11 +33,9 @@ class DOIToQueryForm(forms.Form): return input_doi - def commentary_exists(self, input_doi): - return Commentary.objects.filter(pub_DOI=input_doi).exists() def request_published_article_form_prefill_data(self): - additional_form_data = {'type': 'published', 'pub_DOI': self.cleaned_data['doi']} + additional_form_data = {'pub_DOI': self.cleaned_data['doi']} return {**self.crossref_data, **additional_form_data} @@ -84,6 +84,22 @@ class RequestPublishedArticleForm(forms.ModelForm): 'pub_date': 'Format: YYYY-MM-DD', } + + def __init__(self, *args, **kwargs): + super(RequestPublishedArticleForm, self).__init__(*args, **kwargs) + # We want pub_DOI to be a required field. + # Since it can be blank on the model, we have to override this property here. + self.fields['pub_DOI'].required = True + + def clean_pub_DOI(self): + input_doi = self.cleaned_data['pub_DOI'] + + if commentary_exists(input_doi): + error_message = 'There already exists a Commentary Page on this publication.' + raise forms.ValidationError(error_message) + + return input_doi + def save(self, *args): commentary = super().save(*args) commentary.metadata = self.metadata diff --git a/commentaries/test_forms.py b/commentaries/test_forms.py index b225d21805268d12371d88fd475c3e111c30da05..9e9d4a483e1a487dab9db2e072c2afe47e223cde 100644 --- a/commentaries/test_forms.py +++ b/commentaries/test_forms.py @@ -6,7 +6,7 @@ from common.helpers import model_form_data from scipost.factories import UserFactory from .factories import VettedCommentaryFactory, UnvettedCommentaryFactory -from .forms import RequestCommentaryForm, VetCommentaryForm, DOIToQueryForm +from .forms import RequestCommentaryForm, RequestPublishedArticleForm, VetCommentaryForm, DOIToQueryForm from .models import Commentary from common.helpers.test import add_groups_and_permissions @@ -111,6 +111,32 @@ class TestVetCommentaryForm(TestCase): self.assertRaises(ValueError, form.process_commentary) +class TestRequestPublishedArticleForm(TestCase): + def setUp(self): + add_groups_and_permissions() + factory_instance = UnvettedCommentaryFactory.build() + self.user = UserFactory() + self.valid_form_data = model_form_data(factory_instance, RequestPublishedArticleForm) + + def test_valid_data_is_valid(self): + """Test valid form for DOI""" + form = RequestPublishedArticleForm(self.valid_form_data) + self.assertTrue(form.is_valid()) + + def test_doi_that_already_has_commentary_page_is_invalid(self): + unvetted_commentary = UnvettedCommentaryFactory() + invalid_data = {**self.valid_form_data, **{'pub_DOI': unvetted_commentary.pub_DOI}} + form = RequestPublishedArticleForm(invalid_data) + self.assertEqual(form.is_valid(), False) + error_message = form.errors['pub_DOI'][0] + self.assertRegexpMatches(error_message, re.compile('already exist')) + + def test_commentary_without_pub_DOI_is_invalid(self): + invalid_data = {**self.valid_form_data, **{'pub_DOI': ''}} + form = RequestPublishedArticleForm(invalid_data) + self.assertEqual(form.is_valid(), False) + + class TestRequestCommentaryForm(TestCase): def setUp(self): add_groups_and_permissions()