diff --git a/kaehmy/forms.py b/kaehmy/forms.py index c82b549..9784c12 100644 --- a/kaehmy/forms.py +++ b/kaehmy/forms.py @@ -2,7 +2,7 @@ from django import forms from django.utils.translation import ugettext_lazy as _ from django.core.exceptions import ValidationError -from kaehmy.models import PresetRole, CustomRole, Application, Comment, KaehmyBaseRole +from kaehmy.models import PresetRole, CustomRole, Application, Comment, BaseRole class CheckboxSelectMultiple(forms.widgets.CheckboxSelectMultiple): @@ -57,7 +57,7 @@ class ApplicationForm(forms.ModelForm): self.fields["custom_roles"].label = _("Custom roles") self.fields["custom_roles"].queryset = CustomRole.objects.all() - for cat_id, category in KaehmyBaseRole.CATEGORIES: + for cat_id, category in BaseRole.CATEGORIES: key = "preset_roles_{}".format(cat_id) qset = PresetRole.objects.filter(category=cat_id).order_by( "category", "-is_board" diff --git a/kaehmy/migrations/0008_baserole.py b/kaehmy/migrations/0008_baserole.py new file mode 100644 index 0000000..13fd777 --- /dev/null +++ b/kaehmy/migrations/0008_baserole.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.14 on 2022-08-03 20:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("kaehmy", "0007_alter_commentparent_id"), + ] + + operations = [ + migrations.CreateModel( + name="BaseRole", + fields=[ + ("id", models.AutoField(primary_key=True, serialize=False)), + ("name", models.CharField(max_length=255, verbose_name="Name")), + ("is_board", models.BooleanField(verbose_name="Board member")), + ( + "category", + models.CharField( + choices=[ + ("corporate", "Corporate affairs"), + ("freshman", "Freshmen"), + ("international", "International"), + ("external", "External affairs"), + ("media", "Media"), + ("tech", "Technology"), + ("wellbeing", "Wellbeing"), + ("elepaja", "Elepaja"), + ("ceremonies", "Ceremonies"), + ("studies", "Studies"), + ("sosso", "Sössö magazine"), + ("alumni", "Alumni relations"), + ("others", "Others"), + ], + default="others", + max_length=255, + verbose_name="Category", + ), + ), + ], + ), + ] diff --git a/kaehmy/migrations/0009_auto_20220726_2015.py b/kaehmy/migrations/0009_auto_20220726_2015.py new file mode 100644 index 0000000..d34942a --- /dev/null +++ b/kaehmy/migrations/0009_auto_20220726_2015.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2.28 on 2022-07-26 17:15 + +from unicodedata import category +from django.db import migrations + + +def copyBaseRolesToNewTable(apps, schema_editor): + Old = apps.get_model("kaehmy", "KaehmyBaseRole") + New = apps.get_model("kaehmy", "BaseRole") + for bases in Old.objects.all(): + New.objects.create( + id=bases.id, + name=bases.name, + is_board=bases.is_board, + category=bases.category, + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ("kaehmy", "0008_baserole"), + ] + + operations = [ + migrations.RunPython( + copyBaseRolesToNewTable, reverse_code=migrations.RunPython.noop + ), + ] diff --git a/kaehmy/migrations/0010_auto_20220726_2033.py b/kaehmy/migrations/0010_auto_20220726_2033.py new file mode 100644 index 0000000..f881a0e --- /dev/null +++ b/kaehmy/migrations/0010_auto_20220726_2033.py @@ -0,0 +1,51 @@ +# Generated by Django 2.2.28 on 2022-07-26 17:33 + +from django.db import migrations, models +import django.db.models.deletion +from sikweb.custom_operations import AlterModelBases + + +class Migration(migrations.Migration): + + dependencies = [ + ("kaehmy", "0009_auto_20220726_2015"), + ] + + operations = [ + AlterModelBases("customrole", (models.Model,)), + AlterModelBases("presetrole", (models.Model,)), + migrations.AlterField( + model_name="customrole", + name="kaehmybaserole_ptr", + field=models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="BaseRole", + ), + ), + migrations.AlterField( + model_name="presetrole", + name="kaehmybaserole_ptr", + field=models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="BaseRole", + ), + ), + migrations.RenameField( + model_name="customrole", + old_name="kaehmybaserole_ptr", + new_name="baserole_ptr", + ), + migrations.RenameField( + model_name="presetrole", + old_name="kaehmybaserole_ptr", + new_name="baserole_ptr", + ), + ] diff --git a/kaehmy/migrations/0011_delete_kaehmybaserole.py b/kaehmy/migrations/0011_delete_kaehmybaserole.py new file mode 100644 index 0000000..26e8731 --- /dev/null +++ b/kaehmy/migrations/0011_delete_kaehmybaserole.py @@ -0,0 +1,16 @@ +# Generated by Django 3.2.14 on 2022-08-03 20:19 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("kaehmy", "0010_auto_20220726_2033"), + ] + + operations = [ + migrations.DeleteModel( + name="KaehmyBaseRole", + ), + ] diff --git a/kaehmy/models.py b/kaehmy/models.py index a3a033a..eb605da 100644 --- a/kaehmy/models.py +++ b/kaehmy/models.py @@ -1,20 +1,16 @@ from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ -from webapp.models import BaseRole - - -# TODO: Move BaseRole to Kaehmt App; will fuck up the DB since table is removed, if no data migration is done before-hand. -# Either reconstruct all kaehmy roles from scratch then, or do these migrations: -# 1. Create table here -# 2. Data migrate from webapp BaseRole to new kaehmy BaseRole -# 3. Delete webapp BaseRole table VERBOSE_NAME = _("Kaehmy") -class KaehmyBaseRole(BaseRole): - """ABC""" +class BaseRole(models.Model): + """Base model for occupations/roles.""" + + id = models.AutoField(primary_key=True) + name = models.CharField(_("Name"), max_length=255) + is_board = models.BooleanField(_("Board member")) CATEGORIES = ( ("corporate", _("Corporate affairs")), @@ -35,8 +31,12 @@ class KaehmyBaseRole(BaseRole): _("Category"), choices=CATEGORIES, default="others", max_length=255 ) + def __str__(self): + n = self.name.capitalize() + return "{} ({})".format(n, _("board member")) if self.is_board else n -class PresetRole(KaehmyBaseRole): + +class PresetRole(BaseRole): """Model for kaehmy role.""" description = models.TextField(_("Description")) @@ -46,7 +46,7 @@ class PresetRole(KaehmyBaseRole): verbose_name_plural = _("Preset kaehmy roles") -class CustomRole(KaehmyBaseRole): +class CustomRole(BaseRole): """Model representing a user-specified custom occupation.""" class Meta: diff --git a/sikweb/custom_operations.py b/sikweb/custom_operations.py new file mode 100644 index 0000000..2a32ca5 --- /dev/null +++ b/sikweb/custom_operations.py @@ -0,0 +1,30 @@ +# contents of yourapp/migrations/custom_operations.py + +from django.db.migrations.operations.models import ModelOperation + + +class AlterModelBases(ModelOperation): + reduce_to_sql = False + reversible = True + + def __init__(self, name, bases): + self.bases = bases + super().__init__(name) + + def state_forwards(self, app_label, state): + """ + Overwrite a models base classes with a custom list of + bases instead, then force Django to reload the model + with this (probably completely) different class hierarchy. + """ + state.models[app_label, self.name_lower].bases = self.bases + state.reload_model(app_label, self.name_lower) + + def database_forwards(self, app_label, schema_editor, from_state, to_state): + pass + + def database_backwards(self, app_label, schema_editor, from_state, to_state): + pass + + def describe(self): + return "Update %s bases to %s" % (self.name, self.bases) diff --git a/webapp/migrations/0082_delete_baserole.py b/webapp/migrations/0082_delete_baserole.py new file mode 100644 index 0000000..2fce8dc --- /dev/null +++ b/webapp/migrations/0082_delete_baserole.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.14 on 2022-08-03 20:19 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("kaehmy", "0011_delete_kaehmybaserole"), + ("webapp", "0081_auto_20220801_2217"), + ] + + operations = [ + migrations.DeleteModel( + name="BaseRole", + ), + ] diff --git a/webapp/models.py b/webapp/models.py index 4a01b07..959171d 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -222,18 +222,6 @@ def email_on_signup(sender, instance, created, **kwargs): ) -class BaseRole(models.Model): - """Base model for occupations/roles.""" - - id = models.AutoField(primary_key=True) - name = models.CharField(_("Name"), max_length=255) - is_board = models.BooleanField(_("Board member")) - - def __str__(self): - n = self.name.capitalize() - return "{} ({})".format(n, _("board member")) if self.is_board else n - - class JobAd(models.Model): """Job advertisements shown on Corporate relations page"""