197 lines
7.2 KiB
Python
197 lines
7.2 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)).distinct()
|
|
if wherehouse_ids:
|
|
projects = projects.filter(wherehouse__in=wherehouse_ids)
|
|
projects_serializer = serializers.ProjectsSerializer(projects, many=True)
|
|
folders_serializer = serializers.ProjectFoldersSerializer(
|
|
folders, many=True,
|
|
context={'user': request.user, 'is_mine': mine}
|
|
)
|
|
return Response(
|
|
{
|
|
'project_folders': folders_serializer.data,
|
|
'projects': projects_serializer.data,
|
|
},
|
|
status=200
|
|
)
|