86 lines
2.9 KiB
Python
86 lines
2.9 KiB
Python
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
|