chore: details url for feedbacks

This commit is contained in:
Livio Bieri 2023-10-25 16:30:10 +02:00
parent b9c622b20d
commit d5025e3408
5 changed files with 40 additions and 6 deletions

View File

@ -49,6 +49,7 @@ class DashboardQuery(graphene.ObjectType):
return CourseStatisticsType( return CourseStatisticsType(
id=course.id, # noqa id=course.id, # noqa
course_title=course.title, # noqa course_title=course.title, # noqa
course_slug=course.slug, # noqa
course_session_selection_ids=list(course_session_ids), # noqa course_session_selection_ids=list(course_session_ids), # noqa
) )

View File

@ -59,6 +59,7 @@ class CourseProgressType(graphene.ObjectType):
class CourseStatisticsType(graphene.ObjectType): class CourseStatisticsType(graphene.ObjectType):
id = graphene.ID(required=True) # course_id, named id for urql id = graphene.ID(required=True) # course_id, named id for urql
course_title = graphene.String(required=True) course_title = graphene.String(required=True)
course_slug = graphene.String(required=True)
course_session_properties = graphene.Field(CourseSessionProperties, required=True) course_session_properties = graphene.Field(CourseSessionProperties, required=True)
course_session_selection_ids = graphene.List(graphene.ID, required=True) course_session_selection_ids = graphene.List(graphene.ID, required=True)
course_session_selection_metrics = graphene.Field( course_session_selection_metrics = graphene.Field(
@ -70,16 +71,25 @@ class CourseStatisticsType(graphene.ObjectType):
competences = graphene.Field(Competences, required=True) competences = graphene.Field(Competences, required=True)
def resolve_attendance_day_presences(root, info) -> AttendanceDayPresences: def resolve_attendance_day_presences(root, info) -> AttendanceDayPresences:
return attendance_day_presences(root.course_session_selection_ids) return attendance_day_presences(
course_session_selection_ids=root.course_session_selection_ids
)
def resolve_feedback_responses(root, info) -> FeedbackResponses: def resolve_feedback_responses(root, info) -> FeedbackResponses:
return feedback_responses(root.course_session_selection_ids) return feedback_responses(
course_session_selection_ids=root.course_session_selection_ids,
course_slug=root.course_slug,
)
def resolve_competences(root, info) -> Competences: def resolve_competences(root, info) -> Competences:
return competences(root.course_session_selection_ids) return competences(
course_session_selection_ids=root.course_session_selection_ids,
)
def resolve_assignments(root, info) -> Assignments: def resolve_assignments(root, info) -> Assignments:
return assignments(root.course_session_selection_ids) return assignments(
course_session_selection_ids=root.course_session_selection_ids
)
def resolve_course_session_selection_metrics( def resolve_course_session_selection_metrics(
root, info root, info

View File

@ -19,6 +19,7 @@ class FeedbackRecord(graphene.ObjectType):
circle_id = graphene.ID(required=True) circle_id = graphene.ID(required=True)
satisfaction_average = graphene.Float(required=True) satisfaction_average = graphene.Float(required=True)
satisfaction_max = graphene.Int(required=True) satisfaction_max = graphene.Int(required=True)
details_url = graphene.String(required=True)
class FeedbackResponses(graphene.ObjectType): class FeedbackResponses(graphene.ObjectType):
@ -28,6 +29,7 @@ class FeedbackResponses(graphene.ObjectType):
def feedback_responses( def feedback_responses(
course_session_selection_ids: graphene.List(graphene.ID), course_session_selection_ids: graphene.List(graphene.ID),
course_slug: graphene.String,
) -> FeedbackResponses: ) -> FeedbackResponses:
# 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(
@ -44,7 +46,12 @@ def feedback_responses(
) )
circle_feedbacks.extend( circle_feedbacks.extend(
circle_feedback_average(fbs, course_session.id, course_session.generation) circle_feedback_average(
feedbacks=fbs,
course_session_id=course_session.id,
generation=course_session.generation,
course_slug=str(course_slug),
)
) )
avg = sum([fb.satisfaction_average for fb in circle_feedbacks]) / len( avg = sum([fb.satisfaction_average for fb in circle_feedbacks]) / len(
@ -62,7 +69,10 @@ def feedback_responses(
def circle_feedback_average( def circle_feedback_average(
feedbacks: List[FeedbackResponse], course_session_id, generation: str feedbacks: List[FeedbackResponse],
course_session_id,
generation: str,
course_slug: str,
): ):
circle_data = {} circle_data = {}
records = [] records = []
@ -81,6 +91,7 @@ def circle_feedback_average(
circle_data[circle_id] = {"total": satisfaction, "count": 1} circle_data[circle_id] = {"total": satisfaction, "count": 1}
for circle_id, data in circle_data.items(): for circle_id, data in circle_data.items():
details_url = f"/course/{course_slug}/cockpit/feedback/{circle_id}?courseSessionId={course_session_id}"
records.append( records.append(
FeedbackRecord( FeedbackRecord(
course_session_id=course_session_id, # noqa course_session_id=course_session_id, # noqa
@ -88,6 +99,7 @@ def circle_feedback_average(
circle_id=circle_id, # noqa circle_id=circle_id, # noqa
satisfaction_average=data["total"] / data["count"], # noqa satisfaction_average=data["total"] / data["count"], # noqa
satisfaction_max=4, # noqa satisfaction_max=4, # noqa
details_url=details_url, # noqa
) )
) )

View File

@ -188,6 +188,7 @@ class DashboardTestCase(GraphQLTestCase):
course_statistics(course_id: $course_id) {{ course_statistics(course_id: $course_id) {{
id id
course_title course_title
course_slug
}} }}
}} }}
""" """
@ -203,6 +204,7 @@ class DashboardTestCase(GraphQLTestCase):
self.assertEqual(course_statistics["id"], str(course_2.id)) self.assertEqual(course_statistics["id"], str(course_2.id))
self.assertEqual(course_statistics["course_title"], course_2.title) self.assertEqual(course_statistics["course_title"], course_2.title)
self.assertEqual(course_statistics["course_slug"], course_2.slug)
def find_dashboard_config_by_course_id(dashboard_configs, course_id): def find_dashboard_config_by_course_id(dashboard_configs, course_id):

View File

@ -79,6 +79,7 @@ class DashboardFeedbackTestCase(GraphQLTestCase):
circle_id circle_id
satisfaction_average satisfaction_average
satisfaction_max satisfaction_max
details_url
}} }}
summary {{ summary {{
satisfaction_average satisfaction_average
@ -109,6 +110,10 @@ class DashboardFeedbackTestCase(GraphQLTestCase):
self.assertEqual(circle1_record["satisfaction_average"], 3.5) self.assertEqual(circle1_record["satisfaction_average"], 3.5)
self.assertEqual(circle1_record["course_session_id"], str(course_session.id)) self.assertEqual(circle1_record["course_session_id"], str(course_session.id))
self.assertEqual(circle1_record["generation"], "2023") self.assertEqual(circle1_record["generation"], "2023")
self.assertEqual(
circle1_record["details_url"],
f"/course/{course.slug}/cockpit/feedback/{circle1.id}?courseSessionId={course_session.id}",
)
circle2_record = next( circle2_record = next(
(r for r in records if r["circle_id"] == str(circle2.id)), None (r for r in records if r["circle_id"] == str(circle2.id)), None
@ -116,6 +121,10 @@ class DashboardFeedbackTestCase(GraphQLTestCase):
self.assertEqual(circle2_record["satisfaction_average"], 1.5) self.assertEqual(circle2_record["satisfaction_average"], 1.5)
self.assertEqual(circle2_record["course_session_id"], str(course_session.id)) self.assertEqual(circle2_record["course_session_id"], str(course_session.id))
self.assertEqual(circle2_record["generation"], "2023") self.assertEqual(circle2_record["generation"], "2023")
self.assertEqual(
circle2_record["details_url"],
f"/course/{course.slug}/cockpit/feedback/{circle2.id}?courseSessionId={course_session.id}",
)
summary = feedback_responses["summary"] summary = feedback_responses["summary"]
self.assertEqual(summary["satisfaction_average"], 2.5) self.assertEqual(summary["satisfaction_average"], 2.5)