feat: add dashboard API
This commit is contained in:
parent
7cbe15ce50
commit
90a8f851d2
|
|
@ -6,6 +6,7 @@ from vbv_lernwelt.competence.graphql.queries import CompetenceCertificateQuery
|
||||||
from vbv_lernwelt.course.graphql.queries import CourseQuery
|
from vbv_lernwelt.course.graphql.queries import CourseQuery
|
||||||
from vbv_lernwelt.course_session.graphql.mutations import CourseSessionMutation
|
from vbv_lernwelt.course_session.graphql.mutations import CourseSessionMutation
|
||||||
from vbv_lernwelt.course_session.graphql.queries import CourseSessionQuery
|
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.feedback.graphql.mutations import FeedbackMutation
|
||||||
from vbv_lernwelt.learnpath.graphql.queries import LearningPathQuery
|
from vbv_lernwelt.learnpath.graphql.queries import LearningPathQuery
|
||||||
|
|
||||||
|
|
@ -16,6 +17,7 @@ class Query(
|
||||||
CourseQuery,
|
CourseQuery,
|
||||||
CourseSessionQuery,
|
CourseSessionQuery,
|
||||||
LearningPathQuery,
|
LearningPathQuery,
|
||||||
|
DashboardQuery,
|
||||||
graphene.ObjectType,
|
graphene.ObjectType,
|
||||||
):
|
):
|
||||||
pass
|
pass
|
||||||
|
|
|
||||||
|
|
@ -266,6 +266,7 @@ class CourseSessionUser(models.Model):
|
||||||
class Role(models.TextChoices):
|
class Role(models.TextChoices):
|
||||||
MEMBER = "MEMBER", _("Teilnehmer")
|
MEMBER = "MEMBER", _("Teilnehmer")
|
||||||
EXPERT = "EXPERT", _("Experte/Trainer")
|
EXPERT = "EXPERT", _("Experte/Trainer")
|
||||||
|
SESSION_SUPERVISOR = "SESSION_SUPERVISOR", _("Regionalleiter")
|
||||||
TUTOR = "TUTOR", _("Lernbegleitung")
|
TUTOR = "TUTOR", _("Lernbegleitung")
|
||||||
|
|
||||||
role = models.CharField(choices=Role.choices, max_length=255, default=Role.MEMBER)
|
role = models.CharField(choices=Role.choices, max_length=255, default=Role.MEMBER)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
]
|
||||||
|
|
@ -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]
|
||||||
|
|
@ -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))
|
||||||
|
|
@ -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,
|
||||||
|
)
|
||||||
Loading…
Reference in New Issue