acl.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from django.utils.translation import ugettext_lazy as _
  2. from django import forms
  3. from misago.acl.builder import BaseACL
  4. from misago.forms import YesNoSwitch
  5. def make_forum_form(request, role, form):
  6. form.base_fields['can_see_forum'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
  7. form.base_fields['can_see_forum_contents'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
  8. form.layout.append((
  9. _("Forums Permissions"),
  10. (
  11. ('can_see_forum', {'label': _("Can see this forum")}),
  12. ('can_see_forum_contents', {'label': _("Can see this forum's contents")}),
  13. ),
  14. ))
  15. class ForumsACL(BaseACL):
  16. def can_see(self, forum):
  17. try:
  18. return forum.pk in self.acl['can_see']
  19. except AttributeError:
  20. return forum in self.acl['can_see']
  21. def can_browse(self, forum):
  22. if self.can_see(forum):
  23. try:
  24. return forum.pk in self.acl['can_see']
  25. except AttributeError:
  26. return forum in self.acl['can_see']
  27. return False
  28. def build_forums(acl, perms, forums, forum_roles):
  29. acl.forums = ForumsACL()
  30. acl.forums.acl['can_see'] = []
  31. acl.forums.acl['can_browse'] = []
  32. for forum in forums:
  33. for perm in perms:
  34. try:
  35. role = forum_roles[perm['forums'][forum.pk]]
  36. if role['can_see_forum'] and forum.pk not in acl.forums.acl['can_see']:
  37. acl.forums.acl['can_see'].append(forum.pk)
  38. if role['can_see_forum_contents'] and forum.pk not in acl.forums.acl['can_browse']:
  39. acl.forums.acl['can_browse'].append(forum.pk)
  40. except KeyError:
  41. pass
  42. def cleanup(acl, perms, forums):
  43. for forum in forums:
  44. if forum.pk in acl.forums.acl['can_browse'] and not forum.pk in acl.forums.acl['can_see']:
  45. # First burp: we can read forum but we cant see forum
  46. del acl.forums.acl['can_browse'][acl.forums.acl['can_browse'].index(forum.pk)]
  47. if forum.level > 1:
  48. if forum.parent_id not in acl.forums.acl['can_see'] or forum.parent_id not in acl.forums.acl['can_browse']:
  49. # Second burp: we cant see or read parent forum
  50. try:
  51. del acl.forums.acl['can_see'][acl.forums.acl['can_see'].index(forum.pk)]
  52. except ValueError:
  53. pass
  54. try:
  55. del acl.forums.acl['can_browse'][acl.forums.acl['can_browse'].index(forum.pk)]
  56. except ValueError:
  57. pass