permissions.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from django.utils.translation import ugettext_lazy as _
  2. from misago.acl import algebra
  3. from misago.core import forms
  4. from misago.forums.models import Forum, RoleForumACL, ForumRole
  5. """
  6. Admin Permissions Form
  7. """
  8. class PermissionsForm(forms.Form):
  9. legend = _("Forum access")
  10. can_see = forms.YesNoSwitch(label=_("Can see forum"))
  11. can_browse = forms.YesNoSwitch(label=_("Can see forum contents"))
  12. def change_permissions_form(role):
  13. if isinstance(role, ForumRole):
  14. return PermissionsForm
  15. else:
  16. return None
  17. """
  18. ACL Builder
  19. """
  20. def build_acl(acl, roles, key_name):
  21. new_acl = {
  22. 'visible_forums': [],
  23. 'forums': {},
  24. }
  25. new_acl.update(acl)
  26. forums_roles = get_forums_roles(roles)
  27. for forum in Forum.objects.all_forums():
  28. build_forum_acl(new_acl, forum, forums_roles, key_name)
  29. return new_acl
  30. def get_forums_roles(roles):
  31. queryset = RoleForumACL.objects.filter(role__in=roles)
  32. queryset = queryset.select_related('forum_role')
  33. forums_roles = {}
  34. for acl_relation in queryset.iterator():
  35. forum_role = acl_relation.forum_role
  36. forums_roles.setdefault(acl_relation.forum_id, []).append(forum_role)
  37. return forums_roles
  38. def build_forum_acl(acl, forum, forums_roles, key_name):
  39. if forum.level > 1:
  40. if forum.parent_id not in acl['visible_forums']:
  41. # dont bother with child forums of invisible parents
  42. return
  43. elif not acl['forums'][forum.parent_id]['can_browse']:
  44. # parent's visible, but its contents aint
  45. return
  46. forum_roles = forums_roles.get(forum.pk, [])
  47. final_acl = {
  48. 'can_see': 0,
  49. 'can_browse': 0,
  50. }
  51. algebra.sum_acls(
  52. final_acl, roles=forum_roles, key=key_name,
  53. can_see=algebra.greater,
  54. can_browse=algebra.greater)
  55. if final_acl['can_see']:
  56. acl['visible_forums'].append(forum.pk)
  57. acl['forums'][forum.pk] = final_acl
  58. """
  59. ACL's for targets
  60. """
  61. """
  62. ACL's for tests
  63. """