permsadmin.py 7.8 KB

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