Source code for django_marina.db.models

from django.core.exceptions import PermissionDenied
from django.utils.translation import gettext_lazy


[docs] class ProtectedModelMixin: """ Add checks to update and delete methods of an instance. The use case is to protect against changes when update or delete is allowed for a user (superuser, admin or otherwise), but should not be executed because of objects that depend on this instance. In such a case, the foreign key relation to the model might benefit from `on_delete=models.PROTECT`. """ # Default message shown to user when object has update protection. update_protection_message = gettext_lazy("This object has update protection.") # Default message shown to user when object has delete protection. delete_protection_message = gettext_lazy("This object has delete protection.") @property def has_update_protection(self): """Return whether this object has update protection.""" return False def get_update_protection_message(self): """Return message shown to user when object has update protection.""" return self.update_protection_message def save(self, *args, **kwargs): """Save the instance, unless it has a primary key and update protection.""" if self.pk and self.has_update_protection: raise PermissionDenied(self.get_update_protection_message()) return super().save(*args, **kwargs) @property def has_delete_protection(self): """Return whether this object has delete protection.""" return False def get_delete_protection_message(self): """Return message shown to user when object has delete protection.""" return self.delete_protection_message def delete(self, *args, **kwargs): """Delete the instance, unlessit has delete protection.""" if self.has_delete_protection: raise PermissionDenied(self.get_delete_protection_message()) return super().delete(*args, **kwargs)