from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.core.exceptions import PermissionDenied from django.shortcuts import get_object_or_404 from apps.projects.models import Project class AdminRequiredMixin(LoginRequiredMixin, UserPassesTestMixin): def test_func(self): return self.request.user.is_admin() class ClientOrAdminMixin(LoginRequiredMixin, UserPassesTestMixin): def test_func(self): user = self.request.user return user.is_admin() or user.is_client() class ProjectMemberMixin(LoginRequiredMixin, UserPassesTestMixin): def test_func(self): pk = self.kwargs.get("pk") or self.kwargs.get("project_pk") if not pk: return False project = get_object_or_404(Project, pk=pk) return project.members.filter(pk=self.request.user.pk).exists() class ProjectMemberRequired: def dispatch(self, request, *args, **kwargs): project = get_object_or_404(Project, pk=kwargs.get("pk")) if not project.members.filter(pk=request.user.pk).exists(): raise PermissionDenied return super().dispatch(request, *args, **kwargs) def project_membership_required(view_func): def wrapper(request, *args, **kwargs): project = get_object_or_404(Project, pk=kwargs.get("pk")) if not project.members.filter(pk=request.user.pk).exists(): raise PermissionDenied return view_func(request, *args, **kwargs) return wrapper