From 7233f287a2a10547377379c905fab1bff06e772c Mon Sep 17 00:00:00 2001 From: Jason Cameron Date: Wed, 3 Jan 2024 00:54:27 -0500 Subject: [PATCH] updated migrations --- core/admin.py | 8 ++ core/api/views/staff.py | 2 - ...er_user_options_user_staff_bio_and_more.py | 51 --------- ...staffmember_alter_user_options_and_more.py | 101 ++++++++++++++++++ core/models/user.py | 29 ++++- core/utils/multiselectfield.py | 5 - 6 files changed, 134 insertions(+), 62 deletions(-) delete mode 100644 core/migrations/0069_alter_user_options_user_staff_bio_and_more.py create mode 100644 core/migrations/0069_staffmember_alter_user_options_and_more.py diff --git a/core/admin.py b/core/admin.py index ae1a5dac..60788f80 100644 --- a/core/admin.py +++ b/core/admin.py @@ -45,6 +45,12 @@ class CourseInline(admin.TabularInline): extra = 0 +class StaffMemberInline(admin.StackedInline): + model = models.StaffMember + can_delete = False + verbose_name_plural = "Staff Member Info" + + class TermAdmin(admin.ModelAdmin): inlines = [ CourseInline, @@ -597,6 +603,7 @@ def save_model(self, request, obj, form, change): class UserAdmin(admin.ModelAdmin): + inlines = (StaffMemberInline,) list_display = ["username", "is_superuser", "is_staff", "is_teacher"] list_filter = [ "is_superuser", @@ -698,6 +705,7 @@ def content_object(self, obj): admin.site.register(models.Tag, TagAdmin) admin.site.register(models.Event, EventAdmin) admin.site.register(models.Raffle, RaffleAdmin) +admin.site.register(models.StaffMember) admin.site.unregister(FlatPage) admin.site.register(FlatPage, CustomFlatPageAdmin) diff --git a/core/api/views/staff.py b/core/api/views/staff.py index 5dcc76b9..e2b424c4 100644 --- a/core/api/views/staff.py +++ b/core/api/views/staff.py @@ -17,8 +17,6 @@ def staff(request): """ Returns a list of all staff. - - https://noi.nyiyui.ca/k/1063/5041#Get Staff """ return Response( [ diff --git a/core/migrations/0069_alter_user_options_user_staff_bio_and_more.py b/core/migrations/0069_alter_user_options_user_staff_bio_and_more.py deleted file mode 100644 index bb1cc0a3..00000000 --- a/core/migrations/0069_alter_user_options_user_staff_bio_and_more.py +++ /dev/null @@ -1,51 +0,0 @@ -# Generated by Django 4.1.13 on 2024-01-02 18:44 -from django.conf import settings -from django.db import migrations, models -import django.db.models.functions.text - - -def populate_bios(apps, schema_editor): - global row - User = apps.get_model("core", "User") - for pk, bio in settings.METROPOLIS_STAFF_BIO.items(): - try: - row = User.objects.get(pk=pk) - except User.DoesNotExist: - print(f"User {pk} does not exist") - row.staff_bio = bio - row.save(update_fields=["staff_bio"]) - -def undo_populate_bios(apps, schema_editor): - raise NotImplementedError("Please only revert this once you have backed up all bios. This is irreversible.") - # replace the above line with pass if you want to revert this migration - -class Migration(migrations.Migration): - dependencies = [ - ( - "core", - "0058_fix_blogpost_featured_image_description_squashed_0068_remove_user_expo_notif_token_delete_recurrencerule", - ), - ] - - operations = [ - migrations.AlterModelOptions( - name="user", - options={}, - ), - migrations.AddField( - model_name="user", - name="staff_bio", - field=models.TextField( - blank=True, help_text="Staff bio for Metropolis staff", null=True - ), - ), - migrations.RunPython(populate_bios, reverse_code=undo_populate_bios), - - migrations.AddConstraint( - model_name="user", - constraint=models.UniqueConstraint( - django.db.models.functions.text.Lower("username"), - name="username-lower-check", - ), - ), - ] diff --git a/core/migrations/0069_staffmember_alter_user_options_and_more.py b/core/migrations/0069_staffmember_alter_user_options_and_more.py new file mode 100644 index 00000000..26850bee --- /dev/null +++ b/core/migrations/0069_staffmember_alter_user_options_and_more.py @@ -0,0 +1,101 @@ +# Generated by Django 5.0 on 2024-01-03 05:44 + +import core.utils.multiselectfield +import django.db.models.deletion +import django.db.models.functions.text +from django.conf import settings +from django.db import migrations, models, IntegrityError + + +def populate_bios(apps, schema_editor): + StaffMember = apps.get_model("core", "StaffMember") + User = apps.get_model("core", "User") + + for position, user_ids in settings.METROPOLIS_STAFFS.items(): + for user_id in user_ids: + try: + user = User.objects.get(pk=user_id) + bio = settings.METROPOLIS_STAFF_BIO.get(user_id, "") + staff_member, created = StaffMember.objects.get_or_create(user=user, bio=bio) + staff_member.position += [position] + staff_member.save() + except User.DoesNotExist: + print(f"User {user_id} does not exist") + except IntegrityError: + print(f"StaffMember for user {user_id} already exists") + +def reversed_pop(apps, schema_editor): + raise RuntimeError("Cannot reverse this migration.") + # just uncomment the above line if you want to reverse this migration, but you will lose all staff bios + +class Migration(migrations.Migration): + dependencies = [ + ("auth", "0012_alter_user_first_name_max_length"), + ( + "core", + "0058_fix_blogpost_featured_image_description_squashed_0068_remove_user_expo_notif_token_delete_recurrencerule", + ), + ] + + operations = [ + migrations.CreateModel( + name="StaffMember", + fields=[ + ( + "user", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + primary_key=True, + related_name="staff", + serialize=False, + to=settings.AUTH_USER_MODEL, + ), + ), + ("bio", models.TextField()), + ( + "position", + core.utils.multiselectfield.MultiSelectField( + max_length=200, + verbose_name=( + ("PM", "Project Manager"), + ("frontend", "Frontend Developer"), + ("backend", "Backend Developer"), + ("app", "App Developer"), + ("graphics", "Graphic Designer"), + ("content", "Content Creator"), + ("doodle", "Doodle Developer"), + ), + ), + ), + ( + "years", + core.utils.multiselectfield.MultiSelectField( + max_length=200, + verbose_name=[ + "2021-22", + "2022-23", + "2023-24", + "2024-25", + "2025-26", + ], + ), + ), + ], + options={ + "verbose_name": "Staff Member", + "verbose_name_plural": "Staff Members", + }, + ), + migrations.AlterModelOptions( + name="user", + options={}, + ), + migrations.AddConstraint( + model_name="user", + constraint=models.UniqueConstraint( + django.db.models.functions.text.Lower("username"), + name="username-lower-check", + ), + ), + migrations.RunPython(populate_bios, reverse_code=reversed_pop), + ] diff --git a/core/models/user.py b/core/models/user.py index 2b148375..82946d07 100644 --- a/core/models/user.py +++ b/core/models/user.py @@ -45,10 +45,6 @@ class User(AbstractUser): help_text="JSON object with keys as tokens and values as null.", # the length is not specified :( https://github.com/expo/expo/issues/1135#issuecomment-399622890 ) - staff_bio = models.TextField( - blank=True, null=True, help_text="Staff bio for Metropolis staff" - ) - # staff_position = MultiSelectField(settings.METROPOLIS_POSITIONS) @property def qltrs2(self): @@ -105,3 +101,28 @@ class Meta: constraints = [ models.UniqueConstraint(Lower("username"), name="username-lower-check") ] + + +class StaffMember(models.Model): + user = models.OneToOneField( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + primary_key=True, + related_name="staff", + ) + bio = models.TextField(blank=False, null=False) + + position = MultiSelectField(settings.METROPOLIS_POSITIONS) + + year_ranges = [ + f"{year}-{str(year + 1)[-2:]}" for year in range(2021, timezone.now().year + 2) # you need to make a migration every 2nd year + ] + + years = MultiSelectField(year_ranges) + + def __str__(self): + return f"{self.user.get_full_name()} ({self.user})" + + class Meta: + verbose_name = "Staff Member" + verbose_name_plural = "Staff Members" diff --git a/core/utils/multiselectfield.py b/core/utils/multiselectfield.py index 9fbfc5d4..b7a79691 100644 --- a/core/utils/multiselectfield.py +++ b/core/utils/multiselectfield.py @@ -137,11 +137,6 @@ def __init__(self, *args, **kwargs): self.min_choices = kwargs.pop("min_choices", None) self.max_choices = kwargs.pop("max_choices", None) super(MultiSelectField, self).__init__(*args, **kwargs) - self.validators = [ - v - for v in self.validators - if not isinstance(v, validators.MaxLengthValidator) - ] # remove existing MaxLengthValidator self.max_length = get_max_length(self.choices, self.max_length) if len(self.validators) == 0: self.validators.append(MaxValueMultiFieldValidator(self.max_length))