permsadmin.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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.categories.forms import (CategoryRoleForm, CategoryRolesACLFormFactory,
  10. RoleCategoryACLFormFactory)
  11. from misago.categories.views.categoriesadmin import (
  12. CategoryAdmin, CategoriesList)
  13. from misago.categories.models import Category, CategoryRole, RoleCategoryACL
  14. class CategoryRoleAdmin(generic.AdminBaseMixin):
  15. root_link = 'misago:admin:permissions:categories:index'
  16. Model = CategoryRole
  17. templates_dir = 'misago/admin/categoryroles'
  18. message_404 = _("Requested role does not exist.")
  19. class CategoryRolesList(CategoryRoleAdmin, generic.ListView):
  20. ordering = (('name', None),)
  21. class RoleFormMixin(object):
  22. def real_dispatch(self, request, target):
  23. form = CategoryRoleForm(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 = CategoryRoleForm(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(
  40. request, self.message_submit % {'name': target.name})
  41. if 'stay' in request.POST:
  42. return redirect(request.path)
  43. else:
  44. return redirect(self.root_link)
  45. elif form.is_valid() and len(perms_forms) != valid_forms:
  46. form.add_error(None, _("Form contains errors."))
  47. return self.render(
  48. request,
  49. {
  50. 'form': form,
  51. 'target': target,
  52. 'perms_forms': perms_forms,
  53. })
  54. class NewCategoryRole(RoleFormMixin, CategoryRoleAdmin, generic.ModelFormView):
  55. message_submit = _('New role "%(name)s" has been saved.')
  56. class EditCategoryRole(RoleFormMixin, CategoryRoleAdmin, generic.ModelFormView):
  57. message_submit = _('Role "%(name)s" has been changed.')
  58. class DeleteCategoryRole(CategoryRoleAdmin, generic.ButtonView):
  59. def check_permissions(self, request, target):
  60. if target.special_role:
  61. message = _('Role "%(name)s" is special '
  62. 'role and can\'t be deleted.')
  63. return message % {'name': target.name}
  64. def button_action(self, request, target):
  65. target.delete()
  66. message = _('Role "%(name)s" has been deleted.')
  67. messages.success(request, message % {'name': target.name})
  68. """
  69. Create category roles view for assinging roles to category,
  70. add link to it in categories list
  71. """
  72. class CategoryPermissions(CategoryAdmin, generic.ModelFormView):
  73. templates_dir = 'misago/admin/categoryroles'
  74. template = 'categoryroles.html'
  75. def real_dispatch(self, request, target):
  76. category_roles = CategoryRole.objects.order_by('name')
  77. assigned_roles = {}
  78. for acl in target.category_role_set.select_related('category_role'):
  79. assigned_roles[acl.role_id] = acl.category_role
  80. forms = []
  81. forms_are_valid = True
  82. for role in Role.objects.order_by('name'):
  83. FormType = CategoryRolesACLFormFactory(
  84. role, category_roles, assigned_roles.get(role.pk))
  85. if request.method == 'POST':
  86. forms.append(FormType(request.POST, prefix=role.pk))
  87. if not forms[-1].is_valid():
  88. forms_are_valid = False
  89. else:
  90. forms.append(FormType(prefix=role.pk))
  91. if request.method == 'POST' and forms_are_valid:
  92. target.category_role_set.all().delete()
  93. new_permissions = []
  94. for form in forms:
  95. if form.cleaned_data['category_role']:
  96. new_permissions.append(
  97. RoleCategoryACL(
  98. role=form.role,
  99. category=target,
  100. category_role=form.cleaned_data['category_role']
  101. ))
  102. if new_permissions:
  103. RoleCategoryACL.objects.bulk_create(new_permissions)
  104. acl_version.invalidate()
  105. message = _("Category %(name)s permissions have been changed.")
  106. messages.success(request, message % {'name': target.name})
  107. if 'stay' in request.POST:
  108. return redirect(request.path)
  109. else:
  110. return redirect(self.root_link)
  111. return self.render(request, {
  112. 'forms': forms,
  113. 'target': target,
  114. })
  115. CategoriesList.add_item_action(
  116. name=_("Category permissions"),
  117. icon='fa fa-adjust',
  118. link='misago:admin:categories:nodes:permissions',
  119. style='success'
  120. )
  121. """
  122. Create role categories view for assinging categories to role,
  123. add link to it in user roles list
  124. """
  125. class RoleCategoriesACL(RoleAdmin, generic.ModelFormView):
  126. templates_dir = 'misago/admin/categoryroles'
  127. template = 'rolecategories.html'
  128. def real_dispatch(self, request, target):
  129. categories = Category.objects.all_categories()
  130. roles = CategoryRole.objects.order_by('name')
  131. if not categories:
  132. messages.info(request, _("No categories exist."))
  133. return redirect(self.root_link)
  134. choices = {}
  135. for choice in target.categories_acls.select_related('category_role'):
  136. choices[choice.category_id] = choice.category_role
  137. forms = []
  138. forms_are_valid = True
  139. for category in categories:
  140. category.level_range = range(category.level - 1)
  141. FormType = RoleCategoryACLFormFactory(category,
  142. roles,
  143. choices.get(category.pk))
  144. if request.method == 'POST':
  145. forms.append(FormType(request.POST, prefix=category.pk))
  146. if not forms[-1].is_valid():
  147. forms_are_valid = False
  148. else:
  149. forms.append(FormType(prefix=category.pk))
  150. if request.method == 'POST' and forms_are_valid:
  151. target.categories_acls.all().delete()
  152. new_permissions = []
  153. for form in forms:
  154. if form.cleaned_data['role']:
  155. new_permissions.append(
  156. RoleCategoryACL(role=target,
  157. category=form.category,
  158. category_role=form.cleaned_data['role']))
  159. if new_permissions:
  160. RoleCategoryACL.objects.bulk_create(new_permissions)
  161. acl_version.invalidate()
  162. message = _("Category permissions for role "
  163. "%(name)s have been changed.")
  164. messages.success(request, message % {'name': target.name})
  165. if 'stay' in request.POST:
  166. return redirect(request.path)
  167. else:
  168. return redirect(self.root_link)
  169. return self.render(request, {
  170. 'forms': forms,
  171. 'target': target,
  172. })
  173. RolesList.add_item_action(
  174. name=_("Categories permissions"),
  175. icon='fa fa-comments-o',
  176. link='misago:admin:permissions:users:categories',
  177. style='success'
  178. )