chore: also expose course config in dashboard
This commit is contained in:
parent
3b2385afe1
commit
51609591e1
|
|
@ -1,12 +1,14 @@
|
||||||
from typing import Dict, List, Set, Tuple
|
from typing import Dict, List, Set, Tuple
|
||||||
|
|
||||||
import graphene
|
import graphene
|
||||||
|
from graphql import GraphQLError
|
||||||
|
|
||||||
from vbv_lernwelt.assignment.models import (
|
from vbv_lernwelt.assignment.models import (
|
||||||
AssignmentCompletion,
|
AssignmentCompletion,
|
||||||
AssignmentCompletionStatus,
|
AssignmentCompletionStatus,
|
||||||
)
|
)
|
||||||
from vbv_lernwelt.core.admin import User
|
from vbv_lernwelt.core.admin import User
|
||||||
|
from vbv_lernwelt.course.graphql.types import CourseConfigurationObjectType
|
||||||
from vbv_lernwelt.course.models import Course, CourseSession, CourseSessionUser
|
from vbv_lernwelt.course.models import Course, CourseSession, CourseSessionUser
|
||||||
from vbv_lernwelt.course_session_group.models import CourseSessionGroup
|
from vbv_lernwelt.course_session_group.models import CourseSessionGroup
|
||||||
from vbv_lernwelt.dashboard.graphql.types.competence import competences
|
from vbv_lernwelt.dashboard.graphql.types.competence import competences
|
||||||
|
|
@ -22,6 +24,7 @@ from vbv_lernwelt.iam.permissions import (
|
||||||
can_view_course_session,
|
can_view_course_session,
|
||||||
can_view_course_session_group_statistics,
|
can_view_course_session_group_statistics,
|
||||||
can_view_course_session_progress,
|
can_view_course_session_progress,
|
||||||
|
can_view_course,
|
||||||
)
|
)
|
||||||
from vbv_lernwelt.learning_mentor.models import LearningMentor
|
from vbv_lernwelt.learning_mentor.models import LearningMentor
|
||||||
|
|
||||||
|
|
@ -31,6 +34,10 @@ class DashboardQuery(graphene.ObjectType):
|
||||||
CourseStatisticsType, course_id=graphene.ID(required=True)
|
CourseStatisticsType, course_id=graphene.ID(required=True)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
course_configuration = graphene.Field(
|
||||||
|
CourseConfigurationObjectType, course_id=graphene.ID(required=True)
|
||||||
|
)
|
||||||
|
|
||||||
course_progress = graphene.Field(
|
course_progress = graphene.Field(
|
||||||
CourseProgressType, course_id=graphene.ID(required=True)
|
CourseProgressType, course_id=graphene.ID(required=True)
|
||||||
)
|
)
|
||||||
|
|
@ -39,6 +46,14 @@ class DashboardQuery(graphene.ObjectType):
|
||||||
graphene.NonNull(DashboardConfigType), required=True
|
graphene.NonNull(DashboardConfigType), required=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def resolve_course_configuration(root, info, course_id: str): # noqa
|
||||||
|
course = Course.objects.get(id=course_id)
|
||||||
|
|
||||||
|
if not can_view_course(user=info.context.user, course=course):
|
||||||
|
raise GraphQLError("You do not have access to this course.")
|
||||||
|
|
||||||
|
return course.configuration
|
||||||
|
|
||||||
def resolve_course_statistics(root, info, course_id: str): # noqa
|
def resolve_course_statistics(root, info, course_id: str): # noqa
|
||||||
user = info.context.user
|
user = info.context.user
|
||||||
course = Course.objects.get(id=course_id)
|
course = Course.objects.get(id=course_id)
|
||||||
|
|
|
||||||
|
|
@ -150,6 +150,62 @@ class DashboardTestCase(GraphQLTestCase):
|
||||||
self.assertEqual(assignment["points_max_count"], 50)
|
self.assertEqual(assignment["points_max_count"], 50)
|
||||||
self.assertEqual(assignment["points_achieved_count"], 20)
|
self.assertEqual(assignment["points_achieved_count"], 20)
|
||||||
|
|
||||||
|
def test_course_configuration_denied(self):
|
||||||
|
# GIVEN
|
||||||
|
role_less_user = create_user("sepp@blatter.fifa")
|
||||||
|
self.client.force_login(role_less_user)
|
||||||
|
|
||||||
|
course, _ = create_course("Course 1")
|
||||||
|
|
||||||
|
# WHEN
|
||||||
|
query = """query($course_id: ID!) {
|
||||||
|
course_configuration(course_id: $course_id) {
|
||||||
|
enable_circle_documents
|
||||||
|
enable_learning_mentor
|
||||||
|
enable_competence_certificates
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
response = self.query(query, variables={"course_id": str(course.id)})
|
||||||
|
|
||||||
|
# THEN
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertEqual(
|
||||||
|
response.json()["errors"][0]["message"],
|
||||||
|
"You do not have access to this course.",
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_course_configuration(self):
|
||||||
|
# GIVEN
|
||||||
|
member = create_user("sepp@blatter.fifa")
|
||||||
|
self.client.force_login(member)
|
||||||
|
|
||||||
|
course, _ = create_course("Course 1")
|
||||||
|
add_course_session_user(
|
||||||
|
course_session=create_course_session(course=course, title="Whatever"),
|
||||||
|
role=CourseSessionUser.Role.MEMBER,
|
||||||
|
user=member,
|
||||||
|
)
|
||||||
|
|
||||||
|
# WHEN
|
||||||
|
query = """query($course_id: ID!) {
|
||||||
|
course_configuration(course_id: $course_id) {
|
||||||
|
enable_circle_documents
|
||||||
|
enable_learning_mentor
|
||||||
|
enable_competence_certificates
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
response = self.query(query, variables={"course_id": str(course.id)})
|
||||||
|
|
||||||
|
# THEN
|
||||||
|
self.assertResponseNoErrors(response)
|
||||||
|
|
||||||
|
course_configuration = response.json()["data"]["course_configuration"]
|
||||||
|
self.assertEqual(course_configuration["enable_circle_documents"], True)
|
||||||
|
self.assertEqual(course_configuration["enable_learning_mentor"], True)
|
||||||
|
self.assertEqual(course_configuration["enable_competence_certificates"], True)
|
||||||
|
|
||||||
def test_dashboard_config(self):
|
def test_dashboard_config(self):
|
||||||
# GIVEN
|
# GIVEN
|
||||||
course_1, _ = create_course("Test Course 1")
|
course_1, _ = create_course("Test Course 1")
|
||||||
|
|
|
||||||
|
|
@ -178,6 +178,16 @@ def has_role_in_course(user: User, course: Course) -> bool:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def can_view_course(user: User, course: Course) -> bool:
|
||||||
|
if user.is_superuser:
|
||||||
|
return True
|
||||||
|
|
||||||
|
if has_role_in_course(user, course):
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def can_view_profile(user: User, profile_user: CourseSessionUser) -> bool:
|
def can_view_profile(user: User, profile_user: CourseSessionUser) -> bool:
|
||||||
if user.is_superuser:
|
if user.is_superuser:
|
||||||
return True
|
return True
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue