From 199daf913efdc503898ee6521bb00656699ecc9a Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Wed, 2 Oct 2024 19:40:53 +0100 Subject: [PATCH] handle discord channels in serializers --- apps/api/serializers.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/apps/api/serializers.py b/apps/api/serializers.py index 9f682f1..2d288d3 100644 --- a/apps/api/serializers.py +++ b/apps/api/serializers.py @@ -10,6 +10,7 @@ from apps.home.models import ( ContentFilter, MessageMutator, MessageStyle, + DiscordChannel, Subscription, Content, UniqueContentRule @@ -170,11 +171,18 @@ class UniqueContentRuleSerializer(DynamicModelSerializer): fields = ("id", "name", "value") +class DiscordChannelSerializer(DynamicModelSerializer): + class Meta: + model = DiscordChannel + fields = ("id", "channel_id") + + class SubscriptionSerializer(DynamicModelSerializer): filters = serializers.PrimaryKeyRelatedField( queryset=ContentFilter.objects.all(), many=True ) + channels = DiscordChannelSerializer(many=True) # unique_rules = UniqueContentRuleSerializer(many=True) # TODO: solve? causes issues with submission. class Meta: @@ -189,11 +197,28 @@ class SubscriptionSerializer(DynamicModelSerializer): "extra_notes", "active", "publish_threshold", + "channels", "filters", "message_style", "unique_rules" ) + def _delete_unused_channels(self): + referenced_channel_ids = set(Subscription.objects.values_list("channels__channel_id", flat=True)) + del_count, _ = DiscordChannel.objects.exclude(channel_id__in=referenced_channel_ids).delete() + log.info("Deleted %s unreferenced DiscordChannel object(s).", del_count) + + def update(self, instance, validated_data): + channels = validated_data.pop("channels") + + instance.channels.clear() + for channel_id in channels: + channel, created = DiscordChannel.objects.get_or_create(channel_id=channel_id) + instance.channels.add(channel) + + self._delete_unused_channels() + return super().update(instance, validated_data) + def validate(self, data): server = data.get("server") or self.context.get("server") if not server: