diff --git a/commentaries/forms.py b/commentaries/forms.py index 8d95c58d896ace0b3f84b7b3da68b4b2c6ced1d9..b74c0f00a8fcf40a98b8de17af146a7596e1a5a4 100644 --- a/commentaries/forms.py +++ b/commentaries/forms.py @@ -2,6 +2,7 @@ import re from django import forms from django.shortcuts import get_object_or_404 +from django.urls import reverse from .models import Commentary @@ -9,9 +10,17 @@ from scipost.models import Contributor class DOIToQueryForm(forms.Form): - doi = forms.CharField(widget=forms.TextInput( + VALID_DOI_REGEXP = r'^(?i)10.\d{4,9}/[-._;()/:A-Z0-9]+$' + doi = forms.RegexField(regex=VALID_DOI_REGEXP, strip=False, widget=forms.TextInput( {'label': 'DOI', 'placeholder': 'ex.: 10.21468/00.000.000000'})) + def clean_doi(self): + input_doi = self.cleaned_data['doi'] + if Commentary.objects.filter(pub_DOI=input_doi).exists(): + error_message = 'There already exists a Commentary Page on this publication.' + raise forms.ValidationError(error_message) + return input_doi + class IdentifierToQueryForm(forms.Form): identifier = forms.CharField(widget=forms.TextInput( diff --git a/commentaries/test_forms.py b/commentaries/test_forms.py index 8733064ae2267d07111ed7c9fe0c1662cc85fb3f..8566a4c96eb674e65d4ba4676283bc525a655337 100644 --- a/commentaries/test_forms.py +++ b/commentaries/test_forms.py @@ -1,13 +1,39 @@ +import re + from django.test import TestCase from common.helpers import model_form_data from scipost.factories import UserFactory from .factories import VettedCommentaryFactory, UnvettedCommentaryFactory -from .forms import RequestCommentaryForm, VetCommentaryForm +from .forms import RequestCommentaryForm, VetCommentaryForm, DOIToQueryForm from .models import Commentary +from common.helpers import model_form_data from common.helpers.test import add_groups_and_permissions +class TestDOIToQueryForm(TestCase): + def setUp(self): + add_groups_and_permissions() + doi_string = "10.21468/SciPostPhys.2.2.010" + self.valid_form_data = {'doi': doi_string} + + def test_valid_doi_is_valid(self): + form = DOIToQueryForm(self.valid_form_data) + self.assertTrue(form.is_valid()) + + def test_invalid_doi_is_invalid(self): + invalid_data = {'doi': 'blablab'} + form = DOIToQueryForm(invalid_data) + self.assertFalse(form.is_valid()) + + def test_doi_that_already_has_commentary_page_is_invalid(self): + unvetted_commentary = UnvettedCommentaryFactory() + invalid_data = {'doi': unvetted_commentary.pub_DOI} + form = DOIToQueryForm(invalid_data) + self.assertFalse(form.is_valid()) + error_message = form.errors['doi'][0] + self.assertRegexpMatches(error_message, re.compile('already exist')) + class TestVetCommentaryForm(TestCase): def setUp(self): @@ -20,6 +46,7 @@ class TestVetCommentaryForm(TestCase): 'email_response_field': 'Lorem Ipsum' } + def test_valid_accepted_form(self): """Test valid form data and return Commentary""" form = VetCommentaryForm(self.form_data, commentary_id=self.commentary.id, user=self.user)