diff --git a/fjob/urls.py b/fjob/urls.py index e6b1a29..6d91d93 100644 --- a/fjob/urls.py +++ b/fjob/urls.py @@ -40,6 +40,7 @@ path('api/company/', include('company.urls')), path('api/candidate/', include('candidate.urls')), path('api/payment/', include('payment.urls')), + path('api/stats/', include('stats.urls')), path('docs/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), ] if settings.DEBUG: diff --git a/stats/serializers.py b/stats/serializers.py new file mode 100644 index 0000000..4dd6b75 --- /dev/null +++ b/stats/serializers.py @@ -0,0 +1,8 @@ +from rest_framework.serializers import ModelSerializer +from .models import Statistics + + +class StatisticsSerializer(ModelSerializer): + class Meta: + model = Statistics + fields = '__all__' diff --git a/stats/urls.py b/stats/urls.py new file mode 100644 index 0000000..c7246b9 --- /dev/null +++ b/stats/urls.py @@ -0,0 +1,16 @@ +from django.urls import path +from .views import ( + StatisticsDayView, + StatisticsMonthView, + StatisticsYearView, + StatisticsAggregatedView, + ModelTypeListView, +) + +urlpatterns = [ + path('day////', StatisticsDayView.as_view(), name='statistics-day'), + path('month///', StatisticsMonthView.as_view(), name='statistics-month'), + path('year//', StatisticsYearView.as_view(), name='statistics-year'), + path('aggregated//', StatisticsAggregatedView.as_view(), name='statistics-aggregated'), + path('model/', ModelTypeListView.as_view(), name='model-type-list'), +] diff --git a/stats/views.py b/stats/views.py index e69de29..1977fb7 100644 --- a/stats/views.py +++ b/stats/views.py @@ -0,0 +1,84 @@ +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status +from .models import Statistics +from .serializers import StatisticsSerializer +from django.db.models import Count +from django.db.models.functions import TruncDay, TruncMonth, TruncYear +from rest_framework.permissions import IsAdminUser + + +class StatisticsDayView(APIView): + permission_classes = [IsAdminUser, ] + + def get(self, request, year, month, day, model_type=None): + queryset = Statistics.objects.filter( + created_at__year=year, created_at__month=month, created_at__day=day + ).filter(model_type=model_type) if model_type else Statistics.objects.filter( + created_at__year=year, created_at__month=month, created_at__day=day + ) + serializer = StatisticsSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class StatisticsMonthView(APIView): + permission_classes = [IsAdminUser, ] + + def get(self, request, year, month, model_type=None): + queryset = Statistics.objects.filter( + created_at__year=year, created_at__month=month + ).filter(model_type=model_type) if model_type else Statistics.objects.filter( + created_at__year=year, created_at__month=month + ) + serializer = StatisticsSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class StatisticsYearView(APIView): + permission_classes = [IsAdminUser, ] + + def get(self, request, year, model_type=None): + queryset = Statistics.objects.filter( + created_at__year=year + ).filter(model_type=model_type) if model_type else Statistics.objects.filter( + created_at__year=year + ) + serializer = StatisticsSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class StatisticsAggregatedView(APIView): + permission_classes = [IsAdminUser, ] + + def get(self, request, scale, model_type=None): + if scale == 'day': + queryset = Statistics.objects.annotate(date=TruncDay('created_at')).values('date').annotate( + count=Count('id')).filter(model_type=model_type) if model_type else Statistics.objects.annotate( + date=TruncDay('created_at')).values('date').annotate(count=Count('id')) + elif scale == 'month': + queryset = Statistics.objects.annotate(date=TruncMonth('created_at')).values('date').annotate( + count=Count('id')).filter(model_type=model_type) if model_type else Statistics.objects.annotate( + date=TruncMonth('created_at')).values('date').annotate(count=Count('id')) + elif scale == 'year': + queryset = Statistics.objects.annotate(date=TruncYear('created_at')).values('date').annotate( + count=Count('id')).filter(model_type=model_type) if model_type else Statistics.objects.annotate( + date=TruncYear('created_at')).values('date').annotate(count=Count('id')) + else: + return Response( + { + "error": "Invalid scale. Supported scales are 'day', 'month', and 'year'." + }, + status=status.HTTP_400_BAD_REQUEST + ) + + serializer = StatisticsSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + +class ModelTypeListView(APIView): + permission_classes = [IsAdminUser, ] + + def get(self, request): + queryset = Statistics.objects.values('model_type').distinct() + serializer = StatisticsSerializer(queryset, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) \ No newline at end of file