models.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. pickled_permissions = models.TextField(null=True, blank=True)
  13. class Meta:
  14. abstract = True
  15. def __unicode__(self):
  16. return unicode(_(self.name))
  17. def save(self, *args, **kwargs):
  18. if self.pk:
  19. cachebuster.invalidate()
  20. return super(BaseRole, self).save(*args, **kwargs)
  21. def delete(self, *args, **kwargs):
  22. cachebuster.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. try:
  30. self.permissions_cache = pickle.loads(
  31. base64.decodestring(self.pickled_permissions))
  32. except Exception:
  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 = base64.encodestring(
  39. pickle.dumps(permissions, pickle.HIGHEST_PROTOCOL))
  40. class Role(BaseRole):
  41. pass
  42. """register models in misago admin"""
  43. site.add_node(
  44. parent='misago:admin',
  45. after='misago:admin:users:accounts:index',
  46. namespace='misago:admin:permissions',
  47. link='misago:admin:permissions:users:index',
  48. name=_("Permissions"),
  49. icon='fa fa-adjust')
  50. site.add_node(
  51. parent='misago:admin:permissions',
  52. namespace='misago:admin:permissions:users',
  53. link='misago:admin:permissions:users:index',
  54. name=_("User roles"),
  55. icon='fa fa-th-large')