Files
ibapp-backend/core/apps/projects/views/project.py
2025-10-06 14:42:47 +05:00

194 lines
7.1 KiB
Python

from django.shortcuts import get_object_or_404
from django.db.models import Prefetch, Q
from rest_framework import generics, status, views
from rest_framework.response import Response
from core.apps.projects.models.project import Project, ProjectFolder
from core.apps.projects.serializers import project as serializers
from core.apps.accounts.permissions.permissions import HasRolePermission
from core.apps.shared.paginations.custom import CustomPageNumberPagination
class ProjectListApiView(generics.ListAPIView):
serializer_class = serializers.ProjectListSerializer
queryset = Project.objects.all()
permission_classes = [HasRolePermission]
pagination_class = CustomPageNumberPagination
def get(self, request):
mine = request.query_params.get('is_mine')
queryset = Project.objects.select_related('location').exclude(is_archive=True).exclude(folder__isnull=False)
if mine and mine.lower() == 'true':
queryset = queryset.filter(Q(boss=request.user) | Q(foreman=request.user) | Q(other_members=request.user))
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
class ArchivedProjectListApiView(generics.ListAPIView):
serializer_class = serializers.ProjectListSerializer
queryset = Project.objects.all()
permission_classes = [HasRolePermission]
pagination_class = CustomPageNumberPagination
def get_queryset(self):
return (
Project.objects
.select_related('location')
.exclude(is_archive=False)
)
class ProjectDetailApiView(generics.RetrieveAPIView):
serializer_class = serializers.ProjectDetailSerialzier
queryset = Project.objects.select_related('location', 'folder', 'builder').prefetch_related(
'boss', 'foreman', 'other_members', 'wherehouse', 'cash_transaction',
)
permission_classes = [HasRolePermission]
lookup_field = 'id'
class ProjectCreateApiView(generics.CreateAPIView):
serializer_class = serializers.ProjectCreateSerializer
queryset = Project.objects.all()
permission_classes = [HasRolePermission]
class ProjectUpdateApiView(generics.UpdateAPIView):
serializer_class = serializers.ProjectUpdateSerialzier
queryset = Project.objects.all()
permission_classes = [HasRolePermission]
lookup_field = 'id'
class ProjectDeleteApiView(generics.DestroyAPIView):
permission_classes = [HasRolePermission]
lookup_field = 'id'
queryset = Project.objects.all()
class ArchiveProjectApiView(generics.GenericAPIView):
serializer_class = None
permission_classes = [HasRolePermission]
def get(self, request, id):
project = get_object_or_404(Project, id=id)
project.is_archive = True
project.save()
return Response({"success": True, "message": "Archived"}, status=200)
class UnArchiveProjectApiView(views.APIView):
permission_classes = [HasRolePermission]
def get(self, request, id):
project = get_object_or_404(Project, id=id)
project.is_archive = False
project.save()
return Response({"success": True, "message": "Un Archived"}, status=200)
# Project Folder
class ProjectFolderCreateApiView(generics.CreateAPIView):
serializer_class = serializers.ProjectFolderCreateSerializer
queryset = ProjectFolder.objects.all()
permission_classes = [HasRolePermission]
class ProjectFolderListApiView(generics.ListAPIView):
serializer_class = serializers.ProjectFolderListSerializer
queryset = ProjectFolder.objects.prefetch_related('projects')
permission_classes = [HasRolePermission]
pagination_class = CustomPageNumberPagination
class ProjectFolderCreateProjectApiView(generics.CreateAPIView):
serializer_class = serializers.ProjectFolderProjectCreateSerializer
queryset = Project.objects.all()
permission_classes = [HasRolePermission]
class ProjectFolderUpdateApiView(generics.GenericAPIView):
serializer_class = serializers.ProjectFolderUpdateSerializer
queryset = ProjectFolder.objects.all()
permission_classes = [HasRolePermission]
def put(self, request, id):
folder = get_object_or_404(ProjectFolder, id=id)
serializer = self.serializer_class(data=request.data, instance=folder)
if serializer.is_valid():
serializer.save()
return Response({'success':True, 'message': "Folder updated!"}, status=200)
return Response({"success": False, 'message': serializer.errors}, status=400)
class ProjectFolderDetailApiView(generics.GenericAPIView):
serializer_class = serializers.ProjectFolderDetailSerializer
queryset = ProjectFolder.objects.select_related('projects')
permission_classes = [HasRolePermission]
def get(self, request, id):
folder = (
ProjectFolder.objects
.prefetch_related(
Prefetch('projects', queryset=Project.objects.exclude(is_archive=True))
)
.get(id=id)
)
serializer = self.serializer_class(folder)
return Response(serializer.data, status=200)
class ProjectFolderDeleteApiView(views.APIView):
permission_classes = [HasRolePermission]
def delete(self, request, id):
folder = get_object_or_404(ProjectFolder, id=id)
folder.delete()
return Response({"success": True, "message": 'deleted!'}, status=204)
class ChangeProjectFolderApiView(generics.GenericAPIView):
serializer_class = serializers.ChangeProjectFolderSerializer
queryset = Project.objects.all()
def post(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
project = serializer.validated_data.get('project')
folder = serializer.validated_data.get('project_folder')
project.folder = folder
project.save()
return Response(
{'success': True, 'message': 'Project Folder changed!'},
status=200
)
return Response(
{'success': False, 'message': serializer.errors}, status=400
)
class ProjectAndFolderApiView(views.APIView):
permission_classes = [HasRolePermission]
def get(self, request):
mine = request.query_params.get('is_mine')
wherehouse_ids = request.query_params.getlist('wherehouse')
folders = ProjectFolder.objects.prefetch_related('projects')
projects = Project.objects.exclude(folder__isnull=False)
if mine and mine.lower() == 'true':
projects = projects.filter(Q(boss=request.user) | Q(foreman=request.user) | Q(other_members=request.user))
if wherehouse_ids:
projects = projects.filter(wherehouse__in=wherehouse_ids)
projects_serializer = serializers.ProjectsSerializer(projects, many=True)
folders_serializer = serializers.ProjectFoldersSerializer(folders, many=True)
return Response(
{
'project_folders': folders_serializer.data,
'projects': projects_serializer.data,
},
status=200
)