feat(src/dashboard/views): annotate ticket metrics
Introduce aggregated ticket counts to eliminate redundant queries and boost performance.
This commit is contained in:
1 file changed
+15
-5
@@ -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(
|
||||
|
||||
Reference in new issue
Block a user