diff --git a/core/apps/admin_panel/serializers/user.py b/core/apps/admin_panel/serializers/user.py index 8902c68..9e0431f 100644 --- a/core/apps/admin_panel/serializers/user.py +++ b/core/apps/admin_panel/serializers/user.py @@ -9,7 +9,7 @@ class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = [ - 'id', 'first_name', 'last_name', 'username', 'password' + 'id', 'first_name', 'last_name', 'username', 'password', 'last_login', 'date_joined' ] extra_kwargs = {'id': {'read_only': True}, 'password': {'write_only': True}} diff --git a/core/apps/admin_panel/urls.py b/core/apps/admin_panel/urls.py index 8307398..f6928a8 100644 --- a/core/apps/admin_panel/urls.py +++ b/core/apps/admin_panel/urls.py @@ -6,7 +6,7 @@ from core.apps.admin_panel.views import unity as unity_views from core.apps.admin_panel.views import category as category_views from core.apps.admin_panel.views import product as product_views from core.apps.admin_panel.views import order as order_views - +from core.apps.admin_panel.views import dashboard as dashboard_views urlpatterns = [ path('user/', include( @@ -59,5 +59,11 @@ urlpatterns = [ [ path('list/', order_views.OrderListApiView.as_view()), ] + )), + path('dashboard/', include( + [ + path('statistics/', dashboard_views.DashboardApiView.as_view()), + path('recent_activity/', dashboard_views.RecentActivityApiView.as_view()), + ] )) ] \ No newline at end of file diff --git a/core/apps/admin_panel/views/dashboard.py b/core/apps/admin_panel/views/dashboard.py new file mode 100644 index 0000000..8c99337 --- /dev/null +++ b/core/apps/admin_panel/views/dashboard.py @@ -0,0 +1,51 @@ +from django.db.models import Sum +from django.utils import timezone + +from rest_framework import generics, views +from rest_framework.permissions import IsAdminUser + +from core.apps.orders.models import Order +from core.apps.accounts.models import User +from core.apps.admin_panel.serializers.user import UserSerializer +from core.apps.products.models import Product, Category +from core.apps.shared.mixins.response import ResponseMixin + + +class DashboardApiView(views.APIView, ResponseMixin): + permission_classes = [IsAdminUser] + + def get(self, request): + products = Product.objects.count() + users = User.objects.count() + orders = Order.objects.count() + total_price = ( + Order.objects.\ + filter(created_at__month=timezone.now().month)\ + .aggregate(total_price=Sum('total_price')) + ) + categories = Category.objects.count() + return self.success_response( + data={ + 'products': products, + 'users': users, + 'orders': orders, + 'total_price': total_price, + 'categories': categories + }, + message='dashboard uchun malumotlar statistikasi' + ) + + +class RecentActivityApiView(generics.GenericAPIView, ResponseMixin): + serializer_class = UserSerializer + queryset = User.objects.order_by('last_login') + permission_classes = [IsAdminUser] + + def get(self, request): + users = self.queryset[:6] + serializer = self.serializer_class(users, many=True) + return self.success_response( + data=serializer.data, + message='oxirgi kirishlar' + ) +