From 35c981a2f2a524d39b1a6dd023871d3323ed4e81 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 3 Mar 2020 15:58:13 +0100 Subject: [PATCH] Add through model to user school class connection, migrate all old classes --- .../migrations/0012_auto_20200303_1258.py | 29 +++++++++++++++++++ .../migrations/0013_auto_20200303_1259.py | 24 +++++++++++++++ .../0014_remove_schoolclass_users.py | 17 +++++++++++ .../migrations/0015_auto_20200303_1306.py | 23 +++++++++++++++ server/users/models.py | 9 +++++- 5 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 server/users/migrations/0012_auto_20200303_1258.py create mode 100644 server/users/migrations/0013_auto_20200303_1259.py create mode 100644 server/users/migrations/0014_remove_schoolclass_users.py create mode 100644 server/users/migrations/0015_auto_20200303_1306.py diff --git a/server/users/migrations/0012_auto_20200303_1258.py b/server/users/migrations/0012_auto_20200303_1258.py new file mode 100644 index 00000000..3fd7f2ed --- /dev/null +++ b/server/users/migrations/0012_auto_20200303_1258.py @@ -0,0 +1,29 @@ +# Generated by Django 2.1.15 on 2020-03-03 12:58 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0011_auto_20200302_1613'), + ] + + operations = [ + migrations.CreateModel( + name='UserSchoolClassConnection', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('active', models.BooleanField(default=True)), + ('school_class', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.SchoolClass')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.AddField( + model_name='schoolclass', + name='users_with_active', + field=models.ManyToManyField(blank=True, related_name='school_classes_with_active', through='users.UserSchoolClassConnection', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/server/users/migrations/0013_auto_20200303_1259.py b/server/users/migrations/0013_auto_20200303_1259.py new file mode 100644 index 00000000..6b82bc12 --- /dev/null +++ b/server/users/migrations/0013_auto_20200303_1259.py @@ -0,0 +1,24 @@ +# Generated by Django 2.1.15 on 2020-03-03 12:59 + +from django.db import migrations + +from users.models import UserSchoolClassConnection + + +def forwards(apps, schema_editor): + SchoolClass = apps.get_model('users', 'SchoolClass') + UserSchoolClassConnection = apps.get_model('users', 'UserSchoolClassConnection') + + for school_class in SchoolClass.objects.all(): + for user in school_class.users.all(): + UserSchoolClassConnection.objects.create(user=user, school_class=school_class, active=True) + + +class Migration(migrations.Migration): + dependencies = [ + ('users', '0012_auto_20200303_1258'), + ] + + operations = [ + migrations.RunPython(forwards) + ] diff --git a/server/users/migrations/0014_remove_schoolclass_users.py b/server/users/migrations/0014_remove_schoolclass_users.py new file mode 100644 index 00000000..5293ac15 --- /dev/null +++ b/server/users/migrations/0014_remove_schoolclass_users.py @@ -0,0 +1,17 @@ +# Generated by Django 2.1.15 on 2020-03-03 13:06 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0013_auto_20200303_1259'), + ] + + operations = [ + migrations.RemoveField( + model_name='schoolclass', + name='users', + ), + ] diff --git a/server/users/migrations/0015_auto_20200303_1306.py b/server/users/migrations/0015_auto_20200303_1306.py new file mode 100644 index 00000000..ebe19bf2 --- /dev/null +++ b/server/users/migrations/0015_auto_20200303_1306.py @@ -0,0 +1,23 @@ +# Generated by Django 2.1.15 on 2020-03-03 13:06 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0014_remove_schoolclass_users'), + ] + + operations = [ + migrations.RemoveField( + model_name='schoolclass', + name='users_with_active', + ), + migrations.AddField( + model_name='schoolclass', + name='users', + field=models.ManyToManyField(blank=True, related_name='school_classes', through='users.UserSchoolClassConnection', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/server/users/models.py b/server/users/models.py index 6477a46a..30932ea1 100644 --- a/server/users/models.py +++ b/server/users/models.py @@ -11,6 +11,7 @@ from users.managers import RoleManager, UserRoleManager, UserManager DEFAULT_SCHOOL_ID = 1 + class User(AbstractUser): last_module = models.ForeignKey('books.Module', related_name='+', on_delete=models.SET_NULL, null=True) avatar_url = models.CharField(max_length=254, blank=True, default='') @@ -69,7 +70,7 @@ class User(AbstractUser): class SchoolClass(models.Model): name = models.CharField(max_length=100, blank=False, null=False, unique=True) is_deleted = models.BooleanField(blank=False, null=False, default=False) - users = models.ManyToManyField(get_user_model(), related_name='school_classes', blank=True) + users = models.ManyToManyField(get_user_model(), related_name='school_classes', blank=True, through='users.UserSchoolClassConnection') code = models.CharField('Code zum Beitreten', blank=True, null=True, max_length=10, unique=True, default=None) class Meta: @@ -175,3 +176,9 @@ class UserRole(models.Model): class UserSetting(models.Model): user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE, related_name='user_setting') selected_class = models.ForeignKey(SchoolClass, blank=True, null=True, on_delete=models.CASCADE) + + +class UserSchoolClassConnection(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + school_class = models.ForeignKey(SchoolClass, on_delete=models.CASCADE) + active = models.BooleanField(default=True)