permsadmin.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. from django.contrib import messages
  2. from django.shortcuts import redirect
  3. from django.utils.translation import ugettext_lazy as _
  4. from misago.admin.views import generic
  5. from misago.acl import version as acl_version
  6. from misago.acl.forms import get_permissions_forms
  7. from misago.acl.views import RoleAdmin, RolesList
  8. from misago.forums.forms import ForumRoleForm, RoleForumACLFormFactory
  9. from misago.forums.models import Forum, ForumRole, RoleForumACL
  10. class ForumRoleAdmin(generic.AdminBaseMixin):
  11. root_link = 'misago:admin:permissions:forums:index'
  12. Model = ForumRole
  13. templates_dir = 'misago/admin/forumroles'
  14. message_404 = _("Requested role does not exist.")
  15. class ForumRolesList(ForumRoleAdmin, generic.ListView):
  16. ordering = (('name', None),)
  17. class RoleFormMixin(object):
  18. def real_dispatch(self, request, target):
  19. role_permissions = target.permissions
  20. form = ForumRoleForm(instance=target)
  21. perms_forms = get_permissions_forms(target)
  22. if request.method == 'POST':
  23. perms_forms = get_permissions_forms(target, request.POST)
  24. valid_forms = 0
  25. for permissions_form in perms_forms:
  26. if permissions_form.is_valid():
  27. valid_forms += 1
  28. form = ForumRoleForm(request.POST, instance=target)
  29. if form.is_valid() and len(perms_forms) == valid_forms:
  30. new_permissions = {}
  31. for permissions_form in perms_forms:
  32. cleaned_data = permissions_form.cleaned_data
  33. new_permissions[permissions_form.prefix] = cleaned_data
  34. form.instance.permissions = new_permissions
  35. form.instance.save()
  36. messages.success(request, self.message_submit % target.name)
  37. if 'stay' in request.POST:
  38. return redirect(request.path)
  39. else:
  40. return redirect(self.root_link)
  41. return self.render(
  42. request,
  43. {
  44. 'form': form,
  45. 'target': target,
  46. 'perms_forms': perms_forms,
  47. })
  48. class NewForumRole(RoleFormMixin, ForumRoleAdmin, generic.ModelFormView):
  49. message_submit = _('New role "%s" has been saved.')
  50. class EditForumRole(RoleFormMixin, ForumRoleAdmin, generic.ModelFormView):
  51. message_submit = _('Role "%s" has been changed.')
  52. class DeleteForumRole(ForumRoleAdmin, generic.ButtonView):
  53. def check_permissions(self, request, target):
  54. if target.special_role:
  55. message = _('Role "%s" is special role and can\'t be deleted.')
  56. return message % target.name
  57. def button_action(self, request, target):
  58. target.delete()
  59. message = _('Role "%s" has been deleted.') % unicode(target.name)
  60. messages.success(request, message)
  61. """
  62. Create forums perms view for perms role and register it in other admin
  63. """
  64. class RoleForumsACL(RoleAdmin, generic.ModelFormView):
  65. templates_dir = 'misago/admin/forumroles'
  66. template = 'forumsroles.html'
  67. def real_dispatch(self, request, target):
  68. forums = Forum.objects.all_forums()
  69. roles = ForumRole.objects.order_by('name')
  70. if not forums:
  71. messages.info(request, _("No forums exist."))
  72. return redirect(self.root_link)
  73. choices = {}
  74. for choice in target.forums_acls.select_related('forum_role'):
  75. choices[choice.forum_id] = choice.forum_role
  76. forms = []
  77. forms_are_valid = True
  78. for forum in forums:
  79. forum.level_range = range(forum.level - 1)
  80. FormType = RoleForumACLFormFactory(forum,
  81. choices.get(forum.pk),
  82. roles)
  83. if request.method == 'POST':
  84. forms.append(FormType(request.POST, prefix=forum.pk))
  85. if not forms[-1].is_valid():
  86. forms_are_valid = False
  87. else:
  88. forms.append(FormType(prefix=forum.pk))
  89. if request.method == 'POST' and forms_are_valid:
  90. target.forums_acls.all().delete()
  91. new_permissions = []
  92. for form in forms:
  93. if form.cleaned_data['role']:
  94. new_permissions.append(
  95. RoleForumACL(role=target,
  96. forum=form.forum,
  97. forum_role=form.cleaned_data['role']))
  98. if new_permissions:
  99. RoleForumACL.objects.bulk_create(new_permissions)
  100. acl_version.invalidate()
  101. message = _("Forum permissions for role %s have been changed.")
  102. messages.success(request, message % target)
  103. if 'stay' in request.POST:
  104. return redirect(request.path)
  105. else:
  106. return redirect(self.root_link)
  107. return self.render(
  108. request,
  109. {
  110. 'forms': forms,
  111. 'target': target,
  112. })
  113. RolesList.add_item_action(
  114. name=_("Forums permissions"),
  115. icon='fa fa-comments-o',
  116. link='misago:admin:permissions:users:forums')