Use deducted and final points in frontend

This commit is contained in:
Daniel Egger 2024-05-22 15:33:39 +02:00
parent f71e2e6ff3
commit 401c44dbc7
15 changed files with 93 additions and 32 deletions

View File

@ -139,7 +139,7 @@ const userPoints = computed(() =>
{{ $t("assignment.von x Punkten", { x: maxPoints }) }} {{ $t("assignment.von x Punkten", { x: maxPoints }) }}
({{ ({{
( (
((props.assignmentCompletion?.evaluation_points ?? 0) / ((props.assignmentCompletion?.evaluation_points_final ?? 0) /
(props.assignmentCompletion?.evaluation_max_points ?? 1)) * (props.assignmentCompletion?.evaluation_max_points ?? 1)) *
100 100
).toFixed(0) ).toFixed(0)

View File

@ -17,8 +17,8 @@ const documents = {
"\n mutation UpsertAssignmentCompletion(\n $assignmentId: ID!\n $courseSessionId: ID!\n $learningContentId: ID\n $assignmentUserId: UUID\n $completionStatus: AssignmentCompletionStatus!\n $completionDataString: String!\n $evaluationPoints: Float\n $initializeCompletion: Boolean\n $evaluationUserId: ID\n ) {\n upsert_assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n learning_content_page_id: $learningContentId\n assignment_user_id: $assignmentUserId\n completion_status: $completionStatus\n completion_data_string: $completionDataString\n evaluation_points: $evaluationPoints\n initialize_completion: $initializeCompletion\n evaluation_user_id: $evaluationUserId\n ) {\n assignment_completion {\n id\n completion_status\n submitted_at\n evaluation_submitted_at\n evaluation_points\n completion_data\n task_completion_data\n }\n }\n }\n": types.UpsertAssignmentCompletionDocument, "\n mutation UpsertAssignmentCompletion(\n $assignmentId: ID!\n $courseSessionId: ID!\n $learningContentId: ID\n $assignmentUserId: UUID\n $completionStatus: AssignmentCompletionStatus!\n $completionDataString: String!\n $evaluationPoints: Float\n $initializeCompletion: Boolean\n $evaluationUserId: ID\n ) {\n upsert_assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n learning_content_page_id: $learningContentId\n assignment_user_id: $assignmentUserId\n completion_status: $completionStatus\n completion_data_string: $completionDataString\n evaluation_points: $evaluationPoints\n initialize_completion: $initializeCompletion\n evaluation_user_id: $evaluationUserId\n ) {\n assignment_completion {\n id\n completion_status\n submitted_at\n evaluation_submitted_at\n evaluation_points\n completion_data\n task_completion_data\n }\n }\n }\n": types.UpsertAssignmentCompletionDocument,
"\n fragment CoursePageFields on CoursePageInterface {\n title\n id\n slug\n content_type\n frontend_url\n }\n": types.CoursePageFieldsFragmentDoc, "\n fragment CoursePageFields on CoursePageInterface {\n title\n id\n slug\n content_type\n frontend_url\n }\n": types.CoursePageFieldsFragmentDoc,
"\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 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 solution_sample {\n id\n url\n }\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 first_name\n last_name\n }\n assignment_user {\n avatar_url\n first_name\n last_name\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 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 solution_sample {\n id\n url\n }\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 first_name\n last_name\n }\n assignment_user {\n avatar_url\n first_name\n last_name\n id\n }\n evaluation_points\n evaluation_max_points\n evaluation_points_deducted\n evaluation_points_deducted_reason\n evaluation_points_final\n\n evaluation_passed\n edoniq_extended_time_flag\n completion_data\n task_completion_data\n }\n }\n": types.AssignmentCompletionQueryDocument,
"\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 competence_certificate_weight\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 id\n title\n slug\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 competence_certificate_weight\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_points_deducted\n evaluation_points_final\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n ...CoursePageFields\n circle {\n id\n title\n slug\n }\n }\n }\n }\n }\n }\n": types.CompetenceCertificateQueryDocument,
"\n query competenceCertificateForUserQuery(\n $courseSlug: String!\n $courseSessionId: ID!\n $userId: UUID!\n ) {\n competence_certificate_list_for_user(course_slug: $courseSlug, user_id: $userId) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n competence_certificate_weight\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 id\n title\n slug\n }\n }\n }\n }\n }\n }\n": types.CompetenceCertificateForUserQueryDocument, "\n query competenceCertificateForUserQuery(\n $courseSlug: String!\n $courseSessionId: ID!\n $userId: UUID!\n ) {\n competence_certificate_list_for_user(course_slug: $courseSlug, user_id: $userId) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n competence_certificate_weight\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 id\n title\n slug\n }\n }\n }\n }\n }\n }\n": types.CompetenceCertificateForUserQueryDocument,
"\n query courseSessionDetail($courseSessionId: ID!) {\n course_session(id: $courseSessionId) {\n id\n title\n course {\n id\n title\n slug\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n }\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 courseSessionDetail($courseSessionId: ID!) {\n course_session(id: $courseSessionId) {\n id\n title\n course {\n id\n title\n slug\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n }\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 courseQuery($slug: String!) {\n course(slug: $slug) {\n id\n title\n slug\n category_name\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n is_uk\n }\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 assignment_type\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 assignment_type\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 courseQuery($slug: String!) {\n course(slug: $slug) {\n id\n title\n slug\n category_name\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n is_uk\n }\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 assignment_type\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 assignment_type\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,
@ -63,11 +63,11 @@ export function graphql(source: "\n query attendanceCheckQuery($courseSessionId
/** /**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. * 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 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 solution_sample {\n id\n url\n }\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 first_name\n last_name\n }\n assignment_user {\n avatar_url\n first_name\n last_name\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"): (typeof documents)["\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 solution_sample {\n id\n url\n }\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 first_name\n last_name\n }\n assignment_user {\n avatar_url\n first_name\n last_name\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"]; export function graphql(source: "\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 solution_sample {\n id\n url\n }\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 first_name\n last_name\n }\n assignment_user {\n avatar_url\n first_name\n last_name\n id\n }\n evaluation_points\n evaluation_max_points\n evaluation_points_deducted\n evaluation_points_deducted_reason\n evaluation_points_final\n\n evaluation_passed\n edoniq_extended_time_flag\n completion_data\n task_completion_data\n }\n }\n"): (typeof documents)["\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 solution_sample {\n id\n url\n }\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 first_name\n last_name\n }\n assignment_user {\n avatar_url\n first_name\n last_name\n id\n }\n evaluation_points\n evaluation_max_points\n evaluation_points_deducted\n evaluation_points_deducted_reason\n evaluation_points_final\n\n evaluation_passed\n edoniq_extended_time_flag\n completion_data\n task_completion_data\n }\n }\n"];
/** /**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. * 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 competence_certificate_weight\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 id\n title\n slug\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 competence_certificate_weight\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 id\n title\n slug\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 competence_certificate_weight\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_points_deducted\n evaluation_points_final\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n ...CoursePageFields\n circle {\n id\n title\n slug\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 competence_certificate_weight\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_points_deducted\n evaluation_points_final\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n ...CoursePageFields\n circle {\n id\n title\n slug\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. * 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

View File

@ -560,6 +560,9 @@ type AssignmentCompletionObjectType {
submitted_at: DateTime submitted_at: DateTime
evaluation_submitted_at: DateTime evaluation_submitted_at: DateTime
evaluation_user: UserObjectType evaluation_user: UserObjectType
evaluation_points_deducted: Float!
evaluation_points_deducted_reason: String!
evaluation_points_deducted_user: UserObjectType
evaluation_passed: Boolean evaluation_passed: Boolean
edoniq_extended_time_flag: Boolean! edoniq_extended_time_flag: Boolean!
assignment_user: UserObjectType! assignment_user: UserObjectType!
@ -571,6 +574,7 @@ type AssignmentCompletionObjectType {
task_completion_data: GenericScalar task_completion_data: GenericScalar
learning_content_page_id: ID learning_content_page_id: ID
evaluation_points: Float evaluation_points: Float
evaluation_points_final: Float
evaluation_max_points: Float evaluation_max_points: Float
} }

View File

@ -77,6 +77,10 @@ export const ASSIGNMENT_COMPLETION_QUERY = graphql(`
} }
evaluation_points evaluation_points
evaluation_max_points evaluation_max_points
evaluation_points_deducted
evaluation_points_deducted_reason
evaluation_points_final
evaluation_passed evaluation_passed
edoniq_extended_time_flag edoniq_extended_time_flag
completion_data completion_data
@ -101,6 +105,8 @@ export const COMPETENCE_NAVI_CERTIFICATE_QUERY = graphql(`
completion_status completion_status
submitted_at submitted_at
evaluation_points evaluation_points
evaluation_points_deducted
evaluation_points_final
evaluation_max_points evaluation_max_points
evaluation_passed evaluation_passed
} }

View File

@ -81,18 +81,24 @@ const getIconName = () => {
> >
<div class="flex flex-col lg:items-center"> <div class="flex flex-col lg:items-center">
<div class="heading-2"> <div class="heading-2">
{{ assignment.completion?.evaluation_points }} {{ assignment.completion?.evaluation_points_final }}
</div> </div>
<div> <div>
{{ $t("assignment.von x Punkten", { x: assignment.max_points }) }} {{ $t("assignment.von x Punkten", { x: assignment.max_points }) }}
({{ ({{
( (
((assignment.completion?.evaluation_points ?? 0) / ((assignment.completion?.evaluation_points_final ?? 0) /
(assignment.completion?.evaluation_max_points ?? 1)) * (assignment.completion?.evaluation_max_points ?? 1)) *
100 100
).toFixed(0) ).toFixed(0)
}}%) }}%)
</div> </div>
<div
v-if="(assignment.completion?.evaluation_points_deducted ?? 0) > 0"
class="text-gray-900"
>
{{ $t("a.mit Abzug") }}
</div>
<div <div
v-if="assignment.completion && !assignment.completion.evaluation_passed" v-if="assignment.completion && !assignment.completion.evaluation_passed"
class="my-2 rounded-md bg-error-red-200 px-2.5 py-0.5" class="my-2 rounded-md bg-error-red-200 px-2.5 py-0.5"

View File

@ -17,7 +17,7 @@ export function assignmentsUserPoints(assignments: CompetenceCertificateAssignme
return +_.sum( return +_.sum(
assignments assignments
.filter((a) => a.completion?.completion_status === "EVALUATION_SUBMITTED") .filter((a) => a.completion?.completion_status === "EVALUATION_SUBMITTED")
.map((a) => a.completion?.evaluation_points ?? 0) .map((a) => a.completion?.evaluation_points_final ?? 0)
).toFixed(1); ).toFixed(1);
} }
@ -31,7 +31,7 @@ export function calcCompetenceCertificateGrade(
const adjustedResults = evaluatedAssignments.map((a) => { const adjustedResults = evaluatedAssignments.map((a) => {
return ( return (
((a.completion?.evaluation_points ?? 0) / a.max_points) * ((a.completion?.evaluation_points_final ?? 0) / a.max_points) *
a.competence_certificate_weight a.competence_certificate_weight
); );
}); });

View File

@ -169,7 +169,7 @@ async function startTest() {
<div class="my-4"> <div class="my-4">
{{ $t("a.Resultat") }}: {{ $t("a.Resultat") }}:
<span class="font-bold"> <span class="font-bold">
{{ assignmentCompletion.evaluation_points }} {{ assignmentCompletion.evaluation_points_final }}
</span> </span>
{{ {{
$t("assignment.von x Punkten", { $t("assignment.von x Punkten", {
@ -178,7 +178,7 @@ async function startTest() {
}} }}
({{ ({{
( (
((assignmentCompletion.evaluation_points ?? 0) / ((assignmentCompletion.evaluation_points_final ?? 0) /
(assignmentCompletion.evaluation_max_points ?? 1)) * (assignmentCompletion.evaluation_max_points ?? 1)) *
100 100
).toFixed(0) ).toFixed(0)
@ -191,6 +191,21 @@ async function startTest() {
</span> </span>
</div> </div>
<div v-if="assignmentCompletion.evaluation_points_deducted > 0" class="my-4">
<div>
{{ $t("a.Punkte aus Bewertung") }}:
{{ assignmentCompletion.evaluation_points }}
</div>
<div>
{{ $t("a.Abgezogene Punkte") }}:
{{ assignmentCompletion.evaluation_points_deducted }}
</div>
<div>
{{ $t("a.Grund") }}:
{{ assignmentCompletion.evaluation_points_deducted_reason }}
</div>
</div>
<div class="mt-4"> <div class="mt-4">
<button class="btn-primary inline-flex items-center" @click="startTest()"> <button class="btn-primary inline-flex items-center" @click="startTest()">
{{ $t("edoniqTest.viewResults") }} {{ $t("edoniqTest.viewResults") }}

View File

@ -47,7 +47,7 @@ export async function loadAssignmentCompletionStatusData(
if (userAssignmentStatus?.completion_status === "EVALUATION_SUBMITTED") { if (userAssignmentStatus?.completion_status === "EVALUATION_SUBMITTED") {
gradedUsers.push({ gradedUsers.push({
user: csu, user: csu,
points: userAssignmentStatus.evaluation_points ?? 0, points: userAssignmentStatus.evaluation_points_final ?? 0,
maxPoints: userAssignmentStatus.evaluation_max_points ?? 0, maxPoints: userAssignmentStatus.evaluation_max_points ?? 0,
passed: userAssignmentStatus.evaluation_passed ?? false, passed: userAssignmentStatus.evaluation_passed ?? false,
}); });

View File

@ -403,6 +403,9 @@ export interface CompetenceCertificateAssignment extends BaseCourseWagtailPage {
completion_status: AssignmentCompletionStatus; completion_status: AssignmentCompletionStatus;
evaluation_submitted_at: string | null; evaluation_submitted_at: string | null;
evaluation_points: number | null; evaluation_points: number | null;
evaluation_points_final: number | null;
evaluation_points_deducted: number | null;
evaluation_points_reason: string;
evaluation_max_points: number | null; evaluation_max_points: number | null;
evaluation_passed: boolean | null; evaluation_passed: boolean | null;
} | null; } | null;
@ -567,6 +570,8 @@ export interface UserAssignmentCompletionStatus {
assignment_user_id: string; assignment_user_id: string;
completion_status: AssignmentCompletionStatus; completion_status: AssignmentCompletionStatus;
evaluation_points: number | null; evaluation_points: number | null;
evaluation_points_final: number | null;
evaluation_points_deducted: number | null;
evaluation_max_points: number | null; evaluation_max_points: number | null;
evaluation_passed: boolean; evaluation_passed: boolean;
learning_content_page_id: string; learning_content_page_id: string;

View File

@ -1,31 +1,38 @@
# Generated by Django 3.2.20 on 2024-05-21 14:52 # Generated by Django 3.2.20 on 2024-05-21 14:52
import django.db.models.deletion
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('assignment', '0013_assignment_competence_certificate_weight'), ("assignment", "0013_assignment_competence_certificate_weight"),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='assignmentcompletion', model_name="assignmentcompletion",
name='evaluation_points_deducted', name="evaluation_points_deducted",
field=models.FloatField(default=0.0, verbose_name='Punkteabzug'), field=models.FloatField(default=0.0, verbose_name="Punkteabzug"),
), ),
migrations.AddField( migrations.AddField(
model_name='assignmentcompletion', model_name="assignmentcompletion",
name='evaluation_points_deducted_reason', name="evaluation_points_deducted_reason",
field=models.TextField(blank=True, default='', verbose_name='Punkteabzug Begründung'), field=models.TextField(
blank=True, default="", verbose_name="Punkteabzug Begründung"
),
), ),
migrations.AddField( migrations.AddField(
model_name='assignmentcompletion', model_name="assignmentcompletion",
name='evaluation_points_deducted_user', name="evaluation_points_deducted_user",
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL), field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
), ),
] ]

View File

@ -384,7 +384,7 @@ class AssignmentCompletion(models.Model):
default=AssignmentCompletionStatus.IN_PROGRESS.value, default=AssignmentCompletionStatus.IN_PROGRESS.value,
) )
completion_data = models.JSONField(default=dict) completion_data = models.JSONField(default=dict, blank=True)
additional_json_data = models.JSONField(default=dict, blank=True) additional_json_data = models.JSONField(default=dict, blank=True)
class Meta: class Meta:

View File

@ -10,7 +10,8 @@ from vbv_lernwelt.assignment.models import (
AssignmentCompletionAuditLog, AssignmentCompletionAuditLog,
AssignmentCompletionStatus, AssignmentCompletionStatus,
AssignmentType, AssignmentType,
is_valid_assignment_completion_status, recalculate_assignment_passed, is_valid_assignment_completion_status,
recalculate_assignment_passed,
) )
from vbv_lernwelt.core.models import User from vbv_lernwelt.core.models import User
from vbv_lernwelt.core.utils import find_first from vbv_lernwelt.core.utils import find_first

View File

@ -21,6 +21,7 @@ def request_assignment_completion_status(request, assignment_id, course_session_
"assignment_user_id", "assignment_user_id",
"completion_status", "completion_status",
"evaluation_points", "evaluation_points",
"evaluation_points_deducted",
"evaluation_max_points", "evaluation_max_points",
"evaluation_passed", "evaluation_passed",
"learning_content_page_id", "learning_content_page_id",
@ -29,6 +30,10 @@ def request_assignment_completion_status(request, assignment_id, course_session_
# Convert the learning_content_page_id to a string # Convert the learning_content_page_id to a string
data = list(qs) # Evaluate the queryset data = list(qs) # Evaluate the queryset
for item in data: for item in data:
# only `evaluation_points_final` is relevant for the frontend
item["evaluation_points_final"] = (
item["evaluation_points"] - item["evaluation_points_deducted"]
)
item["learning_content_page_id"] = str(item["learning_content_page_id"]) item["learning_content_page_id"] = str(item["learning_content_page_id"])
return Response(status=200, data=data) return Response(status=200, data=data)

View File

@ -188,14 +188,22 @@ class DashboardQuery(graphene.ObjectType):
completion_status=AssignmentCompletionStatus.EVALUATION_SUBMITTED.value, completion_status=AssignmentCompletionStatus.EVALUATION_SUBMITTED.value,
assignment_user=user, assignment_user=user,
course_session__course=course, course_session__course=course,
).values("evaluation_max_points", "evaluation_points") ).values(
"evaluation_max_points", "evaluation_points", "evaluation_points_deducted"
)
evaluation_results = list(evaluation_results) evaluation_results = list(evaluation_results)
points_max_count = sum( points_max_count = sum(
[result.get("evaluation_max_points", 0) for result in evaluation_results] [result.get("evaluation_max_points", 0) for result in evaluation_results]
) )
points_achieved_count = sum( points_achieved_count = sum(
[result.get("evaluation_points", 0) for result in evaluation_results] [
(
result.get("evaluation_points", 0)
- result.get("evaluation_points_deducted", 0)
)
for result in evaluation_results
]
) )
return CourseProgressType( return CourseProgressType(