diff --git a/server/vbv_lernwelt/competence/services.py b/server/vbv_lernwelt/competence/services.py index 977ea2dc..168e938f 100644 --- a/server/vbv_lernwelt/competence/services.py +++ b/server/vbv_lernwelt/competence/services.py @@ -17,7 +17,8 @@ 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"): + ).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) @@ -34,7 +35,7 @@ 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"): + ).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 d09d5d36..766fb8af 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/assignment.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/assignment.py @@ -1,8 +1,9 @@ import math -from typing import List +from typing import List, Dict, Tuple import graphene -from django.db import connection, reset_queries +import structlog +from django.db import connections, reset_queries import vbv_lernwelt.assignment.models from vbv_lernwelt.assignment.models import ( @@ -19,6 +20,8 @@ from vbv_lernwelt.course_session.models import ( CourseSessionEdoniqTest, ) +logger = structlog.get_logger() + class AssignmentCompletionMetricsType(graphene.ObjectType): _id = graphene.ID(required=True) @@ -139,11 +142,21 @@ def create_record( course_session_assignment: CourseSessionAssignment | CourseSessionEdoniqTest, user_selection_ids: List[str] | None, urql_id_postfix: str = "", -) -> AssignmentStatisticsRecordType: - if isinstance(course_session_assignment, CourseSessionAssignment): - due_date = course_session_assignment.submission_deadline - else: - due_date = course_session_assignment.deadline + context=None, +) -> Tuple[AssignmentStatisticsRecordType, Dict]: + 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 + + key = f"{assignment_type}_{course_session_assignment.learning_content.id}" + + if not key in context: + context[key] = course_session_assignment.learning_content.get_circle().id + + circle_id = context[key] learning_content = course_session_assignment.learning_content @@ -152,7 +165,7 @@ def create_record( _id=f"{course_session_assignment._meta.model_name}#{course_session_assignment.id}@{urql_id_postfix}", # noqa course_session_id=str(course_session_assignment.course_session.id), # noqa - circle_id=learning_content.get_circle().id, # noqa + circle_id=circle_id, # noqa course_session_assignment_id=str(course_session_assignment.id), # noqa generation=course_session_assignment.course_session.generation, # noqa assignment_type_translation_key=due_date.assignment_type_translation_key, @@ -166,7 +179,7 @@ def create_record( ), details_url=due_date.url_expert, # noqa deadline=due_date.start, # noqa - ) + ), context def assignments( @@ -176,9 +189,6 @@ def assignments( circle_ids: List[graphene.ID] | None = None, urql_id: str = None, ) -> AssignmentsStatisticsType: - import structlog - - logger = structlog.get_logger() if urql_id is None: urql_id = str(course_id) @@ -186,22 +196,20 @@ def assignments( id__in=course_session_selection_ids, ) 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 = create_record(csa, user_selection_ids, urql_id_postfix=urql_id) + record, context = create_record(csa, user_selection_ids, urql_id_postfix=urql_id, context=context) records.append(record) for cset in csets: - record = create_record(cset, user_selection_ids, urql_id_postfix=urql_id) + record, context = create_record(cset, user_selection_ids, urql_id_postfix=urql_id, context=context) records.append(record) - - num_queries = len(connection.queries) - logger.info(f"cset number of queries executed: {num_queries}") - + 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