feat: praxis assigment evaluation user
This commit is contained in:
parent
712d6d2868
commit
6479683ad8
|
|
@ -47,9 +47,6 @@ const onSubmit = async () => {
|
||||||
learningContentId: props.learningContentId,
|
learningContentId: props.learningContentId,
|
||||||
completionDataString: JSON.stringify({}),
|
completionDataString: JSON.stringify({}),
|
||||||
completionStatus: "SUBMITTED",
|
completionStatus: "SUBMITTED",
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
||||||
// @ts-ignore
|
|
||||||
id: props.assignmentCompletion?.id,
|
|
||||||
});
|
});
|
||||||
bustItGetCache(
|
bustItGetCache(
|
||||||
`/api/course/completion/${props.courseSessionId}/${useUserStore().id}/`
|
`/api/course/completion/${props.courseSessionId}/${useUserStore().id}/`
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import ItButton from "@/components/ui/ItButton.vue";
|
import ItButton from "@/components/ui/ItButton.vue";
|
||||||
import ItCheckbox from "@/components/ui/ItCheckbox.vue";
|
import ItCheckbox from "@/components/ui/ItCheckbox.vue";
|
||||||
import { computed, ref } from "vue";
|
import { ref } from "vue";
|
||||||
import { bustItGetCache, useCSRFFetch } from "@/fetchHelpers";
|
import { bustItGetCache, useCSRFFetch } from "@/fetchHelpers";
|
||||||
import { useUserStore } from "@/stores/user";
|
import { useUserStore } from "@/stores/user";
|
||||||
import eventBus from "@/utils/eventBus";
|
import eventBus from "@/utils/eventBus";
|
||||||
|
|
@ -10,12 +10,14 @@ import dayjs from "dayjs";
|
||||||
|
|
||||||
import { useMutation } from "@urql/vue";
|
import { useMutation } from "@urql/vue";
|
||||||
import { UPSERT_ASSIGNMENT_COMPLETION_MUTATION } from "@/graphql/mutations";
|
import { UPSERT_ASSIGNMENT_COMPLETION_MUTATION } from "@/graphql/mutations";
|
||||||
import type { CourseSessionUserObjectsType } from "@/gql/graphql";
|
|
||||||
import type { Assignment } from "@/types";
|
import type { Assignment } from "@/types";
|
||||||
|
import DateEmbedding from "@/components/dueDates/DateEmbedding.vue";
|
||||||
|
import { useCurrentCourseSession } from "@/composables";
|
||||||
|
|
||||||
|
const currentCourseSession = useCurrentCourseSession();
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
submissionDeadlineStart?: string | null;
|
submissionDeadlineStart?: string | null;
|
||||||
circleExpert?: CourseSessionUserObjectsType;
|
|
||||||
courseSessionId: string;
|
courseSessionId: string;
|
||||||
assignment: Assignment;
|
assignment: Assignment;
|
||||||
learningContentId: string;
|
learningContentId: string;
|
||||||
|
|
@ -27,14 +29,12 @@ const upsertAssignmentCompletionMutation = useMutation(
|
||||||
UPSERT_ASSIGNMENT_COMPLETION_MUTATION
|
UPSERT_ASSIGNMENT_COMPLETION_MUTATION
|
||||||
);
|
);
|
||||||
|
|
||||||
const circleExpertName = computed(() => {
|
|
||||||
return `${props.circleExpert?.first_name} ${props.circleExpert?.last_name}`;
|
|
||||||
});
|
|
||||||
|
|
||||||
const { data: learningMentors } = useCSRFFetch(
|
const { data: learningMentors } = useCSRFFetch(
|
||||||
`/api/mentor/${props.courseSessionId}/mentors`
|
`/api/mentor/${props.courseSessionId}/mentors`
|
||||||
).json();
|
).json();
|
||||||
|
|
||||||
|
const selectedLearningMentor = ref();
|
||||||
|
|
||||||
const onSubmit = async () => {
|
const onSubmit = async () => {
|
||||||
try {
|
try {
|
||||||
await upsertAssignmentCompletionMutation.executeMutation({
|
await upsertAssignmentCompletionMutation.executeMutation({
|
||||||
|
|
@ -43,9 +43,7 @@ const onSubmit = async () => {
|
||||||
learningContentId: props.learningContentId,
|
learningContentId: props.learningContentId,
|
||||||
completionDataString: JSON.stringify({}),
|
completionDataString: JSON.stringify({}),
|
||||||
completionStatus: "SUBMITTED",
|
completionStatus: "SUBMITTED",
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
evaluationUserId: selectedLearningMentor.value,
|
||||||
// @ts-ignore
|
|
||||||
id: props.assignmentCompletion?.id,
|
|
||||||
});
|
});
|
||||||
bustItGetCache(
|
bustItGetCache(
|
||||||
`/api/course/completion/${props.courseSessionId}/${useUserStore().id}/`
|
`/api/course/completion/${props.courseSessionId}/${useUserStore().id}/`
|
||||||
|
|
@ -62,27 +60,53 @@ const onSubmit = async () => {
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="w-full border-b border-gray-400">
|
<div class="w-full border-b border-gray-400">
|
||||||
<ItCheckbox
|
<div v-if="learningMentors?.length" class="my-6">
|
||||||
class="py-6"
|
<ItCheckbox
|
||||||
:checkbox-item="{
|
class="py-6"
|
||||||
label: $t('a.confirmSubmitPersonPraxisAssignment'),
|
:checkbox-item="{
|
||||||
value: 'value',
|
label: $t('a.confirmSubmitPersonPraxisAssignment'),
|
||||||
checked: confirmPerson,
|
value: 'value',
|
||||||
}"
|
checked: confirmPerson,
|
||||||
data-cy="confirm-submit-person"
|
}"
|
||||||
@toggle="confirmPerson = !confirmPerson"
|
data-cy="confirm-submit-person"
|
||||||
></ItCheckbox>
|
@toggle="confirmPerson = !confirmPerson"
|
||||||
<div v-if="circleExpert" class="flex flex-row items-center pb-6 pl-[49px]">
|
></ItCheckbox>
|
||||||
<img
|
|
||||||
alt="Notification icon"
|
<div>
|
||||||
class="mr-2 h-[45px] min-w-[45px] rounded-full"
|
<select v-model="selectedLearningMentor">
|
||||||
:src="circleExpert.avatar_url"
|
<option
|
||||||
/>
|
:value="learningMentor.mentor.id"
|
||||||
<p class="text-base font-bold">
|
v-for="learningMentor in learningMentors"
|
||||||
{{ circleExpertName }}
|
:key="learningMentor.id"
|
||||||
</p>
|
>
|
||||||
|
{{ learningMentor.mentor.first_name }} {{ learningMentor.mentor.last_name }}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else class="my-6">
|
||||||
|
<div class="flex space-x-2 bg-sky-200 p-4">
|
||||||
|
<it-icon-info class="it-icon h-6 w-6 text-sky-700" />
|
||||||
|
<div>
|
||||||
|
<div class="mb-4">
|
||||||
|
{{
|
||||||
|
$t(
|
||||||
|
"a.Aktuell hast du noch keine Person als Lernbegleitung eingeladen. Lade jetzt jemanden ein."
|
||||||
|
)
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
<router-link
|
||||||
|
:to="{
|
||||||
|
name: 'learningMentorManagement',
|
||||||
|
params: { courseSlug: currentCourseSession.course.slug },
|
||||||
|
}"
|
||||||
|
class="btn-blue px-4 py-2 font-bold"
|
||||||
|
>
|
||||||
|
{{ $t("a.Lernbegleitung einladen") }}
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ learningMentors }}
|
|
||||||
</div>
|
</div>
|
||||||
<p v-if="props.submissionDeadlineStart" class="pt-6">
|
<p v-if="props.submissionDeadlineStart" class="pt-6">
|
||||||
{{ $t("assignment.dueDateSubmission") }}
|
{{ $t("assignment.dueDateSubmission") }}
|
||||||
|
|
@ -90,12 +114,12 @@ const onSubmit = async () => {
|
||||||
</p>
|
</p>
|
||||||
<ItButton
|
<ItButton
|
||||||
class="mt-6"
|
class="mt-6"
|
||||||
variant="blue"
|
variant="primary"
|
||||||
size="large"
|
size="large"
|
||||||
:disabled="!confirmPerson"
|
:disabled="!confirmPerson || !selectedLearningMentor"
|
||||||
data-cy="submit-assignment"
|
data-cy="submit-assignment"
|
||||||
@click="onSubmit"
|
@click="onSubmit"
|
||||||
>
|
>
|
||||||
<p>{{ $t("assignment.submitAssignment") }}</p>
|
<p>{{ $t("a.Ergebnisse teilen") }}</p>
|
||||||
</ItButton>
|
</ItButton>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
||||||
|
|
@ -30,9 +30,6 @@ const onSubmit = async () => {
|
||||||
learningContentId: props.learningContentId,
|
learningContentId: props.learningContentId,
|
||||||
completionDataString: JSON.stringify({}),
|
completionDataString: JSON.stringify({}),
|
||||||
completionStatus: "SUBMITTED",
|
completionStatus: "SUBMITTED",
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
||||||
// @ts-ignore
|
|
||||||
id: props.assignmentCompletion?.id,
|
|
||||||
});
|
});
|
||||||
bustItGetCache(
|
bustItGetCache(
|
||||||
`/api/course/completion/${props.courseSessionId}/${useUserStore().id}/`
|
`/api/course/completion/${props.courseSessionId}/${useUserStore().id}/`
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-
|
||||||
*/
|
*/
|
||||||
const documents = {
|
const documents = {
|
||||||
"\n mutation AttendanceCheckMutation(\n $attendanceCourseId: ID!\n $attendanceUserList: [AttendanceUserInputType]!\n ) {\n update_course_session_attendance_course_users(\n id: $attendanceCourseId\n attendance_user_list: $attendanceUserList\n ) {\n course_session_attendance_course {\n id\n attendance_user_list {\n user_id\n first_name\n last_name\n email\n status\n }\n }\n }\n }\n": types.AttendanceCheckMutationDocument,
|
"\n mutation AttendanceCheckMutation(\n $attendanceCourseId: ID!\n $attendanceUserList: [AttendanceUserInputType]!\n ) {\n update_course_session_attendance_course_users(\n id: $attendanceCourseId\n attendance_user_list: $attendanceUserList\n ) {\n course_session_attendance_course {\n id\n attendance_user_list {\n user_id\n first_name\n last_name\n email\n status\n }\n }\n }\n }\n": types.AttendanceCheckMutationDocument,
|
||||||
"\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 ) {\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 ) {\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 }\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 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 }\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,
|
||||||
|
|
@ -48,7 +48,7 @@ export function graphql(source: "\n mutation AttendanceCheckMutation(\n $att
|
||||||
/**
|
/**
|
||||||
* 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 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 ) {\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 ) {\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"): (typeof 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 ) {\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 ) {\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"];
|
export function graphql(source: "\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"): (typeof 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"];
|
||||||
/**
|
/**
|
||||||
* 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
|
|
@ -863,7 +863,7 @@ type CompetenceCertificateListObjectType implements CoursePageInterface {
|
||||||
type Mutation {
|
type Mutation {
|
||||||
send_feedback(course_session_id: ID!, data: GenericScalar, learning_content_page_id: ID!, learning_content_type: String!, submitted: Boolean = false): SendFeedbackMutation
|
send_feedback(course_session_id: ID!, data: GenericScalar, learning_content_page_id: ID!, learning_content_type: String!, submitted: Boolean = false): SendFeedbackMutation
|
||||||
update_course_session_attendance_course_users(attendance_user_list: [AttendanceUserInputType]!, id: ID!): AttendanceCourseUserMutation
|
update_course_session_attendance_course_users(attendance_user_list: [AttendanceUserInputType]!, id: ID!): AttendanceCourseUserMutation
|
||||||
upsert_assignment_completion(assignment_id: ID!, assignment_user_id: UUID, completion_data_string: String, completion_status: AssignmentCompletionStatus, course_session_id: ID!, evaluation_passed: Boolean, evaluation_points: Float, initialize_completion: Boolean, learning_content_page_id: ID): AssignmentCompletionMutation
|
upsert_assignment_completion(assignment_id: ID!, assignment_user_id: UUID, completion_data_string: String, completion_status: AssignmentCompletionStatus, course_session_id: ID!, evaluation_passed: Boolean, evaluation_points: Float, evaluation_user_id: ID, initialize_completion: Boolean, learning_content_page_id: ID): AssignmentCompletionMutation
|
||||||
}
|
}
|
||||||
|
|
||||||
type SendFeedbackMutation {
|
type SendFeedbackMutation {
|
||||||
|
|
@ -903,4 +903,4 @@ enum AssignmentCompletionStatus {
|
||||||
SUBMITTED
|
SUBMITTED
|
||||||
EVALUATION_IN_PROGRESS
|
EVALUATION_IN_PROGRESS
|
||||||
EVALUATION_SUBMITTED
|
EVALUATION_SUBMITTED
|
||||||
}
|
}
|
||||||
|
|
@ -33,6 +33,7 @@ export const UPSERT_ASSIGNMENT_COMPLETION_MUTATION = graphql(`
|
||||||
$completionDataString: String!
|
$completionDataString: String!
|
||||||
$evaluationPoints: Float
|
$evaluationPoints: Float
|
||||||
$initializeCompletion: Boolean
|
$initializeCompletion: Boolean
|
||||||
|
$evaluationUserId: ID
|
||||||
) {
|
) {
|
||||||
upsert_assignment_completion(
|
upsert_assignment_completion(
|
||||||
assignment_id: $assignmentId
|
assignment_id: $assignmentId
|
||||||
|
|
@ -43,6 +44,7 @@ export const UPSERT_ASSIGNMENT_COMPLETION_MUTATION = graphql(`
|
||||||
completion_data_string: $completionDataString
|
completion_data_string: $completionDataString
|
||||||
evaluation_points: $evaluationPoints
|
evaluation_points: $evaluationPoints
|
||||||
initialize_completion: $initializeCompletion
|
initialize_completion: $initializeCompletion
|
||||||
|
evaluation_user_id: $evaluationUserId
|
||||||
) {
|
) {
|
||||||
assignment_completion {
|
assignment_completion {
|
||||||
id
|
id
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,12 @@ const openSolutionSample = () => {
|
||||||
<template>
|
<template>
|
||||||
<div class="w-full border border-gray-400 p-8" data-cy="confirm-container">
|
<div class="w-full border border-gray-400 p-8" data-cy="confirm-container">
|
||||||
<h3 class="heading-3 border-b border-gray-400 pb-6">
|
<h3 class="heading-3 border-b border-gray-400 pb-6">
|
||||||
{{ $t("assignment.submitAssignment") }}
|
<template v-if="isPraxisAssignment">
|
||||||
|
{{ $t("a.Ergebnisse teilen") }}
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
{{ $t("assignment.submitAssignment") }}
|
||||||
|
</template>
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div v-if="completionStatus === 'IN_PROGRESS'">
|
<div v-if="completionStatus === 'IN_PROGRESS'">
|
||||||
|
|
@ -109,7 +114,6 @@ const openSolutionSample = () => {
|
||||||
:course-session-id="courseSessionId"
|
:course-session-id="courseSessionId"
|
||||||
:assignment="assignment"
|
:assignment="assignment"
|
||||||
:learning-content-id="learningContentId"
|
:learning-content-id="learningContentId"
|
||||||
:circle-expert="circleExpert"
|
|
||||||
:submission-deadline-start="submissionDeadlineStart"
|
:submission-deadline-start="submissionDeadlineStart"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,7 @@ const router = createRouter({
|
||||||
path: "/course/:courseSlug/mentor",
|
path: "/course/:courseSlug/mentor",
|
||||||
component: () => import("@/pages/learningMentor/MentorManagementPage.vue"),
|
component: () => import("@/pages/learningMentor/MentorManagementPage.vue"),
|
||||||
props: true,
|
props: true,
|
||||||
|
name: "learningMentorManagement",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/lernbegleitung/:courseId/invitation/:invitationId",
|
path: "/lernbegleitung/:courseId/invitation/:invitationId",
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ class AssignmentCompletionMutation(graphene.Mutation):
|
||||||
|
|
||||||
evaluation_points = graphene.Float()
|
evaluation_points = graphene.Float()
|
||||||
evaluation_passed = graphene.Boolean()
|
evaluation_passed = graphene.Boolean()
|
||||||
|
evaluation_user_id = graphene.ID(required=False)
|
||||||
initialize_completion = graphene.Boolean(required=False)
|
initialize_completion = graphene.Boolean(required=False)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
@ -46,6 +47,7 @@ class AssignmentCompletionMutation(graphene.Mutation):
|
||||||
completion_data_string="{}",
|
completion_data_string="{}",
|
||||||
evaluation_points=None,
|
evaluation_points=None,
|
||||||
evaluation_passed=None,
|
evaluation_passed=None,
|
||||||
|
evaluation_user_id=None,
|
||||||
initialize_completion=False,
|
initialize_completion=False,
|
||||||
):
|
):
|
||||||
if assignment_user_id is None:
|
if assignment_user_id is None:
|
||||||
|
|
@ -78,13 +80,18 @@ class AssignmentCompletionMutation(graphene.Mutation):
|
||||||
}
|
}
|
||||||
|
|
||||||
if completion_status == AssignmentCompletionStatus.SUBMITTED:
|
if completion_status == AssignmentCompletionStatus.SUBMITTED:
|
||||||
# TODO: determine proper way to assign evaluation user
|
if evaluation_user_id:
|
||||||
experts = CourseSessionUser.objects.filter(
|
assignment_data["evaluation_user"] = User.objects.get(
|
||||||
course_session=course_session, role="EXPERT"
|
id=evaluation_user_id
|
||||||
)
|
)
|
||||||
if not experts:
|
else:
|
||||||
raise PermissionDenied()
|
# TODO: determine proper way to assign evaluation user
|
||||||
assignment_data["evaluation_user"] = experts[0].user
|
experts = CourseSessionUser.objects.filter(
|
||||||
|
course_session=course_session, role="EXPERT"
|
||||||
|
)
|
||||||
|
if not experts:
|
||||||
|
raise PermissionDenied()
|
||||||
|
assignment_data["evaluation_user"] = experts[0].user
|
||||||
|
|
||||||
evaluation_data = {}
|
evaluation_data = {}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,12 +17,16 @@ from vbv_lernwelt.learning_mentor.entities import (
|
||||||
|
|
||||||
|
|
||||||
def get_assignment_completions(
|
def get_assignment_completions(
|
||||||
course_session: CourseSession, assignment: Assignment, participants: List[User]
|
course_session: CourseSession,
|
||||||
|
assignment: Assignment,
|
||||||
|
participants: List[User],
|
||||||
|
evaluation_user: User,
|
||||||
) -> List[PraxisAssignmentCompletion]:
|
) -> List[PraxisAssignmentCompletion]:
|
||||||
evaluation_results = AssignmentCompletion.objects.filter(
|
evaluation_results = AssignmentCompletion.objects.filter(
|
||||||
assignment_user__in=participants,
|
assignment_user__in=participants,
|
||||||
course_session=course_session,
|
course_session=course_session,
|
||||||
assignment=assignment,
|
assignment=assignment,
|
||||||
|
evaluation_user=evaluation_user,
|
||||||
).values("completion_status", "assignment_user__last_name", "assignment_user")
|
).values("completion_status", "assignment_user__last_name", "assignment_user")
|
||||||
|
|
||||||
user_status_map = {}
|
user_status_map = {}
|
||||||
|
|
@ -73,7 +77,7 @@ def get_assignment_completions(
|
||||||
|
|
||||||
|
|
||||||
def get_praxis_assignments(
|
def get_praxis_assignments(
|
||||||
course_session: CourseSession, participants: List[User]
|
course_session: CourseSession, participants: List[User], evaluation_user: User
|
||||||
) -> Tuple[List[PraxisAssignmentStatus], Set[int]]:
|
) -> Tuple[List[PraxisAssignmentStatus], Set[int]]:
|
||||||
records = []
|
records = []
|
||||||
circle_ids = set()
|
circle_ids = set()
|
||||||
|
|
@ -93,6 +97,7 @@ def get_praxis_assignments(
|
||||||
course_session=course_session,
|
course_session=course_session,
|
||||||
assignment=learning_content.content_assignment,
|
assignment=learning_content.content_assignment,
|
||||||
participants=participants,
|
participants=participants,
|
||||||
|
evaluation_user=evaluation_user,
|
||||||
)
|
)
|
||||||
|
|
||||||
submitted_count = len(
|
submitted_count = len(
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ from vbv_lernwelt.learning_mentor.entities import CompletionStatus
|
||||||
|
|
||||||
class AttendanceServicesTestCase(TestCase):
|
class AttendanceServicesTestCase(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
self.mentor = create_user("Mentor")
|
||||||
self.user1 = create_user("Alpha")
|
self.user1 = create_user("Alpha")
|
||||||
self.user2 = create_user("Beta")
|
self.user2 = create_user("Beta")
|
||||||
self.user3 = create_user("Kappa")
|
self.user3 = create_user("Kappa")
|
||||||
|
|
@ -41,18 +42,21 @@ class AttendanceServicesTestCase(TestCase):
|
||||||
course_session=self.course_session,
|
course_session=self.course_session,
|
||||||
assignment=self.assignment,
|
assignment=self.assignment,
|
||||||
completion_status=AssignmentCompletionStatus.EVALUATION_SUBMITTED.value,
|
completion_status=AssignmentCompletionStatus.EVALUATION_SUBMITTED.value,
|
||||||
|
evaluation_user=self.mentor,
|
||||||
)
|
)
|
||||||
AssignmentCompletion.objects.create(
|
AssignmentCompletion.objects.create(
|
||||||
assignment_user=self.user2,
|
assignment_user=self.user2,
|
||||||
course_session=self.course_session,
|
course_session=self.course_session,
|
||||||
assignment=self.assignment,
|
assignment=self.assignment,
|
||||||
completion_status=AssignmentCompletionStatus.SUBMITTED.value,
|
completion_status=AssignmentCompletionStatus.SUBMITTED.value,
|
||||||
|
evaluation_user=self.mentor,
|
||||||
)
|
)
|
||||||
AssignmentCompletion.objects.create(
|
AssignmentCompletion.objects.create(
|
||||||
assignment_user=self.user3,
|
assignment_user=self.user3,
|
||||||
course_session=self.course_session,
|
course_session=self.course_session,
|
||||||
assignment=self.assignment,
|
assignment=self.assignment,
|
||||||
completion_status=AssignmentCompletionStatus.IN_PROGRESS.value,
|
completion_status=AssignmentCompletionStatus.IN_PROGRESS.value,
|
||||||
|
evaluation_user=self.mentor,
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_assignment_completions(self):
|
def test_assignment_completions(self):
|
||||||
|
|
@ -61,7 +65,10 @@ class AttendanceServicesTestCase(TestCase):
|
||||||
|
|
||||||
# WHEN
|
# WHEN
|
||||||
results = get_assignment_completions(
|
results = get_assignment_completions(
|
||||||
self.course_session, self.assignment, participants
|
course_session=self.course_session,
|
||||||
|
assignment=self.assignment,
|
||||||
|
participants=participants,
|
||||||
|
evaluation_user=self.mentor,
|
||||||
)
|
)
|
||||||
|
|
||||||
# THEN
|
# THEN
|
||||||
|
|
@ -88,7 +95,9 @@ class AttendanceServicesTestCase(TestCase):
|
||||||
|
|
||||||
# WHEN
|
# WHEN
|
||||||
assignments, circle_ids = get_praxis_assignments(
|
assignments, circle_ids = get_praxis_assignments(
|
||||||
self.course_session, participants
|
course_session=self.course_session,
|
||||||
|
participants=participants,
|
||||||
|
evaluation_user=self.mentor,
|
||||||
)
|
)
|
||||||
|
|
||||||
# THEN
|
# THEN
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,7 @@ class LearningMentorAPITest(APITestCase):
|
||||||
course_session=self.course_session,
|
course_session=self.course_session,
|
||||||
assignment=self.assignment,
|
assignment=self.assignment,
|
||||||
completion_status=AssignmentCompletionStatus.EVALUATION_SUBMITTED.value,
|
completion_status=AssignmentCompletionStatus.EVALUATION_SUBMITTED.value,
|
||||||
|
evaluation_user=self.mentor,
|
||||||
)
|
)
|
||||||
|
|
||||||
AssignmentCompletion.objects.create(
|
AssignmentCompletion.objects.create(
|
||||||
|
|
@ -132,6 +133,7 @@ class LearningMentorAPITest(APITestCase):
|
||||||
course_session=self.course_session,
|
course_session=self.course_session,
|
||||||
assignment=self.assignment,
|
assignment=self.assignment,
|
||||||
completion_status=AssignmentCompletionStatus.SUBMITTED.value,
|
completion_status=AssignmentCompletionStatus.SUBMITTED.value,
|
||||||
|
evaluation_user=self.mentor,
|
||||||
)
|
)
|
||||||
|
|
||||||
# WHEN
|
# WHEN
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,9 @@ def mentor_summary(request, course_session_id: int):
|
||||||
participants = mentor.participants.filter(course_session=course_session)
|
participants = mentor.participants.filter(course_session=course_session)
|
||||||
users = [p.user for p in participants]
|
users = [p.user for p in participants]
|
||||||
|
|
||||||
praxis_assignments, circle_ids = get_praxis_assignments(course_session, users)
|
praxis_assignments, circle_ids = get_praxis_assignments(
|
||||||
|
course_session=course_session, participants=users, evaluation_user=request.user
|
||||||
|
)
|
||||||
|
|
||||||
circles = Circle.objects.filter(id__in=circle_ids).values("id", "title")
|
circles = Circle.objects.filter(id__in=circle_ids).values("id", "title")
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue