From 155305b2a4e17e52fc3c590d5fcf62e5f88e6ae6 Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Mon, 8 May 2017 21:09:23 +0200
Subject: [PATCH] Add Commentary factories

---
 commentaries/constants.py |  6 +++++
 commentaries/factories.py | 46 ++++++++++++++++++++++++---------------
 commentaries/models.py    |  9 +-------
 3 files changed, 36 insertions(+), 25 deletions(-)
 create mode 100644 commentaries/constants.py

diff --git a/commentaries/constants.py b/commentaries/constants.py
new file mode 100644
index 000000000..5fe492bf1
--- /dev/null
+++ b/commentaries/constants.py
@@ -0,0 +1,6 @@
+COMMENTARY_PUBLISHED = 'published'
+COMMENTARY_PREPRINT = 'preprint'
+COMMENTARY_TYPES = (
+    (COMMENTARY_PUBLISHED, 'published paper'),
+    (COMMENTARY_PREPRINT, 'arXiv preprint'),
+)
diff --git a/commentaries/factories.py b/commentaries/factories.py
index 60f1625f2..1f9a3fd28 100644
--- a/commentaries/factories.py
+++ b/commentaries/factories.py
@@ -1,42 +1,54 @@
 import factory
 
-from scipost.constants import DISCIPLINE_PHYSICS, SCIPOST_SUBJECT_AREAS
+from scipost.constants import SCIPOST_DISCIPLINES, SCIPOST_SUBJECT_AREAS
 from scipost.factories import ContributorFactory
+from scipost.models import Contributor
 from journals.constants import SCIPOST_JOURNALS_DOMAINS
-from common.helpers import random_arxiv_identifier_with_version_number
+from common.helpers import random_arxiv_identifier_with_version_number, random_external_doi
 
-from .models import Commentary, COMMENTARY_TYPES
+from .constants import COMMENTARY_TYPES
+from .models import Commentary
+
+from faker import Faker
 
 
 class CommentaryFactory(factory.django.DjangoModelFactory):
     class Meta:
         model = Commentary
-        abstract = True
 
     requested_by = factory.SubFactory(ContributorFactory)
-    vetted_by = factory.SubFactory(ContributorFactory)
-    type = COMMENTARY_TYPES[0][0]
-    discipline = DISCIPLINE_PHYSICS
-    domain = SCIPOST_JOURNALS_DOMAINS[0][0]
-    subject_area = SCIPOST_SUBJECT_AREAS[0][1][0][0]
-    pub_title = factory.Faker('bs')
-    pub_DOI = '10.1103/PhysRevB.92.214427'
+    type = factory.Iterator(COMMENTARY_TYPES, getter=lambda c: c[0])
+    discipline = factory.Iterator(SCIPOST_DISCIPLINES, getter=lambda c: c[0])
+    domain = factory.Iterator(SCIPOST_JOURNALS_DOMAINS, getter=lambda c: c[0])
+    subject_area = factory.Iterator(SCIPOST_SUBJECT_AREAS[0][1], getter=lambda c: c[0])
+    pub_title = factory.Faker('text')
+    pub_DOI = factory.Sequence(lambda n: random_external_doi())
     arxiv_identifier = factory.Sequence(lambda n: random_arxiv_identifier_with_version_number())
-    author_list = factory.Faker('name')
-    pub_abstract = factory.Faker('text')
+    arxiv_link = factory.Faker('uri')
+    pub_abstract = factory.lazy_attribute(lambda x: Faker().paragraph())
+
+    @factory.post_generation
+    def arxiv_link(self, create, extracted, **kwargs):
+        self.arxiv_link = 'https://arxiv.org/abs/%s' % self.arxiv_identifier
+        self.arxiv_or_DOI_string = self.arxiv_identifier
 
     @factory.post_generation
     def create_urls(self, create, extracted, **kwargs):
         self.parse_links_into_urls(commit=create)
 
-
-class EmptyCommentaryFactory(CommentaryFactory):
-    pub_DOI = None
-    arxiv_identifier = None
+    @factory.post_generation
+    def add_authors(self, create, extracted, **kwargs):
+        contributors = list(Contributor.objects.order_by('?')
+                            .exclude(pk=self.requested_by.pk).all()[:4])
+        for contrib in contributors:
+            self.author_list += ', %s %s' % (contrib.user.first_name, contrib.user.last_name)
+            if create:
+                self.authors.add(contrib)
 
 
 class VettedCommentaryFactory(CommentaryFactory):
     vetted = True
+    vetted_by = factory.SubFactory(ContributorFactory)
 
 
 class UnpublishedVettedCommentaryFactory(VettedCommentaryFactory):
diff --git a/commentaries/models.py b/commentaries/models.py
index ac6dab51b..51490c7d8 100644
--- a/commentaries/models.py
+++ b/commentaries/models.py
@@ -8,17 +8,10 @@ from scipost.behaviors import ArxivCallable, TimeStampedModel
 from scipost.models import Contributor
 from scipost.constants import SCIPOST_DISCIPLINES, DISCIPLINE_PHYSICS, SCIPOST_SUBJECT_AREAS
 
+from .constants import COMMENTARY_TYPES
 from .managers import CommentaryManager
 
 
-COMMENTARY_PUBLISHED = 'published'
-COMMENTARY_PREPRINT = 'preprint'
-COMMENTARY_TYPES = (
-    (COMMENTARY_PUBLISHED, 'published paper'),
-    (COMMENTARY_PREPRINT, 'arXiv preprint'),
-)
-
-
 class Commentary(ArxivCallable, TimeStampedModel):
     """
     A Commentary contains all the contents of a SciPost Commentary page for a given publication.
-- 
GitLab