From 4667da44f41f1c0c7b0bea0709c835810010a1a4 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Sat, 22 Nov 2025 17:14:08 +0500 Subject: [PATCH] ochirish va tahrirlash uchun apilar qoshildi --- core/apps/shared/serializers/place.py | 33 +++++++++++++++- core/apps/shared/urls.py | 2 + core/apps/shared/views/district.py | 53 +++++++++++++++++++++++++- core/apps/shared/views/place.py | 54 ++++++++++++++++++++++++++- 4 files changed, 138 insertions(+), 4 deletions(-) diff --git a/core/apps/shared/serializers/place.py b/core/apps/shared/serializers/place.py index 7a9615a..15de2fb 100644 --- a/core/apps/shared/serializers/place.py +++ b/core/apps/shared/serializers/place.py @@ -32,7 +32,7 @@ class PlaceCreateSerializer(serializers.Serializer): district_id = serializers.IntegerField() def validate_name(self, value): - if not Place.objects.filter(name=value).exists(): + if Place.objects.filter(name=value).exists(): raise serializers.ValidationError({"name": "Place bu name bilan mavjud"}) return value @@ -54,3 +54,34 @@ class PlaceCreateSerializer(serializers.Serializer): user=self.context.get('user'), ) + + +class PlaceUpdateSerializer(serializers.Serializer): + name = serializers.CharField(required=False) + latitude = serializers.FloatField(required=False) + longitude = serializers.FloatField(required=False) + extra_location = serializers.JSONField(required=False) + district_id = serializers.IntegerField(required=False) + + def validate_name(self, value): + if not Place.objects.filter(name=value).exists(): + raise serializers.ValidationError({"name": "Place bu name bilan mavjud"}) + return value + + def validate(self, data): + if data.get('district_id'): + district = District.objects.filter(id=data['district_id']).first() + if not district: + raise serializers.ValidationError({"district_id": "District not found"}) + data['district'] = district + return data + + def update(self, instance, validated_data): + with transaction.atomic(): + instance.name = validated_data.get('name', instance.name) + instance.latitude = validated_data.get('latitude', instance.latitude) + instance.longitude = validated_data.get('longitude', instance.longitude) + instance.extra_location = validated_data.get('extra_location', instance.extra_location) + instance.district = validated_data.get('district', instance.district) + instance.save() + return instance \ No newline at end of file diff --git a/core/apps/shared/urls.py b/core/apps/shared/urls.py index 4f9b8e5..fa15bdc 100644 --- a/core/apps/shared/urls.py +++ b/core/apps/shared/urls.py @@ -20,6 +20,7 @@ urlpatterns = [ [ path('list/', dis_view.DistrictListApiView.as_view(), name='district-list-api'), path('create/', dis_view.DistrictCreateApiView.as_view(), name='district-create-api'), + path('/', dis_view.DistrictDeleteUpdateApiView.as_view(), name='district-update-delete-api'), ], )), # place @@ -27,6 +28,7 @@ urlpatterns = [ [ path('list/', pl_view.PlaceListApiView.as_view(), name='place-list-api'), path('create/', pl_view.PlaceCreateApiView.as_view(), name='place-create-api'), + path('/', pl_view.PlaceDeleteUpdateApiView.as_view(), name='place-update-delete-api'), ] )), ] \ No newline at end of file diff --git a/core/apps/shared/views/district.py b/core/apps/shared/views/district.py index 280c82f..a68f2f0 100644 --- a/core/apps/shared/views/district.py +++ b/core/apps/shared/views/district.py @@ -1,3 +1,6 @@ +# django +from django.shortcuts import get_object_or_404 + # rest framework from rest_framework import generics, permissions @@ -58,4 +61,52 @@ class DistrictCreateApiView(generics.CreateAPIView, ResponseMixin): ) return self.failure_response(data=serializer.errors, message='malumot qoshilmadi') except Exception as e: - return self.error_response(data=str(e), message='xatolik') \ No newline at end of file + return self.error_response(data=str(e), message='xatolik') + + +class DistrictDeleteUpdateApiView(generics.GenericAPIView, ResponseMixin): + serializer_class = district_serializers.DistrictSerializer + queryset = District.objects.all() + permission_classes = [permissions.IsAuthenticated] + + @swagger_auto_schema( + responses={ + 200: base_serializers.SuccessResponseSerializer(), + 400: base_serializers.BaseResponseSerializer(), + 500: base_serializers.BaseResponseSerializer(), + } + ) + def patch(self, request, id): + try: + obj = get_object_or_404(District, id=id, user=request.user) + serializer = self.serializer_class(data=request.data, instance=obj) + if serializer.is_valid(): + name = serializer.validated_data.get('name') + obj.name = name + obj.save() + return self.success_response( + data=district_serializers.DistrictSerializer(obj).data, + message='Malumot tahrilandi' + ) + return self.failure_response( + data=serializer.errors, + message='Malumot tahrirlanmadi' + ) + except Exception as e: + return self.error_response(data=str(e), message='xatolik') + + + @swagger_auto_schema( + responses={ + 204: base_serializers.SuccessResponseSerializer(), + 400: base_serializers.BaseResponseSerializer(), + 500: base_serializers.BaseResponseSerializer(), + } + ) + def delete(self, request, id): + try: + obj = get_object_or_404(District, id=id, user=request.user) + obj.delete() + return self.success_response(message='Malumot ochirildi', status_code=204) + except Exception as e: + return self.error_response(data=str(e), message='xatolik') diff --git a/core/apps/shared/views/place.py b/core/apps/shared/views/place.py index bf5564f..75d583b 100644 --- a/core/apps/shared/views/place.py +++ b/core/apps/shared/views/place.py @@ -1,3 +1,6 @@ +# django +from django.shortcuts import get_object_or_404 + # rest framework from rest_framework import generics, permissions @@ -7,7 +10,7 @@ from drf_yasg.utils import swagger_auto_schema # shared from core.apps.shared.models import Place from core.apps.shared.serializers import base as base_serializer -from core.apps.shared.serializers.place import PlaceSerializer, PlaceCreateSerializer +from core.apps.shared.serializers.place import PlaceSerializer, PlaceCreateSerializer, PlaceUpdateSerializer from core.apps.shared.utils.response_mixin import ResponseMixin # accounts @@ -66,4 +69,51 @@ class PlaceCreateApiView(generics.GenericAPIView, ResponseMixin): return self.success_response(data=PlaceSerializer(instance).data, message='malumot qoshildi') return self.failure_response(data=serializer.errors, message='malumot qoshilmadi') except Exception as e: - return self.error_response(data=str(e), message='xatolik') \ No newline at end of file + return self.error_response(data=str(e), message='xatolik') + + + +class PlaceDeleteUpdateApiView(generics.GenericAPIView, ResponseMixin): + serializer_class = PlaceUpdateSerializer + queryset = Place.objects.all() + permission_classes = [permissions.IsAuthenticated] + + @swagger_auto_schema( + responses={ + 200: base_serializer.SuccessResponseSerializer(), + 400: base_serializer.BaseResponseSerializer(), + 500: base_serializer.BaseResponseSerializer(), + } + ) + def patch(self, request, id): + try: + obj = get_object_or_404(Place, id=id, user=request.user) + serializer = self.serializer_class(data=request.data, instance=obj) + if serializer.is_valid(): + instance = serializer.save() + return self.success_response( + data=PlaceSerializer(instance).data, + message='Malumot tahrilandi' + ) + return self.failure_response( + data=serializer.errors, + message='Malumot tahrirlanmadi' + ) + except Exception as e: + return self.error_response(data=str(e), message='xatolik') + + + @swagger_auto_schema( + responses={ + 204: base_serializer.SuccessResponseSerializer(), + 400: base_serializer.BaseResponseSerializer(), + 500: base_serializer.BaseResponseSerializer(), + } + ) + def delete(self, request, id): + try: + obj = get_object_or_404(Place, id=id, user=request.user) + obj.delete() + return self.success_response(message='Malumot ochirildi', status_code=204) + except Exception as e: + return self.error_response(data=str(e), message='xatolik')