permsadmin.py 7.5 KB

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