From 5df85f1a85706f0ed8209280c969d6e1b171e9c7 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Wed, 13 Aug 2025 12:41:30 +0500 Subject: [PATCH] change api --- .../contracts/serializers/contract_side.py | 5 +++ core/apps/contracts/urls.py | 2 +- core/apps/contracts/views/contract_side.py | 37 +++++++++++++++---- docker-compose.yaml | 10 ++--- docker/Dockerfile.web | 28 ++++---------- requirements.txt | 2 +- 6 files changed, 49 insertions(+), 35 deletions(-) diff --git a/core/apps/contracts/serializers/contract_side.py b/core/apps/contracts/serializers/contract_side.py index b0b2d69..f1109f2 100644 --- a/core/apps/contracts/serializers/contract_side.py +++ b/core/apps/contracts/serializers/contract_side.py @@ -25,6 +25,11 @@ class ContractSideCreateSerializer(serializers.Serializer): return data + +class ContractSideListCreateSerializer(serializers.Serializer): + contract_side = ContractSideCreateSerializer(many=True) + + class ContractSideListSerializer(serializers.ModelSerializer): contract_signature = serializers.SerializerMethodField(method_name='get_contract_signature') diff --git a/core/apps/contracts/urls.py b/core/apps/contracts/urls.py index 755fd85..3d6d3c6 100644 --- a/core/apps/contracts/urls.py +++ b/core/apps/contracts/urls.py @@ -14,7 +14,7 @@ urlpatterns = [ ] )), path('contract_side/', include([ - path('create/', contract_side_views.ConstartSideCreateApiView.as_view(), name='contract-side-create'), + path('create/', contract_side_views.ContractSideCreateApiView.as_view(), name='contract-side-create'), ] )), path('contract_signature/', include( diff --git a/core/apps/contracts/views/contract_side.py b/core/apps/contracts/views/contract_side.py index 62a8872..6bbf80b 100644 --- a/core/apps/contracts/views/contract_side.py +++ b/core/apps/contracts/views/contract_side.py @@ -1,20 +1,41 @@ +from django.db import transaction + from rest_framework import generics, status, parsers from rest_framework.response import Response from core.apps.contracts.serializers import contract_side as contract_side_serializer -from core.apps.contracts.models.contract import ContractSide +from core.apps.contracts.models.contract import ContractSide, Contract from core.apps.contracts.tasks.contract_side import create_contract_side from core.apps.shared.utils.response import error_message, success_message +from core.apps.accounts.models import User -class ConstartSideCreateApiView(generics.GenericAPIView): - serializer_class = contract_side_serializer.ContractSideCreateSerializer +class ContractSideCreateApiView(generics.GenericAPIView): + serializer_class = contract_side_serializer.ContractSideListCreateSerializer queryset = ContractSide.objects.all() + @transaction.atomic def post(self, request): serializer = self.serializer_class(data=request.data) if serializer.is_valid(): - # TODO: call celery task - create_contract_side.delay(serializer.validated_data) - return success_message("Contract side created", 201) - return error_message(serializer.error_messages, 400) - + try: + with transaction.atomic(): + for side_data in serializer.validated_data['contract_side']: + user = User.objects.get(phone=side_data['phone']) + contract = Contract.objects.get(id=side_data['contract_id']) + ContractSide.objects.create( + full_name=side_data['full_name'], + indentification=side_data['indentification'], + position=side_data.get('position', ''), + has_indentification=side_data['has_indentification'], + user_role=side_data['user_role'], + # phone=side_data['phone'], + contract=contract, + user=user + ) + return success_message("Contract side created", 201) + + except Exception as e: + transaction.set_rollback(True) + return error_message(str(e), 400) + + return error_message(serializer.errors, 400) \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index efbfb6b..21c1f3f 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -27,7 +27,7 @@ services: build: context: . dockerfile: ./docker/Dockerfile.web - restart: always + # restart: always command: sh resources/scripts/entrypoint.sh environment: - PYTHONPYCACHEPREFIX=/var/cache/pycache @@ -54,13 +54,13 @@ services: - web networks: - trustme - restart: always + # restart: always db: image: postgres:16 networks: - trustme - restart: always + # restart: always environment: POSTGRES_DB: ${DB_NAME} POSTGRES_USER: ${DB_USER} @@ -76,7 +76,7 @@ services: restart: always image: redis:latest ports: - - 6379:6379 + - 6380:6379 bot: build: @@ -84,4 +84,4 @@ services: dockerfile: Dockerfile volumes: - /home/behruz/bots/send-verification-code:/bot - restart: unless-stopped + # restart: unless-stopped diff --git a/docker/Dockerfile.web b/docker/Dockerfile.web index 8435355..5472b77 100644 --- a/docker/Dockerfile.web +++ b/docker/Dockerfile.web @@ -1,25 +1,13 @@ -FROM python:3.12 +FROM python:3.12-alpine + +ENV PYTHONPYCACHEPREFIX=/dev/null + +RUN apk update && apk add git gettext WORKDIR /code -RUN apt-get update && \ - apt-get install -y \ - gdal-bin \ - libgdal-dev \ - python3-gdal \ - libgeos-dev \ - libproj-dev \ - g++ \ - make \ - wkhtmltopdf && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* +COPY requirements.txt /code/requirements.txt +RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt -RUN gdalinfo --version - -COPY . . - -RUN --mount=type=cache,target=/root/.cache/pip python3 -m pip install -r requirements.txt - -CMD ["sh", "./resources/scripts/entrypoint.sh"] \ No newline at end of file +CMD ["sh", "./entrypoint.sh"] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 16bc259..5e3e0d4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ django==5.2 gunicorn uvicorn -psycopg2 +psycopg2-binary django-environ==0.12.0 pillow djangorestframework_simplejwt==5.5.0