import graphene from vbv_lernwelt.course.models import CourseSession, Course from vbv_lernwelt.course_session_group.models import CourseSessionGroup from vbv_lernwelt.dashboard.graphql.types.dashboard import CourseStatisticsType, DashboardConfigType from vbv_lernwelt.iam.permissions import can_view_course_session_group_statistics, can_view_course_session class DashboardQuery(graphene.ObjectType): course_statistics = graphene.Field(CourseStatisticsType, course_id=graphene.ID(required=True)) dashboard_config = graphene.List( DashboardConfigType ) def resolve_course_statistics(root, info, course_id: str): # noqa user = info.context.user course = Course.objects.get(id=course_id) course_session_ids = set() for group in CourseSessionGroup.objects.filter(course=course): if can_view_course_session_group_statistics(user=user, group=group): course_session_ids.update(group.course_session.all().values_list("id", flat=True)) if not course_session_ids: return None return CourseStatisticsType(course_id=course.id, course_title=course.title, # noqa course_session_selection_ids=list(course_session_ids)) # noqa def resolve_dashboard_config(root, info): # noqa user = info.context.user course_index = set() dashboards = [] for group in CourseSessionGroup.objects.all(): if can_view_course_session_group_statistics(user=user, group=group): course = group.course course_index.add(course) dashboards.append( { "id": str(course.id), "title": course.title, "dashboard_type": "StatisticsDashboard", } ) for course_session in CourseSession.objects.exclude(course__in=course_index): if can_view_course_session(user=user, course_session=course_session): course = course_session.course dashboards.append( { "id": str(course.id), "title": course.title, "dashboard_type": "SimpleDashboard", } ) return dashboards