From 6510d745495e92035836a53d3d29383ae2bee9ee Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Wed, 11 Oct 2023 17:26:46 +0200 Subject: [PATCH] Add first basic LEARNING_PATH_QUERY --- client/src/gql/gql.ts | 9 +- client/src/gql/graphql.ts | 150 +++++++++++++++--- client/src/gql/schema.graphql | 21 +-- client/src/graphql/queries.ts | 38 ++++- .../vbv_lernwelt/learnpath/graphql/types.py | 57 +++++-- server/vbv_lernwelt/learnpath/models.py | 3 + 6 files changed, 227 insertions(+), 51 deletions(-) diff --git a/client/src/gql/gql.ts b/client/src/gql/gql.ts index d971bb1d..40b879b0 100644 --- a/client/src/gql/gql.ts +++ b/client/src/gql/gql.ts @@ -19,8 +19,9 @@ const documents = { "\n query attendanceCheckQuery($courseSessionId: ID!) {\n course_session_attendance_course(id: $courseSessionId) {\n id\n attendance_user_list {\n user_id\n status\n }\n }\n }\n": types.AttendanceCheckQueryDocument, "\n query assignmentCompletionQuery(\n $assignmentId: ID!\n $courseSessionId: ID!\n $learningContentId: ID\n $assignmentUserId: UUID\n ) {\n assignment(id: $assignmentId) {\n assignment_type\n needs_expert_evaluation\n max_points\n content_type\n effort_required\n evaluation_description\n evaluation_document_url\n evaluation_tasks\n id\n intro_text\n performance_objectives\n slug\n tasks\n title\n translation_key\n competence_certificate {\n ...CoursePageFields\n }\n }\n assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n assignment_user_id: $assignmentUserId\n learning_content_page_id: $learningContentId\n ) {\n id\n completion_status\n submitted_at\n evaluation_submitted_at\n evaluation_user {\n id\n }\n assignment_user {\n id\n }\n evaluation_points\n evaluation_max_points\n evaluation_passed\n edoniq_extended_time_flag\n completion_data\n task_completion_data\n }\n }\n": types.AssignmentCompletionQueryDocument, "\n query courseQuery($courseId: ID!) {\n course(id: $courseId) {\n id\n slug\n title\n category_name\n learning_path {\n id\n }\n }\n }\n": types.CourseQueryDocument, - "\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n title\n id\n slug\n content_type\n frontend_url\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\n": types.CompetenceCertificateQueryDocument, + "\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n ...CoursePageFields\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\n": types.CompetenceCertificateQueryDocument, "\n query courseSessionDetail($courseSessionId: ID!) {\n course_session(id: $courseSessionId) {\n id\n title\n course {\n id\n title\n slug\n }\n users {\n id\n user_id\n first_name\n last_name\n email\n avatar_url\n role\n circles {\n id\n title\n slug\n }\n }\n attendance_courses {\n id\n location\n trainer\n due_date {\n id\n start\n end\n }\n learning_content_id\n learning_content {\n id\n title\n circle {\n id\n title\n slug\n }\n }\n }\n assignments {\n id\n submission_deadline {\n id\n start\n }\n evaluation_deadline {\n id\n start\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n edoniq_tests {\n id\n deadline {\n id\n start\n end\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n }\n }\n": types.CourseSessionDetailDocument, + "\n query learningPathQuery($slug: String!) {\n learning_path(slug: $slug) {\n ...CoursePageFields\n topics {\n is_visible\n ...CoursePageFields\n circles {\n ...CoursePageFields\n learning_sequences {\n icon\n ...CoursePageFields\n learning_units {\n evaluate_url\n ...CoursePageFields\n learning_contents {\n ...CoursePageFields\n ... on LearningContentAssignmentObjectType {\n assignment_type\n content_assignment {\n id\n }\n }\n }\n }\n }\n }\n }\n }\n }\n": types.LearningPathQueryDocument, "\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, }; @@ -65,11 +66,15 @@ export function graphql(source: "\n query courseQuery($courseId: ID!) {\n co /** * 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 competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n title\n id\n slug\n content_type\n frontend_url\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n title\n id\n slug\n content_type\n frontend_url\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\n"]; +export function graphql(source: "\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n ...CoursePageFields\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n ...CoursePageFields\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\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 courseSessionDetail($courseSessionId: ID!) {\n course_session(id: $courseSessionId) {\n id\n title\n course {\n id\n title\n slug\n }\n users {\n id\n user_id\n first_name\n last_name\n email\n avatar_url\n role\n circles {\n id\n title\n slug\n }\n }\n attendance_courses {\n id\n location\n trainer\n due_date {\n id\n start\n end\n }\n learning_content_id\n learning_content {\n id\n title\n circle {\n id\n title\n slug\n }\n }\n }\n assignments {\n id\n submission_deadline {\n id\n start\n }\n evaluation_deadline {\n id\n start\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n edoniq_tests {\n id\n deadline {\n id\n start\n end\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query courseSessionDetail($courseSessionId: ID!) {\n course_session(id: $courseSessionId) {\n id\n title\n course {\n id\n title\n slug\n }\n users {\n id\n user_id\n first_name\n last_name\n email\n avatar_url\n role\n circles {\n id\n title\n slug\n }\n }\n attendance_courses {\n id\n location\n trainer\n due_date {\n id\n start\n end\n }\n learning_content_id\n learning_content {\n id\n title\n circle {\n id\n title\n slug\n }\n }\n }\n assignments {\n id\n submission_deadline {\n id\n start\n }\n evaluation_deadline {\n id\n start\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n edoniq_tests {\n id\n deadline {\n id\n start\n end\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n }\n }\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 learningPathQuery($slug: String!) {\n learning_path(slug: $slug) {\n ...CoursePageFields\n topics {\n is_visible\n ...CoursePageFields\n circles {\n ...CoursePageFields\n learning_sequences {\n icon\n ...CoursePageFields\n learning_units {\n evaluate_url\n ...CoursePageFields\n learning_contents {\n ...CoursePageFields\n ... on LearningContentAssignmentObjectType {\n assignment_type\n content_assignment {\n id\n }\n }\n }\n }\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query learningPathQuery($slug: String!) {\n learning_path(slug: $slug) {\n ...CoursePageFields\n topics {\n is_visible\n ...CoursePageFields\n circles {\n ...CoursePageFields\n learning_sequences {\n icon\n ...CoursePageFields\n learning_units {\n evaluate_url\n ...CoursePageFields\n learning_contents {\n ...CoursePageFields\n ... on LearningContentAssignmentObjectType {\n assignment_type\n content_assignment {\n id\n }\n }\n }\n }\n }\n }\n }\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ diff --git a/client/src/gql/graphql.ts b/client/src/gql/graphql.ts index 9a81624b..00e0275c 100644 --- a/client/src/gql/graphql.ts +++ b/client/src/gql/graphql.ts @@ -374,7 +374,7 @@ export type FeedbackResponseObjectType = { submitted: Scalars['Boolean']['output']; }; -export type LearningContentAssignmentObjectType = LearningContentInterface & { +export type LearningContentAssignmentObjectType = CoursePageInterface & LearningContentInterface & { __typename?: 'LearningContentAssignmentObjectType'; assignment_type: LearnpathLearningContentAssignmentAssignmentTypeChoices; circle?: Maybe; @@ -392,7 +392,7 @@ export type LearningContentAssignmentObjectType = LearningContentInterface & { translation_key?: Maybe; }; -export type LearningContentAttendanceCourseObjectType = LearningContentInterface & { +export type LearningContentAttendanceCourseObjectType = CoursePageInterface & LearningContentInterface & { __typename?: 'LearningContentAttendanceCourseObjectType'; circle?: Maybe; content?: Maybe; @@ -408,7 +408,7 @@ export type LearningContentAttendanceCourseObjectType = LearningContentInterface translation_key?: Maybe; }; -export type LearningContentDocumentListObjectType = LearningContentInterface & { +export type LearningContentDocumentListObjectType = CoursePageInterface & LearningContentInterface & { __typename?: 'LearningContentDocumentListObjectType'; circle?: Maybe; content?: Maybe; @@ -424,7 +424,7 @@ export type LearningContentDocumentListObjectType = LearningContentInterface & { translation_key?: Maybe; }; -export type LearningContentEdoniqTestObjectType = LearningContentInterface & { +export type LearningContentEdoniqTestObjectType = CoursePageInterface & LearningContentInterface & { __typename?: 'LearningContentEdoniqTestObjectType'; circle?: Maybe; content?: Maybe; @@ -441,7 +441,7 @@ export type LearningContentEdoniqTestObjectType = LearningContentInterface & { translation_key?: Maybe; }; -export type LearningContentFeedbackObjectType = LearningContentInterface & { +export type LearningContentFeedbackObjectType = CoursePageInterface & LearningContentInterface & { __typename?: 'LearningContentFeedbackObjectType'; circle?: Maybe; content?: Maybe; @@ -472,7 +472,7 @@ export type LearningContentInterface = { translation_key?: Maybe; }; -export type LearningContentLearningModuleObjectType = LearningContentInterface & { +export type LearningContentLearningModuleObjectType = CoursePageInterface & LearningContentInterface & { __typename?: 'LearningContentLearningModuleObjectType'; circle?: Maybe; content?: Maybe; @@ -488,7 +488,7 @@ export type LearningContentLearningModuleObjectType = LearningContentInterface & translation_key?: Maybe; }; -export type LearningContentMediaLibraryObjectType = LearningContentInterface & { +export type LearningContentMediaLibraryObjectType = CoursePageInterface & LearningContentInterface & { __typename?: 'LearningContentMediaLibraryObjectType'; circle?: Maybe; content?: Maybe; @@ -504,7 +504,7 @@ export type LearningContentMediaLibraryObjectType = LearningContentInterface & { translation_key?: Maybe; }; -export type LearningContentPlaceholderObjectType = LearningContentInterface & { +export type LearningContentPlaceholderObjectType = CoursePageInterface & LearningContentInterface & { __typename?: 'LearningContentPlaceholderObjectType'; circle?: Maybe; content?: Maybe; @@ -520,7 +520,7 @@ export type LearningContentPlaceholderObjectType = LearningContentInterface & { translation_key?: Maybe; }; -export type LearningContentRichTextObjectType = LearningContentInterface & { +export type LearningContentRichTextObjectType = CoursePageInterface & LearningContentInterface & { __typename?: 'LearningContentRichTextObjectType'; circle?: Maybe; content?: Maybe; @@ -536,7 +536,7 @@ export type LearningContentRichTextObjectType = LearningContentInterface & { translation_key?: Maybe; }; -export type LearningContentVideoObjectType = LearningContentInterface & { +export type LearningContentVideoObjectType = CoursePageInterface & LearningContentInterface & { __typename?: 'LearningContentVideoObjectType'; circle?: Maybe; content?: Maybe; @@ -608,6 +608,7 @@ export type LearningUnitObjectType = CoursePageInterface & { circle?: Maybe; content_type?: Maybe; course?: Maybe; + evaluate_url?: Maybe; frontend_url?: Maybe; id?: Maybe; learning_contents?: Maybe>>; @@ -809,6 +810,26 @@ type CoursePageFieldsCompetenceCertificateListObjectTypeFragment = { __typename? type CoursePageFieldsCompetenceCertificateObjectTypeFragment = { __typename?: 'CompetenceCertificateObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsCompetenceCertificateObjectTypeFragment' }; +type CoursePageFieldsLearningContentAssignmentObjectTypeFragment = { __typename?: 'LearningContentAssignmentObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningContentAssignmentObjectTypeFragment' }; + +type CoursePageFieldsLearningContentAttendanceCourseObjectTypeFragment = { __typename?: 'LearningContentAttendanceCourseObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningContentAttendanceCourseObjectTypeFragment' }; + +type CoursePageFieldsLearningContentDocumentListObjectTypeFragment = { __typename?: 'LearningContentDocumentListObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningContentDocumentListObjectTypeFragment' }; + +type CoursePageFieldsLearningContentEdoniqTestObjectTypeFragment = { __typename?: 'LearningContentEdoniqTestObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningContentEdoniqTestObjectTypeFragment' }; + +type CoursePageFieldsLearningContentFeedbackObjectTypeFragment = { __typename?: 'LearningContentFeedbackObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningContentFeedbackObjectTypeFragment' }; + +type CoursePageFieldsLearningContentLearningModuleObjectTypeFragment = { __typename?: 'LearningContentLearningModuleObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningContentLearningModuleObjectTypeFragment' }; + +type CoursePageFieldsLearningContentMediaLibraryObjectTypeFragment = { __typename?: 'LearningContentMediaLibraryObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningContentMediaLibraryObjectTypeFragment' }; + +type CoursePageFieldsLearningContentPlaceholderObjectTypeFragment = { __typename?: 'LearningContentPlaceholderObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningContentPlaceholderObjectTypeFragment' }; + +type CoursePageFieldsLearningContentRichTextObjectTypeFragment = { __typename?: 'LearningContentRichTextObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningContentRichTextObjectTypeFragment' }; + +type CoursePageFieldsLearningContentVideoObjectTypeFragment = { __typename?: 'LearningContentVideoObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningContentVideoObjectTypeFragment' }; + type CoursePageFieldsLearningPathObjectTypeFragment = { __typename?: 'LearningPathObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningPathObjectTypeFragment' }; type CoursePageFieldsLearningSequenceObjectTypeFragment = { __typename?: 'LearningSequenceObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsLearningSequenceObjectTypeFragment' }; @@ -817,7 +838,7 @@ type CoursePageFieldsLearningUnitObjectTypeFragment = { __typename?: 'LearningUn type CoursePageFieldsTopicObjectTypeFragment = { __typename?: 'TopicObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null } & { ' $fragmentName'?: 'CoursePageFieldsTopicObjectTypeFragment' }; -export type CoursePageFieldsFragment = CoursePageFieldsAssignmentObjectTypeFragment | CoursePageFieldsCircleObjectTypeFragment | CoursePageFieldsCompetenceCertificateListObjectTypeFragment | CoursePageFieldsCompetenceCertificateObjectTypeFragment | CoursePageFieldsLearningPathObjectTypeFragment | CoursePageFieldsLearningSequenceObjectTypeFragment | CoursePageFieldsLearningUnitObjectTypeFragment | CoursePageFieldsTopicObjectTypeFragment; +export type CoursePageFieldsFragment = CoursePageFieldsAssignmentObjectTypeFragment | CoursePageFieldsCircleObjectTypeFragment | CoursePageFieldsCompetenceCertificateListObjectTypeFragment | CoursePageFieldsCompetenceCertificateObjectTypeFragment | CoursePageFieldsLearningContentAssignmentObjectTypeFragment | CoursePageFieldsLearningContentAttendanceCourseObjectTypeFragment | CoursePageFieldsLearningContentDocumentListObjectTypeFragment | CoursePageFieldsLearningContentEdoniqTestObjectTypeFragment | CoursePageFieldsLearningContentFeedbackObjectTypeFragment | CoursePageFieldsLearningContentLearningModuleObjectTypeFragment | CoursePageFieldsLearningContentMediaLibraryObjectTypeFragment | CoursePageFieldsLearningContentPlaceholderObjectTypeFragment | CoursePageFieldsLearningContentRichTextObjectTypeFragment | CoursePageFieldsLearningContentVideoObjectTypeFragment | CoursePageFieldsLearningPathObjectTypeFragment | CoursePageFieldsLearningSequenceObjectTypeFragment | CoursePageFieldsLearningUnitObjectTypeFragment | CoursePageFieldsTopicObjectTypeFragment; export type AttendanceCheckQueryQueryVariables = Exact<{ courseSessionId: Scalars['ID']['input']; @@ -855,37 +876,67 @@ export type CompetenceCertificateQueryQueryVariables = Exact<{ export type CompetenceCertificateQueryQuery = { __typename?: 'Query', competence_certificate_list?: ( { __typename?: 'CompetenceCertificateListObjectType', competence_certificates?: Array<( { __typename?: 'CompetenceCertificateObjectType', assignments?: Array<( - { __typename?: 'AssignmentObjectType', assignment_type: AssignmentAssignmentAssignmentTypeChoices, max_points?: number | null, completion?: { __typename?: 'AssignmentCompletionObjectType', id: any, completion_status: AssignmentAssignmentCompletionCompletionStatusChoices, submitted_at?: any | null, evaluation_points?: number | null, evaluation_max_points?: number | null, evaluation_passed?: boolean | null } | null, learning_content?: { __typename?: 'LearningContentAssignmentObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( + { __typename?: 'AssignmentObjectType', assignment_type: AssignmentAssignmentAssignmentTypeChoices, max_points?: number | null, completion?: { __typename?: 'AssignmentCompletionObjectType', id: any, completion_status: AssignmentAssignmentCompletionCompletionStatusChoices, submitted_at?: any | null, evaluation_points?: number | null, evaluation_max_points?: number | null, evaluation_passed?: boolean | null } | null, learning_content?: ( + { __typename?: 'LearningContentAssignmentObjectType', circle?: ( { __typename?: 'CircleObjectType' } & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } - ) | null } | { __typename?: 'LearningContentAttendanceCourseObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( + ) | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentAssignmentObjectTypeFragment': CoursePageFieldsLearningContentAssignmentObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentAttendanceCourseObjectType', circle?: ( { __typename?: 'CircleObjectType' } & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } - ) | null } | { __typename?: 'LearningContentDocumentListObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( + ) | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentAttendanceCourseObjectTypeFragment': CoursePageFieldsLearningContentAttendanceCourseObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentDocumentListObjectType', circle?: ( { __typename?: 'CircleObjectType' } & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } - ) | null } | { __typename?: 'LearningContentEdoniqTestObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( + ) | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentDocumentListObjectTypeFragment': CoursePageFieldsLearningContentDocumentListObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentEdoniqTestObjectType', circle?: ( { __typename?: 'CircleObjectType' } & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } - ) | null } | { __typename?: 'LearningContentFeedbackObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( + ) | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentEdoniqTestObjectTypeFragment': CoursePageFieldsLearningContentEdoniqTestObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentFeedbackObjectType', circle?: ( { __typename?: 'CircleObjectType' } & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } - ) | null } | { __typename?: 'LearningContentLearningModuleObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( + ) | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentFeedbackObjectTypeFragment': CoursePageFieldsLearningContentFeedbackObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentLearningModuleObjectType', circle?: ( { __typename?: 'CircleObjectType' } & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } - ) | null } | { __typename?: 'LearningContentMediaLibraryObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( + ) | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentLearningModuleObjectTypeFragment': CoursePageFieldsLearningContentLearningModuleObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentMediaLibraryObjectType', circle?: ( { __typename?: 'CircleObjectType' } & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } - ) | null } | { __typename?: 'LearningContentPlaceholderObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( + ) | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentMediaLibraryObjectTypeFragment': CoursePageFieldsLearningContentMediaLibraryObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentPlaceholderObjectType', circle?: ( { __typename?: 'CircleObjectType' } & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } - ) | null } | { __typename?: 'LearningContentRichTextObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( + ) | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentPlaceholderObjectTypeFragment': CoursePageFieldsLearningContentPlaceholderObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentRichTextObjectType', circle?: ( { __typename?: 'CircleObjectType' } & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } - ) | null } | { __typename?: 'LearningContentVideoObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( + ) | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentRichTextObjectTypeFragment': CoursePageFieldsLearningContentRichTextObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentVideoObjectType', circle?: ( { __typename?: 'CircleObjectType' } & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } - ) | null } | null } + ) | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentVideoObjectTypeFragment': CoursePageFieldsLearningContentVideoObjectTypeFragment } } + ) | null } & { ' $fragmentRefs'?: { 'CoursePageFieldsAssignmentObjectTypeFragment': CoursePageFieldsAssignmentObjectTypeFragment } } ) | null> | null } & { ' $fragmentRefs'?: { 'CoursePageFieldsCompetenceCertificateObjectTypeFragment': CoursePageFieldsCompetenceCertificateObjectTypeFragment } } @@ -900,6 +951,58 @@ export type CourseSessionDetailQueryVariables = Exact<{ export type CourseSessionDetailQuery = { __typename?: 'Query', course_session?: { __typename?: 'CourseSessionObjectType', id: string, title: string, course: { __typename?: 'CourseObjectType', id: string, title: string, slug: string }, users?: Array<{ __typename?: 'CourseSessionUserObjectsType', id: any, user_id?: any | null, first_name?: string | null, last_name?: string | null, email?: string | null, avatar_url?: string | null, role?: string | null, circles?: Array<{ __typename?: 'CourseSessionUserExpertCircleType', id?: string | null, title?: string | null, slug?: string | null } | null> | null } | null> | null, attendance_courses?: Array<{ __typename?: 'CourseSessionAttendanceCourseObjectType', id: string, location: string, trainer: string, learning_content_id?: string | null, due_date?: { __typename?: 'DueDateObjectType', id: string, start?: any | null, end?: any | null } | null, learning_content?: { __typename?: 'LearningContentAttendanceCourseObjectType', id?: string | null, title?: string | null, circle?: { __typename?: 'CircleObjectType', id?: string | null, title?: string | null, slug?: string | null } | null } | null } | null> | null, assignments?: Array<{ __typename?: 'CourseSessionAssignmentObjectType', id: string, submission_deadline?: { __typename?: 'DueDateObjectType', id: string, start?: any | null } | null, evaluation_deadline?: { __typename?: 'DueDateObjectType', id: string, start?: any | null } | null, learning_content?: { __typename?: 'LearningContentAssignmentObjectType', id?: string | null, title?: string | null, content_assignment: { __typename?: 'AssignmentObjectType', id?: string | null, title?: string | null, assignment_type: AssignmentAssignmentAssignmentTypeChoices } } | null } | null> | null, edoniq_tests?: Array<{ __typename?: 'CourseSessionEdoniqTestObjectType', id: string, deadline?: { __typename?: 'DueDateObjectType', id: string, start?: any | null, end?: any | null } | null, learning_content?: { __typename?: 'LearningContentEdoniqTestObjectType', id?: string | null, title?: string | null, content_assignment?: { __typename?: 'AssignmentObjectType', id?: string | null, title?: string | null, assignment_type: AssignmentAssignmentAssignmentTypeChoices } | null } | null } | null> | null } | null }; +export type LearningPathQueryQueryVariables = Exact<{ + slug: Scalars['String']['input']; +}>; + + +export type LearningPathQueryQuery = { __typename?: 'Query', learning_path?: ( + { __typename?: 'LearningPathObjectType', topics?: Array<( + { __typename?: 'TopicObjectType', is_visible: boolean, circles?: Array<( + { __typename?: 'CircleObjectType', learning_sequences?: Array<( + { __typename?: 'LearningSequenceObjectType', icon: string, learning_units?: Array<( + { __typename?: 'LearningUnitObjectType', evaluate_url?: string | null, learning_contents?: Array<( + { __typename?: 'LearningContentAssignmentObjectType', assignment_type: LearnpathLearningContentAssignmentAssignmentTypeChoices, content_assignment: { __typename?: 'AssignmentObjectType', id?: string | null } } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentAssignmentObjectTypeFragment': CoursePageFieldsLearningContentAssignmentObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentAttendanceCourseObjectType' } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentAttendanceCourseObjectTypeFragment': CoursePageFieldsLearningContentAttendanceCourseObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentDocumentListObjectType' } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentDocumentListObjectTypeFragment': CoursePageFieldsLearningContentDocumentListObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentEdoniqTestObjectType' } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentEdoniqTestObjectTypeFragment': CoursePageFieldsLearningContentEdoniqTestObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentFeedbackObjectType' } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentFeedbackObjectTypeFragment': CoursePageFieldsLearningContentFeedbackObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentLearningModuleObjectType' } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentLearningModuleObjectTypeFragment': CoursePageFieldsLearningContentLearningModuleObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentMediaLibraryObjectType' } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentMediaLibraryObjectTypeFragment': CoursePageFieldsLearningContentMediaLibraryObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentPlaceholderObjectType' } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentPlaceholderObjectTypeFragment': CoursePageFieldsLearningContentPlaceholderObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentRichTextObjectType' } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentRichTextObjectTypeFragment': CoursePageFieldsLearningContentRichTextObjectTypeFragment } } + ) | ( + { __typename?: 'LearningContentVideoObjectType' } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningContentVideoObjectTypeFragment': CoursePageFieldsLearningContentVideoObjectTypeFragment } } + ) | null> | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningUnitObjectTypeFragment': CoursePageFieldsLearningUnitObjectTypeFragment } } + ) | null> | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningSequenceObjectTypeFragment': CoursePageFieldsLearningSequenceObjectTypeFragment } } + ) | null> | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } + ) | null> | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsTopicObjectTypeFragment': CoursePageFieldsTopicObjectTypeFragment } } + ) | null> | null } + & { ' $fragmentRefs'?: { 'CoursePageFieldsLearningPathObjectTypeFragment': CoursePageFieldsLearningPathObjectTypeFragment } } + ) | null }; + export type SendFeedbackMutationMutationVariables = Exact<{ courseSessionId: Scalars['ID']['input']; learningContentId: Scalars['ID']['input']; @@ -916,6 +1019,7 @@ export const UpsertAssignmentCompletionDocument = {"kind":"Document","definition export const AttendanceCheckQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"attendanceCheckQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"course_session_attendance_course"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"attendance_user_list"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user_id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}}]}}]}}]} as unknown as DocumentNode; export const AssignmentCompletionQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"assignmentCompletionQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"assignmentId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"learningContentId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"assignmentUserId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"assignment"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assignmentId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"assignment_type"}},{"kind":"Field","name":{"kind":"Name","value":"needs_expert_evaluation"}},{"kind":"Field","name":{"kind":"Name","value":"max_points"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"effort_required"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_description"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_document_url"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_tasks"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"intro_text"}},{"kind":"Field","name":{"kind":"Name","value":"performance_objectives"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"tasks"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"translation_key"}},{"kind":"Field","name":{"kind":"Name","value":"competence_certificate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"assignment_completion"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"assignment_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assignmentId"}}},{"kind":"Argument","name":{"kind":"Name","value":"course_session_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}}},{"kind":"Argument","name":{"kind":"Name","value":"assignment_user_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assignmentUserId"}}},{"kind":"Argument","name":{"kind":"Name","value":"learning_content_page_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"learningContentId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"completion_status"}},{"kind":"Field","name":{"kind":"Name","value":"submitted_at"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_submitted_at"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assignment_user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_points"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_max_points"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_passed"}},{"kind":"Field","name":{"kind":"Name","value":"edoniq_extended_time_flag"}},{"kind":"Field","name":{"kind":"Name","value":"completion_data"}},{"kind":"Field","name":{"kind":"Name","value":"task_completion_data"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CoursePageFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CoursePageInterface"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"frontend_url"}}]}}]} as unknown as DocumentNode; export const CourseQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"courseQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"course"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"category_name"}},{"kind":"Field","name":{"kind":"Name","value":"learning_path"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]} as unknown as DocumentNode; -export const CompetenceCertificateQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"competenceCertificateQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSlug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"competence_certificate_list"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"course_slug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSlug"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"competence_certificates"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"assignments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"assignment_type"}},{"kind":"Field","name":{"kind":"Name","value":"max_points"}},{"kind":"Field","name":{"kind":"Name","value":"completion"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"course_session_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"completion_status"}},{"kind":"Field","name":{"kind":"Name","value":"submitted_at"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_points"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_max_points"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_passed"}}]}},{"kind":"Field","name":{"kind":"Name","value":"learning_content"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"frontend_url"}},{"kind":"Field","name":{"kind":"Name","value":"circle"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}}]}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CoursePageFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CoursePageInterface"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"frontend_url"}}]}}]} as unknown as DocumentNode; +export const CompetenceCertificateQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"competenceCertificateQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSlug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"competence_certificate_list"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"course_slug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSlug"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"competence_certificates"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"assignments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"assignment_type"}},{"kind":"Field","name":{"kind":"Name","value":"max_points"}},{"kind":"Field","name":{"kind":"Name","value":"completion"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"course_session_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"completion_status"}},{"kind":"Field","name":{"kind":"Name","value":"submitted_at"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_points"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_max_points"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_passed"}}]}},{"kind":"Field","name":{"kind":"Name","value":"learning_content"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"circle"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}}]}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CoursePageFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CoursePageInterface"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"frontend_url"}}]}}]} as unknown as DocumentNode; export const CourseSessionDetailDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"courseSessionDetail"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"course_session"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"course"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}}]}},{"kind":"Field","name":{"kind":"Name","value":"users"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"user_id"}},{"kind":"Field","name":{"kind":"Name","value":"first_name"}},{"kind":"Field","name":{"kind":"Name","value":"last_name"}},{"kind":"Field","name":{"kind":"Name","value":"email"}},{"kind":"Field","name":{"kind":"Name","value":"avatar_url"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"circles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"attendance_courses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"location"}},{"kind":"Field","name":{"kind":"Name","value":"trainer"}},{"kind":"Field","name":{"kind":"Name","value":"due_date"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"start"}},{"kind":"Field","name":{"kind":"Name","value":"end"}}]}},{"kind":"Field","name":{"kind":"Name","value":"learning_content_id"}},{"kind":"Field","name":{"kind":"Name","value":"learning_content"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"circle"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"assignments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"submission_deadline"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"start"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_deadline"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"start"}}]}},{"kind":"Field","name":{"kind":"Name","value":"learning_content"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"content_assignment"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"assignment_type"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"edoniq_tests"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"deadline"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"start"}},{"kind":"Field","name":{"kind":"Name","value":"end"}}]}},{"kind":"Field","name":{"kind":"Name","value":"learning_content"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"content_assignment"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"assignment_type"}}]}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const LearningPathQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"learningPathQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"slug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"learning_path"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"slug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"slug"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"topics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"is_visible"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"circles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"learning_sequences"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"learning_units"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"evaluate_url"}},{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"learning_contents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LearningContentAssignmentObjectType"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"assignment_type"}},{"kind":"Field","name":{"kind":"Name","value":"content_assignment"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CoursePageFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CoursePageInterface"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"frontend_url"}}]}}]} as unknown as DocumentNode; export const SendFeedbackMutationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SendFeedbackMutation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"learningContentId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"GenericScalar"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"submitted"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"send_feedback"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"course_session_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}}},{"kind":"Argument","name":{"kind":"Name","value":"learning_content_page_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"learningContentId"}}},{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}},{"kind":"Argument","name":{"kind":"Name","value":"submitted"},"value":{"kind":"Variable","name":{"kind":"Name","value":"submitted"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"feedback_response"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"data"}},{"kind":"Field","name":{"kind":"Name","value":"submitted"}}]}},{"kind":"Field","name":{"kind":"Name","value":"errors"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"field"}},{"kind":"Field","name":{"kind":"Name","value":"messages"}}]}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/client/src/gql/schema.graphql b/client/src/gql/schema.graphql index 8120f07c..2168b783 100644 --- a/client/src/gql/schema.graphql +++ b/client/src/gql/schema.graphql @@ -124,6 +124,7 @@ type LearningUnitObjectType implements CoursePageInterface { circle: CircleObjectType course: CourseObjectType learning_contents: [LearningContentInterface] + evaluate_url: String } interface LearningContentInterface { @@ -193,7 +194,7 @@ type TopicObjectType implements CoursePageInterface { circles: [CircleObjectType] } -type LearningContentMediaLibraryObjectType implements LearningContentInterface { +type LearningContentMediaLibraryObjectType implements CoursePageInterface & LearningContentInterface { id: ID title: String slug: String @@ -208,7 +209,7 @@ type LearningContentMediaLibraryObjectType implements LearningContentInterface { content: String } -type LearningContentAssignmentObjectType implements LearningContentInterface { +type LearningContentAssignmentObjectType implements CoursePageInterface & LearningContentInterface { content_assignment: AssignmentObjectType! assignment_type: LearnpathLearningContentAssignmentAssignmentTypeChoices! id: ID @@ -349,7 +350,7 @@ type CourseSessionAttendanceCourseObjectType { attendance_user_list: [AttendanceUserObjectType] } -type LearningContentAttendanceCourseObjectType implements LearningContentInterface { +type LearningContentAttendanceCourseObjectType implements CoursePageInterface & LearningContentInterface { id: ID title: String slug: String @@ -428,7 +429,7 @@ type CourseSessionEdoniqTestObjectType { learning_content_id: ID } -type LearningContentEdoniqTestObjectType implements LearningContentInterface { +type LearningContentEdoniqTestObjectType implements CoursePageInterface & LearningContentInterface { content_assignment: AssignmentObjectType id: ID title: String @@ -518,7 +519,7 @@ enum LearnpathLearningContentAssignmentAssignmentTypeChoices { EDONIQ_TEST } -type LearningContentFeedbackObjectType implements LearningContentInterface { +type LearningContentFeedbackObjectType implements CoursePageInterface & LearningContentInterface { id: ID title: String slug: String @@ -533,7 +534,7 @@ type LearningContentFeedbackObjectType implements LearningContentInterface { content: String } -type LearningContentLearningModuleObjectType implements LearningContentInterface { +type LearningContentLearningModuleObjectType implements CoursePageInterface & LearningContentInterface { id: ID title: String slug: String @@ -548,7 +549,7 @@ type LearningContentLearningModuleObjectType implements LearningContentInterface content: String } -type LearningContentPlaceholderObjectType implements LearningContentInterface { +type LearningContentPlaceholderObjectType implements CoursePageInterface & LearningContentInterface { id: ID title: String slug: String @@ -563,7 +564,7 @@ type LearningContentPlaceholderObjectType implements LearningContentInterface { content: String } -type LearningContentRichTextObjectType implements LearningContentInterface { +type LearningContentRichTextObjectType implements CoursePageInterface & LearningContentInterface { id: ID title: String slug: String @@ -578,7 +579,7 @@ type LearningContentRichTextObjectType implements LearningContentInterface { content: String } -type LearningContentVideoObjectType implements LearningContentInterface { +type LearningContentVideoObjectType implements CoursePageInterface & LearningContentInterface { id: ID title: String slug: String @@ -593,7 +594,7 @@ type LearningContentVideoObjectType implements LearningContentInterface { content: String } -type LearningContentDocumentListObjectType implements LearningContentInterface { +type LearningContentDocumentListObjectType implements CoursePageInterface & LearningContentInterface { id: ID title: String slug: String diff --git a/client/src/graphql/queries.ts b/client/src/graphql/queries.ts index 91bfd7c7..76e5f2ef 100644 --- a/client/src/graphql/queries.ts +++ b/client/src/graphql/queries.ts @@ -109,11 +109,7 @@ export const COMPETENCE_NAVI_CERTIFICATE_QUERY = graphql(` evaluation_passed } learning_content { - title - id - slug - content_type - frontend_url + ...CoursePageFields circle { ...CoursePageFields } @@ -208,3 +204,35 @@ export const COURSE_SESSION_DETAIL_QUERY = graphql(` } } `); + +export const LEARNING_PATH_QUERY = graphql(` + query learningPathQuery($slug: String!) { + learning_path(slug: $slug) { + ...CoursePageFields + topics { + is_visible + ...CoursePageFields + circles { + ...CoursePageFields + learning_sequences { + icon + ...CoursePageFields + learning_units { + evaluate_url + ...CoursePageFields + learning_contents { + ...CoursePageFields + ... on LearningContentAssignmentObjectType { + assignment_type + content_assignment { + id + } + } + } + } + } + } + } + } + } +`); diff --git a/server/vbv_lernwelt/learnpath/graphql/types.py b/server/vbv_lernwelt/learnpath/graphql/types.py index 3c568797..11624216 100644 --- a/server/vbv_lernwelt/learnpath/graphql/types.py +++ b/server/vbv_lernwelt/learnpath/graphql/types.py @@ -63,49 +63,70 @@ class LearningContentInterface(CoursePageInterface): class LearningContentAttendanceCourseObjectType(DjangoObjectType): class Meta: model = LearningContentAttendanceCourse - interfaces = (LearningContentInterface,) + interfaces = ( + CoursePageInterface, + LearningContentInterface, + ) fields = [] class LearningContentVideoObjectType(DjangoObjectType): class Meta: model = LearningContentVideo - interfaces = (LearningContentInterface,) + interfaces = ( + CoursePageInterface, + LearningContentInterface, + ) fields = [] class LearningContentPlaceholderObjectType(DjangoObjectType): class Meta: model = LearningContentPlaceholder - interfaces = (LearningContentInterface,) + interfaces = ( + CoursePageInterface, + LearningContentInterface, + ) fields = [] class LearningContentFeedbackObjectType(DjangoObjectType): class Meta: model = LearningContentFeedback - interfaces = (LearningContentInterface,) + interfaces = ( + CoursePageInterface, + LearningContentInterface, + ) fields = [] class LearningContentLearningModuleObjectType(DjangoObjectType): class Meta: model = LearningContentLearningModule - interfaces = (LearningContentInterface,) + interfaces = ( + CoursePageInterface, + LearningContentInterface, + ) fields = [] class LearningContentMediaLibraryObjectType(DjangoObjectType): class Meta: model = LearningContentMediaLibrary - interfaces = (LearningContentInterface,) + interfaces = ( + CoursePageInterface, + LearningContentInterface, + ) fields = [] class LearningContentEdoniqTestObjectType(DjangoObjectType): class Meta: model = LearningContentEdoniqTest - interfaces = (LearningContentInterface,) + interfaces = ( + CoursePageInterface, + LearningContentInterface, + ) fields = [ "content_assignment", ] @@ -114,14 +135,20 @@ class LearningContentEdoniqTestObjectType(DjangoObjectType): class LearningContentRichTextObjectType(DjangoObjectType): class Meta: model = LearningContentRichText - interfaces = (LearningContentInterface,) + interfaces = ( + CoursePageInterface, + LearningContentInterface, + ) fields = [] class LearningContentAssignmentObjectType(DjangoObjectType): class Meta: model = LearningContentAssignment - interfaces = (LearningContentInterface,) + interfaces = ( + CoursePageInterface, + LearningContentInterface, + ) fields = [ "content_assignment", "assignment_type", @@ -131,17 +158,25 @@ class LearningContentAssignmentObjectType(DjangoObjectType): class LearningContentDocumentListObjectType(DjangoObjectType): class Meta: model = LearningContentDocumentList - interfaces = (LearningContentInterface,) + interfaces = ( + CoursePageInterface, + LearningContentInterface, + ) fields = [] class LearningUnitObjectType(DjangoObjectType): learning_contents = graphene.List(LearningContentInterface) + evaluate_url = graphene.String() class Meta: model = LearningUnit interfaces = (CoursePageInterface,) - fields = [] + fields = ["evaluate_url"] + + @staticmethod + def resolve_evaluate_url(root: LearningUnit, info, **kwargs): + return root.get_evaluate_url() @staticmethod def resolve_learning_contents(root: LearningUnit, info, **kwargs): diff --git a/server/vbv_lernwelt/learnpath/models.py b/server/vbv_lernwelt/learnpath/models.py index 9a1703e1..d841aa0a 100644 --- a/server/vbv_lernwelt/learnpath/models.py +++ b/server/vbv_lernwelt/learnpath/models.py @@ -58,6 +58,9 @@ class Topic(CourseBasePage): def get_admin_display_title(self): return f"Thema: {self.draft_title}" + def get_frontend_url(self): + return "" + class Meta: verbose_name = "Topic"