Kod źródłowy modułu poradnia.users.views

from atom.views import ActionMessageMixin, ActionView
from braces.views import LoginRequiredMixin, StaffuserRequiredMixin, UserFormKwargsMixin
from dal import autocomplete
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.exceptions import PermissionDenied
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView, RedirectView, UpdateView
from django_filters.views import FilterView

from poradnia.cases.models import Case, CaseUserObjectPermission
from poradnia.utils.mixins import ExprAutocompleteMixin

from .filters import UserFilter
from .forms import ProfileForm, UserForm
from .models import Profile, User
from .utils import PermissionMixin


[dokumentacja] class UserDetailView(PermissionRequiredMixin, DetailView): model = User slug_field = "username" slug_url_kwarg = "username" permission_required = "users.can_view_other" raise_exception = True
[dokumentacja] def has_permission(self, *args, **kwargs): if self.kwargs["username"] == self.request.user.username: return True return super().has_permission(*args, **kwargs)
def handle_no_permission(self): if self.request.user.is_authenticated: url = reverse( "users:user_info", kwargs={"username": self.kwargs["username"]} ) return HttpResponseRedirect(url) else: raise PermissionDenied
[dokumentacja] class UserInfoView(DetailView): model = User slug_field = "username" slug_url_kwarg = "username" template_name = "users/user_info.html" fields = ["picture", "profile"]
[dokumentacja] def get_queryset(self): queryset = super().get_queryset() return queryset.only(*self.fields)
[dokumentacja] class UserRedirectView(LoginRequiredMixin, RedirectView): permanent = False
[dokumentacja] def get_redirect_url(self): return reverse("users:detail", kwargs={"username": self.request.user.username})
[dokumentacja] class UserUpdateView(LoginRequiredMixin, UpdateView): form_class = UserForm # we already imported User in the view code above, remember? model = User # send the user back to their own page after a successful update
[dokumentacja] def get_success_url(self): return reverse("users:detail", kwargs={"username": self.request.user.username})
[dokumentacja] def get_object(self): # Only get the User record for the user making the request return User.objects.get(username=self.request.user.username)
[dokumentacja] class ProfileUpdateView(UserFormKwargsMixin, LoginRequiredMixin, UpdateView): form_class = ProfileForm model = Profile
[dokumentacja] def get_success_url(self): return reverse("users:detail", kwargs={"username": self.request.user.username})
[dokumentacja] def get_object(self): # Only get the User record for the user making the request return Profile.objects.get_or_create(user=self.request.user)[0]
[dokumentacja] class UserListView(StaffuserRequiredMixin, PermissionMixin, FilterView): model = User slug_field = "username" slug_url_kwarg = "username" filterset_class = UserFilter paginate_by = 25 IS_STAFF_FILTER = ( (_("All users"), {}), (_("Staff"), {"is_staff": True}), ((_("Clients"), {"is_staff": False})), ) def get_is_staff_choice(self): if "is_staff" not in self.request.GET: return 0 if not self.request.GET["is_staff"].isdigit(): return 0 num = int(self.request.GET["is_staff"]) if len(self.IS_STAFF_FILTER) < num: return 0 return num
[dokumentacja] def get_queryset(self, *args, **kwargs): qs = super().get_queryset(*args, **kwargs) qs = qs.filter(**self.IS_STAFF_FILTER[self.get_is_staff_choice()][1]) qs = qs.with_case_count() qs = qs.with_case_count_assigned() return qs
[dokumentacja] def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["is_staff"] = dict( choices=enumerate(self.IS_STAFF_FILTER), selected=self.get_is_staff_choice() ) return context
[dokumentacja] class UserAutocomplete( PermissionMixin, ExprAutocompleteMixin, autocomplete.Select2QuerySetView ): model = User search_expr = [ "first_name__icontains", "last_name__icontains", "username__icontains", ]
[dokumentacja] class UserDeassignView( LoginRequiredMixin, PermissionRequiredMixin, ActionMessageMixin, ActionView, ): model = User slug_field = "username" slug_url_kwarg = "username" permission_required = "cases.can_assign" success_message = _("{subject} deassigned") template_name_suffix = "_deassign" raise_exception = True def get_success_url(self): return self.object.get_absolute_url() def action(self): self.count = int( Case.objects.filter(caseuserobjectpermission__user=self.object) .exclude(client=self.object) .distinct() .count() ) CaseUserObjectPermission.objects.filter(user=self.object).exclude( content_object__client=self.object ).delete() def get_success_message(self): return _("{object} deassigned from {count} cases").format( object=self.object, count=self.count )