From 86005ddf9c440ae38ac7989266544681faaea79f Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Sun, 19 Mar 2017 11:40:52 +0100
Subject: [PATCH] Add NewsItem to populate_db

---
 news/factories.py                          | 14 +++++
 scipost/management/commands/factories.py   | 70 ++++++++++++++++++++++
 scipost/management/commands/populate_db.py | 38 +++++++++++-
 3 files changed, 119 insertions(+), 3 deletions(-)
 create mode 100644 news/factories.py
 create mode 100644 scipost/management/commands/factories.py

diff --git a/news/factories.py b/news/factories.py
new file mode 100644
index 000000000..74dcad744
--- /dev/null
+++ b/news/factories.py
@@ -0,0 +1,14 @@
+import factory
+
+from .models import NewsItem
+
+
+class NewsItemFactory(factory.django.DjangoModelFactory):
+    class Meta:
+        model = NewsItem
+
+    date = factory.Faker('date_time')
+    headline = factory.Faker('sentence', nb_words=6)
+    blurb = factory.Faker('text', max_nb_chars=200)
+    followup_link = factory.Faker('url')
+    followup_link_text = factory.Faker('sentence', nb_words=4)
diff --git a/scipost/management/commands/factories.py b/scipost/management/commands/factories.py
new file mode 100644
index 000000000..8a747b60b
--- /dev/null
+++ b/scipost/management/commands/factories.py
@@ -0,0 +1,70 @@
+import factory
+import random
+
+from django.contrib.auth import get_user_model
+from django.contrib.auth.models import Group
+
+from .models import Contributor, EditorialCollege, EditorialCollegeMember
+
+
+class ContributorFactory(factory.django.DjangoModelFactory):
+    class Meta:
+        model = Contributor
+
+    title = "MR"
+    user = factory.SubFactory('scipost.factories.UserFactory', contributor=None)
+    status = 1  # normal user
+    vetted_by = factory.SubFactory('scipost.factories.ContributorFactory', vetted_by=None)
+
+
+class VettingEditorFactory(ContributorFactory):
+    @factory.post_generation
+    def add_to_vetting_editors(self, create, extracted, **kwargs):
+        if not create:
+            return
+        self.user.groups.add(Group.objects.get(name="Vetting Editors"))
+
+
+class UserFactory(factory.django.DjangoModelFactory):
+    class Meta:
+        model = get_user_model()
+
+    username = factory.Faker('user_name')
+    password = factory.PostGenerationMethodCall('set_password', 'adm1n')
+    email = factory.Faker('safe_email')
+    first_name = factory.Faker('first_name')
+    last_name = factory.Faker('last_name')
+    is_active = True
+    # When user object is created, associate new Contributor object to it.
+    contributor = factory.RelatedFactory(ContributorFactory, 'user')
+
+    @factory.post_generation
+    def groups(self, create, extracted, **kwargs):
+        # If the object is not saved, we cannot use many-to-many relationship.
+        if not create:
+            return
+        # If group objects were passed in, use those.
+        if extracted:
+            for group in extracted:
+                self.groups.add(group)
+        else:
+            self.groups.add(Group.objects.get(name="Registered Contributors"))
+
+
+class EditorialCollegeFactory(factory.django.DjangoModelFactory):
+    class Meta:
+        model = EditorialCollege
+        django_get_or_create = ('discipline', )
+
+    discipline = random.choice(['Physics', 'Chemistry', 'Medicine'])
+
+
+class EditorialCollegeMemberFactory(factory.django.DjangoModelFactory):
+    class Meta:
+        model = EditorialCollegeMember
+
+    title = factory.Faker('prefix')
+    name = factory.Faker('name')
+    link = factory.Faker('url')
+    subtitle = factory.Faker('company')
+    college = factory.Iterator(EditorialCollege.objects.all())
diff --git a/scipost/management/commands/populate_db.py b/scipost/management/commands/populate_db.py
index ae0f171dc..e1296b85e 100644
--- a/scipost/management/commands/populate_db.py
+++ b/scipost/management/commands/populate_db.py
@@ -1,9 +1,41 @@
 from django.core.management.base import BaseCommand
 
+from news.factories import NewsItemFactory
+
 from ...factories import EditorialCollegeFactory, EditorialCollegeMemberFactory
 
 
 class Command(BaseCommand):
+    def add_arguments(self, parser):
+        parser.add_argument(
+            '--news',
+            action='store_true',
+            dest='news',
+            default=False,
+            help='Add NewsItems',
+        )
+        parser.add_argument(
+            '--editorial-college',
+            action='store_true',
+            dest='editorial-college',
+            default=False,
+            help='Add Editorial College and members',
+        )
+        parser.add_argument(
+            '--all',
+            action='store_true',
+            dest='all',
+            default=False,
+            help='Add all available',
+        )
+
+    def handle(self, *args, **kwargs):
+        if kwargs['editorial-college'] or kwargs['all']:
+            self.create_editorial_college()
+            self.create_editorial_college_members()
+        if kwargs['news'] or kwargs['all']:
+            self.create_news_items()
+
     def create_editorial_college(self):
         EditorialCollegeFactory.create_batch(5)
         self.stdout.write(self.style.SUCCESS('Successfully created Editorial College\'s.'))
@@ -12,6 +44,6 @@ class Command(BaseCommand):
         EditorialCollegeMemberFactory.create_batch(20)
         self.stdout.write(self.style.SUCCESS('Successfully created Editorial College Members.'))
 
-    def handle(self, *args, **kwargs):
-        self.create_editorial_college()
-        self.create_editorial_college_members()
+    def create_news_items(self):
+        NewsItemFactory.create_batch(5)
+        self.stdout.write(self.style.SUCCESS('Successfully created News items.'))
-- 
GitLab