models.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from django.db import models
  2. from django.utils.translation import ugettext as _
  3. from misago.admin import site
  4. from misago.acl import cachebuster
  5. import base64
  6. try:
  7. import cPickle as pickle
  8. except ImportError:
  9. import pickle
  10. class BaseRole(models.Model):
  11. name = models.CharField(max_length=255)
  12. special_role = models.CharField(max_length=255, null=True, blank=True)
  13. pickled_permissions = models.TextField(null=True, blank=True)
  14. class Meta:
  15. abstract = True
  16. def __unicode__(self):
  17. return unicode(_(self.name))
  18. def save(self, *args, **kwargs):
  19. if self.pk:
  20. cachebuster.invalidate()
  21. return super(BaseRole, self).save(*args, **kwargs)
  22. def delete(self, *args, **kwargs):
  23. cachebuster.invalidate()
  24. return super(BaseRole, self).delete(*args, **kwargs)
  25. @property
  26. def permissions(self):
  27. try:
  28. return self.permissions_cache
  29. except AttributeError:
  30. try:
  31. self.permissions_cache = pickle.loads(
  32. base64.decodestring(self.pickled_permissions))
  33. except Exception:
  34. self.permissions_cache = {}
  35. return self.permissions_cache
  36. @permissions.setter
  37. def permissions(self, permissions):
  38. self.permissions_cache = permissions
  39. self.pickled_permissions = base64.encodestring(
  40. pickle.dumps(permissions, pickle.HIGHEST_PROTOCOL))
  41. class Role(BaseRole):
  42. pass
  43. """register models in misago admin"""
  44. site.add_node(
  45. parent='misago:admin',
  46. after='misago:admin:users:accounts:index',
  47. namespace='misago:admin:permissions',
  48. link='misago:admin:permissions:users:index',
  49. name=_("Permissions"),
  50. icon='fa fa-adjust')
  51. site.add_node(
  52. parent='misago:admin:permissions',
  53. namespace='misago:admin:permissions:users',
  54. link='misago:admin:permissions:users:index',
  55. name=_("User roles"),
  56. icon='fa fa-th-large')