feat: add dashboard API

This commit is contained in:
Reto Aebersold 2023-10-16 09:23:25 +02:00
parent 7cbe15ce50
commit 90a8f851d2
9 changed files with 142 additions and 0 deletions

View File

@ -6,6 +6,7 @@ from vbv_lernwelt.competence.graphql.queries import CompetenceCertificateQuery
from vbv_lernwelt.course.graphql.queries import CourseQuery
from vbv_lernwelt.course_session.graphql.mutations import CourseSessionMutation
from vbv_lernwelt.course_session.graphql.queries import CourseSessionQuery
from vbv_lernwelt.dashboard.graphql.queries import DashboardQuery
from vbv_lernwelt.feedback.graphql.mutations import FeedbackMutation
from vbv_lernwelt.learnpath.graphql.queries import LearningPathQuery
@ -16,6 +17,7 @@ class Query(
CourseQuery,
CourseSessionQuery,
LearningPathQuery,
DashboardQuery,
graphene.ObjectType,
):
pass

View File

@ -266,6 +266,7 @@ class CourseSessionUser(models.Model):
class Role(models.TextChoices):
MEMBER = "MEMBER", _("Teilnehmer")
EXPERT = "EXPERT", _("Experte/Trainer")
SESSION_SUPERVISOR = "SESSION_SUPERVISOR", _("Regionalleiter")
TUTOR = "TUTOR", _("Lernbegleitung")
role = models.CharField(choices=Role.choices, max_length=255, default=Role.MEMBER)

View File

@ -0,0 +1,20 @@
import graphene
from vbv_lernwelt.course.models import Course, CourseSessionUser
from vbv_lernwelt.dashboard.graphql.types import CourseDashboardType
class DashboardQuery(graphene.ObjectType):
course_dashboard = graphene.List(CourseDashboardType)
def resolve_course_dashboard(root, info, course_id: str | None = None):
user = info.context.user
courses = Course.objects.filter(
coursesession__coursesessionuser__user=user,
coursesession__coursesessionuser__role=CourseSessionUser.Role.SESSION_SUPERVISOR,
).distinct()
return [
CourseDashboardType(course_id=course.id, course_title=course.title)
for course in courses
]

View File

@ -0,0 +1,16 @@
import graphene
class CourseSessionDashboardType(graphene.ObjectType):
session_id = graphene.String()
class CourseDashboardType(graphene.ObjectType):
course_id = graphene.String()
course_title = graphene.String()
course_sessions = graphene.List(CourseSessionDashboardType)
def resolve_course_sessions(self, info):
session = []
return [CourseSessionDashboardType() for s in session]

View File

@ -0,0 +1,61 @@
from graphene_django.utils import GraphQLTestCase
from vbv_lernwelt.course.models import CourseSessionUser
from vbv_lernwelt.dashboard.tests.utils import (
add_course_session_user,
create_course,
create_course_session,
create_user,
)
class DashboardTestCase(GraphQLTestCase):
GRAPHQL_URL = "/server/graphql/"
def setUp(self):
self.trainer = create_user("supervisor")
self.course = create_course("Test Course")
self.course_session = create_course_session(
course=self.course, title="Test Bern 2022 a"
)
add_course_session_user(
course_session=self.course_session,
user=self.trainer,
role=CourseSessionUser.Role.SESSION_SUPERVISOR,
)
def test_courses(self):
# GIVEN
some_course = create_course("Other Course")
some_course_session = create_course_session(
course=some_course, title="Here is go study"
)
add_course_session_user(
course_session=some_course_session,
user=self.trainer,
role=CourseSessionUser.Role.MEMBER,
)
self.client.force_login(self.trainer)
query = f"""
query {{
course_dashboard {{
course_id
course_sessions{{
session_id
}}
}}
}}
"""
# WHEN
response = self.query(query)
# THEN
self.assertResponseNoErrors(response)
course_dashboard = response.json()["data"]["course_dashboard"]
self.assertEqual(len(course_dashboard), 1)
self.assertEqual(course_dashboard[0]["course_id"], str(self.course.id))

View File

@ -0,0 +1,42 @@
from django.contrib.auth.hashers import make_password
from django.utils import timezone
from django.utils.text import slugify
from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.models import Course, CourseSession, CourseSessionUser
def create_course(title: str) -> Course:
return Course.objects.create(
title=title, slug=slugify(title), category_name="Handlungsfeld"
)
def create_user(username: str) -> User:
user = User.objects.create_user(
username="username",
password=make_password("test"),
email=f"{username}@example.com",
language="de",
)
return user
def create_course_session(course: Course, title: str) -> CourseSession:
return CourseSession.objects.create(
course=course,
title=title,
import_id=title,
start_date=timezone.now(),
)
def add_course_session_user(
course_session: CourseSession, user: User, role: CourseSessionUser.Role
) -> CourseSessionUser:
return CourseSessionUser.objects.create(
course_session=course_session,
user=user,
role=role,
)