diff --git a/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py b/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py index 7013f504..863d7fe7 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py @@ -1,5 +1,6 @@ import graphene +from vbv_lernwelt.course.models import CourseSession, CourseSessionUser from vbv_lernwelt.dashboard.graphql.types.attendance import ( attendance_day_presences, AttendanceDayPresences, @@ -8,6 +9,7 @@ from vbv_lernwelt.dashboard.graphql.types.feedback import ( feedback_responses, FeedbackResponses, ) +from vbv_lernwelt.learnpath.models import Circle class CourseSessionData(graphene.ObjectType): @@ -41,5 +43,52 @@ class CourseDashboardType(graphene.ObjectType): return feedback_responses(root.course_id, info.context.user) def resolve_course_session_properties(root, info): - pass - # return course_session_properties(root.course_id, info.context.user) + course_session_data = [] + circle_data = [] + generations = set() + + course_sessions = CourseSession.objects.filter( + coursesessionuser__user=info.context.user, + coursesessionuser__role=CourseSessionUser.Role.SESSION_SUPERVISOR, + course_id=root.course_id, + ) + + for course_session in course_sessions: + course_session_data.append( + CourseSessionData( + session_id=course_session.id, + session_title=course_session.title, + ) + ) + generations.add(course_session.generation) + + # Get all circles for this course session + siblings = ( + course_session.course.get_learning_path() + .get_descendants() + .live() + .specific() + ) + + circles = [] + for sibling in siblings: + if sibling.specific_class == Circle: + circles.append(sibling.specific) + + for circle in circles: + circle_data.append( + CircleData( + circle_id=circle.id, + circle_title=circle.title, + experts=[ + f"{su.user.first_name} {su.user.last_name}" + for su in circle.expert.all() + ], + ) + ) + + return CourseSessionProperties( + sessions=course_session_data, + generations=list(generations), + circles=circle_data, + ) diff --git a/server/vbv_lernwelt/dashboard/tests/graphql/test_dashboard.py b/server/vbv_lernwelt/dashboard/tests/graphql/test_dashboard.py index f22bd6c3..4f305615 100644 --- a/server/vbv_lernwelt/dashboard/tests/graphql/test_dashboard.py +++ b/server/vbv_lernwelt/dashboard/tests/graphql/test_dashboard.py @@ -3,6 +3,7 @@ from graphene_django.utils import GraphQLTestCase from vbv_lernwelt.course.models import CourseSessionUser from vbv_lernwelt.dashboard.tests.graphql.utils import ( add_course_session_user, + create_circle, create_course, create_course_session, create_user, @@ -15,7 +16,7 @@ class DashboardTestCase(GraphQLTestCase): def test_course_dashboard(self): # GIVEN supervisor = create_user("supervisor") - course, _ = create_course("Test Course") + course, course_page = create_course("Test Course") course_session = create_course_session(course=course, title="Test Bern 2022 a") add_course_session_user( course_session=course_session, @@ -33,6 +34,17 @@ class DashboardTestCase(GraphQLTestCase): role=CourseSessionUser.Role.MEMBER, ) + circle, _ = create_circle(title="Test Circle", course_page=course_page) + + # expert + expert = create_user("expert") + expert_session_user = add_course_session_user( + course_session=some_course_session, + user=expert, + role=CourseSessionUser.Role.EXPERT, + ) + expert_session_user.expert.add(circle) + self.client.force_login(supervisor) query = f""" @@ -40,6 +52,18 @@ class DashboardTestCase(GraphQLTestCase): course_dashboard {{ course_id course_title + course_session_properties{{ + sessions{{ + session_id + session_title + }} + generations + circles{{ + circle_id + circle_title + experts + }} + }} }} }} """ @@ -56,6 +80,28 @@ class DashboardTestCase(GraphQLTestCase): self.assertEqual(course_dashboard[0]["course_id"], str(course.id)) self.assertEqual(course_dashboard[0]["course_title"], str(course.title)) + session_properties = course_dashboard[0]["course_session_properties"] + self.assertEqual(len(session_properties["sessions"]), 1) + self.assertEqual( + session_properties["sessions"][0]["session_id"], str(course_session.id) + ) + self.assertEqual( + session_properties["sessions"][0]["session_title"], + str(course_session.title), + ) + + self.assertEqual(len(session_properties["generations"]), 1) + self.assertEqual( + session_properties["generations"][0], str(course_session.generation) + ) + + self.assertEqual(len(session_properties["circles"]), 1) + self.assertEqual(session_properties["circles"][0]["circle_id"], str(circle.id)) + self.assertEqual( + session_properties["circles"][0]["circle_title"], str(circle.title) + ) + self.assertEqual(session_properties["circles"][0]["experts"], ["Test Expert"]) + def test_course_dashboard_id(self): # GIVEN supervisor = create_user("supervisor") diff --git a/server/vbv_lernwelt/dashboard/tests/graphql/utils.py b/server/vbv_lernwelt/dashboard/tests/graphql/utils.py index 9a1cb7db..9e757d78 100644 --- a/server/vbv_lernwelt/dashboard/tests/graphql/utils.py +++ b/server/vbv_lernwelt/dashboard/tests/graphql/utils.py @@ -20,6 +20,7 @@ from vbv_lernwelt.learnpath.tests.learning_path_factories import ( CircleFactory, LearningContentAttendanceCourseFactory, LearningPathFactory, + TopicFactory, ) @@ -43,6 +44,8 @@ def create_user(username: str) -> User: password=make_password("test"), email=f"{username}@example.com", language="de", + first_name="Test", + last_name=username.capitalize(), ) @@ -72,6 +75,8 @@ def create_circle( if not learning_path: learning_path = LearningPathFactory(title="Test Lernpfad", parent=course_page) + TopicFactory(title="Circle Test Topic", is_visible=False, parent=learning_path) + circle = CircleFactory( title=title, parent=learning_path, description="Circle Description" )