From 62e9b0cba7b94aaaaaf46f5801ccb75ace8aa7d5 Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Sun, 14 May 2017 17:22:36 +0200
Subject: [PATCH] Improve SubFactory use

---
 commentaries/factories.py                  |  5 ++--
 comments/factories.py                      |  6 ++--
 journals/factories.py                      | 14 +++++----
 scipost/factories.py                       |  3 +-
 scipost/management/commands/populate_db.py | 33 ++++++++++++++++------
 submissions/factories.py                   |  6 ++--
 theses/factories.py                        |  6 ++--
 7 files changed, 47 insertions(+), 26 deletions(-)

diff --git a/commentaries/factories.py b/commentaries/factories.py
index 1f9a3fd28..940e958cb 100644
--- a/commentaries/factories.py
+++ b/commentaries/factories.py
@@ -1,7 +1,6 @@
 import factory
 
 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, random_external_doi
@@ -16,7 +15,7 @@ class CommentaryFactory(factory.django.DjangoModelFactory):
     class Meta:
         model = Commentary
 
-    requested_by = factory.SubFactory(ContributorFactory)
+    requested_by = factory.Iterator(Contributor.objects.all())
     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])
@@ -48,7 +47,7 @@ class CommentaryFactory(factory.django.DjangoModelFactory):
 
 class VettedCommentaryFactory(CommentaryFactory):
     vetted = True
-    vetted_by = factory.SubFactory(ContributorFactory)
+    vetted_by = factory.Iterator(Contributor.objects.all())
 
 
 class UnpublishedVettedCommentaryFactory(VettedCommentaryFactory):
diff --git a/comments/factories.py b/comments/factories.py
index de3bf4106..d74370a13 100644
--- a/comments/factories.py
+++ b/comments/factories.py
@@ -4,7 +4,7 @@ import pytz
 from django.utils import timezone
 
 from commentaries.factories import VettedCommentaryFactory
-from scipost.factories import ContributorFactory
+from scipost.models import Contributor
 from submissions.factories import EICassignedSubmissionFactory
 from theses.factories import VettedThesisLinkFactory
 
@@ -17,12 +17,12 @@ timezone.now()
 
 
 class CommentFactory(factory.django.DjangoModelFactory):
-    author = factory.SubFactory(ContributorFactory)
+    author = factory.Iterator(Contributor.objects.all())
     comment_text = factory.lazy_attribute(lambda x: Faker().paragraph())
     remarks_for_editors = factory.lazy_attribute(lambda x: Faker().paragraph())
     file_attachment = Faker().file_name(extension='pdf')
     status = STATUS_VETTED  # All comments will have status vetted!
-    vetted_by = factory.SubFactory(ContributorFactory)
+    vetted_by = factory.Iterator(Contributor.objects.all())
     date_submitted = Faker().date_time_between(start_date="-3y", end_date="now", tzinfo=pytz.UTC)
 
     class Meta:
diff --git a/journals/factories.py b/journals/factories.py
index 203fe8cb6..8d8de8ee1 100644
--- a/journals/factories.py
+++ b/journals/factories.py
@@ -25,11 +25,12 @@ class JournalFactory(factory.django.DjangoModelFactory):
 
 class VolumeFactory(factory.django.DjangoModelFactory):
     in_journal = factory.SubFactory(JournalFactory)
-    number = factory.Sequence(lambda n: n + 1)
+    number = 9999
     doi_label = factory.Faker('md5')
 
     @factory.post_generation
     def doi(self, create, extracted, **kwargs):
+        self.number = self.in_journal.volume_set.count()
         self.doi_label = self.in_journal.doi_label + '.' + str(self.number)
 
     @factory.post_generation
@@ -45,12 +46,13 @@ class VolumeFactory(factory.django.DjangoModelFactory):
 
 
 class IssueFactory(factory.django.DjangoModelFactory):
-    in_volume = factory.SubFactory(VolumeFactory)
-    number = factory.Sequence(lambda n: n + 1)
+    in_volume = factory.Iterator(Volume.objects.all())
+    number = 9999
     doi_label = factory.Faker('md5')
 
     @factory.post_generation
     def doi(self, create, extracted, **kwargs):
+        self.number = self.in_volume.issue_set.count()
         self.doi_label = self.in_volume.doi_label + '.' + str(self.number)
 
     @factory.post_generation
@@ -68,9 +70,9 @@ class IssueFactory(factory.django.DjangoModelFactory):
 
 class PublicationFactory(factory.django.DjangoModelFactory):
     accepted_submission = factory.SubFactory(PublishedSubmissionFactory)
