diff --git a/core/apps/dashboard/serializers/plan.py b/core/apps/dashboard/serializers/plan.py index a6e65fb..e6d98f7 100644 --- a/core/apps/dashboard/serializers/plan.py +++ b/core/apps/dashboard/serializers/plan.py @@ -62,6 +62,9 @@ class PlanUpdateSerializer(serializers.ModelSerializer): 'date', 'user', ] + extra_kwargs = { + "user": {"required": False} + } def update(self, instance, validated_data): with transaction.atomic(): diff --git a/core/apps/dashboard/urls.py b/core/apps/dashboard/urls.py index e05902b..2f5191f 100644 --- a/core/apps/dashboard/urls.py +++ b/core/apps/dashboard/urls.py @@ -13,6 +13,8 @@ from core.apps.dashboard.views import district as district_views from core.apps.dashboard.views.doctor import DoctorViewSet # region from core.apps.dashboard.views import region as region_views +# plan +from core.apps.dashboard.views.plan import PlanViewSet urlpatterns = [ # -------------- user -------------- @@ -49,5 +51,6 @@ urlpatterns = [ ### ViewSets ### router = DefaultRouter() router.register("doctor", DoctorViewSet) +router.register("plan", PlanViewSet) urlpatterns += router.urls \ No newline at end of file diff --git a/core/apps/dashboard/views/plan.py b/core/apps/dashboard/views/plan.py new file mode 100644 index 0000000..f9a9af7 --- /dev/null +++ b/core/apps/dashboard/views/plan.py @@ -0,0 +1,179 @@ +# 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 plan as serializers + +# shared +from core.apps.shared.models import Plan +from core.apps.shared.utils.response_mixin import ResponseMixin + + +class PlanViewSet(viewsets.GenericViewSet, ResponseMixin): + permission_classes = [permissions.IsAdminUser] + queryset = Plan.objects.all() + + def get_serializer_class(self): + if self.action == "post": + return serializers.PlanCreateSerializer + elif self.action in ("patch", "put"): + return serializers.PlanUpdateSerializer + else: + return serializers.PlanListSerializer + + @swagger_auto_schema( + tags=['Admin Plans'], + manual_parameters=[ + openapi.Parameter( + in_=openapi.IN_QUERY, + name="status", + description="reja satatus bo'yicha filter", + required=False, + type=openapi.TYPE_BOOLEAN, + ), + openapi.Parameter( + in_=openapi.IN_QUERY, + name="date", + description="reja date bo'yicha filter", + required=False, + type=openapi.FORMAT_DATE, + ), + openapi.Parameter( + in_=openapi.IN_QUERY, + name="user", + description="qo'shgan foydalanuvchini ism va familiyasi bo'yicha qidirish", + required=False, + type=openapi.TYPE_STRING, + ), + ], + ) + @action(detail=False, methods=['get'], url_path="list") + def get(self, request): + try: + # params + status = request.query_params.get('status', None) + date = request.query_params.get('date', None) + user_full_name = request.query_params.get('user', None) + + queryset = self.queryset.all() + + # filters + if status is not None: + queryset = queryset.filter( + is_done=True if status == 'true' else False + ) + + if date is not None: + queryset = queryset.filter(date=date) + + if user_full_name is not None: + queryset = queryset.filter( + Q(user__first_name__istartswith=user_full_name) | + Q(user__last_name__istartswith=user_full_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 Plans'] + ) + @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.PlanListSerializer(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 Plans'] + ) + @action(detail=True, methods=['patch'], url_path='update') + def update_doctor(self, request, pk=None): + try: + plan = Plan.objects.filter(id=pk).first() + if not plan: + return self.failure_response( + data={}, + message="plan topilmadi", + status_code=404 + ) + serializer = self.get_serializer(data=request.data, instance=plan) + if serializer.is_valid(): + obj = serializer.save() + return self.success_response( + data=serializers.PlanListSerializer(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 Plans'] + ) + @action(detail=True, methods=['delete'], url_path='delete') + def delete(self, request, pk=None): + try: + plan = Plan.objects.filter(id=pk).first() + if not plan: + return self.failure_response( + data={}, + message="plan topilmadi", + status_code=404 + ) + plan.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