permsadmin.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  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.models import Role
  8. from misago.acl.views import RoleAdmin, RolesList
  9. from misago.forums.forms import (ForumRoleForm, ForumRolesACLFormFactory,
  10. RoleForumACLFormFactory)
  11. from misago.forums.views.forumsadmin import ForumAdmin, ForumsList
  12. from misago.forums.models import Forum, ForumRole, RoleForumACL
  13. class ForumRoleAdmin(generic.AdminBaseMixin):
  14. root_link = 'misago:admin:permissions:forums:index'
  15. Model = ForumRole
  16. templates_dir = 'misago/admin/forumroles'
  17. message_404 = _("Requested role does not exist.")
  18. class ForumRolesList(ForumRoleAdmin, generic.ListView):
  19. ordering = (('name', None),)
  20. class RoleFormMixin(object):
  21. def real_dispatch(self, request, target):
  22. role_permissions = target.permissions
  23. form = ForumRoleForm(instance=target)
  24. perms_forms = get_permissions_forms(target)
  25. if request.method == 'POST':
  26. perms_forms = get_permissions_forms(target, request.POST)
  27. valid_forms = 0
  28. for permissions_form in perms_forms:
  29. if permissions_form.is_valid():
  30. valid_forms += 1
  31. form = ForumRoleForm(request.POST, instance=target)
  32. if form.is_valid() and len(perms_forms) == valid_forms:
  33. new_permissions = {}
  34. for permissions_form in perms_forms:
  35. cleaned_data = permissions_form.cleaned_data
  36. new_permissions[permissions_form.prefix] = cleaned_data
  37. form.instance.permissions = new_permissions
  38. form.instance.save()
  39. messages.success(request, self.message_submit % target.name)
  40. if 'stay' in request.POST:
  41. return redirect(request.path)
  42. else:
  43. return redirect(self.root_link)
  44. return self.render(
  45. request,
  46. {
  47. 'form': form,
  48. 'target': target,
  49. 'perms_forms': perms_forms,
  50. })
  51. class NewForumRole(RoleFormMixin, ForumRoleAdmin, generic.ModelFormView):
  52. message_submit = _('New role "%s" has been saved.')
  53. class EditForumRole(RoleFormMixin, ForumRoleAdmin, generic.ModelFormView):
  54. message_submit = _('Role "%s" has been changed.')
  55. class DeleteForumRole(ForumRoleAdmin, generic.ButtonView):
  56. def check_permissions(self, request, target):
  57. if target.special_role:
  58. message = _('Role "%s" is special role and can\'t be deleted.')
  59. return message % target.name
  60. def button_action(self, request, target):
  61. target.delete()
  62. message = _('Role "%s" has been deleted.') % unicode(target.name)
  63. messages.success(request, message)
  64. """
  65. Create forum roles view for assinging roles to forum,
  66. add link to it in forums list
  67. """
  68. class ForumPermissions(ForumAdmin, generic.ModelFormView):
  69. templates_dir = 'misago/admin/forumroles'
  70. template = 'forumroles.html'
  71. def real_dispatch(self, request, target):
  72. forum_roles = ForumRole.objects.order_by('name')
  73. assigned_roles = {}
  74. for acl in target.forum_role_set.select_related('forum_role'):
  75. assigned_roles[acl.role_id] = acl.forum_role
  76. forms = []
  77. forms_are_valid = True
  78. for role in Role.objects.order_by('name'):
  79. FormType = ForumRolesACLFormFactory(role,
  80. forum_roles,
  81. assigned_roles.get(role.pk))
  82. if request.method == 'POST':
  83. forms.append(FormType(request.POST, prefix=role.pk))
  84. if not forms[-1].is_valid():
  85. forms_are_valid = False
  86. else:
  87. forms.append(FormType(prefix=role.pk))
  88. if request.method == 'POST' and forms_are_valid:
  89. target.forum_role_set.all().delete()
  90. new_permissions = []
  91. for form in forms:
  92. if form.cleaned_data['forum_role']:
  93. new_permissions.append(
  94. RoleForumACL(
  95. role=form.role,
  96. forum=target,
  97. forum_role=form.cleaned_data['forum_role']
  98. ))
  99. if new_permissions:
  100. RoleForumACL.objects.bulk_create(new_permissions)
  101. acl_version.invalidate()
  102. message = _("Forum %s permissions have been changed.")
  103. messages.success(request, message % target)
  104. if 'stay' in request.POST:
  105. return redirect(request.path)
  106. else:
  107. return redirect(self.root_link)
  108. return self.render(
  109. request,
  110. {
  111. 'forms': forms,
  112. 'target': target,
  113. })
  114. ForumsList.add_item_action(
  115. name=_("Forum permissions"),
  116. icon='fa fa-adjust',
  117. link='misago:admin:forums:nodes:permissions',
  118. style='success')
  119. """
  120. Create role forums view for assinging forums to role,
  121. add link to it in user roles list
  122. """
  123. class RoleForumsACL(RoleAdmin, generic.ModelFormView):
  124. templates_dir = 'misago/admin/forumroles'
  125. template = 'roleforums.html'
  126. def real_dispatch(self, request, target):
  127. forums = Forum.objects.all_forums()
  128. roles = ForumRole.objects.order_by('name')
  129. if not forums:
  130. messages.info(request, _("No forums exist."))
  131. return redirect(self.root_link)
  132. choices = {}
  133. for choice in target.forums_acls.select_related('forum_role'):
  134. choices[choice.forum_id] = choice.forum_role
  135. forms = []
  136. forms_are_valid = True
  137. for forum in forums:
  138. forum.level_range = range(forum.level - 1)
  139. FormType = RoleForumACLFormFactory(forum,
  140. roles,
  141. choices.get(forum.pk))
  142. if request.method == 'POST':
  143. forms.append(FormType(request.POST, prefix=forum.pk))
  144. if not forms[-1].is_valid():
  145. forms_are_valid = False
  146. else:
  147. forms.append(FormType(prefix=forum.pk))
  148. if request.method == 'POST' and forms_are_valid:
  149. target.forums_acls.all().delete()
  150. new_permissions = []
  151. for form in forms:
  152. if form.cleaned_data['role']:
  153. new_permissions.append(
  154. RoleForumACL(role=target,
  155. forum=form.forum,
  156. forum_role=form.cleaned_data['role']))
  157. if new_permissions:
  158. RoleForumACL.objects.bulk_create(new_permissions)
  159. acl_version.invalidate()
  160. message = _("Forum permissions for role %s have been changed.")
  161. messages.success(request, message % target)
  162. if 'stay' in request.POST:
  163. return redirect(request.path)
  164. else:
  165. return redirect(self.root_link)
  166. return self.render(
  167. request,
  168. {
  169. 'forms': forms,
  170. 'target': target,
  171. })
  172. RolesList.add_item_action(
  173. name=_("Forums permissions"),
  174. icon='fa fa-comments-o',
  175. link='misago:admin:permissions:users:forums',
  176. style='success')