models.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. class ForumRole(BaseRole):
  43. pass
  44. """register models in misago admin"""
  45. site.add_node(
  46. parent='misago:admin',
  47. after='misago:admin:users:accounts:index',
  48. namespace='misago:admin:permissions',
  49. link='misago:admin:permissions:users:index',
  50. name=_("Permissions"),
  51. icon='fa fa-adjust')
  52. site.add_node(
  53. parent='misago:admin:permissions',
  54. namespace='misago:admin:permissions:users',
  55. link='misago:admin:permissions:users:index',
  56. name=_("User Roles"),
  57. icon='fa fa-th-large')
  58. site.add_node(
  59. parent='misago:admin:permissions',
  60. namespace='misago:admin:permissions:forums',
  61. link='misago:admin:permissions:forums:index',
  62. name=_("Forum Roles"),
  63. icon='fa fa-list')