forums.py 3.1 KB

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