models.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 Role(models.Model):
  11. name = models.CharField(max_length=255)
  12. pickled_permissions = models.TextField(null=True, blank=True)
  13. def __unicode__(self):
  14. return unicode(_(self.name))
  15. def save(self, *args, **kwargs):
  16. if self.pk:
  17. cachebuster.invalidate()
  18. return super(Role, self).save(*args, **kwargs)
  19. def delete(self, *args, **kwargs):
  20. cachebuster.invalidate()
  21. return super(Role, self).delete(*args, **kwargs)
  22. @property
  23. def permissions(self):
  24. try:
  25. return self.permissions_cache
  26. except AttributeError:
  27. try:
  28. self.permissions_cache = pickle.loads(
  29. base64.decodestring(self.pickled_permissions))
  30. except Exception:
  31. self.permissions_cache = {}
  32. return self.permissions_cache
  33. @permissions.setter
  34. def permissions(self, permissions):
  35. self.permissions_cache = permissions
  36. self.pickled_permissions = base64.encodestring(
  37. pickle.dumps(permissions, pickle.HIGHEST_PROTOCOL))
  38. class ForumRole(models.Model):
  39. name = models.CharField(max_length=255)
  40. pickled_permissions = models.TextField(null=True, blank=True)
  41. def __unicode__(self):
  42. return unicode(_(self.name))
  43. def save(self, *args, **kwargs):
  44. if self.pk:
  45. cachebuster.invalidate()
  46. return super(ForumRole, self).save(*args, **kwargs)
  47. def delete(self, *args, **kwargs):
  48. cachebuster.invalidate()
  49. return super(ForumRole, self).delete(*args, **kwargs)
  50. @property
  51. def permissions(self):
  52. try:
  53. return self.permissions_cache
  54. except AttributeError:
  55. try:
  56. self.permissions_cache = pickle.loads(
  57. base64.decodestring(self.pickled_permissions))
  58. except Exception:
  59. self.permissions_cache = {}
  60. return self.permissions_cache
  61. @permissions.setter
  62. def permissions(self, permissions):
  63. self.permissions_cache = permissions
  64. self.pickled_permissions = base64.encodestring(
  65. pickle.dumps(permissions, pickle.HIGHEST_PROTOCOL))
  66. """register models in misago admin"""
  67. site.add_node(
  68. parent='misago:admin',
  69. after='misago:admin:users:accounts:index',
  70. namespace='misago:admin:permissions',
  71. link='misago:admin:permissions:users:index',
  72. name=_("Permissions"),
  73. icon='fa fa-adjust')
  74. site.add_node(
  75. parent='misago:admin:permissions',
  76. namespace='misago:admin:permissions:users',
  77. link='misago:admin:permissions:users:index',
  78. name=_("User Roles"),
  79. icon='fa fa-th-large')
  80. site.add_node(
  81. parent='misago:admin:permissions',
  82. namespace='misago:admin:permissions:forums',
  83. link='misago:admin:permissions:forums:index',
  84. name=_("Forum Roles"),
  85. icon='fa fa-list')