from atom.ext.guardian.views import RaisePermissionRequiredMixin
from atom.views import ActionMessageMixin, ActionView
from braces.views import FormValidMessageMixin
from django.contrib import messages
from django.contrib.auth import get_user_model
from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.utils.functional import cached_property
from django.utils.translation import gettext as _
from django.views.generic import FormView
from guardian.shortcuts import get_perms
from poradnia.users.forms import (
TranslatedManageObjectPermissionForm,
TranslatedUserObjectPermissionsForm,
)
from poradnia.users.models import User
from ..forms import CaseGroupPermissionForm
from ..models import Case, CaseUserObjectPermission
[dokumentacja]
class CasePermissionTestMixin(RaisePermissionRequiredMixin):
accept_global_perms = True
@cached_property
def case(self):
return get_object_or_404(Case, pk=self.kwargs["pk"])
def get_permission_object(self):
return self.case
[dokumentacja]
def get_required_permissions(self, request=None):
if self.case.status == self.case.STATUS.free:
return ["cases.can_assign"]
else:
return ["cases.can_manage_permission"]
[dokumentacja]
class UserPermissionCreateView(CasePermissionTestMixin, FormView):
form_class = TranslatedManageObjectPermissionForm
template_name = "cases/case_form_permission_add.html"
[dokumentacja]
def get_success_url(self):
return reverse("cases:detail", kwargs={"pk": str(self.case.pk)})
[dokumentacja]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["object"] = self.case
return context
[dokumentacja]
class UserPermissionUpdateView(
CasePermissionTestMixin, FormValidMessageMixin, FormView
):
form_class = TranslatedUserObjectPermissionsForm
template_name = "cases/case_form_permission_update.html"
def get_obj_perms_field_initial(self, *args, **kwargs):
return get_perms(self.action_user, self.case)
[dokumentacja]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["object"] = self.case
context["action_user"] = self.action_user
return context
[dokumentacja]
def get_success_url(self):
return self.case.get_absolute_url()
[dokumentacja]
class CaseGroupPermissionView(CasePermissionTestMixin, FormValidMessageMixin, FormView):
model = Case
form_class = CaseGroupPermissionForm
template_name = "cases/case_form.html"
[dokumentacja]
def get_success_url(self):
return reverse("cases:detail", kwargs={"pk": str(self.object.pk)})
[dokumentacja]
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context["object"] = self.object
return context
def get_object(self):
return self.case
[dokumentacja]
class UserPermissionRemoveView(
RaisePermissionRequiredMixin, ActionMessageMixin, ActionView
):
model = Case
permission_required = "cases.can_manage_permission"
template_name_suffix = "_permission_remove_confirm"
accept_global_perms = True
@cached_property
def user(self):
return get_object_or_404(User, username=self.kwargs["username"])
def action(self):
CaseUserObjectPermission.objects.filter(
user=self.user, content_object=self.object
).delete()
self.object.update_status()
def get_success_message(self):
return _('Removed all permission of "{user}" in case "{case}"').format(
user=self.user, case=self.object
)
[dokumentacja]
def get_context_data(self, **kwargs):
return super().get_context_data(**kwargs)
def get_success_url(self):
return self.object.get_absolute_url()