serializers.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from rest_framework import serializers
  2. from .models import ProjectAlert, AlertRecipient
  3. class AlertRecipientSerializer(serializers.ModelSerializer):
  4. recipientType = serializers.CharField(source="recipient_type")
  5. class Meta:
  6. model = AlertRecipient
  7. fields = ("pk", "recipientType", "url")
  8. class ProjectAlertSerializer(serializers.ModelSerializer):
  9. alertRecipients = AlertRecipientSerializer(
  10. source="alertrecipient_set", many=True, required=False
  11. )
  12. class Meta:
  13. model = ProjectAlert
  14. fields = ("pk", "timespan_minutes", "quantity", "alertRecipients")
  15. def create(self, validated_data):
  16. alert_recipients = validated_data.pop("alertrecipient_set", [])
  17. instance = super().create(validated_data)
  18. for recipient in alert_recipients:
  19. instance.alertrecipient_set.create(**recipient)
  20. return instance
  21. def update(self, instance, validated_data):
  22. alert_recipients = validated_data.pop("alertrecipient_set", [])
  23. instance = super().update(instance, validated_data)
  24. # Create/Delete recipients as needed
  25. delete_recipient_ids = set(
  26. instance.alertrecipient_set.values_list("id", flat=True)
  27. )
  28. for recipient in alert_recipients:
  29. new_recipient, created = AlertRecipient.objects.get_or_create(
  30. alert=instance, **recipient
  31. )
  32. if not created:
  33. delete_recipient_ids.discard(new_recipient.pk)
  34. if delete_recipient_ids:
  35. instance.alertrecipient_set.filter(pk__in=delete_recipient_ids).delete()
  36. return instance