from django.db.models.signals import pre_delete, pre_save from django.dispatch import receiver from django.utils.translation import gettext_lazy as _ from .models import Service, ServiceTemplate class TemplateLockedError(Exception): """Raised when attempting to modify a locked template.""" def __init__(self, obj, message=None): self.obj = obj self.message = message or _( "Cannot modify {}: it is locked because one or more services " "have been spawned from it." ).format(obj) super().__init__(self.message) @receiver(pre_save, sender=ServiceTemplate) def lock_service_template_save(sender, instance, **kwargs): if not instance.pk: return if instance.services.exists(): try: old = ServiceTemplate.objects.get(pk=instance.pk) except ServiceTemplate.DoesNotExist: return for field in ("name", "tree"): if getattr(instance, field) != getattr(old, field): raise TemplateLockedError(instance) @receiver(pre_delete, sender=ServiceTemplate) def lock_service_template_delete(sender, instance, **kwargs): if instance.services.exists(): raise TemplateLockedError(instance)