SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 35aba111 authored by Geert Kapteijns's avatar Geert Kapteijns
Browse files

move checks for existing commentary and bad request to ArxivQueryForm

parent 47ffc28f
No related branches found
No related tags found
No related merge requests found
...@@ -6,7 +6,7 @@ from django.urls import reverse ...@@ -6,7 +6,7 @@ from django.urls import reverse
from .models import Commentary from .models import Commentary
from scipost.services import DOICaller from scipost.services import DOICaller, ArxivCaller
from scipost.models import Contributor from scipost.models import Contributor
...@@ -48,10 +48,21 @@ class ArxivQueryForm(forms.Form): ...@@ -48,10 +48,21 @@ class ArxivQueryForm(forms.Form):
identifier = forms.RegexField(regex=VALID_ARXIV_IDENTIFIER_REGEX, strip=True) identifier = forms.RegexField(regex=VALID_ARXIV_IDENTIFIER_REGEX, strip=True)
# identifierpattern_new = re.compile("^[0-9]{4,}.[0-9]{4,5}v[0-9]{1,2}$") def clean_identifier(self):
# identifierpattern_old = re.compile("^[-.a-z]+/[0-9]{7,}v[0-9]{1,2}$") identifier = self.cleaned_data['identifier']
if Commentary.objects.filter(arxiv_identifier=identifier).exists():
error_message = 'There already exists a Commentary Page on this arXiv preprint.'
raise forms.ValidationError(error_message)
caller = ArxivCaller(identifier)
if caller.is_valid:
self.arxiv_data = ArxivCaller(identifier).data
else:
error_message = 'Could not find a resource for that arXiv identifier.'
raise forms.ValidationError(error_message)
return identifier
# class IdentifierToQueryForm(forms.Form): # class IdentifierToQueryForm(forms.Form):
......
...@@ -12,6 +12,9 @@ from common.helpers.test import add_groups_and_permissions ...@@ -12,6 +12,9 @@ from common.helpers.test import add_groups_and_permissions
class TestArxivQueryForm(TestCase): class TestArxivQueryForm(TestCase):
def setUp(self):
add_groups_and_permissions()
def test_new_arxiv_identifier_is_valid(self): def test_new_arxiv_identifier_is_valid(self):
new_identifier_data = {'identifier': '1612.07611v1'} new_identifier_data = {'identifier': '1612.07611v1'}
form = ArxivQueryForm(new_identifier_data) form = ArxivQueryForm(new_identifier_data)
...@@ -37,6 +40,19 @@ class TestArxivQueryForm(TestCase): ...@@ -37,6 +40,19 @@ class TestArxivQueryForm(TestCase):
form = ArxivQueryForm(data) form = ArxivQueryForm(data)
self.assertFalse(form.is_valid()) self.assertFalse(form.is_valid())
def test_arxiv_identifier_that_already_has_commentary_page_is_invalid(self):
unvetted_commentary = UnvettedCommentaryFactory()
invalid_data = {'identifier': unvetted_commentary.arxiv_identifier}
form = ArxivQueryForm(invalid_data)
self.assertFalse(form.is_valid())
error_message = form.errors['identifier'][0]
self.assertRegexpMatches(error_message, re.compile('already exist'))
def test_valid_but_non_existent_identifier_is_invalid(self):
invalid_data = {'identifier': '1613.07611v1'}
form = ArxivQueryForm(invalid_data)
self.assertFalse(form.is_valid())
class TestDOIToQueryForm(TestCase): class TestDOIToQueryForm(TestCase):
def setUp(self): def setUp(self):
......
...@@ -77,9 +77,10 @@ class ArxivCaller: ...@@ -77,9 +77,10 @@ class ArxivCaller:
def _call_arxiv(self): def _call_arxiv(self):
url = self.query_base_url % self.identifier url = self.query_base_url % self.identifier
request = requests.get(url) request = requests.get(url)
if request.ok: arxiv_data = feedparser.parse(request.content)['entries'][0]
if self._search_result_present(arxiv_data):
self.is_valid = True self.is_valid = True
self._arxiv_data = feedparser.parse(request.content)['entries'][0] self._arxiv_data = arxiv_data
else: else:
self.is_valid = False self.is_valid = False
...@@ -97,6 +98,9 @@ class ArxivCaller: ...@@ -97,6 +98,9 @@ class ArxivCaller:
'pub_abstract': abstract, 'pub_abstract': abstract,
} }
def _search_result_present(self, data):
return 'title' in data
# I'm going to revamp this whole thing... # I'm going to revamp this whole thing...
class BaseCaller(object): class BaseCaller(object):
......
...@@ -24,7 +24,7 @@ class ArxivCallerTest(TestCase): ...@@ -24,7 +24,7 @@ class ArxivCallerTest(TestCase):
def valid_but_nonexistent_identifier(self): def valid_but_nonexistent_identifier(self):
caller = ArxivCaller('1613.07611v1') caller = ArxivCaller('1613.07611v1')
self.assertFalse(caller.is_valid) self.assertEqual(caller.is_valid, False)
class DOICallerTest(TestCase): class DOICallerTest(TestCase):
......
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