models.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. if self.pickled_permissions:
  27. self.permissions_cache = serializer.loads(
  28. self.pickled_permissions)
  29. else:
  30. self.permissions_cache = {}
  31. return self.permissions_cache
  32. @permissions.setter
  33. def permissions(self, permissions):
  34. self.permissions_cache = permissions
  35. self.pickled_permissions = serializer.dumps(permissions)
  36. class Role(BaseRole):
  37. pass
  38. """
  39. Signal handlers
  40. """
  41. @receiver(secret_key_changed)
  42. def update_roles_pickles(sender, **kwargs):
  43. for role in Role.objects.iterator():
  44. if role.pickled_permissions:
  45. role.pickled_permissions = serializer.regenerate_checksum(
  46. role.pickled_permissions)
  47. role.save(update_fields=['pickled_permissions'])