models.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import base64
  2. try:
  3. import cPickle as pickle
  4. except ImportError:
  5. import pickle
  6. from django.db import models
  7. from misago.acl import version as acl_version
  8. class BaseRole(models.Model):
  9. name = models.CharField(max_length=255)
  10. special_role = models.CharField(max_length=255, null=True, blank=True)
  11. pickled_permissions = models.TextField(null=True, blank=True)
  12. class Meta:
  13. abstract = True
  14. def __unicode__(self):
  15. return self.name
  16. def save(self, *args, **kwargs):
  17. if self.pk:
  18. acl_version.invalidate()
  19. return super(BaseRole, self).save(*args, **kwargs)
  20. def delete(self, *args, **kwargs):
  21. acl_version.invalidate()
  22. return super(BaseRole, self).delete(*args, **kwargs)
  23. @property
  24. def permissions(self):
  25. try:
  26. return self.permissions_cache
  27. except AttributeError:
  28. try:
  29. self.permissions_cache = pickle.loads(
  30. base64.decodestring(self.pickled_permissions))
  31. except Exception:
  32. self.permissions_cache = {}
  33. return self.permissions_cache
  34. @permissions.setter
  35. def permissions(self, permissions):
  36. self.permissions_cache = permissions
  37. self.pickled_permissions = base64.encodestring(
  38. pickle.dumps(permissions, pickle.HIGHEST_PROTOCOL))
  39. class Role(BaseRole):
  40. pass