permsadmin.py 7.4 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, RoleForumACLFormFactory
  10. from misago.forums.views.forumsadmin import ForumAdmin, ForumsList
  11. from misago.forums.models import Forum, ForumRole, RoleForumACL
  12. class ForumRoleAdmin(generic.AdminBaseMixin):
  13. root_link = 'misago:admin:permissions:forums:index'
  14. Model = ForumRole
  15. templates_dir = 'misago/admin/forumroles'
  16. message_404 = _("Requested role does not exist.")
  17. class ForumRolesList(ForumRoleAdmin, generic.ListView):
  18. ordering = (('name', None),)
  19. class RoleFormMixin(object):
  20. def real_dispatch(self, request, target):
  21. role_permissions = target.permissions
  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. templates_dir = 'misago/admin/forumroles'
  68. class ForumPermissions(ForumAdmin, generic.ModelFormView):
  69. template = 'permissions.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 forums perms view for perms role and register it in other admin
  120. """
  121. class RoleForumsACL(RoleAdmin, generic.ModelFormView):
  122. templates_dir = 'misago/admin/forumroles'
  123. template = 'roleforums.html'
  124. def real_dispatch(self, request, target):
  125. forums = Forum.objects.all_forums()
  126. roles = ForumRole.objects.order_by('name')
  127. if not forums:
  128. messages.info(request, _("No forums exist."))
  129. return redirect(self.root_link)
  130. choices = {}
  131. for choice in target.forums_acls.select_related('forum_role'):
  132. choices[choice.forum_id] = choice.forum_role
  133. forms = []
  134. forms_are_valid = True
  135. for forum in forums:
  136. forum.level_range = range(forum.level - 1)
  137. FormType = RoleForumACLFormFactory(forum,
  138. roles,
  139. choices.get(forum.pk))
  140. if request.method == 'POST':
  141. forms.append(FormType(request.POST, prefix=forum.pk))
  142. if not forms[-1].is_valid():
  143. forms_are_valid = False
  144. else:
  145. forms.append(FormType(prefix=forum.pk))
  146. if request.method == 'POST' and forms_are_valid:
  147. target.forums_acls.all().delete()
  148. new_permissions = []
  149. for form in forms:
  150. if form.cleaned_data['role']:
  151. new_permissions.append(
  152. RoleForumACL(role=target,
  153. forum=form.forum,
  154. forum_role=form.cleaned_data['role']))
  155. if new_permissions:
  156. RoleForumACL.objects.bulk_create(new_permissions)
  157. acl_version.invalidate()
  158. message = _("Forum permissions for role %s have been changed.")
  159. messages.success(request, message % target)
  160. if 'stay' in request.POST:
  161. return redirect(request.path)
  162. else:
  163. return redirect(self.root_link)
  164. return self.render(
  165. request,
  166. {
  167. 'forms': forms,
  168. 'target': target,
  169. })
  170. RolesList.add_item_action(
  171. name=_("Forums permissions"),
  172. icon='fa fa-comments-o',
  173. link='misago:admin:permissions:users:forums',
  174. style='success')