VBV-350: Refactor LearningContent to individual wagtail pages

This commit is contained in:
Daniel Egger 2023-05-12 11:23:17 +02:00
parent 3858cdfc79
commit a15af2bf86
63 changed files with 1461 additions and 3057 deletions

View File

@ -12,14 +12,14 @@ import {
import LearningContentMultiLayout from "@/pages/learningPath/learningContentPage/layouts/LearningContentMultiLayout.vue";
import { useCircleStore } from "@/stores/circle";
import { useCourseSessionsStore } from "@/stores/courseSessions";
import type { LearningContent } from "@/types";
import type { LearningContentFeedback } from "@/types";
import { useMutation } from "@urql/vue";
import { useRouteQuery } from "@vueuse/router";
import log from "loglevel";
import { computed, onMounted, reactive, ref } from "vue";
import { useI18n } from "vue-i18n";
const props = defineProps<{ page: LearningContent }>();
const props = defineProps<{ page: LearningContentFeedback }>();
const courseSessionsStore = useCourseSessionsStore();
const circleStore = useCircleStore();
const { t } = useI18n();
@ -132,7 +132,7 @@ const sendFeedback = () => {
<LearningContentMultiLayout
:title="title"
subtitle="Feedback"
:learning-content-type="'feedback'"
learning-content-type="learnpath.LearningContentFeedback"
:show-start-button="stepNo === 0"
:show-next-button="stepNo > 0 && stepNo + 1 < numSteps"
:show-previous-button="stepNo > 0"

View File

@ -9,7 +9,7 @@ const props = defineProps<{
<template>
<div
v-if="props.learningContentType !== 'placeholder'"
v-if="props.learningContentType !== 'learnpath.LearningContentPlaceholder'"
class="flex h-min w-min items-center gap-2 rounded-full bg-gray-200 px-2.5 py-0.5"
>
<component

View File

@ -5,7 +5,7 @@ import { showIcon } from "@/pages/learningPath/circlePage/learningSequenceUtils"
import { useCircleStore } from "@/stores/circle";
import type {
CourseCompletionStatus,
LearningContent,
LearningContentInterface,
LearningSequence,
} from "@/types";
import { humanizeDuration } from "@/utils/humanizeDuration";
@ -23,7 +23,7 @@ const props = withDefaults(defineProps<Props>(), {
const circleStore = useCircleStore();
function toggleCompleted(learningContent: LearningContent) {
function toggleCompleted(learningContent: LearningContentInterface) {
let completionStatus: CourseCompletionStatus = "success";
if (learningContent.completion_status === "success") {
completionStatus = "fail";
@ -173,7 +173,7 @@ const learningSequenceBorderClass = computed(() => {
<div class="hidden sm:block"></div>
<div class="w-full sm:w-auto">
<LearningContentBadge
:learning-content-type="learningContent.contents[0].type"
:learning-content-type="learningContent.type"
/>
</div>
</div>

View File

@ -1,9 +1,10 @@
<script setup lang="ts">
import LearningContent from "@/pages/learningPath/learningContentPage/LearningContent.vue";
import LearningContentParent from "@/pages/learningPath/learningContentPage/LearningContentParent.vue";
import { useCircleStore } from "@/stores/circle";
import type { LearningContent as LearningContentType } from "@/types";
import type { LearningContent } from "@/types";
import * as log from "loglevel";
import { onMounted, reactive, watch } from "vue";
import type { Ref } from "vue";
import { onMounted, ref, watch } from "vue";
log.debug("LearningContentView created");
@ -13,13 +14,13 @@ const props = defineProps<{
contentSlug: string;
}>();
const state: { learningContent?: LearningContentType } = reactive({});
const learningContent: Ref<LearningContent | undefined> = ref(undefined);
const circleStore = useCircleStore();
const loadLearningContent = async () => {
try {
state.learningContent = await circleStore.loadLearningContent(
learningContent.value = await circleStore.loadLearningContent(
props.courseSlug,
props.circleSlug,
props.contentSlug
@ -54,10 +55,7 @@ onMounted(async () => {
</script>
<template>
<LearningContent
v-if="state.learningContent"
:learning-content="state.learningContent"
/>
<LearningContentParent v-if="learningContent" :learning-content="learningContent" />
</template>
<style lang="postcss" scoped></style>

View File

@ -2,19 +2,17 @@
import LearningContentContainer from "@/pages/learningPath/learningContentPage/LearningContentContainer.vue";
import { useCircleStore } from "@/stores/circle";
import type { LearningContent, LearningContentType } from "@/types";
import eventBus from "@/utils/eventBus";
import log from "loglevel";
import type { Component } from "vue";
import { computed, onUnmounted } from "vue";
import AssignmentBlock from "@/pages/learningPath/learningContentPage/blocks/AssignmentBlock.vue";
import AttendanceDayBlock from "@/pages/learningPath/learningContentPage/blocks/AttendanceDayBlock.vue";
import eventBus from "@/utils/eventBus";
import DescriptionBlock from "./blocks/DescriptionBlock.vue";
import DescriptionTextBlock from "./blocks/DescriptionTextBlock.vue";
import AssignmentBlock from "./blocks/AssignmentBlock.vue";
import AttendanceDayBlock from "./blocks/AttendanceDayBlock.vue";
import FeedbackBlock from "./blocks/FeedbackBlock.vue";
import IframeBlock from "./blocks/IframeBlock.vue";
import MediaLibraryBlock from "./blocks/MediaLibraryBlock.vue";
import PlaceholderBlock from "./blocks/PlaceholderBlock.vue";
import DescriptionBlock from "./blocks/RichTextBlock.vue";
import VideoBlock from "./blocks/VideoBlock.vue";
log.debug("LearningContent.vue setup");
@ -25,37 +23,22 @@ const props = defineProps<{
learningContent: LearningContent;
}>();
const block = computed(() => {
if (props.learningContent?.contents?.length) {
return props.learningContent.contents[0];
}
return undefined;
});
// can't use the type as component name, as some are reserved HTML components, e.g. video
const COMPONENTS: Record<LearningContentType, Component> = {
placeholder: PlaceholderBlock,
video: VideoBlock,
assignment: AssignmentBlock,
resource: DescriptionTextBlock,
exercise: IframeBlock,
test: IframeBlock,
learningmodule: IframeBlock,
feedback: FeedbackBlock,
book: DescriptionBlock,
document: DescriptionBlock,
media_library: MediaLibraryBlock,
online_training: DescriptionBlock,
attendance_day: AttendanceDayBlock,
"learnpath.LearningContentAssignment": AssignmentBlock,
"learnpath.LearningContentAttendanceDay": AttendanceDayBlock,
"learnpath.LearningContentFeedback": FeedbackBlock,
"learnpath.LearningContentLearningModule": IframeBlock,
"learnpath.LearningContentMediaLibrary": MediaLibraryBlock,
"learnpath.LearningContentPlaceholder": PlaceholderBlock,
"learnpath.LearningContentRichText": DescriptionBlock,
"learnpath.LearningContentTest": IframeBlock,
"learnpath.LearningContentVideo": VideoBlock,
};
const DEFAULT_BLOCK = DescriptionBlock;
const component = computed(() => {
if (block.value) {
return COMPONENTS[block.value.type] || DEFAULT_BLOCK;
}
return DEFAULT_BLOCK;
return COMPONENTS[props.learningContent.type] || DEFAULT_BLOCK;
});
function handleFinishedLearningContent() {
@ -71,15 +54,10 @@ onUnmounted(() => {
<template>
<LearningContentContainer
v-if="block"
@exit="circleStore.closeLearningContent(props.learningContent)"
>
<div>
<component
:is="component"
:value="block.value"
:content="learningContent"
></component>
<component :is="component" :content="learningContent"></component>
</div>
</LearningContentContainer>
</template>

View File

@ -12,7 +12,7 @@ import type {
AssignmentTask,
CourseSessionAssignmentDetails,
CourseSessionUser,
LearningContent,
LearningContentAssignment,
} from "@/types";
import { useRouteQuery } from "@vueuse/router";
import dayjs from "dayjs";
@ -36,8 +36,7 @@ const state: State = reactive({
});
const props = defineProps<{
assignmentId: number;
learningContent: LearningContent;
learningContent: LearningContentAssignment;
}>();
// 0 = introduction, 1 - n = tasks, n+1 = submission
@ -49,17 +48,23 @@ const completionStatus = computed(() => {
});
onMounted(async () => {
log.debug("AssignmentView mounted", props.assignmentId, props.learningContent);
log.debug(
"AssignmentView mounted",
props.learningContent.content_assignment_id,
props.learningContent
);
const courseSessionsStore = useCourseSessionsStore();
try {
state.assignment = await assignmentStore.loadAssignment(props.assignmentId);
state.assignment = await assignmentStore.loadAssignment(
props.learningContent.content_assignment_id
);
state.courseSessionAssignmentDetails = courseSessionsStore.findAssignmentDetails(
props.learningContent.id
);
await assignmentStore.loadAssignmentCompletion(
props.assignmentId,
props.learningContent.content_assignment_id,
courseSessionId.value
);
@ -140,7 +145,7 @@ const assignmentUser = computed(() => {
:current-step="stepIndex"
:subtitle="state.assignment?.title ?? ''"
:title="getTitle()"
learning-content-type="assignment"
:learning-content-type="props.learningContent.type"
:steps-count="numPages"
:show-next-button="showNextButton && stepIndex !== 0"
:show-exit-button="showExitButton"
@ -164,7 +169,7 @@ const assignmentUser = computed(() => {
<AssignmentTaskView
v-if="currentTask"
:task="currentTask"
:assignment-id="props.assignmentId"
:assignment-id="props.learningContent.content_assignment_id"
></AssignmentTaskView>
<AssignmentSubmissionView
v-if="stepIndex + 1 === numPages && state.assignment && courseSessionId"

View File

@ -1,21 +1,15 @@
<script setup lang="ts">
import AssignmentView from "@/pages/learningPath/learningContentPage/assignment/AssignmentView.vue";
import type { LearningContentAssignment } from "@/types";
const props = defineProps<{
content: LearningContentAssignment;
}>();
</script>
<template>
<AssignmentView
:assignment-id="props.value.assignment"
:assignment-id="props.content.content_assignment_id"
:learning-content="props.content"
/>
</template>
<script setup lang="ts">
import AssignmentView from "@/pages/learningPath/learningContentPage/assignment/AssignmentView.vue";
import type { LearningContent } from "@/types";
interface Value {
description: string;
assignment: number;
}
const props = defineProps<{
value: Value;
content: LearningContent;
}>();
</script>

View File

@ -1,22 +1,17 @@
<script setup lang="ts">
import AttendanceDay from "@/pages/learningPath/learningContentPage/attendanceDay/AttendanceDay.vue";
import { useCourseSessionsStore } from "@/stores/courseSessions";
import type { LearningContent } from "@/types";
import type { LearningContentAttendanceDay } from "@/types";
import { computed } from "vue";
import AttendanceDay from "../attendanceDay/AttendanceDay.vue";
import LearningContentSimpleLayout from "../layouts/LearningContentSimpleLayout.vue";
export interface Value {
description: string;
}
const courseSessionsStore = useCourseSessionsStore();
const props = defineProps<{
value: Value;
content: LearningContent;
content: LearningContentAttendanceDay;
}>();
const attendanceDay = computed(() => {
const courseSessionAttendanceDay = computed(() => {
return courseSessionsStore.findAttendanceDay(props.content.id);
});
</script>
@ -24,13 +19,13 @@ const attendanceDay = computed(() => {
<template>
<LearningContentSimpleLayout
:title="content.title"
learning-content-type="attendance_day"
:learning-content-type="props.content.type"
>
<div class="container-medium">
<div class="lg:mt-8">
<div class="text-large my-4">
<div v-if="attendanceDay">
<AttendanceDay :attendance-day="attendanceDay" />
<div v-if="courseSessionAttendanceDay">
<AttendanceDay :attendance-day="courseSessionAttendanceDay" />
</div>
<div v-else>
Für diese Durchführung {{ content.id }} existieren noch keine Details

View File

@ -1,20 +0,0 @@
<template>
<div class="container-medium">
<div class="lg:mt-8">
<p class="text-large my-4">{{ value.description }}</p>
</div>
</div>
</template>
<script setup lang="ts">
import type { LearningContent } from "@/types";
interface Value {
description: string;
}
defineProps<{
value: Value;
content: LearningContent;
}>();
</script>

View File

@ -1,23 +0,0 @@
<template>
<!-- eslint-disable vue/no-v-html -->
<div class="container-medium">
<div class="lg:mt-8">
<p class="text-large my-4">{{ value.description }}</p>
<div class="resource-text" v-html="value.text"></div>
</div>
</div>
</template>
<script setup lang="ts">
import type { LearningContent } from "@/types";
interface Value {
description: string;
text: string;
}
defineProps<{
value: Value;
content: LearningContent;
}>();
</script>

View File

@ -4,14 +4,9 @@
<script setup lang="ts">
import FeedbackForm from "@/components/FeedbackForm.vue";
import type { LearningContent } from "@/types";
interface Value {
description: string;
}
import type { LearningContentFeedback } from "@/types";
defineProps<{
value: Value;
content: LearningContent;
content: LearningContentFeedback;
}>();
</script>

View File

@ -1,21 +1,21 @@
<script setup lang="ts">
import LearningContentSimpleLayout from "@/pages/learningPath/learningContentPage/layouts/LearningContentSimpleLayout.vue";
import type { LearningContentInterface } from "@/types";
const props = defineProps<{
content: LearningContentInterface;
}>();
</script>
<template>
<LearningContentSimpleLayout learning-content-type="resource">
<LearningContentSimpleLayout :learning-content-type="props.content.type">
<div class="h-screen">
<iframe width="100%" height="100%" scrolling="no" :src="value.url" />
<iframe
width="100%"
height="100%"
scrolling="no"
:src="props.content.content_url"
/>
</div>
</LearningContentSimpleLayout>
</template>
<script setup lang="ts">
import LearningContentSimpleLayout from "@/pages/learningPath/learningContentPage/layouts/LearningContentSimpleLayout.vue";
import type { LearningContent } from "@/types";
export interface Value {
url: string;
}
defineProps<{
value: Value;
content: LearningContent;
}>();
</script>

View File

@ -1,31 +1,28 @@
<script setup lang="ts">
import LearningContentSimpleLayout from "@/pages/learningPath/learningContentPage/layouts/LearningContentSimpleLayout.vue";
import type { LearningContentMediaLibrary } from "@/types";
import { useRoute } from "vue-router";
const route = useRoute();
const props = defineProps<{
content: LearningContentMediaLibrary;
}>();
</script>
<template>
<LearningContentSimpleLayout
:title="content.title"
learning-content-type="media_library"
:title="props.content.title"
:learning-content-type="props.content.type"
>
<div class="container-medium">
<p class="text-large my-4 lg:my-8">{{ value.description }}</p>
<router-link :to="`${value.url}?back=${route.path}`" class="button btn-primary">
<p class="text-large my-4 lg:my-8">{{ props.content.description }}</p>
<router-link
:to="`${props.content.content_url}?back=${route.path}`"
class="button btn-primary"
>
Mediathek öffnen
</router-link>
</div>
</LearningContentSimpleLayout>
</template>
<script setup lang="ts">
import LearningContentSimpleLayout from "@/pages/learningPath/learningContentPage/layouts/LearningContentSimpleLayout.vue";
import type { LearningContent } from "@/types";
import { useRoute } from "vue-router";
export interface Value {
description: string;
url: string;
}
const route = useRoute();
defineProps<{
value: Value;
content: LearningContent;
}>();
</script>

View File

@ -1,20 +1,15 @@
<template>
<LearningContentSimpleLayout
:title="content.title"
learning-content-type="placeholder"
></LearningContentSimpleLayout>
</template>
<script setup lang="ts">
import LearningContentSimpleLayout from "@/pages/learningPath/learningContentPage/layouts/LearningContentSimpleLayout.vue";
import type { LearningContent } from "@/types";
import type { LearningContentInterface } from "@/types";
export interface Value {
description: string;
}
defineProps<{
value: Value;
content: LearningContent;
const props = defineProps<{
content: LearningContentInterface;
}>();
</script>
<template>
<LearningContentSimpleLayout
:title="props.content.title"
:learning-content-type="props.content.type"
></LearningContentSimpleLayout>
</template>

View File

@ -0,0 +1,15 @@
<template>
<div class="container-medium">
<div class="lg:mt-8">
<p class="text-large my-4">{{ props.content.description }}}</p>
</div>
</div>
</template>
<script setup lang="ts">
import type { LearningContentInterface } from "@/types";
const props = defineProps<{
content: LearningContentInterface;
}>();
</script>

View File

@ -1,10 +1,13 @@
<template>
<LearningContentSimpleLayout :title="content.title" learning-content-type="video">
<LearningContentSimpleLayout
:title="props.content.title"
:learning-content-type="props.content.type"
>
<div class="container-medium">
<iframe
class="mt-8 aspect-video w-full"
:src="value.url"
:title="content.title"
:src="props.content.content_url"
:title="props.content.title"
frameborder="0"
allow="accelerometer; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
@ -15,14 +18,9 @@
<script setup lang="ts">
import LearningContentSimpleLayout from "@/pages/learningPath/learningContentPage/layouts/LearningContentSimpleLayout.vue";
import type { LearningContent } from "@/types";
import type { LearningContentVideo } from "@/types";
export interface Value {
url: string;
}
defineProps<{
value: Value;
content: LearningContent;
const props = defineProps<{
content: LearningContentVideo;
}>();
</script>

View File

@ -38,7 +38,7 @@ const emit = defineEmits(["previous", "next", "exit"]);
<template>
<div class="container-large">
<div
v-if="props.learningContentType !== 'placeholder'"
v-if="props.learningContentType !== 'learnpath.LearningContentPlaceholder'"
class="flex h-min items-center gap-2 rounded-full pb-10"
>
<component

View File

@ -19,7 +19,7 @@ const type = learningContentTypeData(props.learningContentType);
<template>
<div class="container-medium">
<div
v-if="props.learningContentType !== 'placeholder'"
v-if="props.learningContentType !== 'learnpath.LearningContentPlaceholder'"
class="flex h-min w-full items-center gap-2 pb-8"
>
<component :is="type.icon" class="h-6 w-6 text-gray-900"></component>

View File

@ -71,7 +71,7 @@ onUnmounted(() => {
:current-step="questionIndex"
:subtitle="$t('selfEvaluation.title')"
:title="$t('selfEvaluation.title', { title: learningUnit.title })"
learning-content-type="learningmodule"
learning-content-type="learnpath.LearningContentLearningModule"
:steps-count="questions.length"
:show-next-button="showNextButton"
:show-exit-button="showExitButton"

View File

@ -6,10 +6,10 @@ import data from "./learning_path_json.json";
describe("Circle.parseJson", () => {
it("can parse circle from api response", () => {
const cirleData = data.children.find(
(c) => c.slug === "test-lehrgang-lp-circle-analyse"
(c) => c.slug === "test-lehrgang-lp-circle-fahrzeug"
) as unknown as WagtailCircle;
const circle = Circle.fromJson(cirleData, undefined);
expect(circle.learningSequences.length).toBe(3);
expect(circle.flatLearningContents.length).toBe(7);
expect(circle.flatLearningContents.length).toBe(9);
});
});

View File

@ -4,11 +4,11 @@ import data from "./learning_path_json.json";
describe("LearningPath.parseJson", () => {
it("can parse learning sequences from api response", () => {
const learningPath = LearningPath.fromJson(data, []);
const learningPath = LearningPath.fromJson(data, [], undefined);
expect(learningPath.circles.length).toBe(2);
expect(learningPath.circles[0].title).toBe("Basis");
expect(learningPath.circles[1].title).toBe("Analyse");
expect(learningPath.circles[0].title).toBe("Fahrzeug");
expect(learningPath.circles[1].title).toBe("Reisen");
expect(learningPath.topics.length).toBe(2);
});

View File

@ -1,473 +1,447 @@
{
"id": 568,
"title": "Test Lernpfad",
"slug": "test-lehrgang-lp",
"type": "learnpath.LearningPath",
"translation_key": "25ddc136-af7d-4a74-8731-896281bfe20b",
"frontend_url": "/course/test-lehrgang/learn",
"children": [
{
"id": 569,
"title": "Basis",
"slug": "test-lehrgang-lp-topic-basis",
"type": "learnpath.Topic",
"translation_key": "8cb75aee-0349-41e2-9d2b-2938c2b04891",
"frontend_url": "",
"is_visible": false
},
{
"id": 570,
"title": "Basis",
"slug": "test-lehrgang-lp-circle-basis",
"type": "learnpath.Circle",
"translation_key": "aaa04c2b-03bf-470e-b414-bd8203db529d",
"frontend_url": "/course/test-lehrgang/learn/basis",
"children": [
"id": 960,
"title": "Test Lernpfad",
"slug": "test-lehrgang-lp",
"type": "learnpath.LearningPath",
"translation_key": "5818e5fb-5f8a-4f6f-b3a4-61651d0cd408",
"frontend_url": "/course/test-lehrgang/learn",
"children": [
{
"id": 571,
"title": "Starten",
"slug": "test-lehrgang-lp-circle-basis-ls-starten",
"type": "learnpath.LearningSequence",
"translation_key": "ce16116f-f4ed-4fc0-a95a-cc75ba88958d",
"frontend_url": "/course/test-lehrgang/learn/basis#ls-starten",
"icon": "it-icon-ls-start"
"id": 961,
"title": "Circle \u00dcK",
"slug": "test-lehrgang-lp-topic-circle-\u00fck",
"type": "learnpath.Topic",
"translation_key": "8b197f3d-8594-416c-9f9c-d3e929524220",
"frontend_url": "",
"is_visible": false
},
{
"id": 572,
"title": "Einf\u00fchrung",
"slug": "test-lehrgang-lp-circle-basis-lu-einf\u00fchrung",
"type": "learnpath.LearningUnit",
"translation_key": "33863daf-a503-425d-a1a2-9a711f8256a5",
"frontend_url": "/course/test-lehrgang/learn/basis#lu-einf\u00fchrung",
"evaluate_url": "/course/test-lehrgang/learn/basis/evaluate/einf\u00fchrung",
"course_category": {
"id": 27,
"title": "Allgemein",
"general": true
},
"children": []
},
{
"id": 573,
"title": "Einf\u00fchrung",
"slug": "test-lehrgang-lp-circle-basis-lc-einf\u00fchrung",
"type": "learnpath.LearningContent",
"translation_key": "ae19458c-9b08-4b9c-9e7c-62c3cce4a6cc",
"frontend_url": "/course/test-lehrgang/learn/basis/einf\u00fchrung",
"minutes": 15,
"contents": [
{
"type": "document",
"value": {
"description": "Beispiel Dokument",
"url": null
},
"id": "601ac5e1-b268-442e-b15b-26ead06bdf77"
}
]
},
{
"id": 574,
"title": "Beenden",
"slug": "test-lehrgang-lp-circle-basis-ls-beenden",
"type": "learnpath.LearningSequence",
"translation_key": "3c167825-a358-4c62-a632-9482e9fbfe5f",
"frontend_url": "/course/test-lehrgang/learn/basis#ls-beenden",
"icon": "it-icon-ls-end"
},
{
"id": 575,
"title": "Beenden",
"slug": "test-lehrgang-lp-circle-basis-lu-beenden",
"type": "learnpath.LearningUnit",
"translation_key": "9a70a164-0468-4681-a6ed-a1b636db1ae6",
"frontend_url": "/course/test-lehrgang/learn/basis#lu-beenden",
"evaluate_url": "/course/test-lehrgang/learn/basis/evaluate/beenden",
"course_category": {
"id": 27,
"title": "Allgemein",
"general": true
},
"children": []
},
{
"id": 576,
"title": "Jetzt kann es losgehen!",
"slug": "test-lehrgang-lp-circle-basis-lc-jetzt-kann-es-losgehen",
"type": "learnpath.LearningContent",
"translation_key": "f251beda-a4b8-4a49-89a6-8c52d335b140",
"frontend_url": "/course/test-lehrgang/learn/basis/jetzt-kann-es-losgehen",
"minutes": 30,
"contents": [
{
"type": "document",
"value": {
"description": "Beispiel Dokument",
"url": null
},
"id": "1075443f-e2e5-46eb-87c4-804f0227a858"
}
]
}
],
"description": "Basis",
"goal_description": "('In diesem Circle baust du deine Handlungskompetenzen f\u00fcr diese Themen aus:',)",
"goals": [
{
"type": "goal",
"value": "... hier ein Beispieltext f\u00fcr ein Ziel 1",
"id": "6c227ac1-42a7-4ca3-bde2-8531bf655481"
},
{
"type": "goal",
"value": "... hier ein Beispieltext f\u00fcr ein Ziel 2",
"id": "7c466321-abe3-4705-bbb1-f286a8e5c800"
},
{
"type": "goal",
"value": "... hier ein Beispieltext f\u00fcr ein Ziel 3",
"id": "1e491838-62a9-4185-b321-f64ca7c99f36"
}
],
"job_situation_description": "Du triffst in diesem Circle auf die folgenden berufstypischen Handlungsfelder:",
"job_situations": [
{
"type": "job_situation",
"value": "Job Situation 1",
"id": "0d4a66de-523c-4659-9b4b-bb81cef28961"
},
{
"type": "job_situation",
"value": "Job Situation 2",
"id": "dc4d8157-1db4-4e64-bc0c-00a35159c32d"
},
{
"type": "job_situation",
"value": "Job Situation 3",
"id": "a270baca-1077-4535-9a9f-5562af9854d8"
},
{
"type": "job_situation",
"value": "Job Situation 4",
"id": "aa4b21f6-0bd3-40f3-8589-c43e4524f565"
},
{
"type": "job_situation",
"value": "Job Situation 5",
"id": "8618d1e7-c628-42ef-aac3-201b2b65393f"
},
{
"type": "job_situation",
"value": "Job Situation 6",
"id": "be7a2a59-2aef-4dd8-ad8d-17c4a46b064f"
},
{
"type": "job_situation",
"value": "Job Situation 7",
"id": "a4b74338-abd7-4de8-82ab-d77664f6cbbf"
}
]
},
{
"id": 577,
"title": "Beraten der Kunden",
"slug": "test-lehrgang-lp-topic-beraten-der-kunden",
"type": "learnpath.Topic",
"translation_key": "2ea6ea41-b839-4462-aea4-1796b0f9849d",
"frontend_url": "",
"is_visible": true
},
{
"id": 578,
"title": "Analyse",
"slug": "test-lehrgang-lp-circle-analyse",
"type": "learnpath.Circle",
"translation_key": "dbc95ecd-0fdf-4b0a-ba91-7eec88a420f3",
"frontend_url": "/course/test-lehrgang/learn/analyse",
"children": [
{
"id": 579,
"title": "Starten",
"slug": "test-lehrgang-lp-circle-analyse-ls-starten",
"type": "learnpath.LearningSequence",
"translation_key": "9b10c6ec-e313-49fa-b09d-9639429254f9",
"frontend_url": "/course/test-lehrgang/learn/analyse#ls-starten",
"icon": "it-icon-ls-start"
},
{
"id": 580,
"title": "Einf\u00fchrung",
"slug": "test-lehrgang-lp-circle-analyse-lu-einf\u00fchrung",
"type": "learnpath.LearningUnit",
"translation_key": "f51ab860-bc23-4f59-bb88-0e8506ef42e5",
"frontend_url": "/course/test-lehrgang/learn/analyse#lu-einf\u00fchrung",
"evaluate_url": "/course/test-lehrgang/learn/analyse/evaluate/einf\u00fchrung",
"course_category": {
"id": 27,
"title": "Allgemein",
"general": true
},
"children": []
},
{
"id": 581,
"title": "Einleitung Circle \"Analyse\"",
"slug": "test-lehrgang-lp-circle-analyse-lc-einleitung-circle-analyse",
"type": "learnpath.LearningContent",
"translation_key": "70363615-2a53-478d-82f7-0aa02744f559",
"frontend_url": "/course/test-lehrgang/learn/analyse/einleitung-circle-analyse",
"minutes": 15,
"contents": [
{
"type": "document",
"value": {
"description": "Beispiel Dokument",
"url": null
},
"id": "174d883b-1bd0-4bee-872d-d08c2544dc3a"
}
]
},
{
"id": 582,
"title": "Beobachten",
"slug": "test-lehrgang-lp-circle-analyse-ls-beobachten",
"type": "learnpath.LearningSequence",
"translation_key": "0a540c5a-25c8-42ab-8661-6c08c78d91c2",
"frontend_url": "/course/test-lehrgang/learn/analyse#ls-beobachten",
"icon": "it-icon-ls-watch"
},
{
"id": 583,
"title": "Fahrzeug",
"slug": "test-lehrgang-lp-circle-analyse-lu-fahrzeug",
"type": "learnpath.LearningUnit",
"translation_key": "f072e5b2-c033-4d7d-9dae-28e6b856087c",
"frontend_url": "/course/test-lehrgang/learn/analyse#lu-fahrzeug",
"evaluate_url": "/course/test-lehrgang/learn/analyse/evaluate/fahrzeug",
"course_category": {
"id": 28,
"id": 962,
"title": "Fahrzeug",
"general": false
},
"children": [
{
"id": 597,
"title": "Innerhalb des Handlungsfelds \u00abFahrzeug\u00bb bin ich f\u00e4hig, die Ziele und Pl\u00e4ne des Kunden zu ergr\u00fcnden (SOLL).",
"slug": "test-lehrgang-competence-crit-y13-fahrzeug",
"type": "competence.PerformanceCriteria",
"translation_key": "7d76cdd3-57a0-4f82-bc33-fcc8a78b15e0",
"frontend_url": "",
"competence_id": "Y1.3"
},
{
"id": 598,
"title": "Innerhalb des Handlungsfelds \u00abFahrzeug\u00bb bin ich f\u00e4hig, die IST-Situation des Kunden mit der geeigneten Gespr\u00e4chs-/Fragetechnik zu erfassen.",
"slug": "test-lehrgang-competence-crit-y21-fahrzeug",
"type": "competence.PerformanceCriteria",
"translation_key": "5b3e1105-a12b-4d99-984c-28f01daeef54",
"frontend_url": "",
"competence_id": "Y2.1"
}
]
"slug": "test-lehrgang-lp-circle-fahrzeug",
"type": "learnpath.Circle",
"translation_key": "f8e861f5-409e-4976-a301-540e6569dbb9",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug",
"children": [
{
"id": 963,
"title": "Vorbereitung",
"slug": "test-lehrgang-lp-circle-fahrzeug-ls-vorbereitung",
"type": "learnpath.LearningSequence",
"translation_key": "a7aac91d-200f-4633-ab34-c75bda9274e6",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug#ls-vorbereitung",
"icon": "it-icon-ls-start"
},
{
"id": 964,
"title": "Vorbereitung",
"slug": "test-lehrgang-lp-circle-fahrzeug-lu-vorbereitung",
"type": "learnpath.LearningUnit",
"translation_key": "cfcbdd21-93f0-4c4a-a9a8-e56c9e2f8232",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug#lu-vorbereitung",
"evaluate_url": "/course/test-lehrgang/learn/fahrzeug/evaluate/vorbereitung",
"course_category": {
"id": 40,
"title": "Allgemein",
"general": true
},
"children": [
{
"id": 968,
"title": "Innerhalb des Handlungsfelds \u00abFahrzeug\u00bb bin ich f\u00e4hig, die Ziele und Pl\u00e4ne des Kunden zu ergr\u00fcnden (SOLL).",
"slug": "test-lehrgang-competence-crit-x11-allgemein",
"type": "competence.PerformanceCriteria",
"translation_key": "6079a11f-d5bd-45ba-88f9-3482dd79ad93",
"frontend_url": "",
"competence_id": "X1.1"
},
{
"id": 969,
"title": "Innerhalb des Handlungsfelds \u00abFahrzeug\u00bb bin ich f\u00e4hig, die IST-Situation des Kunden mit der geeigneten Gespr\u00e4chs-/Fragetechnik zu erfassen.",
"slug": "test-lehrgang-competence-crit-x11-allgemein-1",
"type": "competence.PerformanceCriteria",
"translation_key": "e8766afa-dc45-4b29-8a74-a766e45aa8c2",
"frontend_url": "",
"competence_id": "X1.1"
}
]
},
{
"id": 965,
"title": "Verschaffe dir einen \u00dcberblick",
"slug": "test-lehrgang-lp-circle-fahrzeug-lc-verschaffe-dir-einen-\u00fcberblick",
"type": "learnpath.LearningContentPlaceholder",
"translation_key": "4c2ba4e8-ad1f-41d1-9394-7b75cd63cecb",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug/verschaffe-dir-einen-\u00fcberblick",
"minutes": 15,
"description": "Platzhalter",
"content_url": ""
},
{
"id": 966,
"title": "Mediathek Fahrzeug",
"slug": "test-lehrgang-lp-circle-fahrzeug-lc-mediathek-fahrzeug",
"type": "learnpath.LearningContentMediaLibrary",
"translation_key": "ea0dd010-b436-48e1-a599-d9fd1543393e",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug/mediathek-fahrzeug",
"minutes": 15,
"description": "",
"content_url": "/media/\u00fcberbetriebliche-kurse-media/category/fahrzeug"
},
{
"id": 967,
"title": "Vorbereitungsauftrag",
"slug": "test-lehrgang-lp-circle-fahrzeug-lc-vorbereitungsauftrag",
"type": "learnpath.LearningContentPlaceholder",
"translation_key": "5bc830fe-812c-4778-b668-807e782d1ec1",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug/vorbereitungsauftrag",
"minutes": 15,
"description": "Platzhalter",
"content_url": ""
},
{
"id": 970,
"title": "Training",
"slug": "test-lehrgang-lp-circle-fahrzeug-ls-training",
"type": "learnpath.LearningSequence",
"translation_key": "83f1443a-d0fa-43fc-a737-8172e8ad53ce",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug#ls-training",
"icon": "it-icon-ls-apply"
},
{
"id": 971,
"title": "Unterlagen",
"slug": "test-lehrgang-lp-circle-fahrzeug-lu-unterlagen",
"type": "learnpath.LearningUnit",
"translation_key": "1573d0a7-3427-4beb-8c17-e60520bf9c4f",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug#lu-unterlagen",
"evaluate_url": "/course/test-lehrgang/learn/fahrzeug/evaluate/unterlagen",
"course_category": {
"id": 40,
"title": "Allgemein",
"general": true
},
"children": []
},
{
"id": 972,
"title": "Unterlagen f\u00fcr den Unterricht",
"slug": "test-lehrgang-lp-circle-fahrzeug-lc-unterlagen-f\u00fcr-den-unterricht",
"type": "learnpath.LearningContentPlaceholder",
"translation_key": "c956b3d3-51d6-4e4d-a088-25dd48ea853c",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug/unterlagen-f\u00fcr-den-unterricht",
"minutes": 15,
"description": "Platzhalter",
"content_url": ""
},
{
"id": 973,
"title": "Pr\u00e4senztag",
"slug": "test-lehrgang-lp-circle-fahrzeug-lu-pr\u00e4senztag",
"type": "learnpath.LearningUnit",
"translation_key": "e0db56fb-25f2-44e2-b46a-88802ca1f7d5",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug#lu-pr\u00e4senztag",
"evaluate_url": "/course/test-lehrgang/learn/fahrzeug/evaluate/pr\u00e4senztag",
"course_category": {
"id": 40,
"title": "Allgemein",
"general": true
},
"children": []
},
{
"id": 974,
"title": "Pr\u00e4senztag Fahrzeug",
"slug": "test-lehrgang-lp-circle-fahrzeug-lc-pr\u00e4senztag-fahrzeug",
"type": "learnpath.LearningContentAttendanceDay",
"translation_key": "b72bab8f-52c2-41cf-b392-1072e1af74a5",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug/pr\u00e4senztag-fahrzeug",
"minutes": 15,
"description": "Platzhalter Beschreibung",
"content_url": ""
},
{
"id": 975,
"title": "Kompetenznachweis",
"slug": "test-lehrgang-lp-circle-fahrzeug-lu-kompetenznachweis",
"type": "learnpath.LearningUnit",
"translation_key": "92c3a43d-a7b8-46d5-9600-42a0e5bd4bb4",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug#lu-kompetenznachweis",
"evaluate_url": "/course/test-lehrgang/learn/fahrzeug/evaluate/kompetenznachweis",
"course_category": {
"id": 40,
"title": "Allgemein",
"general": true
},
"children": []
},
{
"id": 976,
"title": "Wissens- und Verst\u00e4ndnisfragen",
"slug": "test-lehrgang-lp-circle-fahrzeug-lc-wissens-und-verst\u00e4ndnisfragen",
"type": "learnpath.LearningContentPlaceholder",
"translation_key": "69982715-8860-474d-babd-7c626bd15f1c",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug/wissens-und-verst\u00e4ndnisfragen",
"minutes": 15,
"description": "Platzhalter",
"content_url": ""
},
{
"id": 977,
"title": "Transfer",
"slug": "test-lehrgang-lp-circle-fahrzeug-ls-transfer",
"type": "learnpath.LearningSequence",
"translation_key": "0322717c-8f61-44fa-b5dd-d5e064733b3f",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug#ls-transfer",
"icon": "it-icon-ls-end"
},
{
"id": 978,
"title": "Transfer",
"slug": "test-lehrgang-lp-circle-fahrzeug-lu-transfer",
"type": "learnpath.LearningUnit",
"translation_key": "028f154d-8460-4509-839b-8bbb37460930",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug#lu-transfer",
"evaluate_url": "/course/test-lehrgang/learn/fahrzeug/evaluate/transfer",
"course_category": {
"id": 40,
"title": "Allgemein",
"general": true
},
"children": []
},
{
"id": 979,
"title": "Reflexion",
"slug": "test-lehrgang-lp-circle-fahrzeug-lc-reflexion",
"type": "learnpath.LearningContentPlaceholder",
"translation_key": "b7a09b9b-ab08-4eec-ba16-3defb8fa965e",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug/reflexion",
"minutes": 15,
"description": "Platzhalter",
"content_url": ""
},
{
"id": 980,
"title": "\u00dcberpr\u00fcfen einer Motorfahrzeug-Versicherungspolice",
"slug": "test-lehrgang-lp-circle-fahrzeug-lc-\u00fcberpr\u00fcfen-einer-motorfahrzeug-versicherungspolice",
"type": "learnpath.LearningContentAssignment",
"translation_key": "19ffe6d9-60ac-4e08-8f18-25dc64f906ca",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug/\u00fcberpr\u00fcfen-einer-motorfahrzeug-versicherungspolice",
"minutes": 15,
"description": "",
"content_url": "",
"content_assignment_id": 959
},
{
"id": 981,
"title": "Feedback",
"slug": "test-lehrgang-lp-circle-fahrzeug-lc-feedback",
"type": "learnpath.LearningContentFeedback",
"translation_key": "23b72e4c-aa68-4b47-9cdc-4b60b40a1e1f",
"frontend_url": "/course/test-lehrgang/learn/fahrzeug/feedback",
"minutes": 15,
"description": "",
"content_url": ""
}
],
"description": "In diesem Circle erf\u00e4hrst du wie der Lehrgang aufgebaut ist.\nZudem lernst du die wichtigsten Grundlagen,\ndamit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.",
"goals": "\n <p class=\"mt-4\">In diesem Circle erf\u00e4hrst du wie der Lehrgang aufgebaut ist. Zudem lernst du die wichtigsten Grundlagen,\n damit du erfolgreich mit deinem Lernpfad und in deinem Job (durch-)starten kannst.</p>\n <p class=\"mt-4\">Du baust das Grundlagenwissen f\u00fcr die folgenden Themenfelder auf:</p>\n <ul>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Aufbau von myVBV und wie du dich im Lernpfad zurechtfindest</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Worauf die Ausbildung und die Zulassungspr\u00fcfung zum/zur Versicherungsvermittler/-in VBV basieren</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Organisation deiner Lernreise und deiner Zusammenarbeit mit deiner Lernbegleitung und einem\n Lernpartner/einer Lernpartnerin</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Tipps und Tricks zur Organisation eines erfolgreichen Arbeitsalltags</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Umgang mit den sozialen Medien und Datenschutz</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Basiswissen Versicherungswirtschaft</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Basiswissen Versicherungsrecht</li>\n </ul>\n <p class=\"mt-4\">Du arbeitest an folgenden Leistungskriterien aus dem Qualifikationsprofil:</p>\n <h3>Arbeitsalltag/Lerneinheit: \u00abLucas Auftritt in den sozialen Medien und der Umgang mit sensiblen Daten\u00bb</h3>\n <p class=\"mt-4\">Ich bin f\u00e4hig, \u2026</p>\n <ul>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>A3.1: \u2026 in Zusammenarbeit mit den IT-Spezialisten und der Marketingabteilung die Inhalte f\u00fcr den zu\n realisierenden Medienauftritt zielgruppengerecht festzulegen</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>A3.2: \u2026 f\u00fcr die verschiedenen Kundensegmente die passenden sozialen Medien zu definieren</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>A3.3. \u2026 die Inhalte compliant zu halten</li>\n </ul>\n "
},
{
"id": 584,
"title": "Rafael Fasel wechselt sein Auto",
"slug": "test-lehrgang-lp-circle-analyse-lc-rafael-fasel-wechselt-sein-auto",
"type": "learnpath.LearningContent",
"translation_key": "ff254250-d010-4f57-9e57-987c343029a6",
"frontend_url": "/course/test-lehrgang/learn/analyse/rafael-fasel-wechselt-sein-auto",
"minutes": 30,
"contents": [
{
"type": "online_training",
"value": {
"description": "In diesem Online-Training lernst du, wie du den Kundenbedarf ermittelst.",
"url": ""
},
"id": "454fb0d8-c37d-4c8e-b15c-c50a32be9fd7"
}
]
"id": 982,
"title": "Circle VV",
"slug": "test-lehrgang-lp-topic-circle-vv",
"type": "learnpath.Topic",
"translation_key": "59e57288-91fd-45fa-9109-5a8c08f2e3f1",
"frontend_url": "",
"is_visible": false
},
{
"id": 585,
"title": "Fachcheck Fahrzeug",
"slug": "test-lehrgang-lp-circle-analyse-lc-fachcheck-fahrzeug",
"type": "learnpath.LearningContent",
"translation_key": "b0a95253-3a63-4d77-9ddc-961b711175a5",
"frontend_url": "/course/test-lehrgang/learn/analyse/fachcheck-fahrzeug",
"minutes": 30,
"contents": [
{
"type": "test",
"value": {
"description": "Beispiel Test",
"url": null
},
"id": "4b3e40c5-f5f9-4726-bc4c-0d914a029f83"
}
]
},
{
"id": 586,
"title": "Reisen",
"slug": "test-lehrgang-lp-circle-analyse-lu-reisen",
"type": "learnpath.LearningUnit",
"translation_key": "22bcb754-d5c5-413b-b63e-76e6406afef9",
"frontend_url": "/course/test-lehrgang/learn/analyse#lu-reisen",
"evaluate_url": "/course/test-lehrgang/learn/analyse/evaluate/reisen",
"course_category": {
"id": 29,
"id": 983,
"title": "Reisen",
"general": false
},
"children": [
{
"id": 599,
"title": "Innerhalb des Handlungsfelds \u00abReisen\u00bb bin ich f\u00e4hig, die Ziele und Pl\u00e4ne des Kunden zu ergr\u00fcnden (SOLL).",
"slug": "test-lehrgang-competence-crit-y13-reisen",
"type": "competence.PerformanceCriteria",
"translation_key": "6a3ce4ac-0d38-4a02-81fa-0979290142e1",
"frontend_url": "",
"competence_id": "Y1.3"
}
]
},
{
"id": 587,
"title": "Reiseversicherung",
"slug": "test-lehrgang-lp-circle-analyse-lc-reiseversicherung",
"type": "learnpath.LearningContent",
"translation_key": "cb1c9c93-7f3b-42d6-9078-2d36655fdfd7",
"frontend_url": "/course/test-lehrgang/learn/analyse/reiseversicherung",
"minutes": 240,
"contents": [
{
"type": "exercise",
"value": {
"description": "Beispiel \u00dcbung",
"url": null
},
"id": "b59bccb2-bcb2-48cc-8204-8df94723975b"
}
]
},
{
"id": 588,
"title": "Emma und Ayla campen durch Amerika",
"slug": "test-lehrgang-lp-circle-analyse-lc-emma-und-ayla-campen-durch-amerika",
"type": "learnpath.LearningContent",
"translation_key": "fdf19afe-fe69-496d-a1d4-ecf18ed36b01",
"frontend_url": "/course/test-lehrgang/learn/analyse/emma-und-ayla-campen-durch-amerika",
"minutes": 120,
"contents": [
{
"type": "learningmodule",
"value": {
"description": "Beispiel Lernmodul",
"url": "/static/media/web_based_trainings/story-06-a-01-emma-und-ayla-campen-durch-amerika-einstieg/scormcontent/index.html"
},
"id": "c3a14f9f-3491-4695-9544-a3b2a2c3a82a"
}
]
},
{
"id": 589,
"title": "Beenden",
"slug": "test-lehrgang-lp-circle-analyse-ls-beenden",
"type": "learnpath.LearningSequence",
"translation_key": "28ffad90-9333-452f-af18-108d4aff5ee4",
"frontend_url": "/course/test-lehrgang/learn/analyse#ls-beenden",
"icon": "it-icon-ls-end"
},
{
"id": 590,
"title": "Beenden",
"slug": "test-lehrgang-lp-circle-analyse-lu-beenden",
"type": "learnpath.LearningUnit",
"translation_key": "05a1cb34-e8d8-44e2-9635-5e33a852bfa2",
"frontend_url": "/course/test-lehrgang/learn/analyse#lu-beenden",
"evaluate_url": "/course/test-lehrgang/learn/analyse/evaluate/beenden",
"course_category": {
"id": 27,
"title": "Allgemein",
"general": true
},
"children": []
},
{
"id": 591,
"title": "KompetenzNavi anschauen",
"slug": "test-lehrgang-lp-circle-analyse-lc-kompetenznavi-anschauen",
"type": "learnpath.LearningContent",
"translation_key": "b90e7ddc-fcde-47aa-91e1-abd67ed96e66",
"frontend_url": "/course/test-lehrgang/learn/analyse/kompetenznavi-anschauen",
"minutes": 30,
"contents": [
{
"type": "document",
"value": {
"description": "Beispiel Dokument",
"url": null
},
"id": "a7faefea-4cd1-471a-aed1-c780d8236301"
}
]
},
{
"id": 592,
"title": "Circle \"Analyse\" abschliessen",
"slug": "test-lehrgang-lp-circle-analyse-lc-circle-analyse-abschliessen",
"type": "learnpath.LearningContent",
"translation_key": "5c17be62-2da6-413c-82a4-7754c00ef18a",
"frontend_url": "/course/test-lehrgang/learn/analyse/circle-analyse-abschliessen",
"minutes": 30,
"contents": [
{
"type": "document",
"value": {
"description": "Beispiel Dokument",
"url": null
},
"id": "c39488aa-2ce4-4bd7-9a39-f9ace70353bd"
}
]
"slug": "test-lehrgang-lp-circle-reisen",
"type": "learnpath.Circle",
"translation_key": "4f549d95-e645-4114-a4e6-49d1a7d0a5ef",
"frontend_url": "/course/test-lehrgang/learn/reisen",
"children": [
{
"id": 984,
"title": "Starten",
"slug": "test-lehrgang-lp-circle-reisen-ls-starten",
"type": "learnpath.LearningSequence",
"translation_key": "a5519b42-00d8-4958-ac7e-078d016a0f11",
"frontend_url": "/course/test-lehrgang/learn/reisen#ls-starten",
"icon": "it-icon-ls-start"
},
{
"id": 985,
"title": "Einf\u00fchrung",
"slug": "test-lehrgang-lp-circle-reisen-lu-einf\u00fchrung",
"type": "learnpath.LearningUnit",
"translation_key": "8c6d323c-abf8-4a7b-b0d0-d64d714d41b2",
"frontend_url": "/course/test-lehrgang/learn/reisen#lu-einf\u00fchrung",
"evaluate_url": "/course/test-lehrgang/learn/reisen/evaluate/einf\u00fchrung",
"course_category": {
"id": 40,
"title": "Allgemein",
"general": true
},
"children": []
},
{
"id": 986,
"title": "Verschaff dir einen \u00dcberblick",
"slug": "test-lehrgang-lp-circle-reisen-lc-verschaff-dir-einen-\u00fcberblick",
"type": "learnpath.LearningContentVideo",
"translation_key": "5205f4a1-3786-4f32-9bab-cfdd762d1d6e",
"frontend_url": "/course/test-lehrgang/learn/reisen/verschaff-dir-einen-\u00fcberblick",
"minutes": 15,
"description": "Willkommen im Lehrgang Versicherungsvermitler VBV",
"content_url": "https://player.vimeo.com/video/772512710?h=30f912f15a"
},
{
"id": 987,
"title": "Mediathek Reisen",
"slug": "test-lehrgang-lp-circle-reisen-lc-mediathek-reisen",
"type": "learnpath.LearningContentMediaLibrary",
"translation_key": "37bbd90f-d6d8-4541-86f1-10a8aa20a06d",
"frontend_url": "/course/test-lehrgang/learn/reisen/mediathek-reisen",
"minutes": 15,
"description": "",
"content_url": "/media/test-lehrgang-media/category/reisen"
},
{
"id": 988,
"title": "Analyse",
"slug": "test-lehrgang-lp-circle-reisen-ls-analyse",
"type": "learnpath.LearningSequence",
"translation_key": "5b56ece3-ddb5-4853-8816-91e87802c5fd",
"frontend_url": "/course/test-lehrgang/learn/reisen#ls-analyse",
"icon": "it-icon-ls-apply"
},
{
"id": 989,
"title": "Bedarfsanalyse, Ist- und Soll-Situation",
"slug": "test-lehrgang-lp-circle-reisen-lu-reisen",
"type": "learnpath.LearningUnit",
"translation_key": "06bd7596-aa6d-45fc-bf02-b0c4d5fd5ef8",
"frontend_url": "/course/test-lehrgang/learn/reisen#lu-reisen",
"evaluate_url": "/course/test-lehrgang/learn/reisen/evaluate/reisen",
"course_category": {
"id": 42,
"title": "Reisen",
"general": false
},
"children": [
{
"id": 991,
"title": "Ich bin f\u00e4hig zu Reisen eine Gespr\u00e4chsf\u00fchrung zu machen",
"slug": "test-lehrgang-competence-crit-y11-reisen",
"type": "competence.PerformanceCriteria",
"translation_key": "3eb8ad1c-e556-415c-a329-1dae3e100982",
"frontend_url": "",
"competence_id": "Y1.1"
},
{
"id": 992,
"title": "Ich bin f\u00e4hig zu Reisen eine Analyse zu machen",
"slug": "test-lehrgang-competence-crit-y21-reisen",
"type": "competence.PerformanceCriteria",
"translation_key": "37f58796-8586-44be-b702-6f27e2c93b10",
"frontend_url": "",
"competence_id": "Y2.1"
}
]
},
{
"id": 990,
"title": "Emma und Ayla campen durch Amerika - Analyse",
"slug": "test-lehrgang-lp-circle-reisen-lc-emma-und-ayla-campen-durch-amerika-analyse",
"type": "learnpath.LearningContentLearningModule",
"translation_key": "457075a2-4e89-4bd9-8e87-fbd2911355d5",
"frontend_url": "/course/test-lehrgang/learn/reisen/emma-und-ayla-campen-durch-amerika-analyse",
"minutes": 15,
"description": "",
"content_url": "https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/emma-und-ayla-campen-durch-amerika-analyse-xapi-FZoZOP9y/index.html"
},
{
"id": 993,
"title": "Transfer",
"slug": "test-lehrgang-lp-circle-reisen-ls-transfer",
"type": "learnpath.LearningSequence",
"translation_key": "aa379cfc-149c-46d0-89ac-bff930432112",
"frontend_url": "/course/test-lehrgang/learn/reisen#ls-transfer",
"icon": "it-icon-ls-end"
},
{
"id": 994,
"title": "Transfer, Reflexion, Feedback",
"slug": "test-lehrgang-lp-circle-reisen-lu-transfer-reflexion-feedback",
"type": "learnpath.LearningUnit",
"translation_key": "f168b203-79ec-4b5f-81f4-88ac5e270434",
"frontend_url": "/course/test-lehrgang/learn/reisen#lu-transfer-reflexion-feedback",
"evaluate_url": "/course/test-lehrgang/learn/reisen/evaluate/transfer-reflexion-feedback",
"course_category": {
"id": 40,
"title": "Allgemein",
"general": true
},
"children": []
},
{
"id": 995,
"title": "Auswandern: Woran muss ich denken?",
"slug": "test-lehrgang-lp-circle-reisen-lc-auswandern-woran-muss-ich-denken",
"type": "learnpath.LearningContentPlaceholder",
"translation_key": "f68d9bc2-ec0f-4617-9dcc-5235a669e896",
"frontend_url": "/course/test-lehrgang/learn/reisen/auswandern-woran-muss-ich-denken",
"minutes": 15,
"description": "Platzhalter",
"content_url": ""
},
{
"id": 996,
"title": "Fachcheck Reisen",
"slug": "test-lehrgang-lp-circle-reisen-lc-fachcheck-reisen",
"type": "learnpath.LearningContentPlaceholder",
"translation_key": "e4e2e747-d570-4af3-9846-2d91a9eee3b8",
"frontend_url": "/course/test-lehrgang/learn/reisen/fachcheck-reisen",
"minutes": 15,
"description": "Platzhalter",
"content_url": ""
},
{
"id": 997,
"title": "Reflexion",
"slug": "test-lehrgang-lp-circle-reisen-lc-reflexion",
"type": "learnpath.LearningContentPlaceholder",
"translation_key": "a1de9b94-38e2-45a5-b913-fbd030fcbdc1",
"frontend_url": "/course/test-lehrgang/learn/reisen/reflexion",
"minutes": 15,
"description": "Platzhalter",
"content_url": ""
},
{
"id": 998,
"title": "Feedback",
"slug": "test-lehrgang-lp-circle-reisen-lc-feedback",
"type": "learnpath.LearningContentFeedback",
"translation_key": "a21f740d-4270-42b3-b324-148188025749",
"frontend_url": "/course/test-lehrgang/learn/reisen/feedback",
"minutes": 15,
"description": "",
"content_url": ""
}
],
"description": "In diesem Circle erf\u00e4hrst du wie der Lehrgang aufgebaut ist. Zudem lernst du die wichtigsten Grundlagen, damit du\nerfolgreich mit deinem Lernpfad und in deinem Job (durch-)starten kannst.",
"goals": "\n <p class=\"mt-4\">In diesem Circle erf\u00e4hrst du wie der Lehrgang aufgebaut ist. Zudem lernst du die wichtigsten Grundlagen,\n damit du erfolgreich mit deinem Lernpfad und in deinem Job (durch-)starten kannst.</p>\n <p class=\"mt-4\">Du baust das Grundlagenwissen f\u00fcr die folgenden Themenfelder auf:</p>\n <ul>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Aufbau von myVBV und wie du dich im Lernpfad zurechtfindest</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Worauf die Ausbildung und die Zulassungspr\u00fcfung zum/zur Versicherungsvermittler/-in VBV basieren</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Organisation deiner Lernreise und deiner Zusammenarbeit mit deiner Lernbegleitung und einem\n Lernpartner/einer Lernpartnerin</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Tipps und Tricks zur Organisation eines erfolgreichen Arbeitsalltags</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Umgang mit den sozialen Medien und Datenschutz</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Basiswissen Versicherungswirtschaft</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>Basiswissen Versicherungsrecht</li>\n </ul>\n <p class=\"mt-4\">Du arbeitest an folgenden Leistungskriterien aus dem Qualifikationsprofil:</p>\n <h3>Arbeitsalltag/Lerneinheit: \u00abLucas Auftritt in den sozialen Medien und der Umgang mit sensiblen Daten\u00bb</h3>\n <p class=\"mt-4\">Ich bin f\u00e4hig, \u2026</p>\n <ul>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>A3.1: \u2026 in Zusammenarbeit mit den IT-Spezialisten und der Marketingabteilung die Inhalte f\u00fcr den zu\n realisierenden Medienauftritt zielgruppengerecht festzulegen</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>A3.2: \u2026 f\u00fcr die verschiedenen Kundensegmente die passenden sozialen Medien zu definieren</li>\n <li class=\"flex items-center\"><it-icon-check class=\"hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon\"></it-icon-check>A3.3. \u2026 die Inhalte compliant zu halten</li>\n </ul>\n "
}
],
"description": "Unit-Test Circle",
"goal_description": "('In diesem Circle baust du deine Handlungskompetenzen f\u00fcr diese Themen aus:',)",
"goals": [
{
"type": "goal",
"value": "... die heutige Versicherungssituation von Privat- oder Gesch\u00e4ftskunden einzusch\u00e4tzen.",
"id": "c6d1b496-14e7-4570-ba05-c6f408f6ecfb"
},
{
"type": "goal",
"value": "... deinem Kunden seine optimale L\u00f6sung aufzuzeigen",
"id": "92e3ec0d-e90e-4d8e-a81a-43f0e56c504f"
}
],
"job_situation_description": "Du triffst in diesem Circle auf die folgenden berufstypischen Handlungsfelder:",
"job_situations": [
{
"type": "job_situation",
"value": "Autoversicherung",
"id": "1a047ce6-8922-4bc7-b185-5b7d6d89c0f9"
},
{
"type": "job_situation",
"value": "Autokauf",
"id": "c1b5a26b-570a-4147-9338-753d87e67cf3"
}
]
],
"course": {
"id": -1,
"title": "Test Lehrgang",
"category_name": "Handlungsfeld",
"slug": "test-lehrgang"
}
],
"course": {
"id": -1,
"title": "Test Lehrgang",
"category_name": "Handlungsfeld",
"slug": "test-lehrgang"
}
}
}

View File

@ -7,13 +7,14 @@ import type {
AssignmentCompletion,
AssignmentCompletionStatus,
CourseSessionUser,
LearningContent,
LearningContentAssignment,
LearningContentInterface,
UserAssignmentCompletionStatus,
} from "@/types";
import { sum } from "d3";
import pick from "lodash/pick";
export interface AssignmentLearningContent extends LearningContent {
export interface AssignmentLearningContent extends LearningContentInterface {
assignmentId: number;
}
@ -23,13 +24,12 @@ export function calcAssignmentLearningContents(learningPath?: LearningPath) {
return learningPath.circles.flatMap((circle) => {
const learningContents = circle.flatLearningContents.filter(
(lc) => lc.contents[0].type === "assignment"
);
(lc) => lc.type === "learnpath.LearningContentAssignment"
) as LearningContentAssignment[];
return learningContents.map((lc) => {
return {
...lc,
// @ts-ignore
assignmentId: lc.contents[0].value.assignment,
assignmentId: lc.content_assignment_id,
};
});
}) as AssignmentLearningContent[];

View File

@ -5,6 +5,7 @@ import type {
CircleJobSituation,
CourseCompletion,
LearningContent,
LearningContentInterface,
LearningSequence,
LearningUnit,
LearningUnitPerformanceCriteria,
@ -14,6 +15,20 @@ import groupBy from "lodash/groupBy";
import partition from "lodash/partition";
import values from "lodash/values";
function isLearningContentType(object: any): object is LearningContent {
return (
object?.type === "learnpath.LearningContentAssignment" ||
object?.type === "learnpath.LearningContentAttendanceDay" ||
object?.type === "learnpath.LearningContentFeedback" ||
object?.type === "learnpath.LearningContentLearningModule" ||
object?.type === "learnpath.LearningContentMediaLibrary" ||
object?.type === "learnpath.LearningContentPlaceholder" ||
object?.type === "learnpath.LearningContentRichText" ||
object?.type === "learnpath.LearningContentTest" ||
object?.type === "learnpath.LearningContentVideo"
);
}
export function parseLearningSequences(
circle: Circle,
children: CircleChild[]
@ -49,7 +64,7 @@ export function parseLearningSequences(
}),
});
learningSequence.learningUnits.push(learningUnit);
} else if (child.type === "learnpath.LearningContent") {
} else if (isLearningContentType(child)) {
if (!learningUnit) {
throw new Error(`LearningContent found before LearningUnit ${child.slug}`);
}
@ -140,8 +155,11 @@ export class Circle implements WagtailCircle {
);
}
public get flatChildren(): (LearningContent | LearningUnitPerformanceCriteria)[] {
const result: (LearningContent | LearningUnitPerformanceCriteria)[] = [];
public get flatChildren(): (
| LearningContentInterface
| LearningUnitPerformanceCriteria
)[] {
const result: (LearningContentInterface | LearningUnitPerformanceCriteria)[] = [];
this.learningSequences.forEach((learningSequence) => {
learningSequence.learningUnits.forEach((learningUnit) => {
learningUnit.children.forEach((performanceCriteria) => {

View File

@ -6,7 +6,7 @@ import { useLearningPathStore } from "@/stores/learningPath";
import type {
Course,
CourseCompletion,
LearningContent,
LearningContentInterface,
LearningPathChild,
Topic,
WagtailLearningPath,
@ -27,7 +27,7 @@ function getLastCompleted(courseSlug: string, completionData: CourseCompletion[]
return (
c.completion_status === "success" &&
c.course_session === courseSession?.id &&
c.page_type === "learnpath.LearningContent"
c.page_type.startsWith("learnpath.LearningContent")
);
});
}
@ -36,7 +36,7 @@ export class LearningPath implements WagtailLearningPath {
readonly type = "learnpath.LearningPath";
public topics: Topic[];
public circles: Circle[];
public nextLearningContent?: LearningContent;
public nextLearningContent?: LearningContentInterface;
public static fromJson(
json: WagtailLearningPath,

View File

@ -6,7 +6,7 @@ import { useLearningPathStore } from "@/stores/learningPath";
import { useUserStore } from "@/stores/user";
import type {
CourseCompletionStatus,
LearningContent,
LearningContentInterface,
LearningUnit,
LearningUnitPerformanceCriteria,
PerformanceCriteria,
@ -101,7 +101,7 @@ export const useCircleStore = defineStore({
},
async markCompletion(
page:
| LearningContent
| LearningContentInterface
| LearningUnitPerformanceCriteria
| PerformanceCriteria
| undefined,
@ -122,12 +122,12 @@ export const useCircleStore = defineStore({
return error;
}
},
openLearningContent(learningContent: LearningContent) {
openLearningContent(learningContent: LearningContentInterface) {
this.router.push({
path: learningContent.frontend_url,
});
},
closeLearningContent(learningContent: LearningContent) {
closeLearningContent(learningContent: LearningContentInterface) {
this.router.push({
path: `${this.circle?.frontend_url}`,
hash: createLearningUnitHash(learningContent.parentLearningUnit),
@ -159,7 +159,7 @@ export const useCircleStore = defineStore({
}
return "unknown";
},
continueFromLearningContent(currentLearningContent: LearningContent) {
continueFromLearningContent(currentLearningContent: LearningContentInterface) {
if (currentLearningContent) {
this.markCompletion(currentLearningContent, "success");
this.closeLearningContent(currentLearningContent);

View File

@ -20,94 +20,24 @@ export interface CircleLight {
readonly translation_key: string;
}
export interface BaseLearningContentBlock {
readonly type: string;
readonly id: string;
readonly value: {
description: string;
url: string;
text?: string;
};
}
export type LearningContent =
| LearningContentAssignment
| LearningContentAttendanceDay
| LearningContentFeedback
| LearningContentLearningModule
| LearningContentMediaLibrary
| LearningContentPlaceholder
| LearningContentRichText
| LearningContentTest
| LearningContentVideo;
export interface AssignmentBlock extends BaseLearningContentBlock {
readonly type: "assignment";
readonly value: {
description: string;
url: string;
assignment: number;
};
}
export type LearningContentType = LearningContent["type"];
export interface BookBlock extends BaseLearningContentBlock {
readonly type: "book";
}
export interface DocumentBlock extends BaseLearningContentBlock {
readonly type: "document";
}
export interface ExerciseBlock extends BaseLearningContentBlock {
readonly type: "exercise";
}
export interface MediaLibraryBlock extends BaseLearningContentBlock {
readonly type: "media_library";
}
export interface OnlineTrainingBlock extends BaseLearningContentBlock {
readonly type: "online_training";
}
export interface ResourceBlock extends BaseLearningContentBlock {
readonly type: "resource";
}
export interface TestBlock extends BaseLearningContentBlock {
readonly type: "test";
}
export interface VideoBlock extends BaseLearningContentBlock {
readonly type: "video";
}
export interface LearningModuleBlock extends BaseLearningContentBlock {
readonly type: "learningmodule";
}
export interface PlaceholderBlock extends BaseLearningContentBlock {
readonly type: "placeholder";
}
export interface FeedbackBlock extends BaseLearningContentBlock {
readonly type: "feedback";
}
export interface AttendanceDayBlock extends BaseLearningContentBlock {
readonly type: "attendance_day";
}
export type LearningContentBlock =
| AssignmentBlock
| BookBlock
| DocumentBlock
| ExerciseBlock
| MediaLibraryBlock
| OnlineTrainingBlock
| ResourceBlock
| TestBlock
| VideoBlock
| LearningModuleBlock
| PlaceholderBlock
| FeedbackBlock
| AttendanceDayBlock;
export type LearningContentType = LearningContentBlock["type"];
export interface LearningContent extends BaseCourseWagtailPage {
readonly type: "learnpath.LearningContent";
minutes: number;
contents: LearningContentBlock[];
export interface LearningContentInterface extends BaseCourseWagtailPage {
readonly type: LearningContentType;
readonly minutes: number;
readonly description: string;
readonly content_url: string;
parentCircle: Circle;
parentLearningSequence?: LearningSequence;
parentLearningUnit?: LearningUnit;
@ -115,6 +45,43 @@ export interface LearningContent extends BaseCourseWagtailPage {
previousLearningContent?: LearningContent;
}
export interface LearningContentAssignment extends LearningContentInterface {
readonly type: "learnpath.LearningContentAssignment";
readonly content_assignment_id: number;
}
export interface LearningContentAttendanceDay extends LearningContentInterface {
readonly type: "learnpath.LearningContentAttendanceDay";
}
export interface LearningContentFeedback extends LearningContentInterface {
readonly type: "learnpath.LearningContentFeedback";
}
export interface LearningContentLearningModule extends LearningContentInterface {
readonly type: "learnpath.LearningContentLearningModule";
}
export interface LearningContentMediaLibrary extends LearningContentInterface {
readonly type: "learnpath.LearningContentMediaLibrary";
}
export interface LearningContentPlaceholder extends LearningContentInterface {
readonly type: "learnpath.LearningContentPlaceholder";
}
export interface LearningContentRichText extends LearningContentInterface {
readonly type: "learnpath.LearningContentRichText";
}
export interface LearningContentTest extends LearningContentInterface {
readonly type: "learnpath.LearningContentTest";
}
export interface LearningContentVideo extends LearningContentInterface {
readonly type: "learnpath.LearningContentVideo";
}
export interface LearningUnitPerformanceCriteria extends BaseCourseWagtailPage {
readonly type: "competence.PerformanceCriteria";
readonly competence_id: string;
@ -143,7 +110,7 @@ export interface LearningSequence extends BaseCourseWagtailPage {
minutes: number;
}
export type CircleChild = LearningContent | LearningUnit | LearningSequence;
export type CircleChild = LearningContentInterface | LearningUnit | LearningSequence;
export interface WagtailLearningPath extends BaseCourseWagtailPage {
readonly type: "learnpath.LearningPath";

View File

@ -10,31 +10,23 @@ export function learningContentTypeData(
t: LearningContentType
): LearningContentIdentifier {
switch (t) {
case "assignment":
case "learnpath.LearningContentAssignment":
return { title: "Transferauftrag", icon: "it-icon-lc-assignment" };
case "book":
return { title: "Buch", icon: "it-icon-lc-book" };
case "document":
return { title: "Dokument", icon: "it-icon-lc-document" };
case "exercise":
return { title: "Übung", icon: "it-icon-lc-exercise" };
case "learningmodule":
return { title: "Lernmodul", icon: "it-icon-lc-learning-module" };
case "media_library":
return { title: "Mediathek", icon: "it-icon-lc-media-library" };
case "online_training":
return { title: "Online-Training", icon: "it-icon-lc-online-training" };
case "video":
return { title: "Video", icon: "it-icon-lc-video" };
case "test":
return { title: "Test", icon: "it-icon-lc-test" };
case "resource":
return { title: "Reflexion", icon: "it-icon-lc-resource" };
case "feedback":
return { title: "Feedback", icon: "it-icon-lc-feedback" };
case "attendance_day":
case "learnpath.LearningContentAttendanceDay":
return { title: "Präsenztag", icon: "it-icon-lc-training" };
case "placeholder":
case "learnpath.LearningContentLearningModule":
return { title: "Lernmodul", icon: "it-icon-lc-learning-module" };
case "learnpath.LearningContentMediaLibrary":
return { title: "Mediathek", icon: "it-icon-lc-media-library" };
case "learnpath.LearningContentVideo":
return { title: "Video", icon: "it-icon-lc-video" };
case "learnpath.LearningContentTest":
return { title: "Test", icon: "it-icon-lc-test" };
case "learnpath.LearningContentRichText":
return { title: "Reflexion", icon: "it-icon-lc-resource" };
case "learnpath.LearningContentFeedback":
return { title: "Feedback", icon: "it-icon-lc-feedback" };
case "learnpath.LearningContentPlaceholder":
return { title: "In Umsetzung", icon: "it-icon-lc-document" };
}

View File

@ -1,9 +1,8 @@
# Generated by Django 3.2.13 on 2023-05-05 14:10
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
import wagtail.blocks
import wagtail.fields
from django.conf import settings
from django.db import migrations, models
@ -13,8 +12,6 @@ class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0083_workflowcontenttype"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("course", "0006_alter_coursesession_attendance_days"),
]
operations = [
@ -221,6 +218,44 @@ class Migration(migrations.Migration):
},
bases=("wagtailcore.page",),
),
migrations.CreateModel(
name="AssignmentCompletion",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("submitted_at", models.DateTimeField(blank=True, null=True)),
(
"evaluation_submitted_at",
models.DateTimeField(blank=True, null=True),
),
("evaluation_grade", models.FloatField(blank=True, null=True)),
("evaluation_points", models.FloatField(blank=True, null=True)),
(
"completion_status",
models.CharField(
choices=[
(1, "in_progress"),
(2, "submitted"),
(3, "evaluation_in_progress"),
(4, "evaluation_submitted"),
],
default="in_progress",
max_length=255,
),
),
("completion_data", models.JSONField(default=dict)),
("additional_json_data", models.JSONField(default=dict)),
],
),
migrations.CreateModel(
name="AssignmentListPage",
fields=[
@ -286,110 +321,6 @@ class Migration(migrations.Migration):
to="assignment.assignment",
),
),
(
"assignment_user",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
),
(
"course_session",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="course.coursesession",
),
),
(
"evaluation_user",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
),
],
),
migrations.CreateModel(
name="AssignmentCompletion",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("submitted_at", models.DateTimeField(blank=True, null=True)),
(
"evaluation_submitted_at",
models.DateTimeField(blank=True, null=True),
),
("evaluation_grade", models.FloatField(blank=True, null=True)),
("evaluation_points", models.FloatField(blank=True, null=True)),
(
"completion_status",
models.CharField(
choices=[
(1, "in_progress"),
(2, "submitted"),
(3, "evaluation_in_progress"),
(4, "evaluation_submitted"),
],
default="in_progress",
max_length=255,
),
),
("completion_data", models.JSONField(default=dict)),
("additional_json_data", models.JSONField(default=dict)),
(
"assignment",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="assignment.assignment",
),
),
(
"assignment_user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
(
"course_session",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="course.coursesession",
),
),
(
"evaluation_user",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
),
],
),
migrations.AddConstraint(
model_name="assignmentcompletion",
constraint=models.UniqueConstraint(
fields=("assignment_user", "assignment", "course_session"),
name="assignment_completion_unique_user_assignment_course_session",
),
),
]

View File

@ -0,0 +1,28 @@
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("assignment", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="assignmentcompletionauditlog",
name="assignment_user",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
),
]

View File

@ -0,0 +1,79 @@
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
("assignment", "0002_assignmentcompletionauditlog_assignment_user"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("course", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="assignmentcompletionauditlog",
name="course_session",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="course.coursesession",
),
),
migrations.AddField(
model_name="assignmentcompletionauditlog",
name="evaluation_user",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AddField(
model_name="assignmentcompletion",
name="assignment",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="assignment.assignment"
),
),
migrations.AddField(
model_name="assignmentcompletion",
name="assignment_user",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL
),
),
migrations.AddField(
model_name="assignmentcompletion",
name="course_session",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="course.coursesession"
),
),
migrations.AddField(
model_name="assignmentcompletion",
name="evaluation_user",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AddConstraint(
model_name="assignmentcompletion",
constraint=models.UniqueConstraint(
fields=("assignment_user", "assignment", "course_session"),
name="assignment_completion_unique_user_assignment_course_session",
),
),
]

View File

@ -1,4 +1,4 @@
# Generated by Django 3.2.13 on 2023-03-31 16:22
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
import wagtail.blocks
@ -11,7 +11,7 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
("wagtailcore", "0069_log_entry_jsonfield"),
("wagtailcore", "0083_workflowcontenttype"),
]
operations = [

View File

@ -1,4 +1,4 @@
# Generated by Django 3.2.13 on 2023-03-31 16:22
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
from django.db import migrations, models

View File

@ -1,12 +1,12 @@
# Generated by Django 3.2.12 on 2022-02-03 15:46
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.contrib.auth.models
import django.contrib.auth.validators
import django.utils.timezone
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
@ -104,12 +104,6 @@ class Migration(migrations.Migration):
blank=True, max_length=150, verbose_name="last name"
),
),
(
"email",
models.EmailField(
blank=True, max_length=254, verbose_name="email address"
),
),
(
"is_staff",
models.BooleanField(
@ -132,6 +126,39 @@ class Migration(migrations.Migration):
default=django.utils.timezone.now, verbose_name="date joined"
),
),
(
"avatar_url",
models.CharField(blank=True, default="", max_length=254),
),
(
"email",
models.EmailField(
max_length=254, unique=True, verbose_name="email address"
),
),
(
"sso_id",
models.UUIDField(
blank=True,
default=None,
null=True,
unique=True,
verbose_name="SSO subscriber ID",
),
),
("additional_json_data", models.JSONField(blank=True, default=dict)),
(
"language",
models.CharField(
choices=[
("de", "Deutsch"),
("fr", "Français"),
("it", "Italiano"),
],
default="de",
max_length=2,
),
),
(
"groups",
models.ManyToManyField(
@ -160,8 +187,5 @@ class Migration(migrations.Migration):
"verbose_name_plural": "users",
"abstract": False,
},
managers=[
("objects", django.contrib.auth.models.UserManager()),
],
),
]

View File

@ -1,33 +0,0 @@
# Generated by Django 3.2.13 on 2022-06-28 12:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("core", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="user",
name="avatar_url",
field=models.CharField(blank=True, default="", max_length=254),
),
migrations.AlterField(
model_name="user",
name="email",
field=models.EmailField(
max_length=254, unique=True, verbose_name="email address"
),
),
migrations.AddField(
model_name="user",
name="language",
field=models.CharField(
choices=[("de", "Deutsch"), ("fr", "Français"), ("it", "Italiano")],
default="de",
max_length=2,
),
),
]

View File

@ -1,16 +0,0 @@
# Generated by Django 3.2.13 on 2022-08-16 08:35
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("core", "0002_user_model"),
]
operations = [
migrations.AlterModelManagers(
name="user",
managers=[],
),
]

View File

@ -1,23 +0,0 @@
# Generated by Django 3.2.13 on 2023-01-10 10:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("core", "0003_alter_user_managers"),
]
operations = [
migrations.AddField(
model_name="user",
name="sso_id",
field=models.UUIDField(
blank=True,
default=None,
null=True,
unique=True,
verbose_name="SSO subscriber ID",
),
),
]

View File

@ -1,25 +0,0 @@
from django.conf import settings
from django.db import migrations
from vbv_lernwelt.core.create_default_users import create_default_users
def create_users(apps, schema_editor):
default_password = "ACEEs0DCmNaPxdoNV8vhccuCTRl9b"
if settings.APP_ENVIRONMENT == "development":
default_password = None
User = apps.get_model("core", "User")
Group = apps.get_model("auth", "Group")
create_default_users(
user_model=User, group_model=Group, default_password=default_password
)
class Migration(migrations.Migration):
dependencies = [
("core", "0004_user_sso_id"),
]
operations = [
migrations.RunPython(create_users),
]

View File

@ -1,17 +0,0 @@
# Generated by Django 3.2.13 on 2023-01-24 09:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("core", "0005_create_users"),
]
operations = [
migrations.AddField(
model_name="user",
name="additional_json_data",
field=models.JSONField(blank=True, default=dict),
),
]

View File

@ -26,18 +26,18 @@ from vbv_lernwelt.course.models import (
)
from vbv_lernwelt.learnpath.models import Circle
from vbv_lernwelt.learnpath.tests.learning_path_factories import (
AssignmentBlockFactory,
AttendanceDayBlockFactory,
CircleFactory,
FeedbackBlockFactory,
LearningContentFactory,
LearningModuleBlockFactory,
LearningContentAssignmentFactory,
LearningContentAttendanceDayFactory,
LearningContentFeedbackFactory,
LearningContentLearningModuleFactory,
LearningContentMediaLibraryFactory,
LearningContentPlaceholderFactory,
LearningContentVideoFactory,
LearningPathFactory,
LearningSequenceFactory,
LearningUnitFactory,
MediaLibraryBlockFactory,
TopicFactory,
VideoBlockFactory,
)
from vbv_lernwelt.media_library.tests.media_library_factories import (
create_external_link_block,
@ -167,23 +167,16 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
title="Vorbereitung", parent=circle, icon="it-icon-ls-start"
)
lu = LearningUnitFactory(title="Vorbereitung", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Verschaffe dir einen Überblick",
parent=circle,
)
LearningContentFactory(
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
contents=[
(
"media_library",
MediaLibraryBlockFactory(
url=f"/media/überbetriebliche-kurse-media/category/{slugify(title)}"
),
)
],
content_url=f"/media/überbetriebliche-kurse-media/category/{slugify(title)}",
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Vorbereitungsauftrag",
parent=circle,
)
@ -203,55 +196,35 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
LearningSequenceFactory(title="Training", parent=circle)
LearningUnitFactory(title="Unterlagen", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Unterlagen für den Unterricht",
parent=circle,
)
LearningUnitFactory(title="Präsenztag", parent=circle)
LearningContentFactory(
LearningContentAttendanceDayFactory(
title="Präsenztag Fahrzeug",
parent=circle,
contents=[
(
"attendance_day",
AttendanceDayBlockFactory(),
)
],
)
LearningUnitFactory(title="Kompetenznachweis", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Wissens- und Verständnisfragen",
parent=circle,
)
LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Transfer", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Reflexion",
parent=circle,
)
LearningContentFactory(
LearningContentAssignmentFactory(
title="Überprüfen einer Motorfahrzeug-Versicherungspolice",
parent=circle,
contents=[
(
"assignment",
AssignmentBlockFactory(
assignment=Assignment.objects.get(
slug__startswith="test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs"
)
),
)
],
content_assignment=Assignment.objects.get(
slug__startswith="test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs"
),
)
LearningContentFactory(
title="Feedback",
LearningContentFeedbackFactory(
parent=circle,
contents=[
(
"feedback",
FeedbackBlockFactory(),
)
],
)
@ -262,30 +235,16 @@ def create_test_circle_reisen(lp):
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentVideoFactory(
title="Verschaff dir einen Überblick",
parent=circle,
contents=[
(
"video",
VideoBlockFactory(
url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
),
)
],
content_url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
)
LearningContentFactory(
LearningContentMediaLibraryFactory(
title=f"Mediathek Reisen",
parent=circle,
contents=[
(
"media_library",
MediaLibraryBlockFactory(
url=f"/media/test-lehrgang-media/category/reisen"
),
)
],
content_url=f"/media/test-lehrgang-media/category/reisen",
)
LearningSequenceFactory(title="Analyse", parent=circle)
@ -299,17 +258,10 @@ def create_test_circle_reisen(lp):
),
)
LearningContentFactory(
LearningContentLearningModuleFactory(
title="Emma und Ayla campen durch Amerika - Analyse",
parent=circle,
contents=[
(
"learningmodule",
LearningModuleBlockFactory(
url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/emma-und-ayla-campen-durch-amerika-analyse-xapi-FZoZOP9y/index.html"
),
)
],
content_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/emma-und-ayla-campen-durch-amerika-analyse-xapi-FZoZOP9y/index.html",
)
PerformanceCriteriaFactory(
@ -329,27 +281,20 @@ def create_test_circle_reisen(lp):
parent = circle
LearningSequenceFactory(title="Transfer", parent=parent, icon="it-icon-ls-end")
LearningUnitFactory(title="Transfer, Reflexion, Feedback", parent=parent)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Auswandern: Woran muss ich denken?",
parent=parent,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title=f"Fachcheck Reisen",
parent=parent,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Reflexion",
parent=parent,
)
LearningContentFactory(
title="Feedback",
LearningContentFeedbackFactory(
parent=parent,
contents=[
(
"feedback",
FeedbackBlockFactory(),
)
],
)

View File

@ -33,7 +33,11 @@ from vbv_lernwelt.feedback.creators.create_demo_feedback import create_feedback
from vbv_lernwelt.learnpath.create_vv_new_learning_path import (
create_vv_new_learning_path,
)
from vbv_lernwelt.learnpath.models import Circle, LearningContent
from vbv_lernwelt.learnpath.models import (
Circle,
LearningContentAssignment,
LearningContentAttendanceDay,
)
from vbv_lernwelt.media_library.create_default_media_library import (
create_default_media_library,
)
@ -151,7 +155,7 @@ def create_course_uk_de():
title="Bern 2023 a",
attendance_days=[
{
"learningContentId": LearningContent.objects.get(
"learningContentId": LearningContentAttendanceDay.objects.get(
slug="überbetriebliche-kurse-lp-circle-fahrzeug-lc-präsenztag-fahrzeug"
).id,
"date": "2023-09-18",
@ -163,7 +167,7 @@ def create_course_uk_de():
],
assignment_details_list=[
{
"learningContentId": LearningContent.objects.get(
"learningContentId": LearningContentAssignment.objects.get(
slug="überbetriebliche-kurse-lp-circle-fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice"
).id,
"submissionDeadlineDateTimeUtc": "2023-06-13T19:00:00Z",

View File

@ -10,15 +10,15 @@ from vbv_lernwelt.core.admin import User
from vbv_lernwelt.course.consts import COURSE_UK, COURSE_UK_FR
from vbv_lernwelt.course.models import CoursePage
from vbv_lernwelt.learnpath.tests.learning_path_factories import (
AssignmentBlockFactory,
AttendanceDayBlockFactory,
CircleFactory,
FeedbackBlockFactory,
LearningContentFactory,
LearningContentAssignmentFactory,
LearningContentAttendanceDayFactory,
LearningContentFeedbackFactory,
LearningContentMediaLibraryFactory,
LearningContentPlaceholderFactory,
LearningPathFactory,
LearningSequenceFactory,
LearningUnitFactory,
MediaLibraryBlockFactory,
TopicFactory,
)
@ -150,7 +150,7 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
title="Vorbereitung", parent=circle, icon="it-icon-ls-start"
)
LearningUnitFactory(title="Vorbereitung", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Verschaffe dir einen Überblick",
parent=circle,
)
@ -165,60 +165,44 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
"Pensionierung",
"Gesundheit",
]:
LearningContentFactory(
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
contents=[
(
"media_library",
MediaLibraryBlockFactory(
# TODO: sollen die ÜKs auf die gleichen Mediatheken verlinken
# wie im Verischerungsvermittler?
url=f"/media/überbetriebliche-kurse-media/category/{slugify(first_title)}"
),
)
],
content_url=f"/media/überbetriebliche-kurse-media/category/{slugify(first_title)}",
)
else:
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Vorbereitungsauftrag",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Selbsteinschätzung",
parent=circle,
)
LearningSequenceFactory(title="Training", parent=circle)
LearningUnitFactory(title="Unterlagen", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Unterlagen für den Unterricht",
parent=circle,
)
LearningUnitFactory(title="Kompetenznachweis", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Wissens- und Verständnisfragen",
parent=circle,
)
LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Transfer", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Reflexion",
parent=circle,
)
LearningContentFactory(
title="Feedback",
LearningContentFeedbackFactory(
parent=circle,
contents=[
(
"feedback",
FeedbackBlockFactory(),
)
],
)
@ -236,75 +220,48 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
title="Vorbereitung", parent=circle, icon="it-icon-ls-start"
)
LearningUnitFactory(title="Vorbereitung", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Verschaffe dir einen Überblick",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title=f"Mediathek {title}",
parent=circle,
contents=[
(
"media_library",
MediaLibraryBlockFactory(
url=f"/media/überbetriebliche-kurse-media/category/{slugify(title)}"
),
)
],
content_url=f"/media/überbetriebliche-kurse-media/category/{slugify(title)}",
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Vorbereitungsauftrag",
parent=circle,
)
LearningSequenceFactory(title="Training", parent=circle)
LearningUnitFactory(title="Unterlagen", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Unterlagen für den Unterricht",
parent=circle,
)
LearningUnitFactory(title="Präsenztag", parent=circle)
LearningContentFactory(
LearningContentAttendanceDayFactory(
title="Präsenztag Fahrzeug",
parent=circle,
contents=[
(
"attendance_day",
AttendanceDayBlockFactory(),
)
],
)
LearningUnitFactory(title="Kompetenznachweis", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Wissens- und Verständnisfragen",
parent=circle,
)
LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Transfer", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Reflexion",
parent=circle,
)
LearningContentFactory(
LearningContentAssignmentFactory(
title="Überprüfen einer Motorfahrzeug-Versicherungspolice",
parent=circle,
contents=[
(
"assignment",
AssignmentBlockFactory(
assignment=Assignment.objects.get(
slug__startswith="überbetriebliche-kurse-assignment-überprüfen-einer-motorfahrzeugs"
)
),
)
],
)
LearningContentFactory(
title="Feedback",
content_assignment=Assignment.objects.get(
slug__startswith="überbetriebliche-kurse-assignment-überprüfen-einer-motorfahrzeugs"
),
),
LearningContentFeedbackFactory(
parent=circle,
contents=[
(
"feedback",
FeedbackBlockFactory(),
)
],
)

View File

@ -1,6 +1,7 @@
# Generated by Django 3.2.13 on 2023-03-31 16:22
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
import django_jsonform.models.fields
from django.db import migrations, models
@ -9,7 +10,7 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
("wagtailcore", "0069_log_entry_jsonfield"),
("wagtailcore", "0083_workflowcontenttype"),
]
operations = [
@ -156,7 +157,12 @@ class Migration(migrations.Migration):
("title", models.TextField()),
("start_date", models.DateField(blank=True, null=True)),
("end_date", models.DateField(blank=True, null=True)),
("additional_json_data", models.JSONField(default=dict)),
(
"attendance_days",
django_jsonform.models.fields.JSONField(blank=True, default=list),
),
("assignment_details_list", models.JSONField(blank=True, default=list)),
("additional_json_data", models.JSONField(blank=True, default=dict)),
],
),
migrations.CreateModel(

View File

@ -1,4 +1,4 @@
# Generated by Django 3.2.13 on 2023-03-31 16:22
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
from django.conf import settings
@ -10,10 +10,10 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
("course", "0001_initial"),
("learnpath", "0001_initial"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("files", "0001_initial"),
("course", "0001_initial"),
]
operations = [

View File

@ -1,23 +0,0 @@
# Generated by Django 3.2.13 on 2023-04-04 06:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("course", "0002_initial"),
]
operations = [
migrations.AddField(
model_name="coursesession",
name="attendance_days",
field=models.JSONField(blank=True, default=list),
),
migrations.AlterField(
model_name="coursesession",
name="additional_json_data",
field=models.JSONField(blank=True, default=dict),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.13 on 2023-04-06 09:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("course", "0003_auto_20230404_0837"),
]
operations = [
migrations.AddField(
model_name="coursesession",
name="assignment_details_list",
field=models.JSONField(blank=True, default=list),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 3.2.13 on 2023-04-25 12:28
import django_jsonform.models.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("course", "0004_coursesession_assignment_details_list"),
]
operations = [
migrations.AlterField(
model_name="coursesession",
name="attendance_days",
field=django_jsonform.models.fields.JSONField(),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 3.2.13 on 2023-04-26 16:28
import django_jsonform.models.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("course", "0005_alter_coursesession_attendance_days"),
]
operations = [
migrations.AlterField(
model_name="coursesession",
name="attendance_days",
field=django_jsonform.models.fields.JSONField(blank=True, default=list),
),
]

View File

@ -11,7 +11,7 @@ from vbv_lernwelt.course.models import (
CourseSession,
CourseSessionUser,
)
from vbv_lernwelt.learnpath.models import LearningContent
from vbv_lernwelt.learnpath.models import LearningContentPlaceholder
class CourseCompletionApiTestCase(APITestCase):
@ -30,7 +30,9 @@ class CourseCompletionApiTestCase(APITestCase):
self.client.login(username="admin", password="test")
def test_completeLearningContent_works(self):
learning_content = LearningContent.objects.get(title="Fachcheck Reisen")
learning_content = LearningContentPlaceholder.objects.get(
title="Fachcheck Reisen"
)
learning_content_key = str(learning_content.translation_key)
mark_url = f"/api/course/completion/mark/"

View File

@ -1,4 +1,4 @@
# Generated by Django 3.2.13 on 2023-03-31 16:22
# Generated by Django 3.2.13 on 2023-05-11 20:06
from django.db import migrations, models

View File

@ -1,4 +1,4 @@
# Generated by Django 3.2.13 on 2023-03-31 16:22
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
from django.db import migrations, models
@ -9,9 +9,9 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
("feedback", "0001_initial"),
("course", "0001_initial"),
("learnpath", "0001_initial"),
("feedback", "0001_initial"),
("course", "0002_initial"),
]
operations = [

View File

@ -1,4 +1,4 @@
# Generated by Django 3.2.13 on 2022-12-22 14:14
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
from django.conf import settings
@ -8,6 +8,7 @@ import vbv_lernwelt.files.utils
class Migration(migrations.Migration):
initial = True
dependencies = [

View File

@ -1,917 +0,0 @@
import wagtail_factories
from django.conf import settings
from django.core.management import call_command
from slugify import slugify
from wagtail.models import Locale, Page, Site
from wagtail.rich_text import RichText
from wagtail_localize.models import LocaleSynchronization
from vbv_lernwelt.core.admin import User
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN_OLD_ID
from vbv_lernwelt.course.models import CourseCategory, CoursePage
from vbv_lernwelt.learnpath.tests.learning_path_factories import (
AssignmentBlockFactory,
CircleFactory,
FeedbackBlockFactory,
LearningContentFactory,
LearningModuleBlockFactory,
LearningPathFactory,
LearningSequenceFactory,
LearningUnitFactory,
MediaLibraryBlockFactory,
ResourceBlockFactory,
TestBlockFactory,
TopicFactory,
VideoBlockFactory,
)
# todo: remove when all Handlungsfelder are ready
READY_HF = ["Fahrzeug", "Reisen"]
def create_vv_learning_path(
course_id=COURSE_VERSICHERUNGSVERMITTLERIN_OLD_ID, user=None, skip_locales=True
):
if user is None:
user = User.objects.get(username="info@iterativ.ch")
site = Site.objects.filter(is_default_site=True).first()
if not site:
site = wagtail_factories.SiteFactory(is_default_site=True)
if settings.APP_ENVIRONMENT == "development":
site.port = 8000
site.save()
course_page = CoursePage.objects.get(course_id=course_id)
lp = LearningPathFactory(
title="Lernpfad",
parent=course_page,
)
TopicFactory(title="Basis", is_visible=False, parent=lp)
create_circle_basis(lp)
TopicFactory(title="Gewinnen von Kunden", parent=lp)
create_circle_gewinnen(lp)
TopicFactory(title="Beraten der Kunden", parent=lp)
create_circle_einstieg(lp)
create_circle_analyse(lp)
create_circle_loesung(lp)
create_circle_abschluss(lp)
TopicFactory(title="Betreuen und Ausbauen des Kundenstamms", parent=lp)
create_circle_betreuen(lp)
TopicFactory(title="Vertiefen und Festigen", parent=lp)
create_circle_vernetzen(lp)
TopicFactory(title="Prüfung", parent=lp)
create_circle_pruefung(lp)
# circle_analyse = create_circle("Betreuen", lp)
# create_circle_children(circle_analyse, "Betreuen")
#
# TopicFactory(title="Prüfung", is_visible=True, parent=lp)
# circle_analyse = create_circle("Prüfungsvorbereitung", lp)
# create_circle_children(circle_analyse, "Prüfungsvorbereitung")
# locales
if not skip_locales:
locale_de = Locale.objects.get(language_code="de-CH")
locale_fr, _ = Locale.objects.get_or_create(language_code="fr-CH")
LocaleSynchronization.objects.get_or_create(
locale_id=locale_fr.id, sync_from_id=locale_de.id
)
locale_it, _ = Locale.objects.get_or_create(language_code="it-CH")
LocaleSynchronization.objects.get_or_create(
locale_id=locale_it.id, sync_from_id=locale_de.id
)
call_command("sync_locale_trees")
# all pages belong to 'admin' by default
Page.objects.update(owner=user)
def create_circle_basis(lp, title="Basis"):
circle = CircleFactory(
title=title,
parent=lp,
description="""
In diesem Circle erfährst du wie der Lehrgang aufgebaut ist.
Zudem lernst du die wichtigsten Grundlagen,
damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
""".strip(),
goals=[
("goal", "Aufbau und Umgang mit dem Lernpfad"),
("goal", "Lerntechnik"),
("goal", "Arbeitstechnik"),
("goal", "Beraten und Verkaufen"),
("goal", "Versicherungswirtschaft"),
("goal", "Versicherungsrecht"),
],
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
title="Willkommen im Lehrgang Versicherungsvermitler VBV",
parent=circle,
)
LearningUnitFactory(title="Arbeits- und Lerntechnik", parent=circle)
LearningContentFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
title="Luca organisiert seinen Arbeitsalltag",
parent=circle,
)
LearningContentFactory(
title="Luca legt sich seine Lernstrategie zurecht",
parent=circle,
)
LearningContentFactory(
title="Fachcheck Arbeits- und Lerntechnik",
parent=circle,
)
LearningSequenceFactory(title="Grundlagen", parent=circle, icon="it-icon-ls-watch")
LearningUnitFactory(title="Versicherung", parent=circle)
LearningContentFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
title="Luca startet durch",
parent=circle,
)
LearningContentFactory(
title="Fachcheck Allgemeines zu Versicherungen",
parent=circle,
)
LearningUnitFactory(title="Beratung und Verkauf", parent=circle)
LearningContentFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
title="Luca macht sich fit im Verkauf",
parent=circle,
)
LearningContentFactory(
title="Fachcheck Beratung und Verkauf",
parent=circle,
)
LearningSequenceFactory(title="Beenden", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Jetzt kann's los gehen", parent=circle)
create_learning_content_beenden(circle)
def create_circle_gewinnen(lp, title="Gewinnen"):
circle = CircleFactory(
title=title,
parent=lp,
description="""
Neue Kunden zu gewinnen ist ein wesentlicher Bestandteil deiner beruflichen Tätigkeit.
Dies sichert dir langfristig deine finanzielle Basis. Dieser Circle fokussiert darauf,
wie du dein Netzwerk aufbauen und erweitern kannst, um damit neue Kunden zu gewinnen.
""".strip(),
goals=[
("goal", "Weiterempfehlungen generieren"),
("goal", "Leads generieren"),
("goal", "Neue Kunden gewinnen"),
("goal", "Soziale Medien pflegen"),
],
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
title="Verschaff dir einen Überblick",
parent=circle,
)
LearningSequenceFactory(title="Beobachten", parent=circle, icon="it-icon-ls-watch")
LearningUnitFactory(title="Kunden gewinnen", parent=circle)
LearningContentFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
title="Lerninhalt offen",
parent=circle,
)
LearningContentFactory(
title="Fachcheck Kunden gewinnen",
parent=circle,
)
LearningSequenceFactory(title="Anwenden", parent=circle, icon="it-icon-ls-watch")
LearningUnitFactory(title="Sozialer Auftritt", parent=circle)
LearningContentFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
title="Lerninhalt offen",
parent=circle,
)
LearningContentFactory(
title="Fachcheck Sozialer Auftritt",
parent=circle,
)
LearningSequenceFactory(title="Üben", parent=circle, icon="it-icon-ls-practice")
LearningUnitFactory(title="Sozialer Auftritt", parent=circle)
LearningContentFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
title="Lerninhalt offen",
parent=circle,
)
LearningSequenceFactory(title="Beenden", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Circle beenden", parent=circle)
create_learning_content_beenden(circle)
def create_circle_einstieg(lp, title="Einstieg"):
circle = CircleFactory(
title=title,
parent=lp,
description="""
Eine deiner Kernkompetenzen ist das fachgerechte, professionelle und ganzheitliche
Beraten von Kunden. Mit dem Einstieg in das Kundengespräch legst du eine
wichtige Grundlage für eine erfolgreiche Beziehung.
""".strip(),
goals=[
("goal", "Termine vereinbaren"),
("goal", "Gespräche vorbereiten"),
("goal", "Gespräch eröffnen"),
("goal", "Agenda präsentieren "),
],
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
title="Verschaff dir einen Überblick",
parent=circle,
contents=[
(
"video",
VideoBlockFactory(
url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
),
)
],
)
LearningSequenceFactory(title="Beobachten", parent=circle, icon="it-icon-ls-watch")
create_standard_learning_unit(
"Patrizia & Marco sichern sich ab",
parent=circle,
category_name="Einkommenssicherung",
wbt_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/story-patrizia-marco-sichern-sich-ab-einstieg/index.html",
)
LearningSequenceFactory(title="Anwenden", parent=circle, icon="it-icon-ls-apply")
create_standard_learning_unit(
"Rafael Fasel wechselt sein Auto",
parent=circle,
category_name="Fahrzeug",
wbt_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/rafael-fasel-wechselt-sein-auto-einstieg-xapi-yXLHE5Xo/index.html",
check_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/fach-check-fahrzeug-xapi-LqpAWv1J/index.html",
)
create_standard_learning_unit(
"Rafael Fasel zieht von zu Hause aus",
parent=circle,
category_name="Haushalt",
)
create_standard_learning_unit(
"Emma und Ayla campen durch Amerika",
parent=circle,
category_name="Reisen",
wbt_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/emma-und-ayla-campen-durch-amerika-einstieg-xapi-_BfVBK8d/index.html",
check_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/fach_check_reisen/index.html",
)
create_standard_learning_unit(
"Herr und Frau Russo planen ihre Pensionierung",
parent=circle,
category_name="Pensionierung",
)
create_standard_learning_unit(
"Familie Babic erwartet Nachwuchs",
parent=circle,
category_name="Gesundheit",
)
create_standard_learning_unit(
"Anne Fleur übernimmt den Blumenladen",
parent=circle,
category_name="KMU",
)
LearningSequenceFactory(title="Üben", parent=circle, icon="it-icon-ls-practice")
LearningUnitFactory(title="Gesprächseinstieg", parent=circle)
LearningContentFactory(
title="Mediathek",
parent=circle,
)
create_learning_content_transferauftrag("Der erste Eindruck zählt", circle)
LearningSequenceFactory(title="Beenden", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Circle beenden", parent=circle)
create_learning_content_beenden(circle)
def create_circle_analyse(lp, title="Analyse"):
circle = CircleFactory(
title=title,
parent=lp,
description="Wer ist dein Kunde und was ist ihm wichtig? In dieser Phase des Gesprächs geht es darum, deine Kundinnen und Kunden mit ihren Zielen, Wünschen und Bedürfnissen kennenzulernen und zu verstehen.",
goals=[
("goal", "Ziele und Pläne ergründen"),
("goal", "Ist-Situation erfassen"),
("goal", "Risiken aufzeigen "),
],
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
title="Verschaff dir einen Überblick",
parent=circle,
)
LearningSequenceFactory(title="Beobachten", parent=circle, icon="it-icon-ls-watch")
create_standard_learning_unit(
"Patrizia & Marco sichern sich ab",
parent=circle,
category_name="Einkommenssicherung",
wbt_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/patrizia-marco-sichern-sich-ab-analyse-xapi-AoI_Ssua/index.html",
)
LearningSequenceFactory(title="Anwenden", parent=circle, icon="it-icon-ls-apply")
create_standard_learning_unit(
"Rafael Fasel wechselt sein Auto",
parent=circle,
category_name="Fahrzeug",
wbt_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/rafael-fasel-wechselt-sein-auto-analyse-xapi-SmrKAa0J/index.html",
check_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/fach-check-fahrzeug-xapi-LqpAWv1J/index.html",
)
create_standard_learning_unit(
"Rafael Fasel zieht von zu Hause aus",
parent=circle,
category_name="Haushalt",
)
create_standard_learning_unit(
"Emma und Ayla campen durch Amerika",
parent=circle,
category_name="Reisen",
wbt_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/emma-und-ayla-campen-durch-amerika-analyse-xapi-mtXA4uBz/index.html",
check_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/fach_check_reisen/index.html",
)
create_standard_learning_unit(
"Herr und Frau Russo planen ihre Pensionierung",
parent=circle,
category_name="Pensionierung",
)
create_standard_learning_unit(
"Familie Babic erwartet Nachwuchs",
parent=circle,
category_name="Gesundheit",
)
create_standard_learning_unit(
"Anne Fleur übernimmt den Blumenladen",
parent=circle,
category_name="KMU",
)
LearningSequenceFactory(title="Üben", parent=circle, icon="it-icon-ls-practice")
LearningUnitFactory(title="Gesprächseinstieg", parent=circle)
LearningContentFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
title="Lerninhalt offen",
parent=circle,
)
LearningSequenceFactory(title="Beenden", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Circle beenden", parent=circle)
create_learning_content_beenden(circle)
def create_circle_loesung(lp, title="Lösung"):
circle = CircleFactory(
title=title,
parent=lp,
description="Ohne Lösungsvorschlag kein Verkauf! Auf der Basis der umfassenden Analyse erstellst du konkrete Lösungsvorschläge. Es ist ein wichtiger Erfolgsfaktor diese Lösungsvorschläge, den Kundinnen und Kunden verständlich zu erklären.",
goals=[
("goal", "Lösungsvorschläge entwickeln"),
("goal", "Lösungsvorschläge erklären"),
("goal", "Nutzen aufzeigen"),
("goal", "Auf Vorbehalte eingehen"),
],
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
title="Verschaff dir einen Überblick",
parent=circle,
)
LearningSequenceFactory(title="Beobachten", parent=circle, icon="it-icon-ls-watch")
create_standard_learning_unit(
"Patrizia & Marco sichern sich ab",
parent=circle,
category_name="Einkommenssicherung",
)
LearningSequenceFactory(title="Anwenden", parent=circle, icon="it-icon-ls-apply")
create_standard_learning_unit(
"Rafael Fasel wechselt sein Auto",
parent=circle,
category_name="Fahrzeug",
wbt_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/rafael-fasel-wechselt-sein-auto-losung-xapi-3rzf8ySd/index.html",
check_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/fach-check-fahrzeug-xapi-LqpAWv1J/index.html",
)
create_standard_learning_unit(
"Rafael und Claudia ziehen zusammen",
parent=circle,
category_name="Haushalt",
)
create_standard_learning_unit(
"Emma und Ayla campen durch Amerika",
parent=circle,
category_name="Reisen",
wbt_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/emma-und-ayla-campen-durch-amerika-losung-xapi-hn7GwUTn/index.html",
check_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/fach_check_reisen/index.html",
)
create_standard_learning_unit(
"Giulia und Davide planen ihre Pensionierung",
parent=circle,
category_name="Pensionierung",
)
create_standard_learning_unit(
"Familie Babic erwartet Nachwuchs",
parent=circle,
category_name="Gesundheit",
)
create_standard_learning_unit(
"Anne Fleur übernimmt den Blumenladen",
parent=circle,
category_name="KMU",
)
LearningSequenceFactory(title="Üben", parent=circle, icon="it-icon-ls-practice")
LearningUnitFactory(title="Heirat", parent=circle)
LearningContentFactory(
title="Mediathek",
parent=circle,
)
create_learning_content_transferauftrag("Patrizia & Marco heiraten", circle)
LearningContentFactory(
title="Fachcheck Heirat",
parent=circle,
)
LearningSequenceFactory(title="Beenden", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Circle beenden", parent=circle)
create_learning_content_beenden(circle)
def create_circle_abschluss(lp, title="Abschluss"):
circle = CircleFactory(
title=title,
parent=lp,
description="Ohne Lösungsvorschlag kein Verkauf! Auf der Basis der umfassenden Analyse erstellst du konkrete Lösungsvorschläge. Es ist ein wichtiger Erfolgsfaktor diese Lösungsvorschläge, den Kundinnen und Kunden verständlich zu erklären.",
goals=[
("goal", "Anträge ausfüllen"),
("goal", "Weiterempfehlungen erhalten"),
("goal", "Gespräch abschliessen"),
("goal", "Termin nachbearbeiten"),
],
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
title="Verschaff dir einen Überblick",
parent=circle,
)
LearningSequenceFactory(title="Beobachten", parent=circle, icon="it-icon-ls-watch")
create_standard_learning_unit(
"Patrizia & Marco sichern sich ab",
parent=circle,
category_name="Einkommenssicherung",
)
LearningSequenceFactory(title="Anwenden", parent=circle, icon="it-icon-ls-apply")
create_standard_learning_unit(
"Rafael Fasel wechselt sein Auto",
parent=circle,
category_name="Fahrzeug",
wbt_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/rafael-fasel-wechselt-sein-auto-abschluss-xapi-WbFBv-4y/index.html",
check_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/fach-check-fahrzeug-xapi-LqpAWv1J/index.html",
)
create_standard_learning_unit(
"Rafael Fasel zieht von zu Hause aus",
parent=circle,
category_name="Haushalt",
)
create_standard_learning_unit(
"Emma und Ayla campen durch Amerika",
parent=circle,
category_name="Reisen",
wbt_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/emma-und-ayla-campen-durch-amerika-abschluss-xapi-Qv4X-yua/index.html",
check_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/fach_check_reisen/index.html",
)
create_standard_learning_unit(
"Herr und Frau Russo planen ihre Pensionierung",
parent=circle,
category_name="Pensionierung",
)
create_standard_learning_unit(
"Familie Babic erwartet Nachwuchs",
parent=circle,
category_name="Gesundheit",
)
create_standard_learning_unit(
"Anne Fleur übernimmt den Blumenladen",
parent=circle,
category_name="KMU",
)
LearningSequenceFactory(title="Üben", parent=circle, icon="it-icon-ls-practice")
LearningUnitFactory(title="Auswandern", parent=circle)
LearningContentFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
title="Emma und Ayla wandern nach Amerika aus",
parent=circle,
)
LearningContentFactory(
title="Fachcheck Auswandern",
parent=circle,
)
LearningSequenceFactory(title="Beenden", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Circle beenden", parent=circle)
create_learning_content_beenden(circle)
def create_circle_betreuen(lp, title="Betreuen"):
circle = CircleFactory(
title=title,
parent=lp,
description="Einen Kunden einmal zu beraten ist eine Sache. Einen Kunden nachhaltig zu betreuen eine andere! In diesem Circle lernst du, wie deine Kunden zufrieden bleiben und du dein Portfolio ausbauen kannst.",
goals=[
("goal", "Cross- und Upselling anwenden"),
("goal", "Bestehende Verträge anpassen"),
("goal", "Bestehende Kunden pflegen"),
("goal", "Prozess im Schadenfall erklären"),
],
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
title="Verschaff dir einen Überblick",
parent=circle,
)
LearningSequenceFactory(title="Beobachten", parent=circle, icon="it-icon-ls-watch")
create_standard_learning_unit(
"Patrizia Feller macht sich selbsständig",
parent=circle,
category_name="Selbstständigkeit",
)
LearningSequenceFactory(title="Anwenden", parent=circle, icon="it-icon-ls-apply")
create_standard_learning_unit(
"Familie Feller Bonsera kaufen ein Haus",
parent=circle,
category_name="Wohneigentum",
)
create_standard_learning_unit(
"Rafael Fasel hat Ärger mit dem Vermieter",
parent=circle,
category_name="Rechtsstreitigkeiten",
)
create_standard_learning_unit(
"Familie Babic spart auf ein Ziel",
parent=circle,
category_name="Sparen",
)
create_standard_learning_unit(
"Chiara übernimmt das Haus der Eltern",
parent=circle,
category_name="Erben / Vererben",
)
LearningSequenceFactory(title="Üben", parent=circle, icon="it-icon-ls-practice")
LearningUnitFactory(title="Bauen", parent=circle)
create_standard_learning_unit(
"Blumenladen Fleur expandiert",
parent=circle,
category_name="Wohneigentum",
learning_unit_title="Bauen",
)
create_standard_learning_unit(
"Davide & Giulia verkaufen ihr Haus an Chiara",
parent=circle,
category_name="Wohneigentum",
learning_unit_title="Hausverkauf",
)
LearningSequenceFactory(title="Beenden", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Circle beenden", parent=circle)
create_learning_content_beenden(circle)
def create_circle_vernetzen(lp, title="Vernetzen"):
circle = CircleFactory(
title=title,
parent=lp,
description="Du suchst nach einer Möglichkeit, das Gelernte noch besser zu vernetzen? Unsere Onlinetraining und/oder Webinare können dich dabei unterstützen.",
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
title="Lerninhalt offen",
parent=circle,
)
LearningSequenceFactory(
title="Online-Trainings", parent=circle, icon="it-icon-ls-watch"
)
LearningUnitFactory(title="Lerneinheit offen", parent=circle)
LearningContentFactory(
title="Lerninhalt offen",
parent=circle,
)
LearningSequenceFactory(
title="Präsenz-Trainings", parent=circle, icon="it-icon-ls-watch"
)
LearningUnitFactory(title="Lerneinheit offen", parent=circle)
LearningContentFactory(
title="Lerninhalt offen",
parent=circle,
)
LearningSequenceFactory(title="Beenden", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Lerneinheit offen", parent=circle)
create_learning_content_beenden(circle)
def create_circle_pruefung(lp, title="Prüfungsvorbereitung"):
circle = CircleFactory(
title=title,
parent=lp,
description="Hier erfährst du alles, was du für die Zulassungsprüfung zum/zur Versicherungsvermittler/-in VBV wissen musst. Du trainierst konkret mit zwei Nullserien, damit du dich zielgerichtet auf die Prüfung vorbereiten kannst.",
goals=[
("goal", "Aufbau und Struktur der Prüfung"),
("goal", "Dauer und Ablauf"),
("goal", "Hilfsmittel"),
("goal", "Anmeldeprozess"),
("goal", "Kosten"),
],
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Prüfung", parent=circle)
LearningContentFactory(
title="Anmeldung",
parent=circle,
)
LearningContentFactory(
title="Aufbau und Ablauf der Prüfung - So geht's",
parent=circle,
)
LearningSequenceFactory(title="Üben", parent=circle, icon="it-icon-ls-practice")
LearningUnitFactory(title="Mach dich fit für die Prüfung", parent=circle)
LearningContentFactory(
title="Null-Serie 1",
parent=circle,
)
LearningContentFactory(
title="Null-Serie 2",
parent=circle,
)
LearningContentFactory(
title="Null-Serie 3",
parent=circle,
)
LearningSequenceFactory(title="Vernetzen", parent=circle, icon="it-icon-ls-network")
LearningUnitFactory(title="Fragen zur Prüfungsvorbereitung", parent=circle)
LearningContentFactory(
title="Online-Session",
parent=circle,
)
LearningContentFactory(
title="FAQ/Blog",
parent=circle,
)
LearningSequenceFactory(title="Beenden", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Bereit für die Prüfung", parent=circle)
LearningContentFactory(
title="Lerninhalt offen",
parent=circle,
)
def create_standard_learning_unit(
title, parent, category_name, wbt_url=None, check_url=None, learning_unit_title=None
):
if learning_unit_title is None:
learning_unit_title = category_name
LearningUnitFactory(
title=learning_unit_title,
parent=parent,
course_category=CourseCategory.objects.get(
course_id=COURSE_VERSICHERUNGSVERMITTLERIN_OLD_ID, title=category_name
),
)
if category_name in READY_HF:
LearningContentFactory(
title=f"Mediathek {category_name}",
parent=parent,
contents=[
(
"media_library",
MediaLibraryBlockFactory(
url=f"/media/versicherungsvermittler-in-media/category/{slugify(category_name)}"
),
)
],
)
else:
LearningContentFactory(
title="Mediathek",
parent=parent,
)
if wbt_url is None:
LearningContentFactory(
title=title,
parent=parent,
)
else:
LearningContentFactory(
title=title,
parent=parent,
contents=[
(
"learningmodule",
LearningModuleBlockFactory(url=wbt_url),
)
],
)
if check_url is None:
LearningContentFactory(
title=f"Fachcheck {category_name}",
parent=parent,
)
else:
LearningContentFactory(
title=f"Fachcheck {category_name}",
parent=parent,
contents=[
(
"test",
TestBlockFactory(url=check_url),
)
],
)
def create_learning_content_beenden(parent):
LearningContentFactory(
title="Hier entsteht die Lernsequenz «beenden»",
parent=parent,
contents=[
(
"resource",
ResourceBlockFactory(
url="https://www.vbv.ch/",
description="Platzhalter Text für Lernsequenz «beenden»:",
text=RichText(
"""
<h2 data-block-key="pwyep">Hier entsteht die Lernsequenz \u00abbeenden\u00bb</h2><h3
data-block-key="dppb3">Reflektiert</h3>
<img src="/static/media/demo_oktober/beenden.jpg" style="
float: right;
margin-left: 32px;
margin-bottom: 32px;
">
<p data-block-key="bho67">Du hast dich im
Circle mit bestimmten Handlungskompetenzen auseinandergesetzt und dir zu verschiedenen
Handlungsfeldern Fachkenntnisse angeeignet. Es handelt sich hier um viel Lernstoff,
der verarbeitet werden muss.</p><p data-block-key="f547i">Deshalb hast du bereits am
Ende jeder Lerneinheit eine Selbsteinsch\u00e4tzung der angestrebten
Handlungskompetenzen vorgenommen. Nun ist es Zeit, nochmals auf das KompetenzNavi zu
schauen. Wo sind noch L\u00fccken? Was braucht es noch? Reflektiere hier nochmals
deine Erfahrungen. Dies kann in Form eines Lerntagebuchs und/oder im Austausch mit
deiner Lernbegleitung passieren.</p><h3 data-block-key="7ljuq">Wieso ist dies
sinnvoll?</h3><p data-block-key="7sf2">Das F\u00fchren eines Lerntagebuchs und das
Beantworten von Reflexionsfragen helfen dir den eigenen Lern- und Denkprozess sichtbar
und begreifbar zu machen. Es deckt deine pers\u00f6nlichen St\u00e4rken und
Schw\u00e4chen w\u00e4hrend der Erarbeitung auf und hilft dir, dich laufend zu
verbessern.</p><p data-block-key="ecq4l">Die folgenden Fragestellungen k\u00f6nnen dir
dabei helfen.</p><h3 data-block-key="9mbpa">Reflexionsbeispiel zum Lerninhalt:</h3>
<ul>
<li data-block-key="bgr7s">Was gelingt mir bereits gut?</li>
<li data-block-key="72mrj">Wo muss ich mich noch vertiefen oder nochmals repetieren?
</li>
<li data-block-key="3gq01">Blick auf das KompetenzNavi sch\u00e4rfen</li>
<li data-block-key="8443s">Was nehme ich mit?</li>
<li data-block-key="4nstg">Was m\u00f6chte ich nochmals mit meiner Lernbegleitung
anschauen?
</li>
</ul><h3 data-block-key="6us0c">Reflexionsbeispiele zum Vorgehen/Verhalten:</h3>
<ul>
<li data-block-key="5ih9d">Wie habe ich mich auf den Circle vorbereitet (z.B. Lernzeit
eingeplant)?
</li>
<li data-block-key="6piqr">Wie gut ist mir die Einhaltung der Lernzeiten gelungen? Was
f\u00fchrte zum Erfolg/Misserfolg?
</li>
<li data-block-key="dglus">Wie bin ich beim Lernen vorgegangen (Einsatz von
Lernmethoden)?
</li>
<li data-block-key="53o3r">Was will ich f\u00fcr den n\u00e4chsten Circle im
Lernprozess \u00e4ndern/verbessern?
</li>
</ul><h3 data-block-key="86e5g">Tools, die du f\u00fcr deine Reflexion in Form eines
Lerntagebuches verwenden kannst:</h3>
<ul>
<li data-block-key="16m0n">OneNote</li>
<li data-block-key="disfa">Miroboard</li>
<li data-block-key="2sr1l">Worddokument</li>
<li data-block-key="5lfsl">Powerpointpr\u00e4sentation</li>
<li data-block-key="fvlkb">Notizbuch</li>
</ul><p data-block-key="fu5sc">Der Vorteil eines digitalen Lerntagebuchs besteht in
erster Linie darin, dass sehr einfach Inhalte strukturiert, erg\u00e4nzt und
bearbeitet werden k\u00f6nnen.</p>
"""
),
),
)
],
)
LearningContentFactory(
title="Feedback",
parent=parent,
contents=[
(
"feedback",
FeedbackBlockFactory(),
)
],
)
def create_learning_content_transferauftrag(title, parent):
LearningContentFactory(
title=title,
parent=parent,
contents=[
(
"assignment",
AssignmentBlockFactory(
url="https://www.vbv.ch/",
description="Platzhalter Text für Lernsequenz «üben»:",
text=RichText(
"""
<h2 data-block-key="pwyep">Hier entsteht die Lernsequenz «üben»</h2><h3
data-block-key="dppb3">Praxisorientiert</h3>
<p data-block-key="bho67">Die Lernsequenz «üben» fordert die Teilnehmenden auf, in der eigenen Organisation anhand eines Transferauftrages eine entsprechende Handlungssituation durchzuführen.</p>
<p data-block-key="f547i">Der Auftrag unterstützt den Transfer in die Praxis und nimmt einzelne Themen aus dem jeweiligen Circle nochmals auf.</p>
<p data-block-key="f547i">Der Teilnehmende wird sein Ergebnis in MyVBV hochladen.</p>
<p data-block-key="f547i">Feedback erfolgt durch die Lernbegleitung oder durch weitere vom Teilnehmenden definierte Personen.<br>Ein Abgleich mit Musterlösungen wird wo sinnvoll angeboten</p>
<p data-block-key="f547i">Zusätzlich zum Auftrag wird auf das relevante Fachwissen aus der Mediathek verwiesen und wo sinnvoll Hilfsmittel zur Verfügung gestellt.</p>
<h3 data-block-key="7ljuq">Hier siehst du ein Beispiel eines Transferauftrages mit einer entsprechenden Musterlösung. </h3>
<p data-block-key="7sf2">Schnuppere mal rein. Viel Spass!</p>
<p>
<img src="/static/media/demo_oktober/der_erste_eindruck.jpg">
</p>
<p>
<a href="/static/media/demo_oktober/Transferauftrag_Der_erste_Eindruck_zaehlt.pdf">PDF Transferauftrag: Der erste Eindruck zählt</a><br>
<a href="/static/media/demo_oktober/Transferauftrag_Der_erste_Eindruck_zaehlt_Musterlösung.pdf">PDF Transferauftrag: Der erste Eindruck zählt - Lösung</a>
</p>
"""
),
),
)
],
)

View File

@ -12,19 +12,18 @@ from vbv_lernwelt.core.admin import User
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN_ID
from vbv_lernwelt.course.models import CourseCategory, CoursePage
from vbv_lernwelt.learnpath.tests.learning_path_factories import (
AssignmentBlockFactory,
CircleFactory,
FeedbackBlockFactory,
LearningContentFactory,
LearningModuleBlockFactory,
LearningContentFeedbackFactory,
LearningContentLearningModuleFactory,
LearningContentMediaLibraryFactory,
LearningContentPlaceholderFactory,
LearningContentRichTextFactory,
LearningContentTestFactory,
LearningContentVideoFactory,
LearningPathFactory,
LearningSequenceFactory,
LearningUnitFactory,
MediaLibraryBlockFactory,
ResourceBlockFactory,
TestBlockFactory,
TopicFactory,
VideoBlockFactory,
)
from vbv_lernwelt.learnpath.vv_circle_goals import GoalsType, VV_CIRCLE_GOALS
@ -146,20 +145,13 @@ def create_circle_basis(lp, title="Basis"):
)
LearningSequenceFactory(title="Einführung", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentVideoFactory(
title="Verschaff dir einen Überblick",
parent=circle,
contents=[
(
"video",
VideoBlockFactory(
url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
),
)
],
content_url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Aufbau myVBV",
parent=circle,
)
@ -169,19 +161,19 @@ def create_circle_basis(lp, title="Basis"):
title="Lerntechnik, Lernbegleitung, Lernpartner/-in und Einführung in MyVBV",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Qualifikationsprofil und Zulassungsprüfung",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Lege dir eine Lernstrategie zurecht",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Such dir eine/n Lernbegleiter/-in, einen Lern-Buddy und plane deine Lernzeiten",
parent=circle,
)
@ -191,27 +183,27 @@ def create_circle_basis(lp, title="Basis"):
title="Mein neuer Job, Arbeitstechnik, Soziale Medien, Datenschutz und Beratungspflichten",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mein neuer Job",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Organisiere deinen Arbeitsalltag",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Soziale Medien und Datenschutz",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Beraterpflichten (inkl. VBV-WBT)",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Fachcheck Beraterpflichten",
parent=circle,
)
@ -221,46 +213,39 @@ def create_circle_basis(lp, title="Basis"):
title="Basiswissen Versicherungen, VVG",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Einstieg in die Versicherung",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Basiswissen Versicherungen (inkl. VBV-WBT)",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="VVG im Versicherungsalltag (inkl. VBV-WBT)",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Fachcheck Versicherungswirtschaft",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Fachcheck Versicherungsrecht",
parent=circle,
)
LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Reflexion, Feedback", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Reflexion",
parent=circle,
)
LearningContentFactory(
title="Feedback",
LearningContentFeedbackFactory(
parent=circle,
contents=[
(
"feedback",
FeedbackBlockFactory(),
)
],
)
@ -282,68 +267,61 @@ wie du dein Netzwerk aufbauen und erweitern kannst, um damit neue Kunden zu gewi
)
LearningSequenceFactory(title="Einführung", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Verschaff dir einen Überblick",
parent=circle,
)
LearningSequenceFactory(title="Verkaufsgrundlagen", parent=circle)
LearningUnitFactory(title="Verkaufsgrundlagen", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Die ersten Schritte im Verkauf",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Sich und das Unternehmen vorstellen",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Fachcheck Verkaufsgrundlagen",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Selbsteinschätzung",
parent=circle,
)
LearningSequenceFactory(title="Kundenakquise", parent=circle)
LearningUnitFactory(title="Kundenakquise", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Vom Lead zum Termin/Telefon auf Empfehlung/Neukundengewinnung",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mein Kundenstamm",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Selbsteinschätzung",
parent=circle,
)
LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Reflexion, Feedback", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Reflexion",
parent=circle,
)
LearningContentFactory(
title="Feedback",
LearningContentFeedbackFactory(
parent=circle,
contents=[
(
"feedback",
FeedbackBlockFactory(),
)
],
)
@ -354,30 +332,16 @@ def create_circle_fahrzeug(lp, title="Fahrzeug"):
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentVideoFactory(
title="Verschaff dir einen Überblick",
parent=circle,
contents=[
(
"video",
VideoBlockFactory(
url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
),
)
],
content_url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
)
LearningContentFactory(
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
contents=[
(
"media_library",
MediaLibraryBlockFactory(
url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}"
),
)
],
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}",
)
LearningSequenceFactory(title="Einstieg", parent=circle)
@ -422,31 +386,17 @@ def create_circle_fahrzeug(lp, title="Fahrzeug"):
LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Reflexion, Feedback", parent=circle)
LearningContentFactory(
LearningContentTestFactory(
title=f"Fachcheck",
parent=circle,
contents=[
(
"test",
TestBlockFactory(
url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/fach-check-fahrzeug-xapi-LqpAWv1J/index.html"
),
)
],
content_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/fach-check-fahrzeug-xapi-LqpAWv1J/index.html",
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Reflexion",
parent=circle,
)
LearningContentFactory(
title="Feedback",
LearningContentFeedbackFactory(
parent=circle,
contents=[
(
"feedback",
FeedbackBlockFactory(),
)
],
)
@ -457,30 +407,16 @@ def create_circle_rechtsstreitigkeiten(lp, title="Rechtsstreitigkeiten"):
)
LearningSequenceFactory(title="Einführung", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentVideoFactory(
title="Verschaff dir einen Überblick",
parent=circle,
contents=[
(
"video",
VideoBlockFactory(
url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
),
)
],
content_url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
)
LearningContentFactory(
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
contents=[
(
"media_library",
MediaLibraryBlockFactory(
url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}"
),
)
],
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}",
)
LearningSequenceFactory(title="Rechtsstreitigkeiten", parent=circle)
@ -503,30 +439,16 @@ def create_circle_reisen(lp, title="Reisen"):
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentVideoFactory(
title="Verschaff dir einen Überblick",
parent=circle,
contents=[
(
"video",
VideoBlockFactory(
url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
),
)
],
content_url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
)
LearningContentFactory(
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
contents=[
(
"media_library",
MediaLibraryBlockFactory(
url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}"
),
)
],
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}",
)
LearningSequenceFactory(title="Einstieg", parent=circle)
@ -581,30 +503,16 @@ def create_circle_einkommenssicherung(lp, title="Einkommenssicherung"):
)
LearningSequenceFactory(title="Einführung", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentVideoFactory(
title="Verschaff dir einen Überblick",
parent=circle,
contents=[
(
"video",
VideoBlockFactory(
url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
),
)
],
content_url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
)
LearningContentFactory(
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
contents=[
(
"media_library",
MediaLibraryBlockFactory(
url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}"
),
)
],
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}",
)
LearningSequenceFactory(title="Einstieg", parent=circle)
@ -664,30 +572,16 @@ def create_circle_standard_small(
circle = CircleFactory(**setup_circle_factory_kwargs(title, lp, goals, description))
LearningSequenceFactory(title="Einführung", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentVideoFactory(
title="Verschaff dir einen Überblick",
parent=circle,
contents=[
(
"video",
VideoBlockFactory(
url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
),
)
],
content_url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
)
LearningContentFactory(
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
contents=[
(
"media_library",
MediaLibraryBlockFactory(
url=f"/media/versicherungsvermittler-in-media/category/{slugify(title, allow_unicode=True)}"
),
)
],
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title, allow_unicode=True)}",
)
if lu_title is None:
@ -708,30 +602,16 @@ def create_circle_standard(lp, title, lc_title, goals=None, description=None):
circle = CircleFactory(**setup_circle_factory_kwargs(title, lp, goals, description))
LearningSequenceFactory(title="Einführung", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentVideoFactory(
title="Verschaff dir einen Überblick",
parent=circle,
contents=[
(
"video",
VideoBlockFactory(
url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
),
)
],
content_url="https://player.vimeo.com/video/772512710?h=30f912f15a",
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
)
LearningContentFactory(
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
contents=[
(
"media_library",
MediaLibraryBlockFactory(
url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}"
),
)
],
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}",
)
LearningSequenceFactory(title="Einstieg", parent=circle)
@ -816,82 +696,82 @@ def create_circle_betreuen(lp, title="Betreuen"):
)
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Verschaff dir einen Überblick",
parent=circle,
)
LearningSequenceFactory(title="Rechtsstreitigkeiten", parent=circle)
LearningUnitFactory(title="Rechtsstreitigkeiten", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Rafael Fasel hat Ärger mit seinem Vermieter",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Fachcheck",
parent=circle,
)
LearningSequenceFactory(title="Sparen", parent=circle)
LearningUnitFactory(title="Sparen", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Familie Babic spart auf ein Ziel",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Fachcheck",
parent=circle,
)
LearningSequenceFactory(title="Wohneigentum", parent=circle)
LearningUnitFactory(title="Wohneigentum", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Familie Bonsera kauft ein Haus",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Fachcheck",
parent=circle,
)
LearningSequenceFactory(title="Selbstständigkeit", parent=circle)
LearningUnitFactory(title="Selbstständigkeit", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Patrizia Feller macht sich selbstständig",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Fachcheck",
parent=circle,
)
LearningSequenceFactory(title="Erben/Vererben", parent=circle)
LearningUnitFactory(title="Erben/Vererben", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Davide und Giulia vererben ihr Haus",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Fachcheck",
parent=circle,
)
@ -909,23 +789,23 @@ def create_circle_vernetzen(lp, title="Vernetzen"):
)
LearningSequenceFactory(title="Einführung ", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Verschaffe dir einen Überblick",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningSequenceFactory(title="Training", parent=circle)
LearningUnitFactory(title="Onlinetrainings", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Unknown ???",
parent=circle,
)
LearningUnitFactory(title="Webinare", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Unknown ???",
parent=circle,
)
@ -940,42 +820,42 @@ def create_circle_pruefungsvorbereitung(lp, title="Prüfungsvorbereitung"):
)
LearningSequenceFactory(title="Einführung ", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Einführung", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Verschaffe dir einen Überblick",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
)
LearningSequenceFactory(title="Aufbau", parent=circle)
LearningUnitFactory(title="Aufbau und Struktur", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Unknown ???",
parent=circle,
)
LearningSequenceFactory(title="Nullserien", parent=circle)
LearningUnitFactory(title="Schriftliche Nullserien", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Nullserie 1",
parent=circle,
)
LearningUnitFactory(title="Mündliche Nullserien", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Nullserie 1 - Aufgabe",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Nullserie 1 - Lösung",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Nullserie 2 - Aufgabe",
parent=circle,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Nullserie 2 - Lösung",
parent=circle,
)
@ -991,7 +871,7 @@ def create_circle_pruefung(lp, title="Prüfung"):
)
LearningSequenceFactory(title="Anmeldung", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Anmeldung", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Anmeldung",
parent=circle,
)
@ -1000,14 +880,14 @@ def create_circle_pruefung(lp, title="Prüfung"):
title="Durchführung", parent=circle, icon="it-icon-ls-start"
)
LearningUnitFactory(title="Durchführung", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Durchführung",
parent=circle,
)
LearningSequenceFactory(title="Feedback", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Feedback", parent=circle)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Feedback",
parent=circle,
)
@ -1034,20 +914,15 @@ def create_standard_learning_unit(
)
if wbt_url is None:
LearningContentFactory(
LearningContentPlaceholderFactory(
title=title,
parent=parent,
)
else:
LearningContentFactory(
LearningContentLearningModuleFactory(
title=title,
parent=parent,
contents=[
(
"learningmodule",
LearningModuleBlockFactory(url=wbt_url),
)
],
content_url=wbt_url,
)
competence_page = CompetencePage.objects.get(competence_id=competence_id)
@ -1063,42 +938,30 @@ def create_learning_sequence_transfer(parent, title, lc_praxis_title=None):
LearningSequenceFactory(title="Transfer", parent=parent, icon="it-icon-ls-end")
LearningUnitFactory(title="Transfer, Reflexion, Feedback", parent=parent)
if lc_praxis_title:
LearningContentFactory(
LearningContentPlaceholderFactory(
title=lc_praxis_title,
parent=parent,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title=f"Fachcheck {title}",
parent=parent,
)
LearningContentFactory(
LearningContentPlaceholderFactory(
title="Reflexion",
parent=parent,
)
LearningContentFactory(
title="Feedback",
LearningContentPlaceholderFactory(
parent=parent,
contents=[
(
"feedback",
FeedbackBlockFactory(),
)
],
)
def create_learning_content_beenden(parent):
LearningContentFactory(
LearningContentRichTextFactory(
title="Hier entsteht die Lernsequenz «beenden»",
parent=parent,
contents=[
(
"resource",
ResourceBlockFactory(
url="https://www.vbv.ch/",
description="Platzhalter Text für Lernsequenz «beenden»:",
text=RichText(
"""
content_url="https://www.vbv.ch/",
description=RichText(
"""
<h2 data-block-key="pwyep">Hier entsteht die Lernsequenz \u00abbeenden\u00bb</h2><h3
data-block-key="dppb3">Reflektiert</h3>
<img src="/static/media/demo_oktober/beenden.jpg" style="
@ -1156,35 +1019,20 @@ def create_learning_content_beenden(parent):
erster Linie darin, dass sehr einfach Inhalte strukturiert, erg\u00e4nzt und
bearbeitet werden k\u00f6nnen.</p>
"""
),
),
)
],
),
)
LearningContentFactory(
title="Feedback",
LearningContentPlaceholderFactory(
parent=parent,
contents=[
(
"feedback",
FeedbackBlockFactory(),
)
],
)
def create_learning_content_transferauftrag(title, parent):
LearningContentFactory(
LearningContentRichTextFactory(
title=title,
parent=parent,
contents=[
(
"assignment",
AssignmentBlockFactory(
url="https://www.vbv.ch/",
description="Platzhalter Text für Lernsequenz «üben»:",
text=RichText(
"""
content_url="https://www.vbv.ch/",
description=RichText(
"""
<h2 data-block-key="pwyep">Hier entsteht die Lernsequenz «üben»</h2><h3
data-block-key="dppb3">Praxisorientiert</h3>
<p data-block-key="bho67">Die Lernsequenz «üben» fordert die Teilnehmenden auf, in der eigenen Organisation anhand eines Transferauftrages eine entsprechende Handlungssituation durchzuführen.</p>
@ -1202,8 +1050,5 @@ def create_learning_content_transferauftrag(title, parent):
<a href="/static/media/demo_oktober/Transferauftrag_Der_erste_Eindruck_zaehlt_Musterlösung.pdf">PDF Transferauftrag: Der erste Eindruck zählt - Lösung</a>
</p>
"""
),
),
)
],
),
)

View File

@ -1,7 +1,6 @@
# Generated by Django 3.2.13 on 2023-03-31 16:22
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
import wagtail.blocks
import wagtail.fields
from django.db import migrations, models
@ -11,8 +10,9 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
("assignment", "0003_initial"),
("wagtailcore", "0083_workflowcontenttype"),
("course", "0001_initial"),
("wagtailcore", "0069_log_entry_jsonfield"),
]
operations = [
@ -39,7 +39,7 @@ class Migration(migrations.Migration):
bases=("wagtailcore.page",),
),
migrations.CreateModel(
name="LearningContent",
name="LearningContentAttendanceDay",
fields=[
(
"page_ptr",
@ -53,129 +53,172 @@ class Migration(migrations.Migration):
),
),
("minutes", models.PositiveIntegerField(default=15)),
(
"contents",
wagtail.fields.StreamField(
[
(
"video",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"resource",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
(
"text",
wagtail.blocks.RichTextBlock(
required=False
),
),
]
),
),
(
"exercise",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"learningmodule",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"online_training",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"media_library",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"document",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"test",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"book",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"assignment",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
(
"text",
wagtail.blocks.RichTextBlock(
required=False
),
),
]
),
),
(
"placeholder",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
("feedback", wagtail.blocks.StructBlock([])),
],
use_json_field=None,
),
),
("description", wagtail.fields.RichTextField(blank=True)),
("content_url", models.TextField(blank=True)),
],
options={
"verbose_name": "Learning Content",
"abstract": False,
},
bases=("wagtailcore.page",),
),
migrations.CreateModel(
name="LearningContentFeedback",
fields=[
(
"page_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.page",
),
),
("minutes", models.PositiveIntegerField(default=15)),
("description", wagtail.fields.RichTextField(blank=True)),
("content_url", models.TextField(blank=True)),
],
options={
"abstract": False,
},
bases=("wagtailcore.page",),
),
migrations.CreateModel(
name="LearningContentLearningModule",
fields=[
(
"page_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.page",
),
),
("minutes", models.PositiveIntegerField(default=15)),
("description", wagtail.fields.RichTextField(blank=True)),
("content_url", models.TextField(blank=True)),
],
options={
"abstract": False,
},
bases=("wagtailcore.page",),
),
migrations.CreateModel(
name="LearningContentMediaLibrary",
fields=[
(
"page_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.page",
),
),
("minutes", models.PositiveIntegerField(default=15)),
("description", wagtail.fields.RichTextField(blank=True)),
("content_url", models.TextField(blank=True)),
],
options={
"abstract": False,
},
bases=("wagtailcore.page",),
),
migrations.CreateModel(
name="LearningContentPlaceholder",
fields=[
(
"page_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.page",
),
),
("minutes", models.PositiveIntegerField(default=15)),
("description", wagtail.fields.RichTextField(blank=True)),
("content_url", models.TextField(blank=True)),
],
options={
"abstract": False,
},
bases=("wagtailcore.page",),
),
migrations.CreateModel(
name="LearningContentRichText",
fields=[
(
"page_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.page",
),
),
("minutes", models.PositiveIntegerField(default=15)),
("description", wagtail.fields.RichTextField(blank=True)),
("content_url", models.TextField(blank=True)),
],
options={
"abstract": False,
},
bases=("wagtailcore.page",),
),
migrations.CreateModel(
name="LearningContentTest",
fields=[
(
"page_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.page",
),
),
("minutes", models.PositiveIntegerField(default=15)),
("description", wagtail.fields.RichTextField(blank=True)),
("content_url", models.TextField(blank=True)),
],
options={
"abstract": False,
},
bases=("wagtailcore.page",),
),
migrations.CreateModel(
name="LearningContentVideo",
fields=[
(
"page_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.page",
),
),
("minutes", models.PositiveIntegerField(default=15)),
("description", wagtail.fields.RichTextField(blank=True)),
("content_url", models.TextField(blank=True)),
],
options={
"abstract": False,
},
bases=("wagtailcore.page",),
),
@ -270,4 +313,35 @@ class Migration(migrations.Migration):
},
bases=("wagtailcore.page",),
),
migrations.CreateModel(
name="LearningContentAssignment",
fields=[
(
"page_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.page",
),
),
("minutes", models.PositiveIntegerField(default=15)),
("description", wagtail.fields.RichTextField(blank=True)),
("content_url", models.TextField(blank=True)),
(
"content_assignment",
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
related_name="+",
to="assignment.assignment",
),
),
],
options={
"abstract": False,
},
bases=("wagtailcore.page",),
),
]

View File

@ -1,137 +0,0 @@
# Generated by Django 3.2.13 on 2023-04-04 08:28
import wagtail.blocks
import wagtail.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("learnpath", "0001_initial"),
]
operations = [
migrations.AlterField(
model_name="learningcontent",
name="contents",
field=wagtail.fields.StreamField(
[
(
"video",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"resource",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
("text", wagtail.blocks.RichTextBlock(required=False)),
]
),
),
(
"exercise",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"learningmodule",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"online_training",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"media_library",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"document",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"test",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"book",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
(
"assignment",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
(
"assignment",
wagtail.blocks.PageChooserBlock(
help_text="Choose the corresponding assignment.",
required=True,
),
),
]
),
),
(
"placeholder",
wagtail.blocks.StructBlock(
[
("description", wagtail.blocks.TextBlock()),
("url", wagtail.blocks.TextBlock()),
]
),
),
("feedback", wagtail.blocks.StructBlock([])),
(
"attendance_day",
wagtail.blocks.StructBlock(
[("description", wagtail.blocks.TextBlock())]
),
),
],
use_json_field=None,
),
),
]

View File

@ -2,28 +2,12 @@ import re
from django.db import models
from django.utils.text import slugify
from wagtail.admin.panels import FieldPanel, StreamFieldPanel
from wagtail.blocks import StreamBlock
from wagtail.fields import RichTextField, StreamField
from wagtail.admin.panels import FieldPanel, PageChooserPanel
from wagtail.fields import RichTextField
from wagtail.models import Page
from vbv_lernwelt.core.model_utils import find_available_slug
from vbv_lernwelt.course.models import CourseBasePage, CoursePage
from vbv_lernwelt.learnpath.models_learning_unit_content import (
AssignmentBlock,
AttendanceDayBlock,
BookBlock,
DocumentBlock,
ExerciseBlock,
FeedbackBlock,
LearningModuleBlock,
MediaLibraryBlock,
OnlineTrainingBlock,
PlaceholderBlock,
ResourceBlock,
TestBlock,
VideoBlock,
)
class LearningPath(CourseBasePage):
@ -80,7 +64,15 @@ class Circle(CourseBasePage):
subpage_types = [
"learnpath.LearningSequence",
"learnpath.LearningUnit",
"learnpath.LearningContent",
"learnpath.LearningContentAssignment",
"learnpath.LearningContentAttendanceDay",
"learnpath.LearningContentFeedback",
"learnpath.LearningContentLearningModule",
"learnpath.LearningContentMediaLibrary",
"learnpath.LearningContentPlaceholder",
"learnpath.LearningContentRichText",
"learnpath.LearningContentTest",
"learnpath.LearningContentVideo",
]
serialize_field_names = [
@ -227,47 +219,31 @@ class LearningUnit(CourseBasePage):
class LearningContent(CourseBasePage):
class Meta:
abstract = True
serialize_field_names = [
"minutes",
"contents",
"description",
"content_url",
]
parent_page_types = ["learnpath.Circle"]
subpage_types = []
minutes = models.PositiveIntegerField(default=15)
content_blocks = [
("video", VideoBlock()),
("resource", ResourceBlock()),
("exercise", ExerciseBlock()),
("learningmodule", LearningModuleBlock()),
("online_training", OnlineTrainingBlock()),
("media_library", MediaLibraryBlock()),
("document", DocumentBlock()),
("test", TestBlock()),
("book", BookBlock()),
("assignment", AssignmentBlock()),
("placeholder", PlaceholderBlock()),
("feedback", FeedbackBlock()),
("attendance_day", AttendanceDayBlock()),
]
contents = StreamField(
StreamBlock(content_blocks), blank=False, min_num=1, max_num=1
)
description = RichTextField(blank=True)
content_url = models.TextField(blank=True)
content_panels = [
FieldPanel("title", classname="full title"),
FieldPanel("minutes"),
StreamFieldPanel("contents"),
FieldPanel("content_url"),
FieldPanel("description"),
]
def get_admin_display_title(self):
display_title = ""
if len(self.contents) > 0:
display_title += f"{self.contents[0].block_type.capitalize()}: "
# if len(self.contents) > 0:
# display_title += f"{self.contents[0].block_type.capitalize()}: "
display_title += self.draft_title
@ -280,9 +256,6 @@ class LearningContent(CourseBasePage):
<span style="margin-left: 8px;">{self.get_admin_display_title()}</span>
</span>"""
class Meta:
verbose_name = "Learning Content"
def get_frontend_url(self):
r = re.compile(
r"^(?P<coursePart>.+?)-lp-circle-(?P<circlePart>.+?)-lc-(?P<lcPart>.+)$"
@ -297,6 +270,68 @@ class LearningContent(CourseBasePage):
super().save(**kwargs)
class LearningContentAttendanceDay(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
class LearningContentVideo(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
class LearningContentPlaceholder(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
class LearningContentFeedback(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
class LearningContentLearningModule(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
class LearningContentMediaLibrary(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
class LearningContentTest(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
class LearningContentRichText(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
class LearningContentAssignment(LearningContent):
serialize_field_names = LearningContent.serialize_field_names + [
"content_assignment_id",
]
parent_page_types = ["learnpath.Circle"]
subpage_types = []
content_assignment = models.ForeignKey(
"assignment.Assignment",
on_delete=models.PROTECT,
related_name="+",
)
content_panels = [
FieldPanel("title", classname="full title"),
FieldPanel("minutes"),
PageChooserPanel("content_assignment", "assignment.Assignment"),
FieldPanel("content_url"),
FieldPanel("description"),
]
def find_slug_with_parent_prefix(page, type_prefix, slug_postfix=None):
parent_slug = page.get_ancestors().exact_type(LearningPath, Circle).last().slug
if parent_slug:

View File

@ -1,106 +0,0 @@
from wagtail import blocks
from wagtail.blocks import PageChooserBlock
class AssignmentBlock(blocks.StructBlock):
description = blocks.TextBlock()
assignment = PageChooserBlock(
required=True, help_text="Choose the corresponding assignment."
)
class Meta:
icon = "media"
class BookBlock(blocks.StructBlock):
description = blocks.TextBlock()
url = blocks.TextBlock()
class Meta:
icon = "media"
class DocumentBlock(blocks.StructBlock):
description = blocks.TextBlock()
url = blocks.TextBlock()
class Meta:
icon = "media"
class ExerciseBlock(blocks.StructBlock):
description = blocks.TextBlock()
url = blocks.TextBlock()
class Meta:
icon = "media"
class LearningModuleBlock(blocks.StructBlock):
description = blocks.TextBlock()
url = blocks.TextBlock()
class Meta:
icon = "media"
class MediaLibraryBlock(blocks.StructBlock):
description = blocks.TextBlock()
url = blocks.TextBlock()
class Meta:
icon = "media"
class OnlineTrainingBlock(blocks.StructBlock):
description = blocks.TextBlock()
url = blocks.TextBlock()
class Meta:
icon = "media"
class ResourceBlock(blocks.StructBlock):
description = blocks.TextBlock()
url = blocks.TextBlock()
text = blocks.RichTextBlock(required=False)
class Meta:
icon = "media"
class TestBlock(blocks.StructBlock):
description = blocks.TextBlock()
url = blocks.TextBlock()
class Meta:
icon = "media"
class VideoBlock(blocks.StructBlock):
# TODO: Possible video Types for the user, upload file, add URL
description = blocks.TextBlock()
url = blocks.TextBlock()
class Meta:
icon = "media"
class PlaceholderBlock(blocks.StructBlock):
description = blocks.TextBlock()
url = blocks.TextBlock()
class Meta:
icon = "media"
class FeedbackBlock(blocks.StructBlock):
class Meta:
icon = "media"
class AttendanceDayBlock(blocks.StructBlock):
description = blocks.TextBlock()
class Meta:
icon = "media"

View File

@ -2,27 +2,20 @@ import wagtail_factories
from vbv_lernwelt.learnpath.models import (
Circle,
LearningContent,
LearningContentAssignment,
LearningContentAttendanceDay,
LearningContentFeedback,
LearningContentLearningModule,
LearningContentMediaLibrary,
LearningContentPlaceholder,
LearningContentRichText,
LearningContentTest,
LearningContentVideo,
LearningPath,
LearningSequence,
LearningUnit,
Topic,
)
from vbv_lernwelt.learnpath.models_learning_unit_content import (
AssignmentBlock,
AttendanceDayBlock,
BookBlock,
DocumentBlock,
ExerciseBlock,
FeedbackBlock,
LearningModuleBlock,
MediaLibraryBlock,
OnlineTrainingBlock,
PlaceholderBlock,
ResourceBlock,
TestBlock,
VideoBlock,
)
class LearningPathFactory(wagtail_factories.PageFactory):
@ -40,97 +33,6 @@ class TopicFactory(wagtail_factories.PageFactory):
model = Topic
class VideoBlockFactory(wagtail_factories.StructBlockFactory):
url = "https://www.youtube.com/embed/qhPIfxS2hvI"
description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam"
class Meta:
model = VideoBlock
class AssignmentBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Auftrag"
class Meta:
model = AssignmentBlock
class BookBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Buch"
class Meta:
model = BookBlock
class DocumentBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Dokument"
class Meta:
model = DocumentBlock
class PlaceholderBlockFactory(wagtail_factories.StructBlockFactory):
description = "Platzhalter"
class Meta:
model = PlaceholderBlock
class ExerciseBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Übung"
class Meta:
model = ExerciseBlock
class LearningModuleBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Lernmodul"
class Meta:
model = LearningModuleBlock
class ResourceBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Hilfsmittel"
class Meta:
model = ResourceBlock
class OnlineTrainingBlockFactory(wagtail_factories.StructBlockFactory):
url = "https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/rise_cmi5_test_export/scormcontent/index.html"
description = "Beispiel Rise Modul"
class Meta:
model = OnlineTrainingBlock
class TestBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Test"
class Meta:
model = TestBlock
class FeedbackBlockFactory(wagtail_factories.StructBlockFactory):
class Meta:
model = FeedbackBlock
class MediaLibraryBlockFactory(wagtail_factories.StructBlockFactory):
description = "Sie erreichen die Mediathek mit einem Klick auf den unteren Link"
class Meta:
model = MediaLibraryBlock
class AttendanceDayBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Präsenztag"
class Meta:
model = AttendanceDayBlock
class CircleFactory(wagtail_factories.PageFactory):
title = "Basis"
description = """
@ -181,10 +83,91 @@ class LearningUnitFactory(wagtail_factories.PageFactory):
model = LearningUnit
class LearningContentFactory(wagtail_factories.PageFactory):
class LearningContentAttendanceDayFactory(wagtail_factories.PageFactory):
title = "Platzhalter Inhalt"
contents = [("placeholder", PlaceholderBlockFactory())]
minutes = 15
description = "Platzhalter Beschreibung"
content_url = ""
class Meta:
model = LearningContent
model = LearningContentAttendanceDay
class LearningContentVideoFactory(wagtail_factories.PageFactory):
title = "Platzhalter Video"
minutes = 15
content_url = "https://www.youtube.com/embed/qhPIfxS2hvI"
description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
class Meta:
model = LearningContentVideo
class LearningContentPlaceholderFactory(wagtail_factories.PageFactory):
title = "Platzhalter Video"
minutes = 15
content_url = ""
description = "Platzhalter"
class Meta:
model = LearningContentPlaceholder
class LearningContentFeedbackFactory(wagtail_factories.PageFactory):
title = "Feedback"
minutes = 15
content_url = ""
description = ""
class Meta:
model = LearningContentFeedback
class LearningContentLearningModuleFactory(wagtail_factories.PageFactory):
title = "Beispiel Lernmodul"
minutes = 15
content_url = ""
description = ""
class Meta:
model = LearningContentLearningModule
class LearningContentMediaLibraryFactory(wagtail_factories.PageFactory):
title = "Mediathek"
minutes = 15
content_url = ""
description = ""
class Meta:
model = LearningContentMediaLibrary
class LearningContentTestFactory(wagtail_factories.PageFactory):
title = "Fachcheck"
minutes = 15
content_url = ""
description = ""
class Meta:
model = LearningContentTest
class LearningContentRichTextFactory(wagtail_factories.PageFactory):
title = "Rich Text"
minutes = 15
content_url = ""
description = ""
class Meta:
model = LearningContentRichText
class LearningContentAssignmentFactory(wagtail_factories.PageFactory):
title = "Geleitete Fallarbeit"
minutes = 15
content_url = ""
description = ""
class Meta:
model = LearningContentAssignment

View File

@ -2,7 +2,7 @@ from django.test import TestCase
from vbv_lernwelt.core.create_default_users import create_default_users
from vbv_lernwelt.course.creators.test_course import create_test_course
from vbv_lernwelt.learnpath.models import LearningContent
from vbv_lernwelt.learnpath.models import LearningContentPlaceholder
class SaveSlugTestCase(TestCase):
@ -11,7 +11,7 @@ class SaveSlugTestCase(TestCase):
create_test_course(include_uk=False)
def test_save_willHandleSlug(self):
lc_fachcheck = LearningContent.objects.get(title="Fachcheck Reisen")
lc_fachcheck = LearningContentPlaceholder.objects.get(title="Fachcheck Reisen")
self.assertEqual(
lc_fachcheck.slug, "test-lehrgang-lp-circle-reisen-lc-fachcheck-reisen"
)
@ -19,7 +19,7 @@ class SaveSlugTestCase(TestCase):
# only changing minutes should not change slug
lc_fachcheck.minutes = 135
lc_fachcheck.save()
lc_fachcheck = LearningContent.objects.get(id=lc_fachcheck.id)
lc_fachcheck = LearningContentPlaceholder.objects.get(id=lc_fachcheck.id)
self.assertEqual(
lc_fachcheck.slug, "test-lehrgang-lp-circle-reisen-lc-fachcheck-reisen"
)
@ -27,7 +27,7 @@ class SaveSlugTestCase(TestCase):
# changing title should change slug
lc_fachcheck.title = "Fachcheck Foobar"
lc_fachcheck.save()
lc_fachcheck = LearningContent.objects.get(id=lc_fachcheck.id)
lc_fachcheck = LearningContentPlaceholder.objects.get(id=lc_fachcheck.id)
self.assertEqual(
lc_fachcheck.slug, "test-lehrgang-lp-circle-reisen-lc-fachcheck-foobar"
)

View File

@ -8,9 +8,9 @@ class MediaLibraryContentBlock(blocks.StructBlock):
link_display_text = blocks.CharBlock(max_length=255, default="Link öffnen")
url = blocks.TextBlock(default="", required=False)
open_window = blocks.BooleanBlock(default=False)
page = blocks.PageChooserBlock(
page_type=["learnpath.LearningContent"], required=False
)
# page = blocks.PageChooserBlock(
# page_type=["learnpath.LearningContent"], required=False
# )
class ExternalLinkBlock(MediaLibraryContentBlock):

View File

@ -1,4 +1,4 @@
# Generated by Django 3.2.13 on 2023-03-31 16:22
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
import taggit.managers
@ -15,10 +15,10 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("wagtailcore", "0083_workflowcontenttype"),
("course", "0002_initial"),
("taggit", "0004_alter_taggeditem_content_type_alter_taggeditem_tag"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("wagtailcore", "0069_log_entry_jsonfield"),
]
operations = [
@ -139,15 +139,6 @@ class Migration(migrations.Migration):
default=False
),
),
(
"page",
wagtail.blocks.PageChooserBlock(
page_type=[
"learnpath.LearningContent"
],
required=False,
),
),
]
),
),
@ -193,15 +184,6 @@ class Migration(migrations.Migration):
default=False
),
),
(
"page",
wagtail.blocks.PageChooserBlock(
page_type=[
"learnpath.LearningContent"
],
required=False,
),
),
]
),
),
@ -247,15 +229,6 @@ class Migration(migrations.Migration):
default=False
),
),
(
"page",
wagtail.blocks.PageChooserBlock(
page_type=[
"learnpath.LearningContent"
],
required=False,
),
),
]
),
),
@ -301,15 +274,6 @@ class Migration(migrations.Migration):
default=False
),
),
(
"page",
wagtail.blocks.PageChooserBlock(
page_type=[
"learnpath.LearningContent"
],
required=False,
),
),
]
),
),

View File

@ -1,4 +1,4 @@
# Generated by Django 3.2.13 on 2023-02-08 08:43
# Generated by Django 3.2.13 on 2023-05-11 20:06
import django.db.models.deletion
import django.utils.timezone
@ -8,6 +8,7 @@ from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [