1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- from django.utils.translation import ugettext_lazy as _
- from django import forms
- from misago.acl.builder import BaseACL
- from misago.acl.utils import ACLError403, ACLError404
- from misago.forms import YesNoSwitch
- def make_forum_form(request, role, form):
- form.base_fields['can_see_forum'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
- form.base_fields['can_see_forum_contents'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
- form.layout.append((
- _("Forums Permissions"),
- (
- ('can_see_forum', {'label': _("Can see forum")}),
- ('can_see_forum_contents', {'label': _("Can see forum contents")}),
- ),
- ))
-
- class ForumsACL(BaseACL):
- def known_forums(self):
- return self.acl['can_see']
-
- def can_see(self, forum):
- try:
- return forum.pk in self.acl['can_see']
- except AttributeError:
- return long(forum) in self.acl['can_see']
-
- def can_browse(self, forum):
- if self.can_see(forum):
- try:
- return forum.pk in self.acl['can_browse']
- except AttributeError:
- return long(forum) in self.acl['can_browse']
- return False
-
- def check_forum(self, forum):
- if not self.can_see(forum):
- raise ACLError404()
- if not self.can_browse(forum):
- raise ACLError403(_("You don't have permission to browse this forum."))
- def build_forums(acl, perms, forums, forum_roles):
- acl.forums = ForumsACL()
- acl.forums.acl['can_see'] = []
- acl.forums.acl['can_browse'] = []
-
- for forum in forums:
- for perm in perms:
- try:
- role = forum_roles[perm['forums'][forum.pk]]
- if role['can_see_forum'] and forum.pk not in acl.forums.acl['can_see']:
- acl.forums.acl['can_see'].append(forum.pk)
- if role['can_see_forum_contents'] and forum.pk not in acl.forums.acl['can_browse']:
- acl.forums.acl['can_browse'].append(forum.pk)
- except KeyError:
- pass
- def cleanup(acl, perms, forums):
- for forum in forums:
- if forum.pk in acl.forums.acl['can_browse'] and not forum.pk in acl.forums.acl['can_see']:
- # First burp: we can read forum but we cant see forum
- del acl.forums.acl['can_browse'][acl.forums.acl['can_browse'].index(forum.pk)]
-
- if forum.level > 1:
- if forum.parent_id not in acl.forums.acl['can_see'] or forum.parent_id not in acl.forums.acl['can_browse']:
- # Second burp: we cant see or read parent forum
- try:
- del acl.forums.acl['can_see'][acl.forums.acl['can_see'].index(forum.pk)]
- except ValueError:
- pass
- try:
- del acl.forums.acl['can_browse'][acl.forums.acl['can_browse'].index(forum.pk)]
- except ValueError:
- pass
|