From c1e1f38a274cd2eea07ebcfde955847733363383 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 24 Jul 2024 11:18:19 +0200 Subject: [PATCH] Optimize duedates in dashboards --- server/vbv_lernwelt/dashboard/views.py | 41 ++++++++------------------ 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/server/vbv_lernwelt/dashboard/views.py b/server/vbv_lernwelt/dashboard/views.py index e8266145..9d20bab7 100644 --- a/server/vbv_lernwelt/dashboard/views.py +++ b/server/vbv_lernwelt/dashboard/views.py @@ -306,45 +306,28 @@ def get_dashboard_due_dates(request): course_sessions = get_course_sessions_with_roles_for_user(request.user) course_session_ids = [cs.id for cs in course_sessions] - all_due_dates = DueDate.objects.filter( - course_session__id__in=course_session_ids - ) - - # filter only future due dates - due_dates = [] today = date.today() - for due_date in all_due_dates: - # due_dates.append(due_date) - if due_date.end: - if due_date.end.date() >= today: - due_dates.append(due_date) - elif due_date.start: - if due_date.start.date() >= today: - due_dates.append(due_date) - due_dates.sort(key=lambda x: x.start) - - # find course session by id in `course_sessions` + # Fetch future due dates in a single query using Q objects for complex filtering + future_due_dates = DueDate.objects.filter( + Q(course_session_id__in=course_session_ids), + Q(end__gte=today) | Q(start__gte=today) + ).select_related('course_session') result_due_dates = [] - for due_date in due_dates: - data = DueDateSerializer(due_date).data + course_session_map = {cs.id: cs for cs in course_sessions} + + for due_date in sorted(future_due_dates, key=lambda x: x.start): + data = DueDateSerializer(due_date).data + cs = course_session_map.get(due_date.course_session_id) - cs = next( - course_session - for course_session in course_sessions - if course_session.id == due_date.course_session.id - ) if cs: data["course_session"] = _create_course_session_dict( cs, my_role=user_role(cs.roles), user_role="" ) result_due_dates.append(data) - return Response( - status=200, - data=result_due_dates, - ) + return Response(status=200, data=result_due_dates) except PermissionDenied as e: raise e @@ -625,7 +608,7 @@ def _get_course_sessions_with_roles_for_user( csr for csr in get_course_sessions_with_roles_for_user(user) if any(role in allowed_roles for role in csr.roles) - and csr.id in requested_cs_ids + and csr.id in requested_cs_ids ] # noqa return all_cs_roles_for_user