diff --git a/backend/core/settings.py b/backend/core/settings.py index 5c01d05..4936805 100644 --- a/backend/core/settings.py +++ b/backend/core/settings.py @@ -52,6 +52,7 @@ INSTALLED_APPS = [ 'tasks', 'users', 'authentications', + 'dashboard', 'corsheaders', 'drf_spectacular', diff --git a/backend/core/urls.py b/backend/core/urls.py index a02869c..434a21f 100644 --- a/backend/core/urls.py +++ b/backend/core/urls.py @@ -27,4 +27,5 @@ urlpatterns = [ path('api/schema/', SpectacularAPIView.as_view(), name='schema'), path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'), + path('dashboard/', include('dashboard.urls')), ] \ No newline at end of file diff --git a/backend/dashboard/__init__.py b/backend/dashboard/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/dashboard/admin.py b/backend/dashboard/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/backend/dashboard/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/backend/dashboard/apps.py b/backend/dashboard/apps.py new file mode 100644 index 0000000..7b1cc05 --- /dev/null +++ b/backend/dashboard/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class DashboardConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'dashboard' diff --git a/backend/dashboard/migrations/__init__.py b/backend/dashboard/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/dashboard/models.py b/backend/dashboard/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/backend/dashboard/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/backend/dashboard/serializers.py b/backend/dashboard/serializers.py new file mode 100644 index 0000000..ddc207b --- /dev/null +++ b/backend/dashboard/serializers.py @@ -0,0 +1,7 @@ +from rest_framework import serializers +from .models import UserStats + +class UserStatsSerializer(serializers.ModelSerializer): + class Meta: + model = UserStats + fields = ['health', 'gold', 'experience', 'strength', 'intelligence', 'endurance', 'perception', 'luck', 'level'] \ No newline at end of file diff --git a/backend/dashboard/tests.py b/backend/dashboard/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/backend/dashboard/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/dashboard/urls.py b/backend/dashboard/urls.py new file mode 100644 index 0000000..beb8f1b --- /dev/null +++ b/backend/dashboard/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from .views import DashboardStatsAPIView + +urlpatterns = [ + path('dashboard/stats/', DashboardStatsAPIView.as_view(), name='dashboard-stats'), +] diff --git a/backend/dashboard/views.py b/backend/dashboard/views.py new file mode 100644 index 0000000..4475d77 --- /dev/null +++ b/backend/dashboard/views.py @@ -0,0 +1,58 @@ +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status +from rest_framework.permissions import IsAuthenticated +from django.db.models import Count +from django.utils import timezone + +from tasks.models import Todo, RecurrenceTask + +class DashboardStatsAPIView(APIView): + permission_classes = [IsAuthenticated] + + def get(self, request): + user = request.user + + # Calculate task usage statistics + todo_count = Todo.objects.filter(user=user).count() + recurrence_task_count = RecurrenceTask.objects.filter(user=user).count() + + # Calculate how many tasks were completed in the last 7 days + completed_todo_count_last_week = Todo.objects.filter(user=user, completed=True, last_update__gte=timezone.now() - timezone.timedelta(days=7)).count() + completed_recurrence_task_count_last_week = RecurrenceTask.objects.filter(user=user, completed=True, last_update__gte=timezone.now() - timezone.timedelta(days=7)).count() + + # Calculate subtask completion rate + total_subtasks = Todo.objects.filter(user=user).aggregate(total=Count('subtask__id'))['total'] + completed_subtasks = Todo.objects.filter(user=user, subtask__completed=True).aggregate(total=Count('subtask__id'))['total'] + + # Calculate overall completion rate + total_tasks = todo_count + recurrence_task_count + completed_tasks = completed_todo_count_last_week + completed_recurrence_task_count_last_week + overall_completion_rate = (completed_tasks / total_tasks) * 100 if total_tasks > 0 else 0 + + data = { + 'todo_count': todo_count, + 'recurrence_task_count': recurrence_task_count, + 'completed_todo_count_last_week': completed_todo_count_last_week, + 'completed_recurrence_task_count_last_week': completed_recurrence_task_count_last_week, + 'total_subtasks': total_subtasks, + 'completed_subtasks': completed_subtasks, + 'overall_completion_rate': overall_completion_rate, + } + + return Response(data, status=status.HTTP_200_OK) + + def post(self, request): + # Handle incoming data from the POST request + # Update the necessary information based on the data + + task_id = request.data.get('task_id') + is_completed = request.data.get('is_completed') + + try: + task = Todo.objects.get(id=task_id, user=request.user) + task.completed = is_completed + task.save() + return Response({'message': 'Task completion status updated successfully'}, status=status.HTTP_200_OK) + except Todo.DoesNotExist: + return Response({'error': 'Task not found'}, status=status.HTTP_404_NOT_FOUND) \ No newline at end of file