From dbcae57091b94d18c20ae9ba58b899b63b72c55a Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Mon, 22 Jul 2024 16:12:59 +0200 Subject: [PATCH] Add CourseSessionUsers to context --- server/vbv_lernwelt/competence/services.py | 15 ++++-- .../dashboard/graphql/types/assignment.py | 54 ++++++++++++------- 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/server/vbv_lernwelt/competence/services.py b/server/vbv_lernwelt/competence/services.py index 168e938f..6905ef91 100644 --- a/server/vbv_lernwelt/competence/services.py +++ b/server/vbv_lernwelt/competence/services.py @@ -17,8 +17,12 @@ def query_competence_course_session_assignments(course_session_ids, circle_ids=N AssignmentType.CASEWORK.value, ], learning_content__content_assignment__competence_certificate__isnull=False, - ).select_related("submission_deadline", "learning_content", "course_session", - "learning_content__content_assignment"): + ).select_related( + "submission_deadline", + "learning_content", + "course_session", + "learning_content__content_assignment", + ): if circle_ids and csa.learning_content.get_circle().id not in circle_ids: continue result.append(csa) @@ -35,7 +39,12 @@ def query_competence_course_session_edoniq_tests(course_session_ids, circle_ids= for cset in CourseSessionEdoniqTest.objects.filter( course_session_id__in=course_session_ids, learning_content__content_assignment__competence_certificate__isnull=False, - ).select_related("deadline", "learning_content", "course_session", "learning_content__content_assignment"): + ).select_related( + "deadline", + "learning_content", + "course_session", + "learning_content__content_assignment", + ): if circle_ids and cset.learning_content.get_circle().id not in circle_ids: continue result.append(cset) diff --git a/server/vbv_lernwelt/dashboard/graphql/types/assignment.py b/server/vbv_lernwelt/dashboard/graphql/types/assignment.py index 766fb8af..ba26e3c6 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/assignment.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/assignment.py @@ -1,9 +1,7 @@ import math -from typing import List, Dict, Tuple +from typing import List import graphene -import structlog -from django.db import connections, reset_queries import vbv_lernwelt.assignment.models from vbv_lernwelt.assignment.models import ( @@ -20,8 +18,6 @@ from vbv_lernwelt.course_session.models import ( CourseSessionEdoniqTest, ) -logger = structlog.get_logger() - class AssignmentCompletionMetricsType(graphene.ObjectType): _id = graphene.ID(required=True) @@ -101,14 +97,23 @@ def get_assignment_completion_metrics( assignment: vbv_lernwelt.assignment.models.Assignment, user_selection_ids: List[str] | None, urql_id_postfix: str = "", + context=None, ) -> AssignmentCompletionMetricsType: + if not context: + context = {} + if user_selection_ids: course_session_users = user_selection_ids else: - course_session_users = CourseSessionUser.objects.filter( - course_session=course_session, - role=CourseSessionUser.Role.MEMBER, - ).values_list("user", flat=True) + key = f"CourseSessionUser_{course_session.id}" + if not key in context: + course_session_users = CourseSessionUser.objects.filter( + course_session=course_session, + role=CourseSessionUser.Role.MEMBER, + ).values_list("user", flat=True) + context[key] = course_session_users + else: + course_session_users = context[key] evaluation_results = AssignmentCompletion.objects.filter( completion_status=AssignmentCompletionStatus.EVALUATION_SUBMITTED.value, @@ -143,13 +148,20 @@ def create_record( user_selection_ids: List[str] | None, urql_id_postfix: str = "", context=None, -) -> Tuple[AssignmentStatisticsRecordType, Dict]: +) -> AssignmentStatisticsRecordType: if not context: context = {} - assignment_type = "CourseSessionAssignment" if isinstance(course_session_assignment, - CourseSessionAssignment) else "CourseSessionEdoniqTest" - due_date = course_session_assignment.submission_deadline if assignment_type == "CourseSessionAssignment" else course_session_assignment.deadline + assignment_type = ( + "CourseSessionAssignment" + if isinstance(course_session_assignment, CourseSessionAssignment) + else "CourseSessionEdoniqTest" + ) + due_date = ( + course_session_assignment.submission_deadline + if assignment_type == "CourseSessionAssignment" + else course_session_assignment.deadline + ) key = f"{assignment_type}_{course_session_assignment.learning_content.id}" @@ -176,10 +188,11 @@ def create_record( assignment=learning_content.content_assignment, # noqa user_selection_ids=user_selection_ids, # noqa urql_id_postfix=urql_id_postfix, # noqa + context=context, # noqa ), details_url=due_date.url_expert, # noqa deadline=due_date.start, # noqa - ), context + ) def assignments( @@ -197,19 +210,22 @@ def assignments( ) records: List[AssignmentStatisticsRecordType] = [] context = {} - reset_queries() + csas = query_competence_course_session_assignments(course_sessions, circle_ids) csets = query_competence_course_session_edoniq_tests(course_sessions, circle_ids) for csa in csas: - record, context = create_record(csa, user_selection_ids, urql_id_postfix=urql_id, context=context) + record = create_record( + csa, user_selection_ids, urql_id_postfix=urql_id, context=context + ) records.append(record) for cset in csets: - record, context = create_record(cset, user_selection_ids, urql_id_postfix=urql_id, context=context) + record = create_record( + cset, user_selection_ids, urql_id_postfix=urql_id, context=context + ) records.append(record) - num_queries = len(connections["default"].queries) - logger.info(num_queries) + return AssignmentsStatisticsType( _id=urql_id, # noqa records=sorted(records, key=lambda r: r.deadline), # noqa