From 81a32c84c7ab902ed804c69bfd523d7a5e219426 Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Thu, 14 Sep 2017 19:50:17 +0200
Subject: [PATCH] Set up new production user;

---
 production/admin.py                           |  8 +++++-
 production/migrations/0011_productionuser.py  | 25 +++++++++++++++++++
 production/models.py                          | 16 +++++++++++-
 scipost/admin.py                              |  2 ++
 .../commands/add_groups_and_permissions.py    | 16 ++++++++++++
 5 files changed, 65 insertions(+), 2 deletions(-)
 create mode 100644 production/migrations/0011_productionuser.py

diff --git a/production/admin.py b/production/admin.py
index 7969db8ec..15b7b61d8 100644
--- a/production/admin.py
+++ b/production/admin.py
@@ -1,12 +1,18 @@
 from django.contrib import admin
 
-from .models import ProductionStream, ProductionEvent
+from .models import ProductionStream, ProductionEvent, ProductionUser
 
 
 def event_count(obj):
     return obj.productionevent_set.count()
 
 
+class ProductionUserInline(admin.StackedInline):
+    model = ProductionUser
+    extra = 0
+    min_num = 0
+
+
 class ProductionEventInline(admin.TabularInline):
     model = ProductionEvent
     extra = 1
diff --git a/production/migrations/0011_productionuser.py b/production/migrations/0011_productionuser.py
new file mode 100644
index 000000000..ed1ec512c
--- /dev/null
+++ b/production/migrations/0011_productionuser.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2017-09-14 17:07
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('production', '0010_auto_20170707_0600'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='ProductionUser',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+    ]
diff --git a/production/models.py b/production/models.py
index 3d94ddaa2..3540573dd 100644
--- a/production/models.py
+++ b/production/models.py
@@ -1,11 +1,25 @@
 from django.db import models
-from django.utils import timezone
 from django.core.urlresolvers import reverse
+from django.contrib.auth.models import User
+from django.utils import timezone
 
 from .constants import PRODUCTION_STREAM_STATUS, PRODUCTION_STREAM_ONGOING, PRODUCTION_EVENTS
 from .managers import ProductionStreamManager, ProductionEventManager
 
 
+class ProductionUser(models.Model):
+    """
+    Production Officers will have a ProductionUser object related to their account
+    to relate all production related actions to.
+    """
+    user = models.OneToOneField(User, on_delete=models.PROTECT, unique=True)
+
+    # objects = ProductionUserQuerySet.as_manager()  -- Not implemented yet
+
+    def __str__(self):
+        return '%s, %s' % (self.user.last_name, self.user.first_name)
+
+
 class ProductionStream(models.Model):
     submission = models.OneToOneField('submissions.Submission', on_delete=models.CASCADE)
     opened = models.DateTimeField(auto_now_add=True)
diff --git a/scipost/admin.py b/scipost/admin.py
index c9c588627..8cfaffcf2 100644
--- a/scipost/admin.py
+++ b/scipost/admin.py
@@ -13,6 +13,7 @@ from scipost.models import Contributor, Remark,\
 
 from journals.models import Publication
 from partners.admin import ContactToUserInline
+from production.admin import ProductionUserInline
 from submissions.models import Submission
 
 
@@ -38,6 +39,7 @@ class UserAdmin(UserAdmin):
     inlines = [
         ContributorInline,
         ContactToUserInline,
+        ProductionUserInline
         ]
     search_fields = ['last_name', 'email']
 
diff --git a/scipost/management/commands/add_groups_and_permissions.py b/scipost/management/commands/add_groups_and_permissions.py
index 6070f1f78..25de01108 100644
--- a/scipost/management/commands/add_groups_and_permissions.py
+++ b/scipost/management/commands/add_groups_and_permissions.py
@@ -27,6 +27,7 @@ class Command(BaseCommand):
         Testers, created = Group.objects.get_or_create(name='Testers')
         Ambassadors, created = Group.objects.get_or_create(name='Ambassadors')
         JuniorAmbassadors, created = Group.objects.get_or_create(name='Junior Ambassadors')
+        ProductionSupervisors, created = Group.objects.get_or_create(name='Production Supervisor')
         ProductionOfficers, created = Group.objects.get_or_create(name='Production Officers')
 
         PartnersAdmin, created = Group.objects.get_or_create(name='Partners Administrators')
@@ -205,6 +206,14 @@ class Command(BaseCommand):
             content_type=content_type)
 
         # Production
+        can_promote_user_to_production_officer, created = Permission.objects.get_or_create(
+            codename='can_promote_user_to_production_officer',
+            name='Can promote user to production officer',
+            content_type=content_type)
+        can_assign_production_officer, created = Permission.objects.get_or_create(
+            codename='can_assign_production_officer',
+            name='Can assign production officer',
+            content_type=content_type)
         can_view_production, created = Permission.objects.get_or_create(
             codename='can_view_production',
             name='Can view production page',
@@ -250,6 +259,7 @@ class Command(BaseCommand):
             can_assign_submissions,
             can_prepare_recommendations_for_voting,
             can_fix_College_decision,
+            can_promote_user_to_production_officer,
             can_view_production,
             can_attend_VGMs,
             can_view_timesheets,
@@ -316,6 +326,12 @@ class Command(BaseCommand):
             can_draft_registration_invitations,
         ])
 
+        ProductionSupervisors.permissions.set([
+            can_assign_production_officer,
+            can_view_docs_scipost,
+            can_view_production,
+        ])
+
         ProductionOfficers.permissions.set([
             can_view_docs_scipost,
             can_view_production,
-- 
GitLab