From 8e6a75e45a6e02f05db86c99b3df6482a28706eb Mon Sep 17 00:00:00 2001
From: Geert Kapteijns <ghkapteijns@gmail.com>
Date: Sun, 26 Feb 2017 16:40:27 +0100
Subject: [PATCH] Fix CommentaryFactory so that it has a valid url

The url is based off of the DOI. Because the DOI is always the same,
making more than one factory instance crashes the detail page.

UnpublishedVettedCommentaryFactory does not have this problem,
as it has an empty DOI field and a valid (random) arxiv identifier.
---
 SciPost_v1/settings.py     |  6 +++++-
 commentaries/factories.py  | 16 ++++++++++++----
 common/helpers/__init__.py | 11 +++++++++++
 submissions/factories.py   | 14 +-------------
 4 files changed, 29 insertions(+), 18 deletions(-)

diff --git a/SciPost_v1/settings.py b/SciPost_v1/settings.py
index 93080c61d..9c9c14867 100644
--- a/SciPost_v1/settings.py
+++ b/SciPost_v1/settings.py
@@ -107,7 +107,11 @@ SHELL_PLUS_POST_IMPORTS = (
     ('theses.factories', ('ThesisLinkFactory')),
     ('comments.factories', ('CommentFactory')),
     ('submissions.factories', ('SubmissionFactory', 'EICassignedSubmissionFactory')),
-    ('commentaries.factories', ('EmptyCommentaryFactory', 'VettedCommentaryFactory', 'UnvettedCommentaryFactory')),
+    ('commentaries.factories',
+        ('EmptyCommentaryFactory',
+        'VettedCommentaryFactory',
+        'UnvettedCommentaryFactory',
+        'UnpublishedVettedCommentaryFactory',)),
 )
 
 MATHJAX_ENABLED = True
diff --git a/commentaries/factories.py b/commentaries/factories.py
index 82319e0cd..31f1354fa 100644
--- a/commentaries/factories.py
+++ b/commentaries/factories.py
@@ -1,11 +1,11 @@
 import factory
 
-from .models import Commentary, COMMENTARY_TYPES
-
 from scipost.constants import DISCIPLINE_PHYSICS, SCIPOST_SUBJECT_AREAS
 from scipost.factories import ContributorFactory
 from journals.models import SCIPOST_JOURNALS_DOMAINS
+from common.helpers import random_arxiv_identifier_with_version_number
 
+from .models import Commentary, COMMENTARY_TYPES
 
 class CommentaryFactory(factory.django.DjangoModelFactory):
     class Meta:
@@ -18,12 +18,16 @@ class CommentaryFactory(factory.django.DjangoModelFactory):
     discipline = DISCIPLINE_PHYSICS
     domain = SCIPOST_JOURNALS_DOMAINS[0][0]
     subject_area = SCIPOST_SUBJECT_AREAS[0][1][0][0]
-    pub_title = factory.Sequence(lambda n: "Commentary %d" % n)
+    pub_title = factory.Faker('bs')
     pub_DOI = '10.1103/PhysRevB.92.214427'
-    arxiv_identifier = '1610.06911v1'
+    arxiv_identifier = factory.Sequence(lambda n: random_arxiv_identifier_with_version_number())
     author_list = factory.Faker('name')
     pub_abstract = factory.Faker('text')
 
+    @factory.post_generation
+    def create_urls(self, create, extracted, **kwargs):
+        self.parse_links_into_urls(commit=create)
+
 
 class EmptyCommentaryFactory(CommentaryFactory):
     pub_DOI = None
@@ -34,5 +38,9 @@ class VettedCommentaryFactory(CommentaryFactory):
     vetted = True
 
 
+class UnpublishedVettedCommentaryFactory(VettedCommentaryFactory):
+    pub_DOI = ''
+
+
 class UnvettedCommentaryFactory(CommentaryFactory):
     vetted = False
diff --git a/common/helpers/__init__.py b/common/helpers/__init__.py
index d91d1905c..d1875920b 100644
--- a/common/helpers/__init__.py
+++ b/common/helpers/__init__.py
@@ -1,3 +1,6 @@
+import random
+import string
+
 def model_form_data(model, form_class, form_kwargs={}):
     '''
     Returns a dict that can be used to instantiate a form object.
@@ -25,6 +28,14 @@ def model_form_data(model, form_class, form_kwargs={}):
     form_fields = list(form_class(**form_kwargs).fields.keys())
     return filter_keys(model_data, form_fields)
 
+def random_arxiv_identifier_with_version_number():
+    return random_arxiv_identifier_without_version_number() + "v0"
+
+def random_arxiv_identifier_without_version_number():
+    return random_digits(4) + "." + random_digits(5)
+
+def random_digits(n):
+    return "".join(random.choice(string.digits) for _ in range(n))
 
 def filter_keys(dictionary, keys_to_keep):
     # Field is empty if not on model.
diff --git a/submissions/factories.py b/submissions/factories.py
index ade2eba39..1abdf6974 100644
--- a/submissions/factories.py
+++ b/submissions/factories.py
@@ -1,8 +1,7 @@
 import factory
-import random
-import string
 
 from scipost.factories import ContributorFactory
+from common.helpers import random_arxiv_identifier_with_version_number
 
 from .models import Submission
 
@@ -18,7 +17,6 @@ class SubmissionFactory(factory.django.DjangoModelFactory):
     abstract = factory.Faker('text')
     arxiv_link = factory.Faker('uri')
     arxiv_identifier_w_vn_nr = factory.Sequence(lambda n: random_arxiv_identifier_with_version_number())
-    arxiv_identifier_wo_vn_nr = factory.LazyAttribute(lambda obj: obj.arxiv_identifier_w_vn_nr[0:-2])
     domain = 'E'
 
 
@@ -26,13 +24,3 @@ class EICassignedSubmissionFactory(SubmissionFactory):
     status = 'EICassigned'
     editor_in_charge = factory.SubFactory(ContributorFactory)
     open_for_commenting = True
-
-
-def random_arxiv_identifier_with_version_number():
-    return random_arxiv_identifier_without_version_number() + "v0"
-
-def random_arxiv_identifier_without_version_number():
-    return random_digits(4) + "." + random_digits(5)
-
-def random_digits(n):
-    return "".join(random.choice(string.digits) for _ in range(n))
-- 
GitLab