From aa443d45192c935fb61a748ba8e333ccede622a9 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Tue, 28 May 2024 16:56:26 +0200 Subject: [PATCH] fix: add unique `_id` for urql to load/show correct data in dashboard --- .../vbv_lernwelt/dashboard/graphql/queries.py | 2 +- .../dashboard/graphql/types/assignment.py | 34 ++++++++++++++----- .../dashboard/graphql/types/attendance.py | 8 +++-- .../dashboard/graphql/types/competence.py | 3 +- .../dashboard/graphql/types/dashboard.py | 4 +++ .../dashboard/graphql/types/feedback.py | 12 +++++-- 6 files changed, 47 insertions(+), 16 deletions(-) diff --git a/server/vbv_lernwelt/dashboard/graphql/queries.py b/server/vbv_lernwelt/dashboard/graphql/queries.py index 6e8bea1b..53795efa 100644 --- a/server/vbv_lernwelt/dashboard/graphql/queries.py +++ b/server/vbv_lernwelt/dashboard/graphql/queries.py @@ -103,7 +103,7 @@ class DashboardQuery(graphene.ObjectType): course_session_ids.add(course_session_id) return CourseStatisticsType( - _id=course.id, # noqa + _id=f"mentor:{course.id}", # noqa course_id=course.id, # noqa course_title=course.title, # noqa course_slug=course.slug, # noqa diff --git a/server/vbv_lernwelt/dashboard/graphql/types/assignment.py b/server/vbv_lernwelt/dashboard/graphql/types/assignment.py index 98939fd0..8199bc72 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/assignment.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/assignment.py @@ -58,12 +58,17 @@ class AssignmentsStatisticsType(graphene.ObjectType): summary = graphene.Field(AssignmentStatisticsSummaryType, required=True) -def create_assignment_summary(course_id, metrics) -> AssignmentStatisticsSummaryType: +def create_assignment_summary( + course_id, metrics, urql_id: str = None +) -> AssignmentStatisticsSummaryType: + if urql_id is None: + urql_id = str(course_id) + completed_metrics = [m for m in metrics if m.ranking_completed] if not completed_metrics: return AssignmentStatisticsSummaryType( - _id=course_id, + _id=urql_id, completed_count=0, average_passed=0, total_passed=0, @@ -80,7 +85,7 @@ def create_assignment_summary(course_id, metrics) -> AssignmentStatisticsSummary total_failed = sum([m.failed_count for m in completed_metrics]) return AssignmentStatisticsSummaryType( - _id=course_id, # noqa + _id=urql_id, # noqa completed_count=completed_count, # noqa average_passed=average_passed_completed, # noqa total_passed=total_passed, # noqa @@ -92,6 +97,7 @@ def get_assignment_completion_metrics( course_session: CourseSession, assignment: vbv_lernwelt.assignment.models.Assignment, user_selection_ids: List[str] | None, + urql_id_postfix: str = "", ) -> AssignmentCompletionMetricsType: if user_selection_ids: course_session_users = user_selection_ids @@ -120,7 +126,7 @@ def get_assignment_completion_metrics( average_passed = math.ceil(passed_count / participants_count * 100) return AssignmentCompletionMetricsType( - _id=f"{course_session.id}-{assignment.id}", # noqa + _id=f"{course_session.id}-{assignment.id}@{urql_id_postfix}", # noqa passed_count=passed_count, # noqa failed_count=failed_count, # noqa unranked_count=unranked_count, # noqa @@ -132,6 +138,7 @@ def get_assignment_completion_metrics( 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 @@ -142,7 +149,7 @@ def create_record( return AssignmentStatisticsRecordType( # make sure it's unique, across all types of assignments! - _id=f"{course_session_assignment._meta.model_name}#{course_session_assignment.id}", + _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 @@ -155,6 +162,7 @@ def create_record( course_session=course_session_assignment.course_session, # noqa assignment=learning_content.content_assignment, # noqa user_selection_ids=user_selection_ids, # noqa + urql_id_postfix=urql_id_postfix, # noqa ), details_url=due_date.url_expert, # noqa deadline=due_date.start, # noqa @@ -166,7 +174,11 @@ def assignments( course_session_selection_ids: graphene.List(graphene.ID), user_selection_ids: List[str] | None = None, circle_ids: List[graphene.ID] | None = None, + urql_id: str = None, ) -> AssignmentsStatisticsType: + if urql_id is None: + urql_id = str(course_id) + course_sessions = CourseSession.objects.filter( id__in=course_session_selection_ids, ) @@ -176,21 +188,25 @@ def assignments( for csa in query_competence_course_session_assignments( [course_session.id], circle_ids ): - record = create_record(csa, user_selection_ids) + record = create_record(csa, user_selection_ids, urql_id_postfix=urql_id) records.append(record) for cset in query_competence_course_session_edoniq_tests( [course_session.id], circle_ids ): record = create_record( - course_session_assignment=cset, user_selection_ids=user_selection_ids + course_session_assignment=cset, + user_selection_ids=user_selection_ids, + urql_id_postfix=urql_id, ) records.append(record) return AssignmentsStatisticsType( - _id=course_id, # noqa + _id=urql_id, # noqa records=sorted(records, key=lambda r: r.deadline), # noqa summary=create_assignment_summary( # noqa - course_id=course_id, metrics=[r.metrics for r in records] # noqa + course_id=course_id, + metrics=[r.metrics for r in records], # noqa + urql_id=urql_id, # noqa ), ) diff --git a/server/vbv_lernwelt/dashboard/graphql/types/attendance.py b/server/vbv_lernwelt/dashboard/graphql/types/attendance.py index caf6105d..ef9ee28e 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/attendance.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/attendance.py @@ -38,7 +38,11 @@ def attendance_day_presences( course_id: graphene.ID, course_session_selection_ids: graphene.List(graphene.ID), circle_ids: List[graphene.ID] = None, + urql_id: str = None, ) -> AttendanceDayPresencesStatisticsType: + if urql_id is None: + urql_id = str(course_id) + completed = CourseSessionAttendanceCourse.objects.filter( course_session_id__in=course_session_selection_ids, due_date__end__lt=timezone.now(), @@ -76,7 +80,7 @@ def attendance_day_presences( records.append( PresenceRecordStatisticsType( - _id=f"attendance_day:{attendance_day.id}", # noqa + _id=f"{urql_id}:attendance_day:{attendance_day.id}", # noqa course_session_id=course_session.id, # noqa generation=course_session.generation, # noqa circle_id=circle.id, # noqa @@ -88,7 +92,7 @@ def attendance_day_presences( ) summary = AttendanceSummaryStatisticsType( - _id=course_id, # noqa + _id=urql_id, # noqa days_completed=len(records), # noqa participants_present=calculate_avg_participation(records), # noqa ) diff --git a/server/vbv_lernwelt/dashboard/graphql/types/competence.py b/server/vbv_lernwelt/dashboard/graphql/types/competence.py index 8a8875da..28dbae75 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/competence.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/competence.py @@ -36,6 +36,7 @@ def competences( course_slug: str, user_selection_ids: List[str] | None = None, circle_ids: List[str] | None = None, + urql_id_postfix: str = "", ) -> Tuple[List[CompetenceRecordStatisticsType], int, int]: completions = CourseCompletion.objects.filter( course_session_id__in=course_session_selection_ids, @@ -70,7 +71,7 @@ def competences( if not circle: continue - combined_id = f"{circle.id}-{completion.course_session.id}" + combined_id = f"{circle.id}-{completion.course_session.id}@{urql_id_postfix}" competence_records.setdefault(combined_id, {}).setdefault( learning_unit, diff --git a/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py b/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py index 0e3c59ee..d5701eb8 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py @@ -107,6 +107,7 @@ class BaseStatisticsType(graphene.ObjectType): course_session_selection_ids=root.course_session_selection_ids, user_selection_ids=user_selection_ids, circle_ids=root.get_circle_ids(_info), + urql_id=str(root._id), ) def get_circle_ids(self, info): @@ -133,6 +134,7 @@ class CourseStatisticsType(BaseStatisticsType): course_id=root.course_id, course_session_selection_ids=root.course_session_selection_ids, circle_ids=root.get_circle_ids(info), + urql_id=str(root._id), ) def resolve_feedback_responses(root, info) -> FeedbackStatisticsResponsesType: @@ -141,6 +143,7 @@ class CourseStatisticsType(BaseStatisticsType): course_id=root.course_id, course_slug=root.course_slug, circle_ids=root.get_circle_ids(info), + urql_id=str(root._id), ) def resolve_competences(root, info) -> CompetencesStatisticsType: @@ -156,6 +159,7 @@ class CourseStatisticsType(BaseStatisticsType): ], user_selection_ids=user_selection_ids, # noqa circle_ids=root.get_circle_ids(info), # noqa + urql_id_postfix=str(root._id), # noqa ) return CompetencesStatisticsType( _id=root._id, # noqa diff --git a/server/vbv_lernwelt/dashboard/graphql/types/feedback.py b/server/vbv_lernwelt/dashboard/graphql/types/feedback.py index 370ce8fe..b8f3be28 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/feedback.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/feedback.py @@ -38,7 +38,11 @@ def feedback_responses( course_id: graphene.ID, course_slug: graphene.String, circle_ids: List[graphene.ID] = None, + urql_id: str = None, ) -> FeedbackStatisticsResponsesType: + if urql_id is None: + urql_id = str(course_id) + # Get all course sessions for this user in the given course course_sessions = CourseSession.objects.filter( id__in=course_session_selection_ids, @@ -65,6 +69,7 @@ def feedback_responses( course_session_id=course_session.id, generation=course_session.generation, course_slug=str(course_slug), + urql_id_postfix=urql_id, ) ) @@ -76,10 +81,10 @@ def feedback_responses( avg = 0 return FeedbackStatisticsResponsesType( - _id=course_id, # noqa + _id=urql_id, # noqa records=circle_feedbacks, # noqa summary=FeedbackStatisticsSummaryType( # noqa - _id=course_id, # noqa + _id=urql_id, # noqa satisfaction_average=avg, # noqa satisfaction_max=4, # noqa total_responses=total_responses, # noqa @@ -92,6 +97,7 @@ def circle_feedback_average( course_session_id, generation: str, course_slug: str, + urql_id_postfix: str = "", ): circle_data = {} records = [] @@ -119,7 +125,7 @@ def circle_feedback_average( records.append( FeedbackStatisticsRecordType( - _id=f"circle:{circle_id}-course_session:{course_session_id}", # noqa + _id=f"circle:{circle_id}-course_session:{course_session_id}@{urql_id_postfix}", # noqa course_session_id=course_session_id, # noqa generation=generation, # noqa circle_id=circle_id, # noqa