Merged in feature/VBV-338-mediathek (pull request #89)

Feature/VBV-338 mediathek

Approved-by: Christian Cueni
This commit is contained in:
Daniel Egger 2023-05-22 07:03:35 +00:00 committed by Christian Cueni
commit 51eb358a43
19 changed files with 309 additions and 977 deletions

View File

@ -21,7 +21,8 @@ const breakpoints = useBreakpoints(breakpointsTailwind);
const userStore = useUserStore();
const courseSessionsStore = useCourseSessionsStore();
const notificationsStore = useNotificationsStore();
const { inCockpit, inCompetenceProfile, inCourse, inLearningPath } = useRouteLookups();
const { inCockpit, inCompetenceProfile, inCourse, inLearningPath, inMediaLibrary } =
useRouteLookups();
const { t } = useI18n();
const state = reactive({
@ -135,17 +136,29 @@ onMounted(() => {
</div>
<div class="flex items-stretch justify-start space-x-8">
<router-link
v-if="inCourse() && courseSessionsStore.currentCourseSession"
:to="courseSessionsStore.currentCourseSession.media_library_url"
data-cy="medialibrary-link"
class="nav-item-no-mobile"
:class="{ 'nav-item--active': inMediaLibrary() }"
>
<it-icon-media-library class="h-8 w-8" />
</router-link>
<!-- Notification Bell & Menu -->
<div v-if="userStore.loggedIn" class="nav-item">
<div v-if="userStore.loggedIn" class="nav-item leading-none">
<NotificationPopover>
<template #toggleButtonContent>
<div class="flex">
<it-icon-notification class="h-6 w-6" />
<div
v-if="notificationsStore.hasUnread"
aria-label="unread notifications"
class="mt-1 h-1.5 w-1.5 rounded-full bg-sky-500"
/>
<div class="relative h-8 w-8">
<div>
<it-icon-notification class="h-8 w-8" />
<div
v-if="notificationsStore.hasUnread"
aria-label="unread notifications"
class="absolute inset-y-0 right-0 h-1.5 w-1.5 rounded-full bg-sky-500"
/>
</div>
</div>
</template>
<template #popoverContent>
@ -156,7 +169,7 @@ onMounted(() => {
<div
v-if="selectedCourseSessionTitle"
class="hidden items-center lg:inline-flex"
class="nav-item hidden items-center lg:inline-flex"
>
<div class="">
{{ selectedCourseSessionTitle }}
@ -203,6 +216,10 @@ onMounted(() => {
@apply inline-flex items-center border-b-4 border-transparent px-1 pt-1 text-white hover:text-sky-500;
}
.nav-item-no-mobile {
@apply hidden items-center border-b-4 border-transparent px-1 pt-1 text-white hover:text-sky-500 lg:inline-flex;
}
.nav-item--active {
@apply border-sky-500;
}

View File

@ -62,6 +62,14 @@ const clickLink = (to: string | undefined) => {
{{ $t("cockpit.title") }}
</button>
</li>
<li class="mt-6">
<button
data-cy="medialibrary-link"
@click="clickLink(`${courseSession?.media_library_url}`)"
>
{{ $t("mediaLibrary.title") }}
</button>
</li>
</ul>
</div>
<div class="mt-6 border-b pb-6">
@ -75,11 +83,6 @@ const clickLink = (to: string | undefined) => {
Shop
</a>
</li>
<li class="mt-6">
<button data-cy="medialibrary-link" @click="clickLink(mediaUrl)">
{{ $t("mediaLibrary.title") }}
</button>
</li>
</ul>
</div>
<button

View File

@ -10,7 +10,7 @@ import { Popover, PopoverButton, PopoverPanel } from "@headlessui/vue";
<PopoverPanel>
<div
class="absolute right-0 mt-2 bg-white px-4 py-4 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none lg:right-2"
class="absolute right-0 z-10 mt-2 bg-white px-4 py-4 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none lg:right-2"
>
<!-- To close the popover withing your content, use the 'PopoverButton'
https://headlessui.com/vue/popover#closing-popovers-manually

View File

@ -15,14 +15,14 @@ import PlaceholderBlock from "./blocks/PlaceholderBlock.vue";
import RichTextBlock from "./blocks/RichTextBlock.vue";
import VideoBlock from "./blocks/VideoBlock.vue";
log.debug("LearningContent.vue setup");
const circleStore = useCircleStore();
const props = defineProps<{
learningContent: LearningContent;
}>();
log.debug("LearningContentParent setup", props.learningContent);
// can't use the type as component name, as some are reserved HTML components, e.g. video
const COMPONENTS: Record<LearningContentType, Component> = {
"learnpath.LearningContentAssignment": AssignmentBlock,

View File

@ -1,13 +1,13 @@
<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();
import log from "loglevel";
const props = defineProps<{
content: LearningContentMediaLibrary;
}>();
log.debug("LearningContentMediaLibraryBlock.vue created");
</script>
<template>
@ -16,13 +16,17 @@ const props = defineProps<{
:learning-content-type="props.content.content_type"
>
<div class="container-medium">
<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"
<!-- eslint-disable vue/no-v-html -->
<p class="text-large my-4 lg:my-8" v-html="props.content.description"></p>
<a
:href="`${props.content.content_url}`"
target="_blank"
data-cy="media-library-link"
class="btn-primary inline-flex items-center"
>
Mediathek öffnen
</router-link>
Handlungsfeld anzeigen
<it-icon-external-link class="ml-2 h-5 w-5"></it-icon-external-link>
</a>
</div>
</LearningContentSimpleLayout>
</template>

View File

@ -5,11 +5,11 @@ import * as log from "loglevel";
import { computed } from "vue";
const props = defineProps<{
mediaLibraryPageSlug: string;
courseSlug: string;
mediaCategorySlug: string;
}>();
log.debug("MLMediaListPage created", props.mediaCategorySlug);
log.debug("MLMediaListPage created", props.courseSlug);
const mediaStore = useMediaLibraryStore();

View File

@ -6,16 +6,16 @@ import { onMounted } from "vue";
log.debug("MediaLibraryView created");
const props = defineProps<{
mediaLibraryPageSlug: string;
courseSlug: string;
}>();
const mediaLibraryStore = useMediaLibraryStore();
onMounted(async () => {
log.debug("MediaLibraryView mounted", props.mediaLibraryPageSlug);
log.debug("MediaLibraryView mounted", props.courseSlug);
try {
await mediaLibraryStore.loadMediaLibraryPage(props.mediaLibraryPageSlug);
await mediaLibraryStore.loadMediaLibraryPage(`${props.courseSlug}-media`);
} catch (error) {
log.error(error);
}

View File

@ -31,7 +31,7 @@ const router = createRouter({
component: DashboardPage,
},
{
path: "/media/:mediaLibraryPageSlug",
path: "/course/:courseSlug/media",
props: true,
component: () => import("@/pages/mediaLibrary/MLParentPage.vue"),
children: [

View File

@ -23,7 +23,8 @@ export function useRouteLookups() {
}
function inMediaLibrary() {
return route.path.startsWith("/media/");
const regex = new RegExp("/course/[^/]+/media");
return regex.test(route.path);
}
return { inMediaLibrary, inCockpit, inLearningPath, inCompetenceProfile, inCourse };

View File

@ -4,7 +4,7 @@ describe("circle page", () => {
beforeEach(() => {
cy.manageCommand("cypress_reset");
login("admin", "test");
login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/learn/fahrzeug");
});
@ -16,17 +16,17 @@ describe("circle page", () => {
cy.get('[data-cy="circle-title"]').should("contain", "Fahrzeug");
cy.get(
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-mediathek-fahrzeug-checkbox"] > .cy-checkbox'
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"] > .cy-checkbox'
).click();
cy.get(
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-mediathek-fahrzeug-checkbox"] > .cy-checkbox-checked'
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"] > .cy-checkbox-checked'
).should("have.class", "cy-checkbox-checked");
// completion data should still be there after reload
cy.reload();
cy.get(
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-mediathek-fahrzeug-checkbox"] > .cy-checkbox-checked'
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"] > .cy-checkbox-checked'
).should("have.class", "cy-checkbox-checked");
});
@ -41,7 +41,10 @@ describe("circle page", () => {
cy.get('[data-cy="complete-and-continue"]').click({ force: true });
cy.get('[data-cy="ls-continue-button"]').click();
cy.get('[data-cy="lc-title"]').should("contain", "Mediathek Fahrzeug");
cy.get('[data-cy="lc-title"]').should(
"contain",
"Handlungsfeld «Fahrzeug»"
);
cy.get('[data-cy="complete-and-continue"]').click({ force: true });
cy.get('[data-cy="ls-continue-button"]').click();
@ -52,7 +55,7 @@ describe("circle page", () => {
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-verschaffe-dir-einen-überblick-checkbox"] > .cy-checkbox-checked'
).should("have.class", "cy-checkbox-checked");
cy.get(
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-mediathek-fahrzeug-checkbox"] > .cy-checkbox-checked'
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"] > .cy-checkbox-checked'
).should("have.class", "cy-checkbox-checked");
cy.get(
@ -72,12 +75,18 @@ describe("circle page", () => {
cy.get('[data-cy="ls-continue-button"]').should("contain", "Weiter geht's");
cy.get('[data-cy="ls-continue-button"]').click();
cy.get('[data-cy="lc-title"]').should("contain", "Mediathek Fahrzeug");
cy.get('[data-cy="lc-title"]').should(
"contain",
"Handlungsfeld «Fahrzeug»"
);
});
it("can open learning content by url", () => {
cy.visit("/course/test-lehrgang/learn/fahrzeug/mediathek-fahrzeug");
cy.get('[data-cy="lc-title"]').should("contain", "Mediathek Fahrzeug");
cy.visit("/course/test-lehrgang/learn/fahrzeug/handlungsfeld-fahrzeug");
cy.get('[data-cy="lc-title"]').should(
"contain",
"Handlungsfeld «Fahrzeug»"
);
cy.get('[data-cy="close-learning-content"]').click();
cy.get('[data-cy="circle-title"]').should("contain", "Fahrzeug");

View File

@ -3,35 +3,25 @@ import { login } from "./helpers";
describe("learningPath page", () => {
beforeEach(() => {
cy.manageCommand("cypress_reset");
login("test-student1@example.com", "test");
cy.visit("/course/test-lehrgang/learn");
});
it("can open learningPath page", () => {
login("admin", "test");
cy.visit("/course/versicherungsvermittler-in/learn");
cy.get('[data-cy="learning-path-title"]').should(
"contain",
"Versicherungsvermittler/-in"
"Test Lehrgang"
);
});
it("can click on circle to open it", () => {
login("admin", "test");
cy.visit("/course/versicherungsvermittler-in/learn");
cy.get('[data-cy="circle-Fahrzeug"]').click({ force: true });
cy.url().should(
"include",
"/course/versicherungsvermittler-in/learn/fahrzeug"
);
cy.url().should("include", "/course/test-lehrgang/learn/fahrzeug");
cy.get('[data-cy="circle-title"]').should("contain", "Fahrzeug");
});
it("switch between list and path view", () => {
login("admin", "test");
cy.visit("/course/versicherungsvermittler-in/learn");
cy.get('[data-cy="lp-path-view"]').should("be.visible");
cy.get('[data-cy="view-switch"]').click();
cy.get('[data-cy="lp-list-view"]').should("be.visible");
@ -40,21 +30,18 @@ describe("learningPath page", () => {
});
it("weiter gehts button will open next circle", () => {
login("admin", "test");
cy.visit("/course/versicherungsvermittler-in/learn");
// first click will open first circle
cy.get('[data-cy="lp-continue-button"]')
.filter(":visible")
.should("contain", "Los geht's")
.click();
cy.get('[data-cy="circle-title"]').should("contain", "Basis");
cy.get('[data-cy="circle-title"]').should("contain", "Fahrzeug");
cy.get('[data-cy="back-to-learning-path-button"]').click();
// mark a learning content in second circle
cy.get('[data-cy="circle-Fahrzeug"]').click({ force: true });
cy.get('[data-cy="circle-Reisen"]').click({ force: true });
cy.get(
'[data-cy="versicherungsvermittler-in-lp-circle-fahrzeug-lc-rafael-fasel-wechselt-sein-auto-einstieg-checkbox"] > .cy-checkbox'
'[data-cy="test-lehrgang-lp-circle-reisen-lc-fachcheck-reisen-checkbox"] > .cy-checkbox'
).click();
cy.get('[data-cy="back-to-learning-path-button"]').click();
@ -63,6 +50,6 @@ describe("learningPath page", () => {
.filter(":visible")
.should("contain", "Weiter geht's")
.click();
cy.get('[data-cy="circle-title"]').should("contain", "Fahrzeug");
cy.get('[data-cy="circle-title"]').should("contain", "Reisen");
});
});

View File

@ -13,40 +13,34 @@ describe("login", () => {
it("can login to app with username/password", () => {
cy.visit("/");
cy.get("#username").type("admin");
cy.get("#username").type("test-student1@example.com");
cy.get("#password").type("test");
cy.get('[data-cy="login-button"]').click();
cy.request("/api/core/me").its("status").should("eq", 200);
cy.get('[data-cy="welcome-message"]').should(
"contain",
"Willkommen, Peter"
);
cy.get('[data-cy="welcome-message"]').should("contain", "Willkommen, Test");
});
it("can login with helper function", () => {
login("admin", "test");
login("test-student1@example.com", "test");
cy.visit("/");
cy.request("/api/core/me").its("status").should("eq", 200);
cy.get('[data-cy="welcome-message"]').should(
"contain",
"Willkommen, Peter"
);
cy.get('[data-cy="welcome-message"]').should("contain", "Willkommen, Test");
});
it("login will redirect to requestet page", () => {
cy.visit("/course/versicherungsvermittler-in/learn");
cy.visit("/course/test-lehrgang/learn");
cy.get("h1").should("contain", "Login");
cy.get("#username").type("admin");
cy.get("#username").type("test-student1@example.com");
cy.get("#password").type("test");
cy.get('[data-cy="login-button"]').click();
cy.get('[data-cy="learning-path-title"]').should(
"contain",
"Versicherungsvermittler"
"Test Lehrgang"
);
});
});

View File

@ -4,13 +4,11 @@ describe("MediaLibrary", () => {
beforeEach(() => {
cy.manageCommand("cypress_reset");
login("admin", "test");
login("test-student1@example.com", "test");
});
it.skip("should be accessible via link in header", () => {
// der Link zur Mediathek fehlt aktuell im Header (auch im Design)
// das ganze Konzept der Mediathek wird noch überdacht -> skip
cy.visit("/course/test-lehrgang");
it("should be accessible via link in header", () => {
cy.visit("/course/test-lehrgang/learn");
cy.get('[data-cy="medialibrary-link"]').click();
cy.get('[data-cy="Handlungsfelder-link"]').click();
cy.get('[data-cy="Fahrzeug-link"]').click();
@ -18,9 +16,21 @@ describe("MediaLibrary", () => {
});
it("should be accessible via direct url", () => {
cy.visit("/media/test-lehrgang-media");
cy.visit("/course/test-lehrgang/media");
cy.get('[data-cy="Handlungsfelder-link"]').click();
cy.get('[data-cy="Fahrzeug-link"]').click();
cy.get('[data-cy="hf-title"]').should("contain", "Fahrzeug");
});
it("handlungsfeld should be accessible via direct url", () => {
cy.visit("/course/test-lehrgang/media/category/fahrzeug");
cy.get('[data-cy="hf-title"]').should("contain", "Fahrzeug");
});
it("should be accessible via learning path circle", () => {
cy.visit("/course/test-lehrgang/learn/fahrzeug/handlungsfeld-fahrzeug");
cy.get('[data-cy="media-library-link"]')
.invoke("attr", "href")
.should("contain", "/media/category/fahrzeug");
});
});

View File

@ -217,9 +217,13 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
),
)
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
title=f"Handlungsfeld «{title}»",
parent=circle,
content_url=f"/media/überbetriebliche-kurse-media/category/{slugify(title)}",
description=RichText(
f"<p>In der Mediathek unter dem Handlungsfeld «{title}» findest du alle relevanten Ressourcen für deine Fachkompetenzen.</p>"
f"<p>Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.</p>"
),
content_url=f"/course/{lp.get_course().slug}/media/category/{slugify(title)}",
)
LearningContentPlaceholderFactory(
title="Vorbereitungsauftrag",

View File

@ -1,5 +1,6 @@
import random
import djclick as click
from wagtail.models import Page
from vbv_lernwelt.assignment.creators.create_assignments import create_uk_assignments
from vbv_lernwelt.assignment.models import Assignment
@ -11,6 +12,7 @@ from vbv_lernwelt.competence.create_uk_competence_profile import (
from vbv_lernwelt.competence.create_vv_new_competence_profile import (
create_vv_new_competence_profile,
)
from vbv_lernwelt.competence.models import PerformanceCriteria
from vbv_lernwelt.core.create_default_users import default_users
from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.consts import (
@ -27,7 +29,7 @@ from vbv_lernwelt.course.management.commands.create_uk_course import (
create_uk_fr_learning_path,
create_uk_learning_path,
)
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
from vbv_lernwelt.course.models import CoursePage, CourseSession, CourseSessionUser
from vbv_lernwelt.course.services import mark_course_completion
from vbv_lernwelt.feedback.creators.create_demo_feedback import create_feedback
from vbv_lernwelt.learnpath.create_vv_new_learning_path import (
@ -35,6 +37,7 @@ from vbv_lernwelt.learnpath.create_vv_new_learning_path import (
)
from vbv_lernwelt.learnpath.models import (
Circle,
LearningContent,
LearningContentAssignment,
LearningContentAttendanceDay,
)
@ -334,772 +337,50 @@ def create_course_uk_de_assignment_completion_data(assignment, course_session, u
def create_course_uk_de_completion_data(course_session):
# initial completion data
for slug, status, email in [
(
"überbetriebliche-kurse-competence-crit-c3pvük5-allgemein",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-mediathek",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-vorbereitungsauftrag",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-selbsteinschätzung",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-unterlagen-für-den-unterricht",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-competence-crit-e4pvük2-allgemein",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-mediathek",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-wissens-und-verständnisfragen",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-vorbereitungsauftrag",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-competence-crit-e4pvük1-allgemein",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-reflexion",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-feedback",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-vorbereitungsauftrag",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük4-allgemein",
"fail",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-verschaffe-dir-einen-überblick",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-kickoff-ls-training",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-ls-transfer",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lu-vorbereitung",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük3-allgemein",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-vorbereitungsauftrag",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-ls-transfer",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-ls-transfer",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-reflexion",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-feedback",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük2-allgemein",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-mediathek-fahrzeug",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-vorbereitungsauftrag",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-wissens-und-verständnisfragen",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-ls-training",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük1-allgemein",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-vorbereitungsauftrag",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-verschaffe-dir-einen-überblick",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-unterlagen-für-den-unterricht",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-competence-crit-c3pvük7-allgemein",
"fail",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-selbsteinschätzung",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-selbsteinschätzung",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-reflexion",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-competence-crit-c3pvük11-allgemein",
"fail",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-mediathek-haushalt-teil-1",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-feedback",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-unterlagen-für-den-unterricht",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-mediathek-haushalt-teil-1",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-selbsteinschätzung",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-vorbereitungsauftrag",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-verschaffe-dir-einen-überblick",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-reflexion",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-mediathek-haushalt-teil-1",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-vorbereitungsauftrag",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-verschaffe-dir-einen-überblick",
"success",
"michael.meier@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lu-vorbereitung",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-competence-crit-c3pvük5-allgemein",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-mediathek",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-vorbereitungsauftrag",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-selbsteinschätzung",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-unterlagen-für-den-unterricht",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-competence-crit-e4pvük2-allgemein",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-mediathek",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-wissens-und-verständnisfragen",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-vorbereitungsauftrag",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-competence-crit-e4pvük1-allgemein",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-reflexion",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-feedback",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-vorbereitungsauftrag",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük4-allgemein",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-verschaffe-dir-einen-überblick",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-kickoff-ls-training",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-ls-transfer",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük3-allgemein",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-vorbereitungsauftrag",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-ls-transfer",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-ls-transfer",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-reflexion",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-feedback",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük2-allgemein",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-mediathek-fahrzeug",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-vorbereitungsauftrag",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-wissens-und-verständnisfragen",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-ls-training",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük1-allgemein",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-vorbereitungsauftrag",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-verschaffe-dir-einen-überblick",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-unterlagen-für-den-unterricht",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-competence-crit-c3pvük7-allgemein",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-competence-crit-c3pvük11-allgemein",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-selbsteinschätzung",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-selbsteinschätzung",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-reflexion",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-mediathek-haushalt-teil-1",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-verschaffe-dir-einen-überblick",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-unterlagen-für-den-unterricht",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-vorbereitungsauftrag",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-verschaffe-dir-einen-überblick",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-wissens-und-verständnisfragen",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-vorbereitungsauftrag",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-unterlagen-für-den-unterricht",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-mediathek-haushalt-teil-1",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-selbsteinschätzung",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-vorbereitungsauftrag",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-verschaffe-dir-einen-überblick",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-reflexion",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-mediathek-haushalt-teil-2",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-verschaffe-dir-einen-überblick",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-mediathek-haushalt-teil-1",
"success",
"lina.egger@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lu-vorbereitung",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-competence-crit-c3pvük5-allgemein",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-mediathek",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-vorbereitungsauftrag",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-selbsteinschätzung",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-unterlagen-für-den-unterricht",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-competence-crit-e4pvük2-allgemein",
"fail",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-mediathek",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-wissens-und-verständnisfragen",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-vorbereitungsauftrag",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-competence-crit-e4pvük1-allgemein",
"fail",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-reflexion",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-feedback",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-vorbereitungsauftrag",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük4-allgemein",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-verschaffe-dir-einen-überblick",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-kickoff-ls-training",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-ls-transfer",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük3-allgemein",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-vorbereitungsauftrag",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-basis-lc-feedback",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük2-allgemein",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-mediathek-fahrzeug",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-wissens-und-verständnisfragen",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-vorbereitungsauftrag",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-ls-training",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-competence-crit-d2pvük1-allgemein",
"fail",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-vorbereitungsauftrag",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-verschaffe-dir-einen-überblick",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-unterlagen-für-den-unterricht",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-competence-crit-c3pvük7-allgemein",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-competence-crit-c3pvük11-allgemein",
"fail",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-selbsteinschätzung",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-selbsteinschätzung",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-reflexion",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-mediathek-haushalt-teil-1",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-feedback",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-verschaffe-dir-einen-überblick",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-wissens-und-verständnisfragen",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-fahrzeug-lc-verschaffe-dir-einen-überblick",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-unterlagen-für-den-unterricht",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-mediathek-haushalt-teil-1",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-1-lc-selbsteinschätzung",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-vorbereitungsauftrag",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-verschaffe-dir-einen-überblick",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-reflexion",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-selbsteinschätzung",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-feedback",
"success",
"evelyn.schmid@example.com",
),
(
"überbetriebliche-kurse-lp-circle-haushalt-teil-2-lc-mediathek-haushalt-teil-2",
"success",
"evelyn.schmid@example.com",
),
]:
circles = Circle.objects.filter(slug__startswith="überbetriebliche-kurse-lp-circle")
for circle in circles:
for index, lc in enumerate(circle.get_descendants().type(LearningContent)):
mark_course_completion(
str(lc.translation_key),
User.objects.get(email="lina.egger@example.com"),
course_session=course_session,
completion_status="success",
)
random_number = random.randint(1, 3)
if index % random_number == 0:
mark_course_completion(
str(lc.translation_key),
User.objects.get(email="michael.meier@example.com"),
course_session=course_session,
completion_status="success",
)
performance_criteria = (
CoursePage.objects.get(course_id=COURSE_UK)
.get_descendants()
.type(PerformanceCriteria)
)
for index, pc in enumerate(performance_criteria):
mark_course_completion(
Page.objects.get(slug=slug).translation_key,
User.objects.get(email=email),
str(pc.translation_key),
User.objects.get(email="lina.egger@example.com"),
course_session=course_session,
completion_status=status,
completion_status="success",
)
random_number = random.randint(1, 4)
if index % random_number == 0:
mark_course_completion(
str(pc.translation_key),
User.objects.get(email="michael.meier@example.com"),
course_session=course_session,
completion_status="success",
)
if index % random_number == 1:
mark_course_completion(
str(pc.translation_key),
User.objects.get(email="michael.meier@example.com"),
course_session=course_session,
completion_status="fail",
)

View File

@ -3,6 +3,7 @@ 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.assignment.models import Assignment
@ -166,14 +167,23 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
"Gesundheit",
]:
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
title=f"Handlungsfeld «{title}»",
parent=circle,
content_url=f"/media/überbetriebliche-kurse-media/category/{slugify(first_title)}",
description=RichText(
f"<p>In der Mediathek unter dem Handlungsfeld «{title}» findest du alle relevanten Ressourcen für deine Fachkompetenzen.</p>"
f"<p>Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.</p>"
),
content_url=f"/course/überbetriebliche-kurse/media/category/{slugify(first_title)}",
)
else:
LearningContentPlaceholderFactory(
title="Mediathek",
LearningContentMediaLibraryFactory(
title=f"Handlungsfeld «{title}»",
parent=circle,
description=RichText(
f"<p>In der Mediathek unter dem Handlungsfeld «{title}» findest du alle relevanten Ressourcen für deine Fachkompetenzen.</p>"
f"<p>Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.</p>"
),
content_url=f"/course/überbetriebliche-kurse/media",
)
LearningContentPlaceholderFactory(
@ -224,10 +234,14 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
title="Verschaffe dir einen Überblick",
parent=circle,
)
LearningContentPlaceholderFactory(
title=f"Mediathek {title}",
LearningContentMediaLibraryFactory(
title=f"Handlungsfeld «{title}»",
parent=circle,
content_url=f"/media/überbetriebliche-kurse-media/category/{slugify(title)}",
description=RichText(
f"<p>In der Mediathek unter dem Handlungsfeld «{title}» findest du alle relevanten Ressourcen für deine Fachkompetenzen.</p>"
f"<p>Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.</p>"
),
content_url=f"/course/überbetriebliche-kurse/media/category/{slugify(title)}",
)
LearningContentPlaceholderFactory(
title="Vorbereitungsauftrag",

View File

@ -164,6 +164,7 @@ def create_circle_basis(lp, title="Basis"):
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningContentPlaceholderFactory(
title="Qualifikationsprofil und Zulassungsprüfung",
@ -186,6 +187,7 @@ def create_circle_basis(lp, title="Basis"):
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningContentPlaceholderFactory(
title="Mein neuer Job",
@ -216,6 +218,7 @@ def create_circle_basis(lp, title="Basis"):
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningContentPlaceholderFactory(
title="Einstieg in die Versicherung",
@ -277,6 +280,7 @@ wie du dein Netzwerk aufbauen und erweitern kannst, um damit neue Kunden zu gewi
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningContentPlaceholderFactory(
title="Die ersten Schritte im Verkauf",
@ -300,6 +304,7 @@ wie du dein Netzwerk aufbauen und erweitern kannst, um damit neue Kunden zu gewi
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningContentPlaceholderFactory(
title="Vom Lead zum Termin/Telefon auf Empfehlung/Neukundengewinnung",
@ -341,7 +346,7 @@ def create_circle_fahrzeug(lp, title="Fahrzeug"):
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}",
content_url=f"/course/versicherungsvermittler-in/media/category/{slugify(title)}",
)
LearningSequenceFactory(title="Einstieg", parent=circle)
@ -416,7 +421,7 @@ def create_circle_rechtsstreitigkeiten(lp, title="Rechtsstreitigkeiten"):
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}",
content_url=f"/course/versicherungsvermittler-in/media/category/{slugify(title)}",
)
LearningSequenceFactory(title="Rechtsstreitigkeiten", parent=circle)
@ -448,7 +453,7 @@ def create_circle_reisen(lp, title="Reisen"):
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}",
content_url=f"/course/versicherungsvermittler-in/media/category/{slugify(title)}",
)
LearningSequenceFactory(title="Einstieg", parent=circle)
@ -512,7 +517,7 @@ def create_circle_einkommenssicherung(lp, title="Einkommenssicherung"):
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}",
content_url=f"/course/versicherungsvermittler-in/media/category/{slugify(title)}",
)
LearningSequenceFactory(title="Einstieg", parent=circle)
@ -581,7 +586,7 @@ def create_circle_standard_small(
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title, allow_unicode=True)}",
content_url=f"/course/versicherungsvermittler-in/media/category/{slugify(title, allow_unicode=True)}",
)
if lu_title is None:
@ -611,7 +616,7 @@ def create_circle_standard(lp, title, lc_title, goals=None, description=None):
LearningContentMediaLibraryFactory(
title=f"Mediathek {title}",
parent=circle,
content_url=f"/media/versicherungsvermittler-in-media/category/{slugify(title)}",
content_url=f"/course/versicherungsvermittler-in/media/category/{slugify(title)}",
)
LearningSequenceFactory(title="Einstieg", parent=circle)
@ -706,6 +711,7 @@ def create_circle_betreuen(lp, title="Betreuen"):
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningContentPlaceholderFactory(
title="Rafael Fasel hat Ärger mit seinem Vermieter",
@ -721,6 +727,7 @@ def create_circle_betreuen(lp, title="Betreuen"):
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningContentPlaceholderFactory(
title="Familie Babic spart auf ein Ziel",
@ -736,6 +743,7 @@ def create_circle_betreuen(lp, title="Betreuen"):
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningContentPlaceholderFactory(
title="Familie Bonsera kauft ein Haus",
@ -751,6 +759,7 @@ def create_circle_betreuen(lp, title="Betreuen"):
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningContentPlaceholderFactory(
title="Patrizia Feller macht sich selbstständig",
@ -766,6 +775,7 @@ def create_circle_betreuen(lp, title="Betreuen"):
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningContentPlaceholderFactory(
title="Davide und Giulia vererben ihr Haus",
@ -796,6 +806,7 @@ def create_circle_vernetzen(lp, title="Vernetzen"):
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningSequenceFactory(title="Training", parent=circle)
@ -827,6 +838,7 @@ def create_circle_pruefungsvorbereitung(lp, title="Prüfungsvorbereitung"):
LearningContentPlaceholderFactory(
title="Mediathek",
parent=circle,
content_url="/course/versicherungsvermittler-in/media",
)
LearningSequenceFactory(title="Aufbau", parent=circle)

View File

@ -4,16 +4,12 @@ from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN_OLD_ID
from vbv_lernwelt.course.models import Course, CoursePage
from vbv_lernwelt.media_library.tests.media_library_factories import (
create_external_link_block,
create_internal_link_block,
create_learn_media_block,
create_media_collection,
create_relative_link_block,
ExternalLinkBlockFactory,
InternalLinkBlockFactory,
LearnMediaBlockFactory,
MediaCategoryPageFactory,
MediaLibraryPageFactory,
RelativeLinkBlockFactory,
)
@ -124,55 +120,55 @@ die der Fahrzeugbesitzer und die Fahrzeugbesitzerin in einem grösseren Schadenf
),
],
),
create_media_collection(
title="Verankerung im Lernpfad",
description="Anhand der Story von Rafael Fasel und seinem Ford Mustang lernst du in diesem berufstypischem Handlungsfeld alles rund um Motorfahrzeugversicherungen, wie man sein Auto optimal schützen kann, wie du vorgehst bei einem Fahrzeugwechsel, welche Aspekte du bei einer Offerte beachten musst und wie du dem Kunden die Lösung präsentierst.",
contents=[
create_internal_link_block(
InternalLinkBlockFactory(
title="Circle: Einstieg Lernsequenz: Anwenden",
url="/learn/versicherungsvermittler-in-lp/einstieg#lu-fahrzeug",
)
),
create_internal_link_block(
InternalLinkBlockFactory(
title="Circle: Analyse Lernsequenz: Anwenden",
url="/learn/versicherungsvermittler-in-lp/analyse#lu-fahrzeug",
)
),
create_internal_link_block(
InternalLinkBlockFactory(
title="Circle: Lösung Lernsequenz: Anwenden",
url="/learn/versicherungsvermittler-in-lp/lösung#lu-fahrzeug",
)
),
create_internal_link_block(
InternalLinkBlockFactory(
title="Circle: Abschluss Lernsequenz: Anwenden",
url="/learn/versicherungsvermittler-in-lp/abschluss#lu-fahrzeug",
)
),
],
),
create_media_collection(
title="Querverweise",
contents=[
create_relative_link_block(
RelativeLinkBlockFactory(
title="Rechtsstreitigkeiten",
description="VBV 303/12.3 Verkehrsrechtsschutz",
url="/media/versicherungsvermittler-in-media/category/rechtsstreitigkeiten",
)
),
create_relative_link_block(
RelativeLinkBlockFactory(
title="Reisen",
description="VBV 303/13 Reiseversicherung",
url="/media/versicherungsvermittler-in-media/category/reisen",
)
),
],
),
# create_media_collection(
# title="Verankerung im Lernpfad",
# description="Anhand der Story von Rafael Fasel und seinem Ford Mustang lernst du in diesem berufstypischem Handlungsfeld alles rund um Motorfahrzeugversicherungen, wie man sein Auto optimal schützen kann, wie du vorgehst bei einem Fahrzeugwechsel, welche Aspekte du bei einer Offerte beachten musst und wie du dem Kunden die Lösung präsentierst.",
# contents=[
# create_internal_link_block(
# InternalLinkBlockFactory(
# title="Circle: Einstieg Lernsequenz: Anwenden",
# url="/learn/versicherungsvermittler-in-lp/einstieg#lu-fahrzeug",
# )
# ),
# create_internal_link_block(
# InternalLinkBlockFactory(
# title="Circle: Analyse Lernsequenz: Anwenden",
# url="/learn/versicherungsvermittler-in-lp/analyse#lu-fahrzeug",
# )
# ),
# create_internal_link_block(
# InternalLinkBlockFactory(
# title="Circle: Lösung Lernsequenz: Anwenden",
# url="/learn/versicherungsvermittler-in-lp/lösung#lu-fahrzeug",
# )
# ),
# create_internal_link_block(
# InternalLinkBlockFactory(
# title="Circle: Abschluss Lernsequenz: Anwenden",
# url="/learn/versicherungsvermittler-in-lp/abschluss#lu-fahrzeug",
# )
# ),
# ],
# ),
# create_media_collection(
# title="Querverweise",
# contents=[
# create_relative_link_block(
# RelativeLinkBlockFactory(
# title="Rechtsstreitigkeiten",
# description="VBV 303/12.3 Verkehrsrechtsschutz",
# url="/media/versicherungsvermittler-in-media/category/rechtsstreitigkeiten",
# )
# ),
# create_relative_link_block(
# RelativeLinkBlockFactory(
# title="Reisen",
# description="VBV 303/13 Reiseversicherung",
# url="/media/versicherungsvermittler-in-media/category/reisen",
# )
# ),
# ],
# ),
]
),
)
@ -229,62 +225,62 @@ Diese können negative Folgen verschiedener Art nach sich ziehen, darunter recht
),
],
),
create_media_collection(
title="Verankerung im Lernpfad",
description="Begleite Emma Durand und Ayla Yilmaz bei den Vorbereitungen auf ihre grosse Reise durch Amerika und lerne dabei, welche Risiken durch welche Versicherungen abgedeckt werden können.",
contents=[
create_internal_link_block(
InternalLinkBlockFactory(
title="Circle: Einstieg Lernsequenz: Anwenden",
url="/learn/versicherungsvermittler-in-lp/einstieg#lu-reisen",
)
),
create_internal_link_block(
InternalLinkBlockFactory(
title="Circle: Analyse Lernsequenz: Anwenden",
url="/learn/versicherungsvermittler-in-lp/analyse#lu-reisen",
)
),
create_internal_link_block(
InternalLinkBlockFactory(
title="Circle: Lösung Lernsequenz: Anwenden",
url="/learn/versicherungsvermittler-in-lp/lösung#lu-reisen",
)
),
create_internal_link_block(
InternalLinkBlockFactory(
title="Circle: Abschluss Lernsequenz: Anwenden",
url="/learn/versicherungsvermittler-in-lp/abschluss#lu-reisen",
)
),
],
),
create_media_collection(
title="Querverweise",
contents=[
create_relative_link_block(
RelativeLinkBlockFactory(
title="Haushalt",
description="VBV 303/03 Hausratversicherung",
url="/media/versicherungsvermittler-in-media/category/haushalt",
)
),
create_relative_link_block(
RelativeLinkBlockFactory(
title="Rechtsstreitigkeiten",
desciption="VBV 303/12 Rechtschutzversicherung",
url="/media/versicherungsvermittler-in-media/category/rechtsstreitigkeiten",
)
),
create_relative_link_block(
RelativeLinkBlockFactory(
title="Gesundheit",
description="VBV 304/Teil E Obligatorische Krankenversicherung",
url="/media/versicherungsvermittler-in-media/category/gesundheit",
)
),
],
),
# create_media_collection(
# title="Verankerung im Lernpfad",
# description="Begleite Emma Durand und Ayla Yilmaz bei den Vorbereitungen auf ihre grosse Reise durch Amerika und lerne dabei, welche Risiken durch welche Versicherungen abgedeckt werden können.",
# contents=[
# create_internal_link_block(
# InternalLinkBlockFactory(
# title="Circle: Einstieg Lernsequenz: Anwenden",
# url="/learn/versicherungsvermittler-in-lp/einstieg#lu-reisen",
# )
# ),
# create_internal_link_block(
# InternalLinkBlockFactory(
# title="Circle: Analyse Lernsequenz: Anwenden",
# url="/learn/versicherungsvermittler-in-lp/analyse#lu-reisen",
# )
# ),
# create_internal_link_block(
# InternalLinkBlockFactory(
# title="Circle: Lösung Lernsequenz: Anwenden",
# url="/learn/versicherungsvermittler-in-lp/lösung#lu-reisen",
# )
# ),
# create_internal_link_block(
# InternalLinkBlockFactory(
# title="Circle: Abschluss Lernsequenz: Anwenden",
# url="/learn/versicherungsvermittler-in-lp/abschluss#lu-reisen",
# )
# ),
# ],
# ),
# create_media_collection(
# title="Querverweise",
# contents=[
# create_relative_link_block(
# RelativeLinkBlockFactory(
# title="Haushalt",
# description="VBV 303/03 Hausratversicherung",
# url="/media/versicherungsvermittler-in-media/category/haushalt",
# )
# ),
# create_relative_link_block(
# RelativeLinkBlockFactory(
# title="Rechtsstreitigkeiten",
# desciption="VBV 303/12 Rechtschutzversicherung",
# url="/media/versicherungsvermittler-in-media/category/rechtsstreitigkeiten",
# )
# ),
# create_relative_link_block(
# RelativeLinkBlockFactory(
# title="Gesundheit",
# description="VBV 304/Teil E Obligatorische Krankenversicherung",
# url="/media/versicherungsvermittler-in-media/category/gesundheit",
# )
# ),
# ],
# ),
]
),
)

View File

@ -31,7 +31,7 @@ class MediaLibraryPage(CourseBasePage):
super(MediaLibraryPage, self).save(clean, user, log_action, **kwargs)
def get_frontend_url(self):
return f"/media/{self.slug}"
return f"/course/{self.slug.replace('-media', '')}/media"
class MediaCategoryPage(CourseBasePage):
@ -95,7 +95,7 @@ class MediaCategoryPage(CourseBasePage):
def get_frontend_url(self):
r = re.compile(r"^(?P<coursePart>.+?)-media-cat-(?P<catPart>.+)$")
m = r.match(self.slug)
return f"/media/{m.group('coursePart')}-media/category/{m.group('catPart')}"
return f"/course/{m.group('coursePart')}/media/category/{m.group('catPart')}"
class LibraryDocument(AbstractDocument):