This commit is contained in:
behruz-dev
2025-08-09 12:25:53 +05:00
parent c902a09c7b
commit cd06aef4e1
3 changed files with 1040 additions and 22 deletions

View File

@@ -4,26 +4,22 @@ from rest_framework import serializers
from core.apps.projects.models.project import Project, ProjectFolder, ProjectLocation
from core.apps.projects.serializers.project_location import ProjectLocationSerializer, ProjectLocationListSerializer
from core.apps.accounts.serializers.user import UserListSerializer
from core.apps.wherehouse.serializers.wherehouse import WhereHouseListSerializer
from core.apps.finance.serializers.cash_transaction import CashTransactionListSerializer
class ProjectListSerializer(serializers.ModelSerializer):
location = ProjectLocationListSerializer()
folder_name = serializers.SerializerMethodField(method_name='get_folder_name')
class Meta:
model = Project
fields = [
'id', 'name', 'location', 'start_date', 'end_date'
'id', 'name', 'start_date', 'end_date', 'status', 'folder_name'
]
class ProjectDetailSerialzier(serializers.ModelSerializer):
location = ProjectLocationListSerializer()
class Meta:
model = Project
fields = [
'id', 'name', 'location', 'start_date', 'end_date', 'status', 'benifit_plan'
]
def get_folder_name(self, obj):
return obj.folder.name if obj.folder else None
class ProjectUpdateSerialzier(serializers.ModelSerializer):
@@ -142,11 +138,14 @@ class ProjectFolderCreateSerializer(serializers.Serializer):
class ProjectFolderListSerializer(serializers.ModelSerializer):
projects = ProjectListSerializer(many=True)
projects_count = serializers.SerializerMethodField(method_name='get_projects_count')
class Meta:
model = ProjectFolder
fields = ['id', 'name', 'projects']
fields = ['id', 'name', 'projects_count']
def get_projects_count(self, obj):
return obj.projects.count()
class ProjectFolderProjectCreateSerializer(serializers.Serializer):
@@ -257,4 +256,31 @@ class ChangeProjectFolderSerializer(serializers.Serializer):
raise serializers.ValidationError("the project folder is attached for this project")
data['project'] = project
data['project_folder'] = project_folder
return data
return data
class ProjectDetailSerialzier(serializers.ModelSerializer):
location = ProjectLocationListSerializer()
folder = ProjectFolderListSerializer()
builder = serializers.SerializerMethodField(method_name='get_builder')
boss = UserListSerializer(many=True)
foreman = UserListSerializer(many=True)
other_members = UserListSerializer(many=True)
wherehouse = WhereHouseListSerializer(many=True)
cash_transaction = CashTransactionListSerializer(many=True)
class Meta:
model = Project
fields = [
'id', 'name', 'location', 'start_date', 'end_date', 'status', 'benifit_plan',
'area', 'currency',
'folder', 'builder', 'boss', 'foreman', 'other_members', 'wherehouse', 'cash_transaction', 'is_archive'
]
def get_builder(self, obj):
return {
'id': obj.builder.id,
'name': obj.builder.name
}

View File

@@ -12,18 +12,24 @@ from core.apps.shared.paginations.custom import CustomPageNumberPagination
class ProjectListApiView(generics.ListAPIView):
serializer_class = serializers.ProjectListSerializer
queryset = Project.objects.filter(is_archive=False).select_related('location')
queryset = Project.objects.all()
permission_classes = [HasRolePermission]
required_permissions = ['project']
pagination_class = CustomPageNumberPagination
def get_queryset(self):
return Project.objects.exclude(folder__isnull=False)
return (
Project.objects
.select_related('location')
.exclude(is_archive=True)
.exclude(folder__isnull=False)
)
class ProjectDetailApiView(generics.RetrieveAPIView):
serializer_class = serializers.ProjectDetailSerialzier
queryset = Project.objects.select_related('location')
queryset = Project.objects.select_related('location', 'folder', 'builder').prefetch_related(
'boss', 'foreman', 'other_members', 'wherehouse', 'cash_transaction',
)
permission_classes = [HasRolePermission]
required_permissions = ['project']
lookup_field = 'id'
@@ -73,9 +79,7 @@ class ProjectFolderCreateApiView(generics.CreateAPIView):
class ProjectFolderListApiView(generics.ListAPIView):
serializer_class = serializers.ProjectFolderListSerializer
queryset = ProjectFolder.objects.prefetch_related(
Prefetch('projects', Project.objects.filter(is_archive=False))
)
queryset = ProjectFolder.objects.prefetch_related('projects')
permission_classes = [HasRolePermission]
required_permissions = ['project_folder']
pagination_class = CustomPageNumberPagination
@@ -110,7 +114,13 @@ class ProjectFolderDetailApiView(generics.GenericAPIView):
required_permissions = ['project_folder']
def get(self, request, id):
folder = get_object_or_404(ProjectFolder, id=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)