VBV-584 feat: only show "Kompetenznachweis-Elemente" in Regio-Dashboard Arbeiten

This commit is contained in:
Daniel Egger 2023-11-07 13:57:24 +01:00
parent 25c6021b82
commit be2488ff73
5 changed files with 54 additions and 37 deletions

View File

@ -45,7 +45,7 @@ const total = (metrics: AssignmentCompletionMetricsType) => {
<template> <template>
<main v-if="statistics"> <main v-if="statistics">
<div class="mb-10 flex items-center justify-between"> <div class="mb-10 flex items-center justify-between">
<h3>{{ $t("a.Arbeiten") }}</h3> <h3>{{ $t("a.Kompetenznachweis-Elemente") }}</h3>
<ItDropdownSelect <ItDropdownSelect
:model-value="dashboardStore.currentDashboardConfig" :model-value="dashboardStore.currentDashboardConfig"
class="mt-4 w-full lg:mt-0 lg:w-96" class="mt-4 w-full lg:mt-0 lg:w-96"

View File

@ -1,5 +1,7 @@
import { login } from "../helpers"; import { login } from "../helpers";
// ignore automatic import mess-up...
const getDashboardStatistics = (what) => { const getDashboardStatistics = (what) => {
return cy.get(`[data-cy="dashboard.stats.${what}"]`); return cy.get(`[data-cy="dashboard.stats.${what}"]`);
}; };
@ -7,12 +9,14 @@ const getDashboardStatistics = (what) => {
const clickOnDetailsLink = (within) => { const clickOnDetailsLink = (within) => {
cy.get(`[data-cy="dashboard.stats.${within}"]`).within(() => { cy.get(`[data-cy="dashboard.stats.${within}"]`).within(() => {
cy.get('[data-cy="basebox.detailsLink"]').click(); cy.get('[data-cy="basebox.detailsLink"]').click();
}) });
}; };
describe("dashboardSupervisor.cy.js", () => { describe("dashboardSupervisor.cy.js", () => {
beforeEach(() => { beforeEach(() => {
cy.manageCommand("cypress_reset --create-assignment-evaluation --create-feedback-responses --create-course-completion-performance-criteria --create-attendance-days"); cy.manageCommand(
"cypress_reset --create-assignment-evaluation --create-feedback-responses --create-course-completion-performance-criteria --create-attendance-days"
);
login("test-supervisor1@example.com", "test"); login("test-supervisor1@example.com", "test");
cy.visit("/"); cy.visit("/");
}); });
@ -31,15 +35,21 @@ describe("dashboardSupervisor.cy.js", () => {
// might be improved: roughly check // might be improved: roughly check
// that the correct data is displayed // that the correct data is displayed
cy.contains("Noch nicht bestätigt"); cy.contains("Noch nicht bestätigt");
cy.contains("Fahrzeug - Mein erstes Auto"); cy.contains("Überprüfen einer Motorfahrzeugs-Versicherungspolice");
cy.contains("Test Bern 2022 a"); cy.contains("Test Bern 2022 a");
}); });
}); });
describe("attendance day summary box", () => { describe("attendance day summary box", () => {
it("contains correct numbers", () => { it("contains correct numbers", () => {
getDashboardStatistics("attendance.dayCompleted").should("have.text", "1"); getDashboardStatistics("attendance.dayCompleted").should(
getDashboardStatistics("attendance.participantsPresent").should("have.text", "34%"); "have.text",
"1"
);
getDashboardStatistics("attendance.participantsPresent").should(
"have.text",
"34%"
);
}); });
it("contains correct details link", () => { it("contains correct details link", () => {
clickOnDetailsLink("attendance"); clickOnDetailsLink("attendance");
@ -53,7 +63,6 @@ describe("dashboardSupervisor.cy.js", () => {
}); });
}); });
describe("overall summary box", () => { describe("overall summary box", () => {
it("contains correct numbers (members, experts etc.)", () => { it("contains correct numbers (members, experts etc.)", () => {
getDashboardStatistics("participant.count").should("have.text", "4"); getDashboardStatistics("participant.count").should("have.text", "4");
@ -66,7 +75,6 @@ describe("dashboardSupervisor.cy.js", () => {
it("contains correct numbers", () => { it("contains correct numbers", () => {
getDashboardStatistics("feedback.average").should("have.text", "3.3"); getDashboardStatistics("feedback.average").should("have.text", "3.3");
getDashboardStatistics("feedback.count").should("have.text", "3"); getDashboardStatistics("feedback.count").should("have.text", "3");
}); });
it("contains correct details link", () => { it("contains correct details link", () => {
clickOnDetailsLink("feedback"); clickOnDetailsLink("feedback");
@ -76,8 +84,8 @@ describe("dashboardSupervisor.cy.js", () => {
// that the correct data is displayed // that the correct data is displayed
cy.contains("3.3 von 4"); cy.contains("3.3 von 4");
cy.contains("Test Trainer1"); cy.contains("Test Trainer1");
cy.contains("Durchführung «Test Bern 2022 a»") cy.contains("Durchführung «Test Bern 2022 a»");
cy.contains("Circle «Fahrzeug»") cy.contains("Circle «Fahrzeug»");
}); });
}); });
@ -94,8 +102,7 @@ describe("dashboardSupervisor.cy.js", () => {
// that the correct data is displayed // that the correct data is displayed
cy.contains("Selbsteinschätzung: Vorbereitung"); cy.contains("Selbsteinschätzung: Vorbereitung");
cy.contains("Durchführung «Test Bern 2022 a»"); cy.contains("Durchführung «Test Bern 2022 a»");
cy.contains("Circle «Fahrzeug»") cy.contains("Circle «Fahrzeug»");
}); });
}); });
}); });

