Optimize duedates in dashboards

This commit is contained in:
Christian Cueni 2024-07-24 11:18:19 +02:00
parent 4d4e202a24
commit c1e1f38a27
1 changed files with 12 additions and 29 deletions

View File

@ -306,45 +306,28 @@ def get_dashboard_due_dates(request):
course_sessions = get_course_sessions_with_roles_for_user(request.user) course_sessions = get_course_sessions_with_roles_for_user(request.user)
course_session_ids = [cs.id for cs in course_sessions] 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() 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) # Fetch future due dates in a single query using Q objects for complex filtering
future_due_dates = DueDate.objects.filter(
# find course session by id in `course_sessions` Q(course_session_id__in=course_session_ids),
Q(end__gte=today) | Q(start__gte=today)
).select_related('course_session')
result_due_dates = [] result_due_dates = []
for due_date in due_dates: course_session_map = {cs.id: cs for cs in course_sessions}
data = DueDateSerializer(due_date).data
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: if cs:
data["course_session"] = _create_course_session_dict( data["course_session"] = _create_course_session_dict(
cs, my_role=user_role(cs.roles), user_role="" cs, my_role=user_role(cs.roles), user_role=""
) )
result_due_dates.append(data) result_due_dates.append(data)
return Response( return Response(status=200, data=result_due_dates)
status=200,
data=result_due_dates,
)
except PermissionDenied as e: except PermissionDenied as e:
raise e raise e