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_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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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