From 49bbb6ae775b5cfda4d0966323b08c9ffef2ad21 Mon Sep 17 00:00:00 2001
From: Geert Kapteijns <ghkapteijns@gmail.com>
Date: Thu, 18 May 2017 18:18:18 +0200
Subject: [PATCH] link to commentary page if it already exists

---
 commentaries/forms.py                         | 47 +++++++++++++------
 .../_doi_query_commentary_exists.html         |  1 +
 .../request_published_article.html            |  2 +-
 commentaries/test_views.py                    |  6 ++-
 commentaries/views.py                         | 20 ++++----
 5 files changed, 47 insertions(+), 29 deletions(-)
 create mode 100644 commentaries/templates/commentaries/_doi_query_commentary_exists.html

diff --git a/commentaries/forms.py b/commentaries/forms.py
index a47a70af1..0af8bc931 100644
--- a/commentaries/forms.py
+++ b/commentaries/forms.py
@@ -3,6 +3,9 @@ import re
 from django import forms
 from django.shortcuts import get_object_or_404
 from django.urls import reverse
+from django.utils.safestring import mark_safe
+from django.template.loader import get_template
+from django.template import Context
 
 from .models import Commentary
 from .constants import COMMENTARY_PUBLISHED, COMMENTARY_PREPRINT
@@ -22,9 +25,12 @@ class DOIToQueryForm(forms.Form):
     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)
+        commentary = Commentary.objects.filter(pub_DOI=input_doi)
+        if commentary.exists():
+            error_message = get_template('commentaries/_doi_query_commentary_exists.html').render(
+                Context({'arxiv_or_DOI_string': commentary[0].arxiv_or_DOI_string})
+            )
+            raise forms.ValidationError(mark_safe(error_message))
 
         caller = DOICaller(input_doi)
         if caller.is_valid:
@@ -52,9 +58,12 @@ class ArxivQueryForm(forms.Form):
     def clean_identifier(self):
         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)
+        commentary = Commentary.objects.filter(arxiv_identifier=identifier)
+        if commentary.exists():
+            error_message = get_template('commentaries/_doi_query_commentary_exists.html').render(
+                Context({'arxiv_or_DOI_string': commentary[0].arxiv_or_DOI_string})
+            )
+            raise forms.ValidationError(mark_safe(error_message))
 
         caller = ArxivCaller(identifier)
         if caller.is_valid:
@@ -80,6 +89,10 @@ class RequestCommentaryForm(forms.ModelForm):
             'pub_date': 'Format: YYYY-MM-DD'
         }
 
+    def save(self, *args, **kwargs):
+        self.instance.parse_links_into_urls()
+        return super().save(self, *args, **kwargs)
+
 
 class RequestArxivPreprintForm(RequestCommentaryForm):
     class Meta(RequestCommentaryForm.Meta):
@@ -96,15 +109,18 @@ class RequestArxivPreprintForm(RequestCommentaryForm):
     def clean_arxiv_identifier(self):
         arxiv_identifier = self.cleaned_data['arxiv_identifier']
 
-        if Commentary.objects.filter(arxiv_identifier=arxiv_identifier).exists():
-            error_message = 'There already exists a Commentary Page on this arXiv preprint.'
-            raise forms.ValidationError(error_message)
+        commentary = Commentary.objects.filter(arxiv_identifier=arxiv_identifier)
+        if commentary.exists():
+            error_message = get_template('commentaries/_doi_query_commentary_exists.html').render(
+                Context({'arxiv_or_DOI_string': commentary[0].arxiv_or_DOI_string})
+            )
+            raise forms.ValidationError(mark_safe(error_message))
 
         return arxiv_identifier
 
     def save(self, *args, **kwargs):
         self.instance.type = COMMENTARY_PREPRINT
-        return super(RequestArxivPreprintForm, self).save(*args, **kwargs)
+        return super().save(*args, **kwargs)
 
 
 class RequestPublishedArticleForm(RequestCommentaryForm):
