views.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from django.contrib import messages
  2. from django.shortcuts import redirect
  3. from django.urls import reverse
  4. from django.utils.translation import gettext_lazy as _
  5. from ...admin.views import generic
  6. from ..models import Role
  7. from .forms import RoleForm, get_permissions_forms
  8. class RoleAdmin(generic.AdminBaseMixin):
  9. root_link = "misago:admin:permissions:index"
  10. model = Role
  11. templates_dir = "misago/admin/roles"
  12. message_404 = _("Requested role does not exist.")
  13. class RolesList(RoleAdmin, generic.ListView):
  14. ordering = (("name", None),)
  15. class RoleFormMixin:
  16. def real_dispatch(self, request, target):
  17. form = RoleForm(instance=target)
  18. perms_forms = get_permissions_forms(target)
  19. if request.method == "POST":
  20. perms_forms = get_permissions_forms(target, request.POST)
  21. valid_forms = 0
  22. for permissions_form in perms_forms:
  23. if permissions_form.is_valid():
  24. valid_forms += 1
  25. form = RoleForm(request.POST, instance=target)
  26. if form.is_valid() and len(perms_forms) == valid_forms:
  27. new_permissions = {}
  28. for permissions_form in perms_forms:
  29. cleaned_data = permissions_form.cleaned_data
  30. new_permissions[permissions_form.prefix] = cleaned_data
  31. form.instance.permissions = new_permissions
  32. form.instance.save()
  33. messages.success(request, self.message_submit % {"name": target.name})
  34. if "stay" in request.POST:
  35. return redirect(request.path)
  36. return redirect(self.root_link)
  37. if form.is_valid() and len(perms_forms) != valid_forms:
  38. form.add_error(None, _("Form contains errors."))
  39. template_name = self.get_template_name(request, target)
  40. return self.render(
  41. request,
  42. {"form": form, "target": target, "perms_forms": perms_forms},
  43. template_name,
  44. )
  45. class NewRole(RoleFormMixin, RoleAdmin, generic.ModelFormView):
  46. message_submit = _('New role "%(name)s" has been saved.')
  47. class EditRole(RoleFormMixin, RoleAdmin, generic.ModelFormView):
  48. message_submit = _('Role "%(name)s" has been changed.')
  49. class DeleteRole(RoleAdmin, generic.ButtonView):
  50. def check_permissions(self, request, target):
  51. if target.special_role:
  52. message = _('Role "%(name)s" is special role and can\'t be deleted.')
  53. return message % {"name": target.name}
  54. def button_action(self, request, target):
  55. target.delete()
  56. message = _('Role "%(name)s" has been deleted.')
  57. messages.success(request, message % {"name": target.name})
  58. class RoleUsers(RoleAdmin, generic.TargetedView):
  59. def real_dispatch(self, request, target):
  60. redirect_url = reverse("misago:admin:users:index")
  61. return redirect("%s?role=%s" % (redirect_url, target.pk))