From 2d2a0b521c557cbe8f8940b697d76580df9a4a5b Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Mon, 1 Dec 2025 15:06:18 +0500 Subject: [PATCH] product uchun crud qoshildi --- core/apps/dashboard/serializers/product.py | 43 ++++++ core/apps/dashboard/urls.py | 3 + core/apps/dashboard/views/product.py | 152 +++++++++++++++++++++ 3 files changed, 198 insertions(+) create mode 100644 core/apps/dashboard/serializers/product.py create mode 100644 core/apps/dashboard/views/product.py diff --git a/core/apps/dashboard/serializers/product.py b/core/apps/dashboard/serializers/product.py new file mode 100644 index 0000000..e88f2f4 --- /dev/null +++ b/core/apps/dashboard/serializers/product.py @@ -0,0 +1,43 @@ +# django +from django.db import transaction + +# rest framework +from rest_framework import serializers + +# orders +from core.apps.orders.models import Product + + +class ProductListSerializer(serializers.ModelSerializer): + class Meta: + model = Product + fields = [ + 'id', 'name', 'price', 'created_at' + ] + + +class ProductCreateSerializer(serializers.Serializer): + name = serializers.CharField() + price = serializers.DecimalField(decimal_places=2, max_digits=15) + + def create(self, validated_data): + with transaction.atomic(): + return Product.objects.create( + name=validated_data.get('name'), + price=validated_data.get('price'), + ) + + +class ProductUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = Product + fields = [ + 'name', 'price' + ] + + def update(self, instance, validated_data): + with transaction.atomic(): + instance.name = validated_data.get('name', instance.name) + instance.price = validated_data.get('price', instance.price) + instance.save() + return instance diff --git a/core/apps/dashboard/urls.py b/core/apps/dashboard/urls.py index 7f28aa3..e765926 100644 --- a/core/apps/dashboard/urls.py +++ b/core/apps/dashboard/urls.py @@ -19,6 +19,8 @@ from core.apps.dashboard.views.plan import PlanViewSet from core.apps.dashboard.views.place import PlaceViewSet # pharmacy from core.apps.dashboard.views.pharmacy import PharmacyViewSet +# product +from core.apps.dashboard.views.product import ProductViewSet urlpatterns = [ # -------------- user -------------- @@ -58,5 +60,6 @@ router.register("doctor", DoctorViewSet) router.register("plan", PlanViewSet) router.register("place", PlaceViewSet) router.register("pharmacy", PharmacyViewSet) +router.register("product", ProductViewSet) urlpatterns += router.urls \ No newline at end of file diff --git a/core/apps/dashboard/views/product.py b/core/apps/dashboard/views/product.py new file mode 100644 index 0000000..477ed7f --- /dev/null +++ b/core/apps/dashboard/views/product.py @@ -0,0 +1,152 @@ +# django +from django.db.models import Q + +# rest framework +from rest_framework import viewsets, permissions +from rest_framework.decorators import action + +# drf yasg +from drf_yasg import openapi +from drf_yasg.utils import swagger_auto_schema + +# dashboard +from core.apps.dashboard.serializers import product as serializers +# orders +from core.apps.orders.models import Product +# shared +from core.apps.shared.utils.response_mixin import ResponseMixin + + +class ProductViewSet(viewsets.GenericViewSet, ResponseMixin): + permission_classes = [permissions.IsAdminUser] + queryset = Product.objects.all() + + def get_serializer_class(self): + if self.action == "post": + return serializers.ProductCreateSerializer + elif self.action in ["patch", "put"]: + return serializers.ProductUpdateSerializer + else: + return serializers.ProductListSerializer + + @swagger_auto_schema( + tags=['Admin Products'], + manual_parameters=[ + openapi.Parameter( + in_=openapi.IN_QUERY, + name="name", + description="name bo'yicha filter", + required=False, + type=openapi.TYPE_STRING, + ), + ], + ) + @action(detail=False, methods=['get'], url_path="list") + def get(self, request): + try: + # params + name = request.query_params.get('name', None) + + queryset = self.queryset.all() + + # filters + if name is not None: + queryset = queryset.filter(name__istartswith=name) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.success_response( + data=self.get_paginated_response(serializer.data).data, + message='malumotlar fetch qilindi' + ) + serializer = self.get_serializer(queryset, many=True) + return self.success_response( + data=serializer.data, + message='malumotlar fetch qilindi' + ) + except Exception as e: + return self.error_response( + data=str(e), + message="xatolik" + ) + + @swagger_auto_schema( + tags=['Admin Products'] + ) + @action(detail=False, methods=['post'], url_path='create') + def post(self, request): + try: + serializer = self.get_serializer(data=request.data) + if serializer.is_valid(): + obj = serializer.save() + return self.success_response( + data=serializers.ProductListSerializer(obj).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" + ) + + @swagger_auto_schema( + tags=['Admin Products'] + ) + @action(detail=True, methods=['patch'], url_path='update') + def update_doctor(self, request, pk=None): + try: + product = Product.objects.filter(id=pk).first() + if not product: + return self.failure_response( + data={}, + message="product topilmadi", + status_code=404 + ) + serializer = self.get_serializer(data=request.data, instance=product) + if serializer.is_valid(): + obj = serializer.save() + return self.success_response( + data=serializers.ProductListSerializer(obj).data, + message='malumot tahrirlandi' + ) + return self.failure_response( + data=serializer.errors, + message='malumot tahrirlandi' + ) + except Exception as e: + return self.error_response( + data=str(e), + message="xatolik" + ) + + @swagger_auto_schema( + tags=['Admin Products'] + ) + @action(detail=True, methods=['delete'], url_path='delete') + def delete(self, request, pk=None): + try: + product = Product.objects.filter(id=pk).first() + if not product: + return self.failure_response( + data={}, + message="product topilmadi", + status_code=404 + ) + product.delete() + return self.success_response( + data={}, + message='malumot ochirildi', + status_code=204 + ) + except Exception as e: + return self.error_response( + data=str(e), + message="xatolik" + ) + + \ No newline at end of file