-    paper_nr = factory.Sequence(lambda n: n)
+    paper_nr = 9999
     pdf_file = Faker().file_name(extension='pdf')
-    in_issue = factory.SubFactory(IssueFactory)
+    in_issue = factory.Iterator(Issue.objects.all())
     submission_date = factory.Faker('date')
     acceptance_date = factory.Faker('date')
     publication_date = factory.Faker('date')
@@ -78,7 +80,7 @@ class PublicationFactory(factory.django.DjangoModelFactory):
 
     @factory.post_generation
     def doi(self, create, extracted, **kwargs):
-        paper_nr = self.in_issue.publication_set.count() + 1
+        paper_nr = self.in_issue.publication_set.count()
         self.paper_nr = paper_nr
         self.doi_label = self.in_issue.doi_label + '.' + str(paper_nr).rjust(3, '0')
 
diff --git a/scipost/factories.py b/scipost/factories.py
index a10f06c56..ce122a655 100644
--- a/scipost/factories.py
+++ b/scipost/factories.py
@@ -7,7 +7,7 @@ from django.contrib.auth.models import Group
 from submissions.models import Submission
 
 from .models import Contributor, EditorialCollege, EditorialCollegeFellowship, Remark
-from .constants import TITLE_CHOICES
+from .constants import TITLE_CHOICES, SCIPOST_SUBJECT_AREAS
 
 from django_countries.data import COUNTRIES
 from faker import Faker
@@ -21,6 +21,7 @@ class ContributorFactory(factory.django.DjangoModelFactory):
     personalwebpage = factory.Faker('url')
     country_of_employment = factory.Iterator(list(COUNTRIES))
     affiliation = factory.Faker('company')
+    expertises = factory.Iterator(SCIPOST_SUBJECT_AREAS[0][1], getter=lambda c: [c[0]])
 
     class Meta:
         model = Contributor
diff --git a/scipost/management/commands/populate_db.py b/scipost/management/commands/populate_db.py
index a8561b693..4efe19d85 100644
--- a/scipost/management/commands/populate_db.py
+++ b/scipost/management/commands/populate_db.py
@@ -4,7 +4,7 @@ from commentaries.factories import VettedCommentaryFactory
 from comments.factories import CommentaryCommentFactory, SubmissionCommentFactory,\
                                ThesislinkCommentFactory
 from scipost.factories import SubmissionRemarkFactory
-from journals.factories import JournalFactory, IssueFactory, PublicationFactory
+from journals.factories import JournalFactory, VolumeFactory, IssueFactory, PublicationFactory
 from news.factories import NewsItemFactory
 from submissions.factories import EICassignedSubmissionFactory
 from theses.factories import VettedThesisLinkFactory
@@ -50,12 +50,19 @@ class Command(BaseCommand):
             default=False,
             help='Add 5 Editorial College and Fellows (Contributors required)',
         )