@@ -122,15 +138,18 @@ class RequestPublishedArticleForm(RequestCommentaryForm):
     def clean_pub_DOI(self):
         input_doi = self.cleaned_data['pub_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)
+        commentary = Commentary.objects.filter(pub_DOI=input_doi)
+        if commentary.exists():
+            error_message = get_template('commentaries/_doi_query_commentary_exists.html').render(
+                Context({'arxiv_or_DOI_string': commentary[0].arxiv_or_DOI_string})
+            )
+            raise forms.ValidationError(mark_safe(error_message))
 
         return input_doi
 
     def save(self, *args, **kwargs):
         self.instance.type = COMMENTARY_PUBLISHED
-        return super(RequestPublishedArticleForm, self).save(*args, **kwargs)
+        return super().save(*args, **kwargs)
 
 
 class VetCommentaryForm(forms.Form):
diff --git a/commentaries/templates/commentaries/_doi_query_commentary_exists.html b/commentaries/templates/commentaries/_doi_query_commentary_exists.html
new file mode 100644
index 000000000..2cc621178
--- /dev/null
+++ b/commentaries/templates/commentaries/_doi_query_commentary_exists.html
@@ -0,0 +1 @@
+There already exists a <a href="{% url 'commentaries:commentary' arxiv_or_DOI_string=arxiv_or_DOI_string %}">Commentary Page</a> on this publication.
diff --git a/commentaries/templates/commentaries/request_published_article.html b/commentaries/templates/commentaries/request_published_article.html
index f9bc472a3..b0bf7365a 100644
--- a/commentaries/templates/commentaries/request_published_article.html
+++ b/commentaries/templates/commentaries/request_published_article.html
@@ -16,7 +16,7 @@
     <div class='col-12 col-md-8'>
         <form action="{% url 'commentaries:prefill_using_DOI' %}" method="post">
           {% csrf_token %}
-          {{ doi_query_form|bootstrap }}
+          {{ query_form|bootstrap }}
           <input class="btn btn-secondary" type="submit" value="Query DOI"/>
         </form>
     </div>
diff --git a/commentaries/test_views.py b/commentaries/test_views.py
index 2454c1026..dbb0bb6c6 100644
--- a/commentaries/test_views.py
+++ b/commentaries/test_views.py
@@ -36,7 +36,7 @@ class RequestPublishedArticleTest(TestCase):
         self.commentary_instance = UnvettedCommentaryFactory.build(requested_by=ContributorFactory())
         self.valid_form_data = model_form_data(self.commentary_instance, RequestPublishedArticleForm)
 
-    def test_commentary_gets_created_with_correct_type(self):
+    def test_commentary_gets_created_with_correct_type_and_link(self):
         request = RequestFactory().post(self.target, self.valid_form_data)
         request.user = UserFactory()
 
@@ -46,6 +46,7 @@ class RequestPublishedArticleTest(TestCase):
         commentary = Commentary.objects.first()
         self.assertEqual(commentary.pub_DOI, self.valid_form_data['pub_DOI'])
         self.assertEqual(commentary.type, 'published')
+        self.assertEqual(commentary.arxiv_or_DOI_string, commentary.pub_DOI)
 
 
 class RequestArxivPreprintTest(TestCase):
@@ -58,7 +59,7 @@ class RequestArxivPreprintTest(TestCase):
         # so model_form_data doesn't include it.
         self.valid_form_data['arxiv_identifier'] = self.commentary_instance.arxiv_identifier
 
-    def test_commentary_gets_created_with_correct_type(self):
+    def test_commentary_gets_created_with_correct_type_and_link(self):
         request = RequestFactory().post(self.target, self.valid_form_data)
         request.user = UserFactory()
 
@@ -68,6 +69,7 @@ class RequestArxivPreprintTest(TestCase):
         commentary = Commentary.objects.first()
         self.assertEqual(commentary.arxiv_identifier, self.valid_form_data['arxiv_identifier'])
         self.assertEqual(commentary.type, 'preprint')
+        self.assertEqual(commentary.arxiv_or_DOI_string, "arXiv:" + self.commentary_instance.arxiv_identifier)
 
 class VetCommentaryRequestsTest(TestCase):
     """Test cases for `vet_commentary_requests` view method"""
diff --git a/commentaries/views.py b/commentaries/views.py
index de97bac21..4c50ca0eb 100644
--- a/commentaries/views.py
+++ b/commentaries/views.py
@@ -41,8 +41,6 @@ class RequestCommentary(CreateView):
         return super().form_valid(form)
 
 
-@method_decorator(permission_required(
-    'scipost.can_request_commentary_pages', raise_exception=True), name='dispatch')
 class RequestPublishedArticle(RequestCommentary):
     form_class = RequestPublishedArticleForm
     template_name = 'commentaries/request_published_article.html'
@@ -53,8 +51,6 @@ class RequestPublishedArticle(RequestCommentary):
         return context
 
 
-@method_decorator(permission_required(
-    'scipost.can_request_commentary_pages', raise_exception=True), name='dispatch')
 class RequestArxivPreprint(RequestCommentary):
     form_class = RequestArxivPreprintForm
     template_name = 'commentaries/request_arxiv_preprint.html'
@@ -68,10 +64,10 @@ class RequestArxivPreprint(RequestCommentary):
 @permission_required('scipost.can_request_commentary_pages', raise_exception=True)
 def prefill_using_DOI(request):
     if request.method == "POST":
-        doi_query_form = DOIToQueryForm(request.POST)
+        query_form = DOIToQueryForm(request.POST)
         # The form checks if doi is valid and commentary doesn't already exist.
-        if doi_query_form.is_valid():
-            prefill_data = doi_query_form.request_published_article_form_prefill_data()
+        if query_form.is_valid():
+            prefill_data = query_form.request_published_article_form_prefill_data()
             form = RequestPublishedArticleForm(initial=prefill_data)
             messages.success(request, strings.acknowledge_doi_query, fail_silently=True)
         else:
@@ -79,7 +75,7 @@ def prefill_using_DOI(request):
 
         context = {
             'form': form,
-            'doi_query_form': doi_query_form,
+            'query_form': query_form,
         }
         return render(request, 'commentaries/request_published_article.html', context)
     else:
@@ -89,9 +85,9 @@ def prefill_using_DOI(request):
 @permission_required('scipost.can_request_commentary_pages', raise_exception=True)
 def prefill_using_arxiv_identifier(request):
     if request.method == "POST":
-        arxiv_query_form = ArxivQueryForm(request.POST)
-        if arxiv_query_form.is_valid():
-            prefill_data = arxiv_query_form.request_arxiv_preprint_form_prefill_data()
+        query_form = ArxivQueryForm(request.POST)
+        if query_form.is_valid():
+            prefill_data = query_form.request_arxiv_preprint_form_prefill_data()
             form = RequestArxivPreprintForm(initial=prefill_data)
             messages.success(request, strings.acknowledge_arxiv_query, fail_silently=True)
         else:
@@ -99,7 +95,7 @@ def prefill_using_arxiv_identifier(request):
 
         context = {
             'form': form,
-            'arxiv_query_form': arxiv_query_form,
+            'query_form': query_form,
         }
         return render(request, 'commentaries/request_arxiv_preprint.html', context)
     else:
-- 
GitLab