View File

@ -19,8 +19,10 @@ from vbv_lernwelt.competence.factories import (
ActionCompetenceListPageFactory, ActionCompetenceListPageFactory,
CompetenceNaviPageFactory, CompetenceNaviPageFactory,
PerformanceCriteriaFactory, PerformanceCriteriaFactory,
CompetenceCertificateListFactory,
CompetenceCertificateFactory,
) )
from vbv_lernwelt.competence.models import PerformanceCriteria from vbv_lernwelt.competence.models import PerformanceCriteria, CompetenceCertificate
from vbv_lernwelt.core.models import User from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.factories import CoursePageFactory from vbv_lernwelt.course.factories import CoursePageFactory
from vbv_lernwelt.course.models import ( from vbv_lernwelt.course.models import (
@ -160,6 +162,12 @@ def create_attendance_course(
) )
def create_competence_certificate(course: Course) -> CompetenceCertificate:
navi = CompetenceNaviPageFactory(parent=course.coursepage)
certificate_list = CompetenceCertificateListFactory(parent=navi)
return CompetenceCertificateFactory(parent=certificate_list)
def create_assignment( def create_assignment(
course: Course, course: Course,
assignment_type: AssignmentType, assignment_type: AssignmentType,

View File

@ -121,12 +121,14 @@ def create_record(
return AssignmentStatisticsRecordType( return AssignmentStatisticsRecordType(
# make sure it's unique, across all types of assignments! # make sure it's unique, across all types of assignments!
_id=f"{course_session_assignment._meta.model_name}#{course_session_assignment.id}", # noqa _id=f"{course_session_assignment._meta.model_name}#{course_session_assignment.id}",
# noqa
course_session_id=str(course_session_assignment.course_session.id), # noqa course_session_id=str(course_session_assignment.course_session.id), # noqa
circle_id=learning_content.get_circle().id, # noqa circle_id=learning_content.get_circle().id, # noqa
course_session_assignment_id=str(course_session_assignment.id), # noqa course_session_assignment_id=str(course_session_assignment.id), # noqa
generation=course_session_assignment.course_session.generation, # noqa generation=course_session_assignment.course_session.generation, # noqa
assignment_type_translation_key=due_date.assignment_type_translation_key, # noqa assignment_type_translation_key=due_date.assignment_type_translation_key,
# noqa
assignment_title=learning_content.content_assignment.title, # noqa assignment_title=learning_content.content_assignment.title, # noqa
metrics=get_assignment_completion_metrics( # noqa metrics=get_assignment_completion_metrics( # noqa
course_session=course_session_assignment.course_session, # noqa course_session=course_session_assignment.course_session, # noqa
@ -149,16 +151,17 @@ def assignments(
for course_session in course_sessions: for course_session in course_sessions:
for csa in CourseSessionAssignment.objects.filter( for csa in CourseSessionAssignment.objects.filter(
course_session=course_session, course_session=course_session,
learning_content__assignment_type__in=[ learning_content__content_assignment__assignment_type__in=[
AssignmentType.CASEWORK.value, AssignmentType.CASEWORK.value,
AssignmentType.PREP_ASSIGNMENT.value,
], ],
learning_content__content_assignment__competence_certificate__isnull=False,
): ):
record = create_record(course_session_assignment=csa) record = create_record(course_session_assignment=csa)
records.append(record) records.append(record)
for cset in CourseSessionEdoniqTest.objects.filter( for cset in CourseSessionEdoniqTest.objects.filter(
course_session=course_session course_session=course_session,
learning_content__content_assignment__competence_certificate__isnull=False,
): ):
record = create_record(course_session_assignment=cset) record = create_record(course_session_assignment=cset)
records.append(record) records.append(record)

View File

@ -17,6 +17,7 @@ from vbv_lernwelt.course.creators.test_utils import (
create_course_session_edoniq_test, create_course_session_edoniq_test,
create_course_session_group, create_course_session_group,
create_user, create_user,
create_competence_certificate,
) )
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
from vbv_lernwelt.course_session.models import ( from vbv_lernwelt.course_session.models import (
@ -101,11 +102,6 @@ class AssignmentTestCase(GraphQLTestCase):
assignment_type=AssignmentType.CASEWORK assignment_type=AssignmentType.CASEWORK
) )
def test_dashboard_contains_prep_assignments(self):
self._test_assignment_type_dashboard_details(
assignment_type=AssignmentType.PREP_ASSIGNMENT
)
def test_dashboard_contains_edoniq_tests(self): def test_dashboard_contains_edoniq_tests(self):
self._test_assignment_type_dashboard_details( self._test_assignment_type_dashboard_details(
assignment_type=AssignmentType.EDONIQ_TEST assignment_type=AssignmentType.EDONIQ_TEST
@ -120,7 +116,6 @@ class AssignmentTestCase(GraphQLTestCase):
irrelevant_types_for_dashboard = set(AssignmentType) - { irrelevant_types_for_dashboard = set(AssignmentType) - {
AssignmentType.CASEWORK, AssignmentType.CASEWORK,
AssignmentType.PREP_ASSIGNMENT,
AssignmentType.EDONIQ_TEST, AssignmentType.EDONIQ_TEST,
} }
@ -134,6 +129,7 @@ class AssignmentTestCase(GraphQLTestCase):
deadline_at=datetime(2000, 4, 1), deadline_at=datetime(2000, 4, 1),
course_session=self.course_session, course_session=self.course_session,
circle=self.circle, circle=self.circle,
add_competence_certificate=True,
) )
create_assignment_completion( create_assignment_completion(
@ -203,6 +199,7 @@ class AssignmentTestCase(GraphQLTestCase):
assignment_type=AssignmentType.CASEWORK, assignment_type=AssignmentType.CASEWORK,
course_session=self.course_session, course_session=self.course_session,
circle=self.circle, circle=self.circle,
add_competence_certificate=True,
) )
assignment_2, _ = mix_assignment_cocktail( assignment_2, _ = mix_assignment_cocktail(
@ -210,13 +207,15 @@ class AssignmentTestCase(GraphQLTestCase):
assignment_type=AssignmentType.EDONIQ_TEST, assignment_type=AssignmentType.EDONIQ_TEST,
course_session=self.course_session, course_session=self.course_session,
circle=self.circle, circle=self.circle,
add_competence_certificate=True,
) )
assignment_3, _ = mix_assignment_cocktail( assignment_3, _ = mix_assignment_cocktail(
deadline_at=datetime(2010, 4, 1), deadline_at=datetime(2010, 4, 1),
assignment_type=AssignmentType.PREP_ASSIGNMENT, assignment_type=AssignmentType.CASEWORK,
course_session=self.course_session, course_session=self.course_session,
circle=self.circle, circle=self.circle,
add_competence_certificate=True,
) )
# no completions for this assignment yet # no completions for this assignment yet
@ -225,6 +224,7 @@ class AssignmentTestCase(GraphQLTestCase):
assignment_type=AssignmentType.EDONIQ_TEST, assignment_type=AssignmentType.EDONIQ_TEST,
course_session=self.course_session, course_session=self.course_session,
circle=self.circle, circle=self.circle,
add_competence_certificate=False,
) )
# assignment 1 # assignment 1
@ -285,13 +285,13 @@ class AssignmentTestCase(GraphQLTestCase):
# 1 -> incomplete (not counted for average) # 1 -> incomplete (not counted for average)
# 2 -> complete 66% passed ... # 2 -> complete 66% passed ...
# 3 -> complete 100% passed --> 83.5% # 3 -> complete 100% passed --> 83.5%
# 4 -> incomplete (not counted for average) # 4 -> not included in certificate
summary = dashboard["assignments"]["summary"] summary = dashboard["assignments"]["summary"]
self.assertEqual(summary["completed_count"], 2) self.assertEqual(summary["completed_count"], 2)
self.assertEqual(summary["average_passed"], 83.5) self.assertEqual(summary["average_passed"], 83.5)
records = dashboard["assignments"]["records"] records = dashboard["assignments"]["records"]
self.assertEqual(len(records), 4) self.assertEqual(len(records), 3)
# 1 -> assigment_1_results (oldest) # 1 -> assigment_1_results (oldest)
assignment_1_metrics = records[0]["metrics"] assignment_1_metrics = records[0]["metrics"]
@ -317,19 +317,12 @@ class AssignmentTestCase(GraphQLTestCase):
self.assertEqual(assignment_3_metrics["ranking_completed"], True) self.assertEqual(assignment_3_metrics["ranking_completed"], True)
self.assertEqual(assignment_3_metrics["average_passed"], 100) self.assertEqual(assignment_3_metrics["average_passed"], 100)
# 4 -> no completions (newest)
assignment_4_metrics = records[3]["metrics"]
self.assertEqual(assignment_4_metrics["passed_count"], 0)
self.assertEqual(assignment_4_metrics["failed_count"], 0)
self.assertEqual(assignment_4_metrics["unranked_count"], 3)
self.assertEqual(assignment_4_metrics["ranking_completed"], False)
self.assertEqual(assignment_4_metrics["average_passed"], 0)
def mix_assignment_cocktail( def mix_assignment_cocktail(
assignment_type: AssignmentType, assignment_type: AssignmentType,
course_session: CourseSession, course_session: CourseSession,
circle: Circle, circle: Circle,
add_competence_certificate: bool = False,
deadline_at: datetime | None = None, deadline_at: datetime | None = None,
) -> Tuple[Assignment, CourseSessionAssignment | CourseSessionEdoniqTest]: ) -> Tuple[Assignment, CourseSessionAssignment | CourseSessionEdoniqTest]:
""" """
@ -338,9 +331,15 @@ def mix_assignment_cocktail(
""" """
assignment = create_assignment( assignment = create_assignment(
course=course_session.course, assignment_type=assignment_type course=course_session.course,
assignment_type=assignment_type,
) )
if add_competence_certificate:
certificate = create_competence_certificate(course=course_session.course)
assignment.competence_certificate = certificate
assignment.save()
if assignment_type == AssignmentType.EDONIQ_TEST: if assignment_type == AssignmentType.EDONIQ_TEST:
cset = create_course_session_edoniq_test( cset = create_course_session_edoniq_test(
deadline_at=deadline_at, deadline_at=deadline_at,