models.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from django.db import models
  2. from django.dispatch import receiver
  3. from misago.core import serializer
  4. from misago.acl import version as acl_version
  5. from misago.core.signals import secret_key_changed
  6. class BaseRole(models.Model):
  7. name = models.CharField(max_length=255)
  8. special_role = models.CharField(max_length=255, null=True, blank=True)
  9. pickled_permissions = models.TextField(null=True, blank=True)
  10. class Meta:
  11. abstract = True
  12. def __unicode__(self):
  13. return self.name
  14. def save(self, *args, **kwargs):
  15. if self.pk:
  16. acl_version.invalidate()
  17. return super(BaseRole, self).save(*args, **kwargs)
  18. def delete(self, *args, **kwargs):
  19. acl_version.invalidate()
  20. return super(BaseRole, self).delete(*args, **kwargs)
  21. @property
  22. def permissions(self):
  23. try:
  24. return self.permissions_cache
  25. except AttributeError:
  26. self.permissions_cache = serializer.loads(
  27. self.pickled_permissions)
  28. return self.permissions_cache
  29. @permissions.setter
  30. def permissions(self, permissions):
  31. self.permissions_cache = permissions
  32. self.pickled_permissions = serializer.dumps(permissions)
  33. class Role(BaseRole):
  34. pass
  35. """
  36. Signal handlers
  37. """
  38. @receiver(secret_key_changed)
  39. def update_roles_pickles(sender, **kwargs):
  40. for role in Role.objects.iterator():
  41. if role.pickled_permissions:
  42. role.pickled_permissions = serializer.regenerate_checksum(
  43. role.pickled_permissions)
  44. role.save(update_fields=['pickled_permissions'])