From 275ad99fced0e2d7a93187d4144c77e4aa805094 Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Thu, 6 Feb 2020 13:56:12 +0100
Subject: [PATCH] Move existing data migrations to new places

---
 aleksis/core/apps.py                          | 16 +++++++++++
 aleksis/core/migrations/0001_initial.py       |  1 +
 .../migrations/0006_create_default_term.py    | 27 -------------------
 .../core/migrations/0007_create_admin_user.py | 25 -----------------
 ...008_rename_fields_notification_activity.py |  2 +-
 .../0010_create_validation_service.py         | 20 --------------
 .../0011_make_primary_group_optional.py       |  2 +-
 aleksis/core/models.py                        | 27 +++++++++++++++++++
 8 files changed, 46 insertions(+), 74 deletions(-)
 delete mode 100644 aleksis/core/migrations/0006_create_default_term.py
 delete mode 100644 aleksis/core/migrations/0007_create_admin_user.py
 delete mode 100644 aleksis/core/migrations/0010_create_validation_service.py

diff --git a/aleksis/core/apps.py b/aleksis/core/apps.py
index 5b87a0450..128d6e819 100644
--- a/aleksis/core/apps.py
+++ b/aleksis/core/apps.py
@@ -11,3 +11,19 @@ class CoreConfig(AppConfig):
 
     def config_updated(self, *args, **kwargs) -> None:
         clean_scss()
+
+    def post_migrate(
+        self,
+        app_config: django.apps.AppConfig,
+        verbosity: int,
+        interactive: bool,
+        using: str,
+        plan: List[Tuple],
+        apps: django.apps.Apps,
+    ) -> None:
+        super().post_migrate(app_config, verbosity, interactive, using, plan, apps)
+
+        # Ensure presence of a OTP YubiKey default config
+        apps.get_model('otp_yubikey', 'ValidationService').objects.using(using).update_or_create(
+            name='default', defaults={'use_ssl': True, 'param_sl': '', 'param_timeout': ''}
+        )
diff --git a/aleksis/core/migrations/0001_initial.py b/aleksis/core/migrations/0001_initial.py
index 2d330f950..15eb9d297 100644
--- a/aleksis/core/migrations/0001_initial.py
+++ b/aleksis/core/migrations/0001_initial.py
@@ -14,6 +14,7 @@ class Migration(migrations.Migration):
 
     dependencies = [
         migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('otp_yubikey', '0001_initial'),
     ]
 
     operations = [
diff --git a/aleksis/core/migrations/0006_create_default_term.py b/aleksis/core/migrations/0006_create_default_term.py
deleted file mode 100644
index 724da0cd4..000000000
--- a/aleksis/core/migrations/0006_create_default_term.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from django.db import migrations, models
-
-from datetime import date
-
-def create_or_mark_current_term(apps, schema_editor):
-    db_alias = schema_editor.connection.alias
-
-    SchoolTerm = apps.get_model('core', 'SchoolTerm')  # noqa
-
-    if not SchoolTerm.objects.filter(current=True).exists():
-        if SchoolTerm.objects.using(db_alias).exists():
-            term = SchoolTerm.objects.using(db_alias).latest('date_start')
-            term.current=True
-            term.save()
-        else:
-            SchoolTerm.objects.using(db_alias).create(date_start=date.today(), current=True)
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0005_add_verbose_names_meta'),
-    ]
-
-    operations = [
-        migrations.RunPython(create_or_mark_current_term)
-    ]
diff --git a/aleksis/core/migrations/0007_create_admin_user.py b/aleksis/core/migrations/0007_create_admin_user.py
deleted file mode 100644
index 384e7cc10..000000000
--- a/aleksis/core/migrations/0007_create_admin_user.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from django.contrib.auth import get_user_model
-from django.db import migrations
-
-
-def create_superuser(apps, schema_editor):
-    User = get_user_model()
-
-    if not User.objects.filter(is_superuser=True).exists():
-        User.objects.create_superuser(
-            username='admin',
-            email='root@example.com',
-            password='admin'
-        ).save()
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0006_create_default_term'),
-    ]
-
-    operations = [
-        migrations.RunPython(create_superuser)
-    ]
-
diff --git a/aleksis/core/migrations/0008_rename_fields_notification_activity.py b/aleksis/core/migrations/0008_rename_fields_notification_activity.py
index 4197d0fed..a84117c70 100644
--- a/aleksis/core/migrations/0008_rename_fields_notification_activity.py
+++ b/aleksis/core/migrations/0008_rename_fields_notification_activity.py
@@ -7,7 +7,7 @@ from django.db import migrations, models
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('core', '0007_create_admin_user'),
+        ('core', '0005_add_verbose_names_meta.py'),
     ]
 
     operations = [
diff --git a/aleksis/core/migrations/0010_create_validation_service.py b/aleksis/core/migrations/0010_create_validation_service.py
deleted file mode 100644
index e314a80a0..000000000
--- a/aleksis/core/migrations/0010_create_validation_service.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from django.db import migrations
-
-
-def create_validation_service(apps, schema_editor):
-    apps.get_model('otp_yubikey', 'ValidationService').objects.update_or_create(
-        name='default', defaults={'use_ssl': True, 'param_sl': '', 'param_timeout': ''}
-    )
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0009_dashboard_widget'),
-        ('otp_yubikey', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.RunPython(create_validation_service)
-    ]
-
diff --git a/aleksis/core/migrations/0011_make_primary_group_optional.py b/aleksis/core/migrations/0011_make_primary_group_optional.py
index 1a4d47137..e081ad5f0 100644
--- a/aleksis/core/migrations/0011_make_primary_group_optional.py
+++ b/aleksis/core/migrations/0011_make_primary_group_optional.py
@@ -7,7 +7,7 @@ import django.db.models.deletion
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('core', '0010_create_validation_service'),
+        ('core', '0009_dashboard_widget.py'),
     ]
 
     operations = [
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index fc5a86f95..c97d95f46 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -1,3 +1,4 @@
+from datetime import date
 from typing import Optional
 
 from django.contrib.auth import get_user_model
@@ -62,6 +63,16 @@ class SchoolTerm(ExtensibleModel):
             self.current = None
         super().save(*args, **kwargs)
 
+    @classmethod
+    def maintain_default_data(cls):
+        if not cls.objects.filter(current=True).exists():
+            if cls.objects.exists():
+                term = cls.objects.latest('date_start')
+                term.current=True
+                term.save()
+            else:
+                cls.objects.create(date_start=date.today(), current=True)
+
     class Meta:
         verbose_name = _("School term")
         verbose_name_plural = _("School terms")
@@ -171,6 +182,22 @@ class Person(ExtensibleModel):
     def __str__(self) -> str:
         return self.full_name
 
+    @classmethod
+    def maintain_default_data(cls):
+        # First, ensure we have an admin user
+        User = get_user_model()
+        if not User.objects.filter(is_superuser=True).exists():
+            admin = User.objects.create_superuser(
+                username='admin',
+                email='root@example.com',
+                password='admin'
+            )
+            admin.save()
+
+            # Ensure this admin user has a person linked to it
+            person = Person(user=admin)
+            person.save()
+
 
 class Group(ExtensibleModel):
     """Any kind of group of persons in a school, including, but not limited
-- 
GitLab