diff --git a/src/dashboard/views/timeline.py b/src/dashboard/views/timeline.py index 9fa8f7c..c6efa3b 100644 --- a/src/dashboard/views/timeline.py +++ b/src/dashboard/views/timeline.py @@ -1,6 +1,7 @@ from datetime import date from django.contrib.auth import get_user_model +from django.db.models import Count, Q from django.shortcuts import render from django.views.decorators.http import require_http_methods @@ -30,6 +31,17 @@ def project_timeline_widget(request): qs = qs.order_by("start_date") today = date.today() + + qs = qs.annotate( + ticket_total=Count("tickets"), + ticket_completed=Count("tickets", filter=Q(tickets__status__is_completed=True)), + ticket_overdue=Count( + "tickets", + filter=Q(tickets__due_date__lt=today) + & ~Q(tickets__status__is_completed=True), + ), + ) + timeline_data = [] for p in qs.select_related(): @@ -73,11 +85,9 @@ def project_timeline_widget(request): remaining_text = "Due today" ticket_counts = { - "total": p.tickets.count(), - "completed": p.tickets.filter(status__is_completed=True).count(), - "overdue": p.tickets.filter(due_date__lt=today) - .exclude(status__is_completed=True) - .count(), + "total": p.ticket_total, + "completed": p.ticket_completed, + "overdue": p.ticket_overdue, } timeline_data.append(