+        parser.add_argument(
+            '--pubset',
+            action='store_true',
+            dest='pubset',
+            default=False,
+            help='Add 5 Issues, Volumes and Journals',
+        )
         parser.add_argument(
             '--issues',
             action='store_true',
             dest='issues',
             default=False,
-            help='Add 5 sets of {Journal, Volume and Issue}',
+            help='Add 5 Issues',
         )
         parser.add_argument(
             '--submissions',
@@ -95,7 +102,10 @@ class Command(BaseCommand):
 
     def handle(self, *args, **kwargs):
         if kwargs['contributor'] or kwargs['all']:
-            self.create_contributors()
+            n = 5
+            if kwargs['all']:
+                n += 10
+            self.create_contributors(n)
         if kwargs['commentaries'] or kwargs['all']:
             self.create_commentaries()
         if kwargs['comments'] or kwargs['all']:
@@ -107,6 +117,8 @@ class Command(BaseCommand):
             self.create_news_items()
         if kwargs['submissions'] or kwargs['all']:
             self.create_submissions()
+        if kwargs['pubset'] or kwargs['all']:
+            self.create_pubset()
         if kwargs['issues'] or kwargs['all']:
             self.create_issues()
         if kwargs['publications'] or kwargs['all']:
@@ -116,9 +128,9 @@ class Command(BaseCommand):
         if kwargs['theses'] or kwargs['all']:
             self.create_theses()
 
-    def create_contributors(self):
-        ContributorFactory.create_batch(5)
-        self.stdout.write(self.style.SUCCESS('Successfully created 5 Contributors.'))
+    def create_contributors(self, n=5):
+        ContributorFactory.create_batch(n)
+        self.stdout.write(self.style.SUCCESS('Successfully created %i Contributors.' % n))
 
     def create_commentaries(self):
         VettedCommentaryFactory.create_batch(5)
@@ -146,13 +158,18 @@ class Command(BaseCommand):
         EICassignedSubmissionFactory.create_batch(5)
         self.stdout.write(self.style.SUCCESS('Successfully created 5 Submissions.'))
 
-    def create_issues(self):
+    def create_pubset(self):
+        VolumeFactory.create_batch(5)
         IssueFactory.create_batch(5)
         self.stdout.write(self.style.SUCCESS(
                           'Successfully created 5x {Journal, Volume and Issue}.'))
 
+    def create_issues(self):
+        IssueFactory.create_batch(5)
+        self.stdout.write(self.style.SUCCESS(
+                          'Successfully created 5 Issue.'))
+
     def create_publications(self):
-        JournalFactory.create_batch(4)
         PublicationFactory.create_batch(5)
         self.stdout.write(self.style.SUCCESS('Successfully created 5 Publications.'))
 
diff --git a/submissions/factories.py b/submissions/factories.py
index 39aab654c..6c6022754 100644
--- a/submissions/factories.py
+++ b/submissions/factories.py
@@ -3,6 +3,7 @@ import pytz
 
 from django.utils import timezone
 
+from scipost.constants import SCIPOST_SUBJECT_AREAS
 from scipost.models import Contributor
 from journals.constants import SCIPOST_JOURNALS_DOMAINS
 from common.helpers import random_arxiv_identifier_without_version_number, random_scipost_journal
@@ -19,14 +20,15 @@ class SubmissionFactory(factory.django.DjangoModelFactory):
         model = Submission
 
     author_list = factory.Faker('name')
-    submitted_by = Contributor.objects.first()
+    submitted_by = factory.Iterator(Contributor.objects.all())
     submitted_to_journal = factory.Sequence(lambda n: random_scipost_journal())
     title = factory.lazy_attribute(lambda x: Faker().sentence())
     abstract = factory.lazy_attribute(lambda x: Faker().paragraph())
     arxiv_link = factory.Faker('uri')
     arxiv_identifier_wo_vn_nr = factory.Sequence(
                                     lambda n: random_arxiv_identifier_without_version_number())
-    domain = SCIPOST_JOURNALS_DOMAINS[0][0]
+    subject_area = factory.Iterator(SCIPOST_SUBJECT_AREAS[0][1], getter=lambda c: c[0])
+    domain = factory.Iterator(SCIPOST_JOURNALS_DOMAINS, getter=lambda c: c[0])
     abstract = Faker().paragraph()
     author_comments = Faker().paragraph()
     remarks_for_editors = Faker().paragraph()
diff --git a/theses/factories.py b/theses/factories.py
index 76bf49969..c5461a1a6 100644
--- a/theses/factories.py
+++ b/theses/factories.py
@@ -5,7 +5,7 @@ from django.utils import timezone
 from common.helpers.factories import FormFactory
 from journals.constants import SCIPOST_JOURNALS_DOMAINS
 from scipost.constants import SCIPOST_DISCIPLINES, SCIPOST_SUBJECT_AREAS
-from scipost.factories import ContributorFactory
+from scipost.models import Contributor
 
 from .models import ThesisLink
 from .forms import VetThesisLinkForm
@@ -20,7 +20,7 @@ class ThesisLinkFactory(factory.django.DjangoModelFactory):
     class Meta:
         model = ThesisLink
 
-    requested_by = factory.SubFactory(ContributorFactory)
+    requested_by = factory.Iterator(Contributor.objects.all())
     type = factory.Iterator(THESIS_TYPES, getter=lambda c: c[0])
     domain = factory.Iterator(SCIPOST_JOURNALS_DOMAINS, getter=lambda c: c[0])
     discipline = factory.Iterator(SCIPOST_DISCIPLINES, getter=lambda c: c[0])
@@ -35,7 +35,7 @@ class ThesisLinkFactory(factory.django.DjangoModelFactory):
 
 
 class VettedThesisLinkFactory(ThesisLinkFactory):
-    vetted_by = factory.SubFactory(ContributorFactory)
+    vetted_by = factory.Iterator(Contributor.objects.all())
     vetted = True
 
 
-- 
GitLab