models.py 1.8 KB

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