From 5ce8cc2ed371dfcd93e78691247085a3a4d935cc Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Wed, 3 Sep 2025 14:21:22 +0500 Subject: [PATCH] add: add new apis for admin panel --- core/apps/admin_panel/serializers/category.py | 11 ++++ core/apps/admin_panel/serializers/product.py | 18 ++++++ core/apps/admin_panel/urls.py | 12 ++++ core/apps/admin_panel/views/category.py | 63 +++++++++++++++++++ core/apps/admin_panel/views/user.py | 15 ++++- 5 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 core/apps/admin_panel/serializers/category.py create mode 100644 core/apps/admin_panel/serializers/product.py create mode 100644 core/apps/admin_panel/views/category.py diff --git a/core/apps/admin_panel/serializers/category.py b/core/apps/admin_panel/serializers/category.py new file mode 100644 index 0000000..520866e --- /dev/null +++ b/core/apps/admin_panel/serializers/category.py @@ -0,0 +1,11 @@ +from rest_framework import serializers + +from core.apps.products.models import Category + + +class CategorySerializer(serializers.ModelSerializer): + class Meta: + model = Category + fields = [ + 'id', 'name' + ] diff --git a/core/apps/admin_panel/serializers/product.py b/core/apps/admin_panel/serializers/product.py new file mode 100644 index 0000000..3885277 --- /dev/null +++ b/core/apps/admin_panel/serializers/product.py @@ -0,0 +1,18 @@ +from rest_framework import serializers + +from core.apps.products.models import Product + + +# class ProductListSerializer(serializers.ModelSerializer): +# class Meta: +# model = Product +# fields = [ +# 'id', 'name', 'image', 'category', 'price', 'description', 'unity' +# ] + +# def get_category(self, obj): +# return { +# '' +# } + + \ No newline at end of file diff --git a/core/apps/admin_panel/urls.py b/core/apps/admin_panel/urls.py index aa80456..48523ba 100644 --- a/core/apps/admin_panel/urls.py +++ b/core/apps/admin_panel/urls.py @@ -3,6 +3,9 @@ from django.urls import path, include from core.apps.admin_panel.views import user as user_views from core.apps.admin_panel.views import banner as banner_views from core.apps.admin_panel.views import unity as unity_views +from core.apps.admin_panel.views import category as category_views + + urlpatterns = [ path('user/', include( @@ -12,6 +15,7 @@ urlpatterns = [ path('/update/', user_views.UserUpdateApiView.as_view()), path('/delete/', user_views.UserDeleteApiView.as_view()), path('/', user_views.UserDetailApiView.as_view()), + path('dashboard/', user_views.UserDashboardApiView.as_view()), ] )), path('banner/', include( @@ -32,4 +36,12 @@ urlpatterns = [ path('/delete/', unity_views.UnityDeleteApiView.as_view()), ] )), + path('category/', include( + [ + path('create/', category_views.CategoryCreateApiView.as_view()), + path('list/', category_views.CategoryListApiView.as_view()), + path('/update/', category_views.CategoryUpdateApiView.as_view()), + path('/delete/', category_views.CategoryDeleteApiView.as_view()), + ] + )), ] \ No newline at end of file diff --git a/core/apps/admin_panel/views/category.py b/core/apps/admin_panel/views/category.py new file mode 100644 index 0000000..5f5d208 --- /dev/null +++ b/core/apps/admin_panel/views/category.py @@ -0,0 +1,63 @@ +from django.shortcuts import get_object_or_404 + +from rest_framework import generics, views, permissions, status + +from core.apps.shared.mixins.response import ResponseMixin +from core.apps.products.models import Category +from core.apps.admin_panel.serializers.category import CategorySerializer + + +class CategoryListApiView(generics.GenericAPIView): + serializer_class = CategorySerializer + queryset = Category.objects.all() + permission_classes = [permissions.IsAdminUser] + + def get(self, request): + page = self.paginate_queryset(self.queryset) + if page is not None: + serializer = self.serializer_class(page, many=True) + return self.get_paginated_response(serializer.data) + + +class CategoryCreateApiView(generics.GenericAPIView, ResponseMixin): + serializer_class = CategorySerializer + queryset = Category.objects.all() + permission_classes = [permissions.IsAdminUser] + + def post(self, request): + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(raise_exception=True): + serializer.save() + return self.success_response( + message='kategoriya qoshildi', status_code=status.HTTP_201_CREATED + ) + return self.failure_response(message='kategoriya qoshishda hatolik', data=serializer.errors) + + +class CategoryDeleteApiView(generics.GenericAPIView, ResponseMixin): + serializer_class = None + queryset = Category.objects.all() + permission_classes = [permissions.IsAdminUser] + + def delete(self, request, id): + category = get_object_or_404(Category, id=id) + category.delete() + return self.success_response( + message='kategoriya ochirildi', status_code=status.HTTP_204_NO_CONTENT + ) + + +class CategoryUpdateApiView(generics.GenericAPIView, ResponseMixin): + serializer_class = CategorySerializer + queryset = Category.objects.all() + permission_classes = [permissions.IsAdminUser] + + def patch(self, request, id): + category = get_object_or_404(Category, id=id) + serializer = self.serializer_class(data=request.data, instance=category) + if serializer.is_valid(raise_exception=True): + serializer.save() + return self.success_response(message='kategoriya tahrirlandi') + return self.failure_response(data=serializer.errors, message='kategoriya tahrirlashda hatolik') + + diff --git a/core/apps/admin_panel/views/user.py b/core/apps/admin_panel/views/user.py index b849d38..ccb266c 100644 --- a/core/apps/admin_panel/views/user.py +++ b/core/apps/admin_panel/views/user.py @@ -1,7 +1,6 @@ from django.shortcuts import get_object_or_404 -from rest_framework import generics, permissions, status -from rest_framework.response import Response +from rest_framework import generics, permissions, status, views from core.apps.admin_panel.serializers.user import UserSerializer from core.apps.accounts.models import User @@ -72,3 +71,15 @@ class UserDetailApiView(generics.GenericAPIView, ResponseMixin): user = get_object_or_404(User, id=id) serializer = self.serializer_class(user) return self.success_response(data=serializer.data, message='user malumotlari') + + +class UserDashboardApiView(views.APIView, ResponseMixin): + permission_classes = [permissions.IsAdminUser] + + def get(self, request): + admin_users = User.objects.filter(is_superuser=True).count() + users = User.objects.filter(is_superuser=False).count() + return self.success_response( + data={'admin_users': admin_users, 'users': users}, + message='userlar soni', + ) \ No newline at end of file