fix: move experts to feedback
This commit is contained in:
parent
9d1328c89d
commit
1e5fb91343
|
|
@ -23,7 +23,7 @@ const documents = {
|
|||
"\n query courseQuery($slug: String!) {\n course(slug: $slug) {\n id\n title\n slug\n category_name\n action_competences {\n competence_id\n ...CoursePageFields\n performance_criteria {\n competence_id\n learning_unit {\n id\n slug\n evaluate_url\n }\n ...CoursePageFields\n }\n }\n learning_path {\n ...CoursePageFields\n topics {\n is_visible\n ...CoursePageFields\n circles {\n description\n goals\n ...CoursePageFields\n learning_sequences {\n icon\n ...CoursePageFields\n learning_units {\n evaluate_url\n ...CoursePageFields\n performance_criteria {\n ...CoursePageFields\n }\n learning_contents {\n can_user_self_toggle_course_completion\n content_url\n minutes\n description\n ...CoursePageFields\n ... on LearningContentAssignmentObjectType {\n assignment_type\n content_assignment {\n id\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n ... on LearningContentEdoniqTestObjectType {\n checkbox_text\n has_extended_time_test\n content_assignment {\n id\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n ... on LearningContentRichTextObjectType {\n text\n }\n }\n }\n }\n }\n }\n }\n }\n }\n": types.CourseQueryDocument,
|
||||
"\n query dashboardConfig {\n dashboard_config {\n id\n slug\n name\n dashboard_type\n }\n }\n": types.DashboardConfigDocument,
|
||||
"\n query dashboardProgress($courseId: ID!) {\n course_progress(course_id: $courseId) {\n _id\n course_id\n session_to_continue_id\n competence {\n _id\n total_count\n success_count\n fail_count\n }\n assignment {\n _id\n total_count\n points_max_count\n points_achieved_count\n }\n }\n }\n": types.DashboardProgressDocument,
|
||||
"\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n experts\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n title\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n": types.CourseStatisticsDocument,
|
||||
"\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n experts\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n title\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n": types.CourseStatisticsDocument,
|
||||
"\n mutation SendFeedbackMutation(\n $courseSessionId: ID!\n $learningContentId: ID!\n $data: GenericScalar!\n $submitted: Boolean\n ) {\n send_feedback(\n course_session_id: $courseSessionId\n learning_content_page_id: $learningContentId\n data: $data\n submitted: $submitted\n ) {\n feedback_response {\n id\n data\n submitted\n }\n errors {\n field\n messages\n }\n }\n }\n": types.SendFeedbackMutationDocument,
|
||||
};
|
||||
|
||||
|
|
@ -84,7 +84,7 @@ export function graphql(source: "\n query dashboardProgress($courseId: ID!) {\n
|
|||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
export function graphql(source: "\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n experts\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n title\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n"): (typeof documents)["\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n experts\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n title\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n"];
|
||||
export function graphql(source: "\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n experts\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n title\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n"): (typeof documents)["\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n experts\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n title\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n"];
|
||||
/**
|
||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||
*/
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -51,7 +51,6 @@ type StatisticsCourseSessionDataType {
|
|||
type StatisticsCircleDataType {
|
||||
id: ID!
|
||||
name: String!
|
||||
experts: [String]!
|
||||
}
|
||||
|
||||
type StatisticsCourseSessionsSelectionMetricType {
|
||||
|
|
@ -105,6 +104,7 @@ type FeedbackStatisticsRecordType {
|
|||
satisfaction_average: Float!
|
||||
satisfaction_max: Int!
|
||||
details_url: String!
|
||||
experts: String!
|
||||
}
|
||||
|
||||
type FeedbackStatisticsSummaryType {
|
||||
|
|
|
|||
|
|
@ -319,7 +319,6 @@ export const DASHBOARD_COURSE_STATISTICS = graphql(`
|
|||
circles {
|
||||
id
|
||||
name
|
||||
experts
|
||||
}
|
||||
}
|
||||
course_session_selection_ids
|
||||
|
|
@ -354,6 +353,7 @@ export const DASHBOARD_COURSE_STATISTICS = graphql(`
|
|||
course_session_id
|
||||
generation
|
||||
circle_id
|
||||
experts
|
||||
satisfaction_average
|
||||
satisfaction_max
|
||||
details_url
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ const { courseSessionName, circleMeta } = useCourseStatistics();
|
|||
<div>
|
||||
{{ $t("a.Durchfuehrung") }} «{{
|
||||
courseSessionName(item.course_session_id)
|
||||
}}» - Trainer: {{ circleMeta(item.circle_id)?.experts[0] }}
|
||||
}}» - Trainer: {{ (item as FeedbackStatisticsRecordType).experts }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
|
|
|
|||
|
|
@ -285,3 +285,17 @@ def create_performance_criteria_page(
|
|||
title="Performance Criteria",
|
||||
learning_unit=lu,
|
||||
)
|
||||
|
||||
|
||||
def create_circle_expert(
|
||||
course_session: CourseSession, circle: Circle, username: str
|
||||
) -> CourseSessionUser:
|
||||
expert_user = create_user(username)
|
||||
course_session_expert_user = add_course_session_user(
|
||||
course_session=course_session,
|
||||
user=expert_user,
|
||||
role=CourseSessionUser.Role.EXPERT,
|
||||
)
|
||||
course_session_expert_user.expert.add(circle)
|
||||
|
||||
return course_session_expert_user
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@ class StatisticsCourseSessionDataType(graphene.ObjectType):
|
|||
class StatisticsCircleDataType(graphene.ObjectType):
|
||||
id = graphene.ID(required=True)
|
||||
name = graphene.String(required=True)
|
||||
experts = graphene.List(graphene.String, required=True)
|
||||
|
||||
|
||||
class StatisticsCourseSessionsSelectionMetricType(graphene.ObjectType):
|
||||
|
|
@ -199,10 +198,6 @@ class CourseStatisticsType(graphene.ObjectType):
|
|||
StatisticsCircleDataType(
|
||||
id=circle.id, # noqa
|
||||
name=circle.title, # noqa
|
||||
experts=[ # noqa
|
||||
f"{su.user.first_name} {su.user.last_name}"
|
||||
for su in circle.expert.all()
|
||||
],
|
||||
)
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ from typing import List
|
|||
|
||||
import graphene
|
||||
|
||||
from vbv_lernwelt.course.models import CourseSession
|
||||
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
|
||||
from vbv_lernwelt.feedback.models import FeedbackResponse
|
||||
from vbv_lernwelt.feedback.utils import feedback_users
|
||||
|
||||
|
|
@ -22,6 +22,7 @@ class FeedbackStatisticsRecordType(graphene.ObjectType):
|
|||
satisfaction_average = graphene.Float(required=True)
|
||||
satisfaction_max = graphene.Int(required=True)
|
||||
details_url = graphene.String(required=True)
|
||||
experts = graphene.String(required=True)
|
||||
|
||||
|
||||
class FeedbackStatisticsResponsesType(graphene.ObjectType):
|
||||
|
|
@ -98,12 +99,20 @@ def circle_feedback_average(
|
|||
if satisfaction is None:
|
||||
continue
|
||||
|
||||
circle_data.setdefault(circle_id, {"total": 0, "count": 0})
|
||||
circle_data.setdefault(circle_id, {"total": 0, "count": 0, "experts": []})
|
||||
circle_data[circle_id]["total"] += satisfaction
|
||||
circle_data[circle_id]["count"] += 1
|
||||
|
||||
for circle_id, data in circle_data.items():
|
||||
details_url = f"/course/{course_slug}/cockpit/feedback/{circle_id}?courseSessionId={course_session_id}"
|
||||
|
||||
experts = CourseSessionUser.objects.filter(
|
||||
role="EXPERT",
|
||||
course_session_id=course_session_id,
|
||||
expert__id__in=[circle_id],
|
||||
).values_list("user__first_name", "user__last_name")
|
||||
experts_names = [f"{first} {last}" for first, last in experts]
|
||||
|
||||
records.append(
|
||||
FeedbackStatisticsRecordType(
|
||||
_id=f"circle:{circle_id}-course_session:{course_session_id}", # noqa
|
||||
|
|
@ -113,6 +122,7 @@ def circle_feedback_average(
|
|||
satisfaction_average=data["total"] / data["count"], # noqa
|
||||
satisfaction_max=4, # noqa
|
||||
details_url=details_url, # noqa
|
||||
experts=", ".join(experts_names), # noqa
|
||||
)
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ from vbv_lernwelt.course.creators.test_utils import (
|
|||
add_course_session_group_supervisor,
|
||||
add_course_session_user,
|
||||
create_circle,
|
||||
create_circle_expert,
|
||||
create_course,
|
||||
create_course_session,
|
||||
create_course_session_group,
|
||||
|
|
@ -36,6 +37,13 @@ class DashboardFeedbackTestCase(GraphQLTestCase):
|
|||
circle1, _ = create_circle(title="Test Circle 1", course_page=course_page)
|
||||
circle2, _ = create_circle(title="Test Circle 2", course_page=course_page)
|
||||
|
||||
create_circle_expert(
|
||||
course_session=course_session, circle=circle1, username="Expert 1"
|
||||
)
|
||||
create_circle_expert(
|
||||
course_session=course_session, circle=circle1, username="Expert 2"
|
||||
)
|
||||
|
||||
FeedbackResponse.objects.create(
|
||||
feedback_user=member,
|
||||
data={"satisfaction": 3},
|
||||
|
|
@ -79,6 +87,7 @@ class DashboardFeedbackTestCase(GraphQLTestCase):
|
|||
satisfaction_average
|
||||
satisfaction_max
|
||||
details_url
|
||||
experts
|
||||
}}
|
||||
summary {{
|
||||
satisfaction_average
|
||||
|
|
@ -113,6 +122,7 @@ class DashboardFeedbackTestCase(GraphQLTestCase):
|
|||
circle1_record["details_url"],
|
||||
f"/course/{course.slug}/cockpit/feedback/{circle1.id}?courseSessionId={course_session.id}",
|
||||
)
|
||||
self.assertEqual(circle1_record["experts"], "Test Expert 1, Test Expert 2")
|
||||
|
||||
circle2_record = next(
|
||||
(r for r in records if r["circle_id"] == str(circle2.id)), None
|
||||
|
|
@ -124,6 +134,7 @@ class DashboardFeedbackTestCase(GraphQLTestCase):
|
|||
circle2_record["details_url"],
|
||||
f"/course/{course.slug}/cockpit/feedback/{circle2.id}?courseSessionId={course_session.id}",
|
||||
)
|
||||
self.assertEqual(circle2_record["experts"], "")
|
||||
|
||||
summary = feedback_responses["summary"]
|
||||
self.assertEqual(summary["satisfaction_average"], 2.5)
|
||||
|
|
|
|||
Loading…
Reference in New Issue