import graphene from vbv_lernwelt.course.models import Course, CourseSession from vbv_lernwelt.course_session_group.models import CourseSessionGroup from vbv_lernwelt.dashboard.graphql.types.dashboard import ( CourseStatisticsType, DashboardConfigType, DashboardType, ) from vbv_lernwelt.iam.permissions import ( can_view_course_session, can_view_course_session_group_statistics, can_view_course_session_progress, ) class DashboardQuery(graphene.ObjectType): course_statistics = graphene.Field( CourseStatisticsType, course_id=graphene.ID(required=True) ) dashboard_config = graphene.List( graphene.NonNull(DashboardConfigType), required=True ) 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( 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), "name": course.title, "dashboard_type": DashboardType.STATISTICS_DASHBOARD, } ) for course_session in CourseSession.objects.exclude(course__in=course_index): course = course_session.course if can_view_course_session(user=user, course_session=course_session): dashboards.append( { "id": str(course.id), "name": course.title, "dashboard_type": DashboardType.SIMPLE_LIST_DASHBOARD, } ) if can_view_course_session_progress( user=user, course_session=course_session ): dashboards.append( { "id": str(course.id), "name": course.title, "dashboard_type": DashboardType.PROGRESS_DASHBOARD, } ) return dashboards