From 1cd1199e2859906301301dd1d02dbe15e19e1ca0 Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Tue, 15 Oct 2024 20:15:54 +0100 Subject: [PATCH] message style safely deletes without setting null will set the related subscription to use the default instead --- apps/api/serializers.py | 5 +++++ .../0015_alter_subscription_message_style.py | 19 +++++++++++++++++++ apps/home/models.py | 10 ++++++++-- 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 apps/home/migrations/0015_alter_subscription_message_style.py diff --git a/apps/api/serializers.py b/apps/api/serializers.py index 6d6706c..bf8ecc4 100644 --- a/apps/api/serializers.py +++ b/apps/api/serializers.py @@ -243,6 +243,11 @@ class SubscriptionSerializer(DynamicModelSerializer): ) channels_detail = serializers.SerializerMethodField() filters_detail = serializers.SerializerMethodField() + message_style = serializers.PrimaryKeyRelatedField( + queryset=MessageStyle.objects.all(), + required=True, + allow_null=False + ) message_style_detail = serializers.SerializerMethodField() unique_rules_detail = serializers.SerializerMethodField() diff --git a/apps/home/migrations/0015_alter_subscription_message_style.py b/apps/home/migrations/0015_alter_subscription_message_style.py new file mode 100644 index 0000000..f0f880a --- /dev/null +++ b/apps/home/migrations/0015_alter_subscription_message_style.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0.4 on 2024-10-15 18:30 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0014_alter_discordchannel_id_alter_server_id'), + ] + + operations = [ + migrations.AlterField( + model_name='subscription', + name='message_style', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='home.messagestyle'), + ), + ] diff --git a/apps/home/models.py b/apps/home/models.py index 6354499..8e7729b 100644 --- a/apps/home/models.py +++ b/apps/home/models.py @@ -150,7 +150,13 @@ class MessageStyle(models.Model): if self.auto_created: raise ValidationError("Cannot delete 'MessageStyle' instance with 'auto_created=True'") - super().delete() + # If this style is being used, reset the users to the default style + default_message_style = MessageStyle.objects.get(server=self.server, auto_created=True) + Subscription.objects \ + .filter(server=self.server, message_style=self) \ + .update(message_style=default_message_style) + + super().delete(*args, **kwargs) def __str__(self): return self.name @@ -240,7 +246,7 @@ class Subscription(models.Model): publish_threshold = models.DateTimeField(default=timezone.now) channels = models.ManyToManyField(to=DiscordChannel, related_name="subscriptions", blank=False) filters = models.ManyToManyField(to=ContentFilter, blank=True) - message_style = models.ForeignKey(to=MessageStyle, on_delete=models.SET_NULL, null=True, blank=True) + message_style = models.ForeignKey(to=MessageStyle, on_delete=models.SET_NULL, null=True, blank=False) unique_rules = models.ManyToManyField(to=UniqueContentRule, blank=False) class Meta: