feat: dashboard API feedback
This commit is contained in:
parent
ea2e303592
commit
09181d0e72
|
|
@ -29,7 +29,6 @@ class Record(graphene.ObjectType):
|
||||||
class AttendanceDayPresences(graphene.ObjectType):
|
class AttendanceDayPresences(graphene.ObjectType):
|
||||||
records = graphene.List(Record)
|
records = graphene.List(Record)
|
||||||
summary = graphene.Field(AttendanceSummary)
|
summary = graphene.Field(AttendanceSummary)
|
||||||
filter = graphene.String()
|
|
||||||
|
|
||||||
|
|
||||||
def attendance_day_presences(course_id: graphene.String(), user: User):
|
def attendance_day_presences(course_id: graphene.String(), user: User):
|
||||||
|
|
@ -40,7 +39,6 @@ def attendance_day_presences(course_id: graphene.String(), user: User):
|
||||||
course_session__course_id=course_id,
|
course_session__course_id=course_id,
|
||||||
).order_by("-due_date__end")
|
).order_by("-due_date__end")
|
||||||
|
|
||||||
_filter = {}
|
|
||||||
records = []
|
records = []
|
||||||
|
|
||||||
for attendance_day in completed:
|
for attendance_day in completed:
|
||||||
|
|
@ -62,7 +60,6 @@ def attendance_day_presences(course_id: graphene.String(), user: User):
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
_filter[circle.id] = circle.title
|
|
||||||
records.append(
|
records.append(
|
||||||
Record(
|
Record(
|
||||||
course_session_id=course_session.id,
|
course_session_id=course_session.id,
|
||||||
|
|
@ -80,7 +77,7 @@ def attendance_day_presences(course_id: graphene.String(), user: User):
|
||||||
participants_present=calculate_avg_participation(records),
|
participants_present=calculate_avg_participation(records),
|
||||||
)
|
)
|
||||||
|
|
||||||
return AttendanceDayPresences(summary=summary, records=records, filter="fuck")
|
return AttendanceDayPresences(summary=summary, records=records)
|
||||||
|
|
||||||
|
|
||||||
def calculate_avg_participation(records: List[Record]) -> float:
|
def calculate_avg_participation(records: List[Record]) -> float:
|
||||||
|
|
|
||||||
|
|
@ -4,20 +4,42 @@ from vbv_lernwelt.dashboard.graphql.types.attendance import (
|
||||||
attendance_day_presences,
|
attendance_day_presences,
|
||||||
AttendanceDayPresences,
|
AttendanceDayPresences,
|
||||||
)
|
)
|
||||||
from vbv_lernwelt.dashboard.graphql.types.feedback import FeedbackResponses
|
from vbv_lernwelt.dashboard.graphql.types.feedback import (
|
||||||
|
feedback_responses,
|
||||||
|
FeedbackResponses,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class CourseSessionDashboardType(graphene.ObjectType):
|
class CourseSessionData(graphene.ObjectType):
|
||||||
session_id = graphene.ID()
|
session_id = graphene.ID()
|
||||||
session_title = graphene.String()
|
session_title = graphene.String()
|
||||||
session_generation = graphene.String()
|
|
||||||
|
|
||||||
|
class CircleData(graphene.ObjectType):
|
||||||
|
circle_id = graphene.ID()
|
||||||
|
circle_title = graphene.String()
|
||||||
|
experts = graphene.List(graphene.String)
|
||||||
|
|
||||||
|
|
||||||
|
class CourseSessionProperties(graphene.ObjectType):
|
||||||
|
sessions = graphene.List(CourseSessionData)
|
||||||
|
generations = graphene.List(graphene.String)
|
||||||
|
circles = graphene.List(CircleData)
|
||||||
|
|
||||||
|
|
||||||
class CourseDashboardType(graphene.ObjectType):
|
class CourseDashboardType(graphene.ObjectType):
|
||||||
course_id = graphene.String()
|
course_id = graphene.String()
|
||||||
course_title = graphene.String()
|
course_title = graphene.String()
|
||||||
|
course_session_properties = graphene.Field(CourseSessionProperties)
|
||||||
attendance_day_presences = graphene.Field(AttendanceDayPresences)
|
attendance_day_presences = graphene.Field(AttendanceDayPresences)
|
||||||
feedback_responses = graphene.Field(FeedbackResponses)
|
feedback_responses = graphene.Field(FeedbackResponses)
|
||||||
|
|
||||||
def resolve_attendance_day_presences(root, info):
|
def resolve_attendance_day_presences(root, info):
|
||||||
return attendance_day_presences(root.course_id, info.context.user)
|
return attendance_day_presences(root.course_id, info.context.user)
|
||||||
|
|
||||||
|
def resolve_feedback_responses(root, info):
|
||||||
|
return feedback_responses(root.course_id, info.context.user)
|
||||||
|
|
||||||
|
def resolve_course_session_properties(root, info):
|
||||||
|
pass
|
||||||
|
# return course_session_properties(root.course_id, info.context.user)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
|
from typing import List
|
||||||
|
|
||||||
import graphene
|
import graphene
|
||||||
|
|
||||||
|
from vbv_lernwelt.core.models import User
|
||||||
|
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
|
||||||
|
from vbv_lernwelt.feedback.models import FeedbackResponse
|
||||||
|
|
||||||
|
|
||||||
class FeedbackSummary(graphene.ObjectType):
|
class FeedbackSummary(graphene.ObjectType):
|
||||||
satisfaction_average = graphene.Float()
|
satisfaction_average = graphene.Float()
|
||||||
|
|
@ -16,3 +22,44 @@ class Record(graphene.ObjectType):
|
||||||
class FeedbackResponses(graphene.ObjectType):
|
class FeedbackResponses(graphene.ObjectType):
|
||||||
records = graphene.List(Record)
|
records = graphene.List(Record)
|
||||||
summary = graphene.Field(FeedbackSummary)
|
summary = graphene.Field(FeedbackSummary)
|
||||||
|
|
||||||
|
|
||||||
|
def feedback_responses(course_id: graphene.String(), user: User):
|
||||||
|
# Get all course sessions for this user in the given course
|
||||||
|
course_sessions = CourseSession.objects.filter(
|
||||||
|
coursesessionuser__user=user,
|
||||||
|
coursesessionuser__role=CourseSessionUser.Role.SESSION_SUPERVISOR,
|
||||||
|
course_id=course_id,
|
||||||
|
)
|
||||||
|
|
||||||
|
for course_session in course_sessions:
|
||||||
|
fbs = FeedbackResponse.objects.filter(
|
||||||
|
submitted=True,
|
||||||
|
course_session=course_session,
|
||||||
|
# Only get feedbacks from members
|
||||||
|
feedback_user__in=CourseSessionUser.objects.filter(
|
||||||
|
course_session=course_session, role=CourseSessionUser.Role.MEMBER
|
||||||
|
).values_list("user", flat=True),
|
||||||
|
)
|
||||||
|
circle_feedbacks = circle_feedback_average(fbs)
|
||||||
|
|
||||||
|
return FeedbackResponses()
|
||||||
|
|
||||||
|
|
||||||
|
def circle_feedback_average(feedbacks: List[FeedbackResponse]):
|
||||||
|
circle_data = {}
|
||||||
|
|
||||||
|
for fb in feedbacks:
|
||||||
|
circle_id = fb.circle.id
|
||||||
|
satisfaction = fb.data.get("satisfaction", 0)
|
||||||
|
|
||||||
|
if circle_id in circle_data:
|
||||||
|
circle_data[circle_id]["total"] += satisfaction
|
||||||
|
circle_data[circle_id]["count"] += 1
|
||||||
|
else:
|
||||||
|
circle_data[circle_id] = {"total": satisfaction, "count": 1}
|
||||||
|
|
||||||
|
for circle_id, data in circle_data.items():
|
||||||
|
circle_data[circle_id]["avg_satisfaction"] = data["total"] / data["count"]
|
||||||
|
|
||||||
|
return circle_data
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ from vbv_lernwelt.dashboard.tests.graphql.utils import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class DashboardTestCase(GraphQLTestCase):
|
class DashboardAttendanceTestCase(GraphQLTestCase):
|
||||||
GRAPHQL_URL = "/server/graphql/"
|
GRAPHQL_URL = "/server/graphql/"
|
||||||
|
|
||||||
def test_attendance_day_presences(self):
|
def test_attendance_day_presences(self):
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
from graphene_django.utils import GraphQLTestCase
|
||||||
|
|
||||||
|
from vbv_lernwelt.course.models import CourseSessionUser
|
||||||
|
from vbv_lernwelt.dashboard.graphql.types.feedback import feedback_responses
|
||||||
|
from vbv_lernwelt.dashboard.tests.graphql.utils import (
|
||||||
|
add_course_session_user,
|
||||||
|
create_circle,
|
||||||
|
create_course,
|
||||||
|
create_course_session,
|
||||||
|
create_user,
|
||||||
|
)
|
||||||
|
from vbv_lernwelt.feedback.models import FeedbackResponse
|
||||||
|
|
||||||
|
|
||||||
|
class DashboardFeedbackTestCase(GraphQLTestCase):
|
||||||
|
GRAPHQL_URL = "/server/graphql/"
|
||||||
|
|
||||||
|
def test_feedback(self):
|
||||||
|
# GIVEN
|
||||||
|
course, course_page = create_course("Test Course")
|
||||||
|
course_session = create_course_session(course=course, title="Test Bern 2022 a")
|
||||||
|
|
||||||
|
supervisor = create_user("supervisor")
|
||||||
|
|
||||||
|
add_course_session_user(
|
||||||
|
course_session=course_session,
|
||||||
|
user=supervisor,
|
||||||
|
role=CourseSessionUser.Role.SESSION_SUPERVISOR,
|
||||||
|
)
|
||||||
|
|
||||||
|
member = create_user("member")
|
||||||
|
|
||||||
|
circle1, _ = create_circle(title="Test Circle 1", course_page=course_page)
|
||||||
|
circle2, _ = create_circle(title="Test Circle 2", course_page=course_page)
|
||||||
|
|
||||||
|
FeedbackResponse.objects.create(
|
||||||
|
feedback_user=member,
|
||||||
|
data={"satisfaction": 3},
|
||||||
|
circle=circle1,
|
||||||
|
course_session=course_session,
|
||||||
|
)
|
||||||
|
FeedbackResponse.objects.create(
|
||||||
|
feedback_user=member,
|
||||||
|
data={"satisfaction": 4},
|
||||||
|
circle=circle1,
|
||||||
|
course_session=course_session,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create Feedbacks for circle2
|
||||||
|
FeedbackResponse.objects.create(
|
||||||
|
feedback_user=member,
|
||||||
|
data={"satisfaction": 5},
|
||||||
|
circle=circle2,
|
||||||
|
course_session=course_session,
|
||||||
|
)
|
||||||
|
FeedbackResponse.objects.create(
|
||||||
|
feedback_user=member,
|
||||||
|
data={"satisfaction": 2},
|
||||||
|
circle=circle2,
|
||||||
|
course_session=course_session,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Get average satisfaction per circle
|
||||||
|
result = feedback_responses(course.id, supervisor)
|
||||||
|
|
||||||
|
# THEN
|
||||||
Loading…
Reference in New Issue