From c1405bbc8ae12acbe8a094286684550e5ea44f9c Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Sat, 9 Aug 2025 15:17:37 +0500 Subject: [PATCH] add project estimate apis --- .../projects/serializers/project_estimate.py | 24 +++++++++ core/apps/projects/urls.py | 9 ++++ core/apps/projects/views/project_estimate.py | 52 +++++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/core/apps/projects/serializers/project_estimate.py b/core/apps/projects/serializers/project_estimate.py index 96fbf3f..3ad4003 100644 --- a/core/apps/projects/serializers/project_estimate.py +++ b/core/apps/projects/serializers/project_estimate.py @@ -1,3 +1,5 @@ +from django.db import transaction + from rest_framework import serializers from core.apps.projects.models.project_estimate import EstimateProduct, EstimateWork, ProjectEstimate @@ -9,3 +11,25 @@ class ProjectEstimateListSerializer(serializers.ModelSerializer): fields = [ 'id', 'number', 'name' ] + + +class ProjectEstimateCreateSerializer(serializers.Serializer): + number = serializers.IntegerField() + name = serializers.CharField() + + def create(self, validated_data): + with transaction.atomic(): + return ProjectEstimate.objects.create( + number=validated_data.get('number'), + name=validated_data.get('name'), + ) + +class ProjectEstimateUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = ProjectEstimate + fields = ['name'] + + def update(self, instance, validated_data): + instance.name = validated_data.get('name', instance.name) + instance.save() + return instance \ No newline at end of file diff --git a/core/apps/projects/urls.py b/core/apps/projects/urls.py index 24b0308..fd670a0 100644 --- a/core/apps/projects/urls.py +++ b/core/apps/projects/urls.py @@ -2,6 +2,7 @@ from django.urls import path, include from core.apps.projects.views import project as project_views from core.apps.projects.views import builder as builder_views +from core.apps.projects.views import project_estimate as estimate_views urlpatterns = [ path('project/', include( @@ -29,5 +30,13 @@ urlpatterns = [ [ path('list/', builder_views.BuilderListApiView.as_view()), ] + )), + path('project_estimate/', include( + [ + path('list/', estimate_views.ProjectEstimateListApiView.as_view()), + path('create/', estimate_views.ProjectEstimateCreateApiView.as_view()), + path('/update/', estimate_views.ProjectEstimateUpdateApiView.as_view()), + path('/delete/', estimate_views.ProjectEstimateDeleteApiView.as_view()), + ] )) ] \ No newline at end of file diff --git a/core/apps/projects/views/project_estimate.py b/core/apps/projects/views/project_estimate.py index 98d3edf..6bf68a1 100644 --- a/core/apps/projects/views/project_estimate.py +++ b/core/apps/projects/views/project_estimate.py @@ -1,5 +1,57 @@ +from django.shortcuts import get_object_or_404 + from rest_framework import generics, views from rest_framework.response import Response from core.apps.accounts.permissions.permissions import HasRolePermission from core.apps.projects.models.project_estimate import ProjectEstimate, EstimateProduct, EstimateWork +from core.apps.projects.serializers import project_estimate as serializers + + +class ProjectEstimateListApiView(generics.ListAPIView): + serializer_class = serializers.ProjectEstimateListSerializer + queryset = ProjectEstimate.objects.all() + permission_classes = [HasRolePermission] + required_permissions = ['project'] + + +class ProjectEstimateCreateApiView(generics.GenericAPIView): + serializer_class = serializers.ProjectEstimateCreateSerializer + queryset = ProjectEstimate.objects.all() + permission_classes = [HasRolePermission] + required_permissions = ['project'] + + def post(self, request): + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + serializer.save() + return Response({"success": True, 'message': 'created'}, status=201) + return Response({"success": True, "message":serializer.errors}, status=400) + + +class ProjectEstimateUpdateApiView(generics.GenericAPIView): + serializer_class = serializers.ProjectEstimateUpdateSerializer + queryset = ProjectEstimate.objects.all() + permission_classes = [HasRolePermission] + required_permissions = ['project'] + + def patch(self, request, id): + estimate = get_object_or_404(ProjectEstimate, id=id) + serializer = self.serializer_class(data=request.data, instance=estimate) + if serializer.is_valid(): + serializer.save() + return Response({'success': True, 'message': 'updated'}, status=200) + return Response({'success': False, 'message': serializer.errors}, status=400) + + +class ProjectEstimateDeleteApiView(generics.GenericAPIView): + queryset = ProjectEstimate.objects.all() + serializer_class = None + permission_classes = [HasRolePermission] + required_permissions = ['project'] + + def delete(self, request, id): + estimte = get_object_or_404(ProjectEstimate, id=id) + estimte.delete() + return Response({"success": True, "message": "deleted"}, status=204) + \ No newline at end of file