- New Features * Introduce CustomUser with role field and admin integration * Add ProjectMembership model linking users to projects * Add Ticket model with status, type, creator, and project relationships * Register CustomUser and ProjectMembership in Django admin with list views * Add URLs and views for account management and ticket CRUD operations - Enhancements * Provide pagination and filtering for ticket listings * Improve admin UI with role‑specific fieldsets - Bug Fixes * Remove obsolete serializers and placeholder files
43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
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
|