Merged in feature/fix-dashboard-urql-id (pull request #334)
fix: add unique `_id` for urql to load/show correct data in dashboard Approved-by: Christian Cueni
This commit is contained in:
commit
35502b167d
|
|
@ -103,7 +103,7 @@ class DashboardQuery(graphene.ObjectType):
|
||||||
course_session_ids.add(course_session_id)
|
course_session_ids.add(course_session_id)
|
||||||
|
|
||||||
return CourseStatisticsType(
|
return CourseStatisticsType(
|
||||||
_id=course.id, # noqa
|
_id=f"mentor:{course.id}", # noqa
|
||||||
course_id=course.id, # noqa
|
course_id=course.id, # noqa
|
||||||
course_title=course.title, # noqa
|
course_title=course.title, # noqa
|
||||||
course_slug=course.slug, # noqa
|
course_slug=course.slug, # noqa
|
||||||
|
|
|
||||||
|
|
@ -58,12 +58,17 @@ class AssignmentsStatisticsType(graphene.ObjectType):
|
||||||
summary = graphene.Field(AssignmentStatisticsSummaryType, required=True)
|
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]
|
completed_metrics = [m for m in metrics if m.ranking_completed]
|
||||||
|
|
||||||
if not completed_metrics:
|
if not completed_metrics:
|
||||||
return AssignmentStatisticsSummaryType(
|
return AssignmentStatisticsSummaryType(
|
||||||
_id=course_id,
|
_id=urql_id,
|
||||||
completed_count=0,
|
completed_count=0,
|
||||||
average_passed=0,
|
average_passed=0,
|
||||||
total_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])
|
total_failed = sum([m.failed_count for m in completed_metrics])
|
||||||
|
|
||||||
return AssignmentStatisticsSummaryType(
|
return AssignmentStatisticsSummaryType(
|
||||||
_id=course_id, # noqa
|
_id=urql_id, # noqa
|
||||||
completed_count=completed_count, # noqa
|
completed_count=completed_count, # noqa
|
||||||
average_passed=average_passed_completed, # noqa
|
average_passed=average_passed_completed, # noqa
|
||||||
total_passed=total_passed, # noqa
|
total_passed=total_passed, # noqa
|
||||||
|
|
@ -92,6 +97,7 @@ def get_assignment_completion_metrics(
|
||||||
course_session: CourseSession,
|
course_session: CourseSession,
|
||||||
assignment: vbv_lernwelt.assignment.models.Assignment,
|
assignment: vbv_lernwelt.assignment.models.Assignment,
|
||||||
user_selection_ids: List[str] | None,
|
user_selection_ids: List[str] | None,
|
||||||
|
urql_id_postfix: str = "",
|
||||||
) -> AssignmentCompletionMetricsType:
|
) -> AssignmentCompletionMetricsType:
|
||||||
if user_selection_ids:
|
if user_selection_ids:
|
||||||
course_session_users = 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)
|
average_passed = math.ceil(passed_count / participants_count * 100)
|
||||||
|
|
||||||
return AssignmentCompletionMetricsType(
|
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
|
passed_count=passed_count, # noqa
|
||||||
failed_count=failed_count, # noqa
|
failed_count=failed_count, # noqa
|
||||||
unranked_count=unranked_count, # noqa
|
unranked_count=unranked_count, # noqa
|
||||||
|
|
@ -132,6 +138,7 @@ def get_assignment_completion_metrics(
|
||||||
def create_record(
|
def create_record(
|
||||||
course_session_assignment: CourseSessionAssignment | CourseSessionEdoniqTest,
|
course_session_assignment: CourseSessionAssignment | CourseSessionEdoniqTest,
|
||||||
user_selection_ids: List[str] | None,
|
user_selection_ids: List[str] | None,
|
||||||
|
urql_id_postfix: str = "",
|
||||||
) -> AssignmentStatisticsRecordType:
|
) -> AssignmentStatisticsRecordType:
|
||||||
if isinstance(course_session_assignment, CourseSessionAssignment):
|
if isinstance(course_session_assignment, CourseSessionAssignment):
|
||||||
due_date = course_session_assignment.submission_deadline
|
due_date = course_session_assignment.submission_deadline
|
||||||
|
|
@ -142,7 +149,7 @@ def create_record(
|
||||||
|
|
||||||
return AssignmentStatisticsRecordType(
|
return AssignmentStatisticsRecordType(
|
||||||
# make sure it's unique, across all types of assignments!
|
# 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
|
# noqa
|
||||||
course_session_id=str(course_session_assignment.course_session.id), # noqa
|
course_session_id=str(course_session_assignment.course_session.id), # noqa
|
||||||
circle_id=learning_content.get_circle().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
|
course_session=course_session_assignment.course_session, # noqa
|
||||||
assignment=learning_content.content_assignment, # noqa
|
assignment=learning_content.content_assignment, # noqa
|
||||||
user_selection_ids=user_selection_ids, # noqa
|
user_selection_ids=user_selection_ids, # noqa
|
||||||
|
urql_id_postfix=urql_id_postfix, # noqa
|
||||||
),
|
),
|
||||||
details_url=due_date.url_expert, # noqa
|
details_url=due_date.url_expert, # noqa
|
||||||
deadline=due_date.start, # noqa
|
deadline=due_date.start, # noqa
|
||||||
|
|
@ -166,7 +174,11 @@ def assignments(
|
||||||
course_session_selection_ids: graphene.List(graphene.ID),
|
course_session_selection_ids: graphene.List(graphene.ID),
|
||||||
user_selection_ids: List[str] | None = None,
|
user_selection_ids: List[str] | None = None,
|
||||||
circle_ids: List[graphene.ID] | None = None,
|
circle_ids: List[graphene.ID] | None = None,
|
||||||
|
urql_id: str = None,
|
||||||
) -> AssignmentsStatisticsType:
|
) -> AssignmentsStatisticsType:
|
||||||
|
if urql_id is None:
|
||||||
|
urql_id = str(course_id)
|
||||||
|
|
||||||
course_sessions = CourseSession.objects.filter(
|
course_sessions = CourseSession.objects.filter(
|
||||||
id__in=course_session_selection_ids,
|
id__in=course_session_selection_ids,
|
||||||
)
|
)
|
||||||
|
|
@ -176,21 +188,25 @@ def assignments(
|
||||||
for csa in query_competence_course_session_assignments(
|
for csa in query_competence_course_session_assignments(
|
||||||
[course_session.id], circle_ids
|
[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)
|
records.append(record)
|
||||||
|
|
||||||
for cset in query_competence_course_session_edoniq_tests(
|
for cset in query_competence_course_session_edoniq_tests(
|
||||||
[course_session.id], circle_ids
|
[course_session.id], circle_ids
|
||||||
):
|
):
|
||||||
record = create_record(
|
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)
|
records.append(record)
|
||||||
|
|
||||||
return AssignmentsStatisticsType(
|
return AssignmentsStatisticsType(
|
||||||
_id=course_id, # noqa
|
_id=urql_id, # noqa
|
||||||
records=sorted(records, key=lambda r: r.deadline), # noqa
|
records=sorted(records, key=lambda r: r.deadline), # noqa
|
||||||
summary=create_assignment_summary( # 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
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,11 @@ def attendance_day_presences(
|
||||||
course_id: graphene.ID,
|
course_id: graphene.ID,
|
||||||
course_session_selection_ids: graphene.List(graphene.ID),
|
course_session_selection_ids: graphene.List(graphene.ID),
|
||||||
circle_ids: List[graphene.ID] = None,
|
circle_ids: List[graphene.ID] = None,
|
||||||
|
urql_id: str = None,
|
||||||
) -> AttendanceDayPresencesStatisticsType:
|
) -> AttendanceDayPresencesStatisticsType:
|
||||||
|
if urql_id is None:
|
||||||
|
urql_id = str(course_id)
|
||||||
|
|
||||||
completed = CourseSessionAttendanceCourse.objects.filter(
|
completed = CourseSessionAttendanceCourse.objects.filter(
|
||||||
course_session_id__in=course_session_selection_ids,
|
course_session_id__in=course_session_selection_ids,
|
||||||
due_date__end__lt=timezone.now(),
|
due_date__end__lt=timezone.now(),
|
||||||
|
|
@ -76,7 +80,7 @@ def attendance_day_presences(
|
||||||
|
|
||||||
records.append(
|
records.append(
|
||||||
PresenceRecordStatisticsType(
|
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
|
course_session_id=course_session.id, # noqa
|
||||||
generation=course_session.generation, # noqa
|
generation=course_session.generation, # noqa
|
||||||
circle_id=circle.id, # noqa
|
circle_id=circle.id, # noqa
|
||||||
|
|
@ -88,7 +92,7 @@ def attendance_day_presences(
|
||||||
)
|
)
|
||||||
|
|
||||||
summary = AttendanceSummaryStatisticsType(
|
summary = AttendanceSummaryStatisticsType(
|
||||||
_id=course_id, # noqa
|
_id=urql_id, # noqa
|
||||||
days_completed=len(records), # noqa
|
days_completed=len(records), # noqa
|
||||||
participants_present=calculate_avg_participation(records), # noqa
|
participants_present=calculate_avg_participation(records), # noqa
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ def competences(
|
||||||
course_slug: str,
|
course_slug: str,
|
||||||
user_selection_ids: List[str] | None = None,
|
user_selection_ids: List[str] | None = None,
|
||||||
circle_ids: List[str] | None = None,
|
circle_ids: List[str] | None = None,
|
||||||
|
urql_id_postfix: str = "",
|
||||||
) -> Tuple[List[CompetenceRecordStatisticsType], int, int]:
|
) -> Tuple[List[CompetenceRecordStatisticsType], int, int]:
|
||||||
completions = CourseCompletion.objects.filter(
|
completions = CourseCompletion.objects.filter(
|
||||||
course_session_id__in=course_session_selection_ids,
|
course_session_id__in=course_session_selection_ids,
|
||||||
|
|
@ -70,7 +71,7 @@ def competences(
|
||||||
if not circle:
|
if not circle:
|
||||||
continue
|
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(
|
competence_records.setdefault(combined_id, {}).setdefault(
|
||||||
learning_unit,
|
learning_unit,
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,7 @@ class BaseStatisticsType(graphene.ObjectType):
|
||||||
course_session_selection_ids=root.course_session_selection_ids,
|
course_session_selection_ids=root.course_session_selection_ids,
|
||||||
user_selection_ids=user_selection_ids,
|
user_selection_ids=user_selection_ids,
|
||||||
circle_ids=root.get_circle_ids(_info),
|
circle_ids=root.get_circle_ids(_info),
|
||||||
|
urql_id=str(root._id),
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_circle_ids(self, info):
|
def get_circle_ids(self, info):
|
||||||
|
|
@ -133,6 +134,7 @@ class CourseStatisticsType(BaseStatisticsType):
|
||||||
course_id=root.course_id,
|
course_id=root.course_id,
|
||||||
course_session_selection_ids=root.course_session_selection_ids,
|
course_session_selection_ids=root.course_session_selection_ids,
|
||||||
circle_ids=root.get_circle_ids(info),
|
circle_ids=root.get_circle_ids(info),
|
||||||
|
urql_id=str(root._id),
|
||||||
)
|
)
|
||||||
|
|
||||||
def resolve_feedback_responses(root, info) -> FeedbackStatisticsResponsesType:
|
def resolve_feedback_responses(root, info) -> FeedbackStatisticsResponsesType:
|
||||||
|
|
@ -141,6 +143,7 @@ class CourseStatisticsType(BaseStatisticsType):
|
||||||
course_id=root.course_id,
|
course_id=root.course_id,
|
||||||
course_slug=root.course_slug,
|
course_slug=root.course_slug,
|
||||||
circle_ids=root.get_circle_ids(info),
|
circle_ids=root.get_circle_ids(info),
|
||||||
|
urql_id=str(root._id),
|
||||||
)
|
)
|
||||||
|
|
||||||
def resolve_competences(root, info) -> CompetencesStatisticsType:
|
def resolve_competences(root, info) -> CompetencesStatisticsType:
|
||||||
|
|
@ -156,6 +159,7 @@ class CourseStatisticsType(BaseStatisticsType):
|
||||||
],
|
],
|
||||||
user_selection_ids=user_selection_ids, # noqa
|
user_selection_ids=user_selection_ids, # noqa
|
||||||
circle_ids=root.get_circle_ids(info), # noqa
|
circle_ids=root.get_circle_ids(info), # noqa
|
||||||
|
urql_id_postfix=str(root._id), # noqa
|
||||||
)
|
)
|
||||||
return CompetencesStatisticsType(
|
return CompetencesStatisticsType(
|
||||||
_id=root._id, # noqa
|
_id=root._id, # noqa
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,11 @@ def feedback_responses(
|
||||||
course_id: graphene.ID,
|
course_id: graphene.ID,
|
||||||
course_slug: graphene.String,
|
course_slug: graphene.String,
|
||||||
circle_ids: List[graphene.ID] = None,
|
circle_ids: List[graphene.ID] = None,
|
||||||
|
urql_id: str = None,
|
||||||
) -> FeedbackStatisticsResponsesType:
|
) -> FeedbackStatisticsResponsesType:
|
||||||
|
if urql_id is None:
|
||||||
|
urql_id = str(course_id)
|
||||||
|
|
||||||
# Get all course sessions for this user in the given course
|
# Get all course sessions for this user in the given course
|
||||||
course_sessions = CourseSession.objects.filter(
|
course_sessions = CourseSession.objects.filter(
|
||||||
id__in=course_session_selection_ids,
|
id__in=course_session_selection_ids,
|
||||||
|
|
@ -65,6 +69,7 @@ def feedback_responses(
|
||||||
course_session_id=course_session.id,
|
course_session_id=course_session.id,
|
||||||
generation=course_session.generation,
|
generation=course_session.generation,
|
||||||
course_slug=str(course_slug),
|
course_slug=str(course_slug),
|
||||||
|
urql_id_postfix=urql_id,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -76,10 +81,10 @@ def feedback_responses(
|
||||||
avg = 0
|
avg = 0
|
||||||
|
|
||||||
return FeedbackStatisticsResponsesType(
|
return FeedbackStatisticsResponsesType(
|
||||||
_id=course_id, # noqa
|
_id=urql_id, # noqa
|
||||||
records=circle_feedbacks, # noqa
|
records=circle_feedbacks, # noqa
|
||||||
summary=FeedbackStatisticsSummaryType( # noqa
|
summary=FeedbackStatisticsSummaryType( # noqa
|
||||||
_id=course_id, # noqa
|
_id=urql_id, # noqa
|
||||||
satisfaction_average=avg, # noqa
|
satisfaction_average=avg, # noqa
|
||||||
satisfaction_max=4, # noqa
|
satisfaction_max=4, # noqa
|
||||||
total_responses=total_responses, # noqa
|
total_responses=total_responses, # noqa
|
||||||
|
|
@ -92,6 +97,7 @@ def circle_feedback_average(
|
||||||
course_session_id,
|
course_session_id,
|
||||||
generation: str,
|
generation: str,
|
||||||
course_slug: str,
|
course_slug: str,
|
||||||
|
urql_id_postfix: str = "",
|
||||||
):
|
):
|
||||||
circle_data = {}
|
circle_data = {}
|
||||||
records = []
|
records = []
|
||||||
|
|
@ -119,7 +125,7 @@ def circle_feedback_average(
|
||||||
|
|
||||||
records.append(
|
records.append(
|
||||||
FeedbackStatisticsRecordType(
|
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
|
course_session_id=course_session_id, # noqa
|
||||||
generation=generation, # noqa
|
generation=generation, # noqa
|
||||||
circle_id=circle_id, # noqa
|
circle_id=circle_id, # noqa
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue