Add language to request, add language backend tests, add icon
This commit is contained in:
parent
7c21070b96
commit
7a8ee56109
|
|
@ -49,7 +49,7 @@ async function exportData() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const filteredItems = statisticFilter.value.getFilteredItems();
|
const filteredItems = statisticFilter.value.getFilteredItems();
|
||||||
await exportDataAsXls(filteredItems, exportCompetenceElements);
|
await exportDataAsXls(filteredItems, exportCompetenceElements, userStore.language);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ async function exportData() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const filteredItems = statisticFilter.value.getFilteredItems();
|
const filteredItems = statisticFilter.value.getFilteredItems();
|
||||||
await exportDataAsXls(filteredItems, exportAttendance);
|
await exportDataAsXls(filteredItems, exportAttendance, userStore.language);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ async function exportData() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const filteredItems = statisticFilter.value.getFilteredItems();
|
const filteredItems = statisticFilter.value.getFilteredItems();
|
||||||
await exportDataAsXls(filteredItems, exportFeedback);
|
await exportDataAsXls(filteredItems, exportFeedback, userStore.language);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -195,21 +195,30 @@ export async function fetchOpenTasksCount(courseId: string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function exportFeedback(
|
export async function exportFeedback(
|
||||||
data: XlsExportRequestData
|
data: XlsExportRequestData,
|
||||||
|
language: string
|
||||||
): Promise<XlsExportResponseData> {
|
): Promise<XlsExportResponseData> {
|
||||||
return await itPost("/api/dashboard/export/feedback/", data);
|
return await itPost("/api/dashboard/export/feedback/", data, {
|
||||||
|
headers: { "Accept-Language": language },
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function exportAttendance(
|
export async function exportAttendance(
|
||||||
data: XlsExportRequestData
|
data: XlsExportRequestData,
|
||||||
|
language: string
|
||||||
): Promise<XlsExportResponseData> {
|
): Promise<XlsExportResponseData> {
|
||||||
return await itPost("/api/dashboard/export/attendance/", data);
|
return await itPost("/api/dashboard/export/attendance/", data, {
|
||||||
|
headers: { "Accept-Language": language },
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function exportCompetenceElements(
|
export async function exportCompetenceElements(
|
||||||
data: XlsExportRequestData
|
data: XlsExportRequestData,
|
||||||
|
language: string
|
||||||
): Promise<XlsExportResponseData> {
|
): Promise<XlsExportResponseData> {
|
||||||
return await itPost("/api/dashboard/export/competence_elements/", data);
|
return await itPost("/api/dashboard/export/competence_elements/", data, {
|
||||||
|
headers: { "Accept-Language": language },
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function courseIdForCourseSlug(
|
export function courseIdForCourseSlug(
|
||||||
|
|
|
||||||
|
|
@ -5,15 +5,16 @@ import type {
|
||||||
} from "@/types";
|
} from "@/types";
|
||||||
|
|
||||||
interface exportApiCall {
|
interface exportApiCall {
|
||||||
(data: XlsExportRequestData): Promise<XlsExportResponseData>;
|
(data: XlsExportRequestData, language: string): Promise<XlsExportResponseData>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function exportDataAsXls(
|
export async function exportDataAsXls(
|
||||||
items: StatisticsFilterItem[],
|
items: StatisticsFilterItem[],
|
||||||
apiCall: exportApiCall
|
apiCall: exportApiCall,
|
||||||
|
language: string
|
||||||
) {
|
) {
|
||||||
const itemIds = extractUniqueIds(items);
|
const itemIds = extractUniqueIds(items);
|
||||||
const data = await apiCall(itemIds);
|
const data = await apiCall(itemIds, language);
|
||||||
openDataAsXls(data.encoded_data, data.file_name);
|
openDataAsXls(data.encoded_data, data.file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-06-17 15:43+0200\n"
|
"POT-Creation-Date: 2024-06-18 15:24+0200\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
|
@ -22,16 +22,24 @@ msgstr ""
|
||||||
msgid "export_kompetenznachweis_elemente"
|
msgid "export_kompetenznachweis_elemente"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: vbv_lernwelt/assignment/export.py:183
|
#: vbv_lernwelt/assignment/export.py:142
|
||||||
|
msgid "Resultat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: vbv_lernwelt/assignment/export.py:143
|
||||||
|
msgid "bestanden"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: vbv_lernwelt/assignment/export.py:187
|
||||||
msgid "Bestanden"
|
msgid "Bestanden"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: vbv_lernwelt/assignment/export.py:185
|
#: vbv_lernwelt/assignment/export.py:189
|
||||||
msgid "Nicht bestanden"
|
msgid "Nicht bestanden"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: vbv_lernwelt/assignment/export.py:199 vbv_lernwelt/assignment/export.py:202
|
#: vbv_lernwelt/assignment/export.py:203 vbv_lernwelt/assignment/export.py:206
|
||||||
#: vbv_lernwelt/assignment/export.py:203
|
#: vbv_lernwelt/assignment/export.py:207
|
||||||
msgid "Keine Daten"
|
msgid "Keine Daten"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -111,28 +119,31 @@ msgstr ""
|
||||||
msgid "export_anwesenheit"
|
msgid "export_anwesenheit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:113
|
#: vbv_lernwelt/course_session/services/export_attendance.py:92
|
||||||
|
msgid "Anwesenheit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: vbv_lernwelt/course_session/services/export_attendance.py:116
|
||||||
msgid "Anwesend"
|
msgid "Anwesend"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:113
|
#: vbv_lernwelt/course_session/services/export_attendance.py:116
|
||||||
msgid "Nicht anwesend"
|
msgid "Nicht anwesend"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:120
|
#: vbv_lernwelt/course_session/services/export_attendance.py:123
|
||||||
msgid "Vorname"
|
msgid "Vorname"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:121
|
#: vbv_lernwelt/course_session/services/export_attendance.py:124
|
||||||
msgid "Nachname"
|
msgid "Nachname"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:122
|
#: vbv_lernwelt/course_session/services/export_attendance.py:125
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "Email"
|
msgstr "Email"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:123
|
#: vbv_lernwelt/course_session/services/export_attendance.py:126
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:135
|
|
||||||
msgid "Lehrvertragsnummer"
|
msgid "Lehrvertragsnummer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-06-17 15:43+0200\n"
|
"POT-Creation-Date: 2024-06-18 15:24+0200\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
|
@ -22,16 +22,24 @@ msgstr ""
|
||||||
msgid "export_kompetenznachweis_elemente"
|
msgid "export_kompetenznachweis_elemente"
|
||||||
msgstr "export_elements_de_controle"
|
msgstr "export_elements_de_controle"
|
||||||
|
|
||||||
#: vbv_lernwelt/assignment/export.py:183
|
#: vbv_lernwelt/assignment/export.py:142
|
||||||
|
msgid "Resultat"
|
||||||
|
msgstr "Résultats"
|
||||||
|
|
||||||
|
#: vbv_lernwelt/assignment/export.py:143
|
||||||
|
msgid "bestanden"
|
||||||
|
msgstr "réussi"
|
||||||
|
|
||||||
|
#: vbv_lernwelt/assignment/export.py:187
|
||||||
msgid "Bestanden"
|
msgid "Bestanden"
|
||||||
msgstr "Réussi"
|
msgstr "Réussi"
|
||||||
|
|
||||||
#: vbv_lernwelt/assignment/export.py:185
|
#: vbv_lernwelt/assignment/export.py:189
|
||||||
msgid "Nicht bestanden"
|
msgid "Nicht bestanden"
|
||||||
msgstr "Échoué"
|
msgstr "Échoué"
|
||||||
|
|
||||||
#: vbv_lernwelt/assignment/export.py:199 vbv_lernwelt/assignment/export.py:202
|
#: vbv_lernwelt/assignment/export.py:203 vbv_lernwelt/assignment/export.py:206
|
||||||
#: vbv_lernwelt/assignment/export.py:203
|
#: vbv_lernwelt/assignment/export.py:207
|
||||||
msgid "Keine Daten"
|
msgid "Keine Daten"
|
||||||
msgstr "Aucune donnée"
|
msgstr "Aucune donnée"
|
||||||
|
|
||||||
|
|
@ -111,28 +119,32 @@ msgstr ""
|
||||||
msgid "export_anwesenheit"
|
msgid "export_anwesenheit"
|
||||||
msgstr "export_presence"
|
msgstr "export_presence"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:113
|
#: vbv_lernwelt/course_session/services/export_attendance.py:92
|
||||||
|
#| msgid "Anwesend"
|
||||||
|
msgid "Anwesenheit"
|
||||||
|
msgstr "Présence"
|
||||||
|
|
||||||
|
#: vbv_lernwelt/course_session/services/export_attendance.py:116
|
||||||
msgid "Anwesend"
|
msgid "Anwesend"
|
||||||
msgstr "Présent"
|
msgstr "Présent"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:113
|
#: vbv_lernwelt/course_session/services/export_attendance.py:116
|
||||||
msgid "Nicht anwesend"
|
msgid "Nicht anwesend"
|
||||||
msgstr "Pas présent"
|
msgstr "Pas présent"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:120
|
#: vbv_lernwelt/course_session/services/export_attendance.py:123
|
||||||
msgid "Vorname"
|
msgid "Vorname"
|
||||||
msgstr "Prénom"
|
msgstr "Prénom"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:121
|
#: vbv_lernwelt/course_session/services/export_attendance.py:124
|
||||||
msgid "Nachname"
|
msgid "Nachname"
|
||||||
msgstr "Nom de famille"
|
msgstr "Nom de famille"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:122
|
#: vbv_lernwelt/course_session/services/export_attendance.py:125
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "Email"
|
msgstr "Email"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:123
|
#: vbv_lernwelt/course_session/services/export_attendance.py:126
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:135
|
|
||||||
msgid "Lehrvertragsnummer"
|
msgid "Lehrvertragsnummer"
|
||||||
msgstr "Numéro de contrat d'apprentissage"
|
msgstr "Numéro de contrat d'apprentissage"
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-06-17 15:43+0200\n"
|
"POT-Creation-Date: 2024-06-18 15:24+0200\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
|
@ -22,16 +22,24 @@ msgstr ""
|
||||||
msgid "export_kompetenznachweis_elemente"
|
msgid "export_kompetenznachweis_elemente"
|
||||||
msgstr "esportazione_elementi_del_controllo"
|
msgstr "esportazione_elementi_del_controllo"
|
||||||
|
|
||||||
#: vbv_lernwelt/assignment/export.py:183
|
#: vbv_lernwelt/assignment/export.py:142
|
||||||
|
msgid "Resultat"
|
||||||
|
msgstr "Risultato"
|
||||||
|
|
||||||
|
#: vbv_lernwelt/assignment/export.py:143
|
||||||
|
msgid "bestanden"
|
||||||
|
msgstr "superato"
|
||||||
|
|
||||||
|
#: vbv_lernwelt/assignment/export.py:187
|
||||||
msgid "Bestanden"
|
msgid "Bestanden"
|
||||||
msgstr "Superato"
|
msgstr "Superato"
|
||||||
|
|
||||||
#: vbv_lernwelt/assignment/export.py:185
|
#: vbv_lernwelt/assignment/export.py:189
|
||||||
msgid "Nicht bestanden"
|
msgid "Nicht bestanden"
|
||||||
msgstr "Fallito"
|
msgstr "Fallito"
|
||||||
|
|
||||||
#: vbv_lernwelt/assignment/export.py:199 vbv_lernwelt/assignment/export.py:202
|
#: vbv_lernwelt/assignment/export.py:203 vbv_lernwelt/assignment/export.py:206
|
||||||
#: vbv_lernwelt/assignment/export.py:203
|
#: vbv_lernwelt/assignment/export.py:207
|
||||||
msgid "Keine Daten"
|
msgid "Keine Daten"
|
||||||
msgstr "Nessun dato"
|
msgstr "Nessun dato"
|
||||||
|
|
||||||
|
|
@ -111,28 +119,32 @@ msgstr ""
|
||||||
msgid "export_anwesenheit"
|
msgid "export_anwesenheit"
|
||||||
msgstr "esportazione_presenza"
|
msgstr "esportazione_presenza"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:113
|
#: vbv_lernwelt/course_session/services/export_attendance.py:92
|
||||||
|
#| msgid "Anwesend"
|
||||||
|
msgid "Anwesenheit"
|
||||||
|
msgstr "Presenza"
|
||||||
|
|
||||||
|
#: vbv_lernwelt/course_session/services/export_attendance.py:116
|
||||||
msgid "Anwesend"
|
msgid "Anwesend"
|
||||||
msgstr "Presente"
|
msgstr "Presente"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:113
|
#: vbv_lernwelt/course_session/services/export_attendance.py:116
|
||||||
msgid "Nicht anwesend"
|
msgid "Nicht anwesend"
|
||||||
msgstr "Non presente"
|
msgstr "Non presente"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:120
|
#: vbv_lernwelt/course_session/services/export_attendance.py:123
|
||||||
msgid "Vorname"
|
msgid "Vorname"
|
||||||
msgstr "Nome"
|
msgstr "Nome"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:121
|
#: vbv_lernwelt/course_session/services/export_attendance.py:124
|
||||||
msgid "Nachname"
|
msgid "Nachname"
|
||||||
msgstr "Cognome"
|
msgstr "Cognome"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:122
|
#: vbv_lernwelt/course_session/services/export_attendance.py:125
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "E-mail"
|
msgstr "E-mail"
|
||||||
|
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:123
|
#: vbv_lernwelt/course_session/services/export_attendance.py:126
|
||||||
#: vbv_lernwelt/course_session/services/export_attendance.py:135
|
|
||||||
msgid "Lehrvertragsnummer"
|
msgid "Lehrvertragsnummer"
|
||||||
msgstr "Numero di contratto di tirocinio"
|
msgstr "Numero di contratto di tirocinio"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ from dataclasses import dataclass
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
import structlog
|
import structlog
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from openpyxl import Workbook
|
from openpyxl import Workbook
|
||||||
|
|
||||||
from vbv_lernwelt.assignment.models import (
|
from vbv_lernwelt.assignment.models import (
|
||||||
|
|
@ -138,16 +138,20 @@ def _create_sheet(
|
||||||
|
|
||||||
col_prefix = f'Circle "{circle.title}" {cse.learning_content.title}'
|
col_prefix = f'Circle "{circle.title}" {cse.learning_content.title}'
|
||||||
|
|
||||||
|
# add translation strings here as they are not picked up in f-strings
|
||||||
|
result_str = str(_("Resultat"))
|
||||||
|
success_str = str(_("bestanden"))
|
||||||
|
|
||||||
sheet.cell(
|
sheet.cell(
|
||||||
row=1,
|
row=1,
|
||||||
column=col_idx,
|
column=col_idx,
|
||||||
value=f"{col_prefix} {_('bestanden')}",
|
value=f"{col_prefix} {success_str}",
|
||||||
)
|
)
|
||||||
|
|
||||||
sheet.cell(
|
sheet.cell(
|
||||||
row=1,
|
row=1,
|
||||||
column=col_idx + 1,
|
column=col_idx + 1,
|
||||||
value=f"{col_prefix} {_('Resultat')} %",
|
value=f"{col_prefix} {result_str} %",
|
||||||
)
|
)
|
||||||
|
|
||||||
ordered_assignement_ids.append(cse.assignment.id)
|
ordered_assignement_ids.append(cse.assignment.id)
|
||||||
|
|
@ -180,9 +184,9 @@ def _add_rows(
|
||||||
|
|
||||||
if user_ac:
|
if user_ac:
|
||||||
status_text = (
|
status_text = (
|
||||||
_("Bestanden")
|
str(_("Bestanden"))
|
||||||
if user_ac.evaluation_passed
|
if user_ac.evaluation_passed
|
||||||
else _("Nicht bestanden")
|
else str(_("Nicht bestanden"))
|
||||||
)
|
)
|
||||||
sheet.cell(row=row_idx, column=col_idx, value=status_text)
|
sheet.cell(row=row_idx, column=col_idx, value=status_text)
|
||||||
try:
|
try:
|
||||||
|
|
@ -196,11 +200,13 @@ def _add_rows(
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
except (ZeroDivisionError, TypeError):
|
except (ZeroDivisionError, TypeError):
|
||||||
sheet.cell(row=row_idx, column=col_idx + 1, value=_("Keine Daten"))
|
sheet.cell(
|
||||||
|
row=row_idx, column=col_idx + 1, value=str(_("Keine Daten"))
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
sheet.cell(row=row_idx, column=col_idx, value=_("Keine Daten"))
|
sheet.cell(row=row_idx, column=col_idx, value=str(_("Keine Daten")))
|
||||||
sheet.cell(row=row_idx, column=col_idx + 1, value=_("Keine Daten"))
|
sheet.cell(row=row_idx, column=col_idx + 1, value=str(_("Keine Daten")))
|
||||||
|
|
||||||
col_idx += 2
|
col_idx += 2
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import io
|
import io
|
||||||
|
|
||||||
|
from django.utils.translation import activate
|
||||||
from openpyxl import load_workbook
|
from openpyxl import load_workbook
|
||||||
|
|
||||||
from vbv_lernwelt.assignment.export import export_competence_elements
|
from vbv_lernwelt.assignment.export import export_competence_elements
|
||||||
|
|
@ -50,7 +51,7 @@ class AssignmentCompletionExportTestCase(ExportBaseTestCase):
|
||||||
self.test_student2.additional_json_data = {"Lehrvertragsnummer": 1987654321}
|
self.test_student2.additional_json_data = {"Lehrvertragsnummer": 1987654321}
|
||||||
self.test_student2.save()
|
self.test_student2.save()
|
||||||
|
|
||||||
test_student3 = User.objects.get(email="test-student3@example.com")
|
self.test_student3 = User.objects.get(email="test-student3@example.com")
|
||||||
|
|
||||||
# Bern assignments
|
# Bern assignments
|
||||||
update_assignment_completion(
|
update_assignment_completion(
|
||||||
|
|
@ -102,9 +103,9 @@ class AssignmentCompletionExportTestCase(ExportBaseTestCase):
|
||||||
"Keine Daten",
|
"Keine Daten",
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
test_student3.first_name,
|
self.test_student3.first_name,
|
||||||
test_student3.last_name,
|
self.test_student3.last_name,
|
||||||
test_student3.email,
|
self.test_student3.email,
|
||||||
None,
|
None,
|
||||||
"Keine Daten",
|
"Keine Daten",
|
||||||
"Keine Daten",
|
"Keine Daten",
|
||||||
|
|
@ -122,15 +123,7 @@ class AssignmentCompletionExportTestCase(ExportBaseTestCase):
|
||||||
def _make_header(
|
def _make_header(
|
||||||
self,
|
self,
|
||||||
):
|
):
|
||||||
casework_assignment = CourseSessionAssignment.objects.filter(
|
casework_assignment, edoniq_assignment = self._get_assignments()
|
||||||
course_session__id=self.course_session_be.id,
|
|
||||||
learning_content__content_assignment__competence_certificate__isnull=False,
|
|
||||||
).first()
|
|
||||||
|
|
||||||
edoniq_assignment = CourseSessionEdoniqTest.objects.filter(
|
|
||||||
course_session__id=self.course_session_be.id,
|
|
||||||
learning_content__content_assignment__competence_certificate__isnull=False,
|
|
||||||
).first()
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
"Vorname",
|
"Vorname",
|
||||||
|
|
@ -143,6 +136,19 @@ class AssignmentCompletionExportTestCase(ExportBaseTestCase):
|
||||||
f'Circle "{self.casework.get_attached_circle_title()}" {casework_assignment.learning_content.title} Resultat %',
|
f'Circle "{self.casework.get_attached_circle_title()}" {casework_assignment.learning_content.title} Resultat %',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def _get_assignments(self):
|
||||||
|
casework_assignment = CourseSessionAssignment.objects.filter(
|
||||||
|
course_session__id=self.course_session_be.id,
|
||||||
|
learning_content__content_assignment__competence_certificate__isnull=False,
|
||||||
|
).first()
|
||||||
|
|
||||||
|
edoniq_assignment = CourseSessionEdoniqTest.objects.filter(
|
||||||
|
course_session__id=self.course_session_be.id,
|
||||||
|
learning_content__content_assignment__competence_certificate__isnull=False,
|
||||||
|
).first()
|
||||||
|
|
||||||
|
return casework_assignment, edoniq_assignment
|
||||||
|
|
||||||
def test_export_single_cs(self):
|
def test_export_single_cs(self):
|
||||||
wb = self._generate_workbook([self.course_session_be.id])
|
wb = self._generate_workbook([self.course_session_be.id])
|
||||||
self.assertEqual(len(wb.sheetnames), 1)
|
self.assertEqual(len(wb.sheetnames), 1)
|
||||||
|
|
@ -212,3 +218,107 @@ class AssignmentCompletionExportTestCase(ExportBaseTestCase):
|
||||||
wb.active = wb["Test Zürich 2022 a"]
|
wb.active = wb["Test Zürich 2022 a"]
|
||||||
|
|
||||||
self._check_export(wb, expected_data, 2, 5)
|
self._check_export(wb, expected_data, 2, 5)
|
||||||
|
|
||||||
|
def test_french_export(self):
|
||||||
|
activate("fr")
|
||||||
|
wb = self._generate_workbook([self.course_session_be.id])
|
||||||
|
|
||||||
|
casework_assignment, edoniq_assignment = self._get_assignments()
|
||||||
|
|
||||||
|
header = [
|
||||||
|
"Prénom",
|
||||||
|
"Nom de famille",
|
||||||
|
"E-mail",
|
||||||
|
"Numéro de contrat d'apprentissage",
|
||||||
|
f'Circle "{self.edoniq_test.get_attached_circle_title()}" {edoniq_assignment.learning_content.title} réussi',
|
||||||
|
f'Circle "{self.edoniq_test.get_attached_circle_title()}" {edoniq_assignment.learning_content.title} Résultats %',
|
||||||
|
f'Circle "{self.casework.get_attached_circle_title()}" {casework_assignment.learning_content.title} réussi',
|
||||||
|
f'Circle "{self.casework.get_attached_circle_title()}" {casework_assignment.learning_content.title} Résultats %',
|
||||||
|
]
|
||||||
|
|
||||||
|
expected_data_be = [
|
||||||
|
header,
|
||||||
|
[
|
||||||
|
self.test_student1.first_name,
|
||||||
|
self.test_student1.last_name,
|
||||||
|
self.test_student1.email,
|
||||||
|
self.test_student1.additional_json_data["Lehrvertragsnummer"],
|
||||||
|
"Échoué",
|
||||||
|
58,
|
||||||
|
"Réussi",
|
||||||
|
83,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
self.test_student2.first_name,
|
||||||
|
self.test_student2.last_name,
|
||||||
|
self.test_student2.email,
|
||||||
|
self.test_student2.additional_json_data["Lehrvertragsnummer"],
|
||||||
|
"Réussi",
|
||||||
|
100,
|
||||||
|
"Aucune donnée",
|
||||||
|
"Aucune donnée",
|
||||||
|
],
|
||||||
|
[
|
||||||
|
self.test_student3.first_name,
|
||||||
|
self.test_student3.last_name,
|
||||||
|
self.test_student3.email,
|
||||||
|
None,
|
||||||
|
"Aucune donnée",
|
||||||
|
"Aucune donnée",
|
||||||
|
"Aucune donnée",
|
||||||
|
"Aucune donnée",
|
||||||
|
],
|
||||||
|
]
|
||||||
|
self._check_export(wb, expected_data_be, 4, 8)
|
||||||
|
|
||||||
|
def test_italian_export(self):
|
||||||
|
activate("it")
|
||||||
|
wb = self._generate_workbook([self.course_session_be.id])
|
||||||
|
|
||||||
|
casework_assignment, edoniq_assignment = self._get_assignments()
|
||||||
|
|
||||||
|
header = [
|
||||||
|
"Nome",
|
||||||
|
"Cognome",
|
||||||
|
"Email",
|
||||||
|
"Numero di contratto di tirocinio",
|
||||||
|
f'Circle "{self.edoniq_test.get_attached_circle_title()}" {edoniq_assignment.learning_content.title} superato',
|
||||||
|
f'Circle "{self.edoniq_test.get_attached_circle_title()}" {edoniq_assignment.learning_content.title} Risultato %',
|
||||||
|
f'Circle "{self.casework.get_attached_circle_title()}" {casework_assignment.learning_content.title} superato',
|
||||||
|
f'Circle "{self.casework.get_attached_circle_title()}" {casework_assignment.learning_content.title} Risultato %',
|
||||||
|
]
|
||||||
|
|
||||||
|
expected_data_be = [
|
||||||
|
header,
|
||||||
|
[
|
||||||
|
self.test_student1.first_name,
|
||||||
|
self.test_student1.last_name,
|
||||||
|
self.test_student1.email,
|
||||||
|
self.test_student1.additional_json_data["Lehrvertragsnummer"],
|
||||||
|
"Fallito",
|
||||||
|
58,
|
||||||
|
"Superato",
|
||||||
|
83,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
self.test_student2.first_name,
|
||||||
|
self.test_student2.last_name,
|
||||||
|
self.test_student2.email,
|
||||||
|
self.test_student2.additional_json_data["Lehrvertragsnummer"],
|
||||||
|
"Superato",
|
||||||
|
100,
|
||||||
|
"Nessun dato",
|
||||||
|
"Nessun dato",
|
||||||
|
],
|
||||||
|
[
|
||||||
|
self.test_student3.first_name,
|
||||||
|
self.test_student3.last_name,
|
||||||
|
self.test_student3.email,
|
||||||
|
None,
|
||||||
|
"Nessun dato",
|
||||||
|
"Nessun dato",
|
||||||
|
"Nessun dato",
|
||||||
|
"Nessun dato",
|
||||||
|
],
|
||||||
|
]
|
||||||
|
self._check_export(wb, expected_data_be, 4, 8)
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ from io import BytesIO
|
||||||
from itertools import groupby
|
from itertools import groupby
|
||||||
|
|
||||||
import structlog
|
import structlog
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from openpyxl import Workbook
|
from openpyxl import Workbook
|
||||||
|
|
||||||
from vbv_lernwelt.course.models import CourseSessionUser
|
from vbv_lernwelt.course.models import CourseSessionUser
|
||||||
|
|
@ -83,15 +83,18 @@ def _create_sheet(
|
||||||
# common user headers..., <attendance_course> <date>, status <attendance_course>, ..
|
# common user headers..., <attendance_course> <date>, status <attendance_course>, ..
|
||||||
col_idx = add_user_headers(sheet)
|
col_idx = add_user_headers(sheet)
|
||||||
attendance_data = {}
|
attendance_data = {}
|
||||||
|
|
||||||
for course in attendance_courses:
|
for course in attendance_courses:
|
||||||
circle = course.get_circle()
|
circle = course.get_circle()
|
||||||
if circle_ids and circle.id not in circle_ids:
|
if circle_ids and circle.id not in circle_ids:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
presence_str = str(_("Anwesenheit")) # f-strings are not picked up by gettext
|
||||||
|
|
||||||
sheet.cell(
|
sheet.cell(
|
||||||
row=1,
|
row=1,
|
||||||
column=col_idx,
|
column=col_idx,
|
||||||
value=f"{_('Anwesenheit')} {circle.title} {course.due_date.start.strftime('%d.%m.%Y')}",
|
value=f"{presence_str} {circle.title} {course.due_date.start.strftime('%d.%m.%Y')}",
|
||||||
)
|
)
|
||||||
user_dict_map = {d["user_id"]: d for d in course.attendance_user_list}
|
user_dict_map = {d["user_id"]: d for d in course.attendance_user_list}
|
||||||
attendance_data[circle.title] = user_dict_map
|
attendance_data[circle.title] = user_dict_map
|
||||||
|
|
@ -110,17 +113,18 @@ def _add_rows(sheet, users: list[CourseSessionUser], attendance_data):
|
||||||
for key, user_dict_map in attendance_data.items():
|
for key, user_dict_map in attendance_data.items():
|
||||||
user_dict = user_dict_map.get(str(user.user.id), {})
|
user_dict = user_dict_map.get(str(user.user.id), {})
|
||||||
status = user_dict.get("status", "") if user_dict else ""
|
status = user_dict.get("status", "") if user_dict else ""
|
||||||
status_text = _("Anwesend") if status == "PRESENT" else _("Nicht anwesend")
|
status_text = (
|
||||||
|
str(_("Anwesend")) if status == "PRESENT" else str(_("Nicht anwesend"))
|
||||||
|
)
|
||||||
sheet.cell(row=row_idx, column=col_idx, value=status_text)
|
sheet.cell(row=row_idx, column=col_idx, value=status_text)
|
||||||
col_idx += 1
|
col_idx += 1
|
||||||
|
|
||||||
|
|
||||||
def add_user_headers(sheet):
|
def add_user_headers(sheet):
|
||||||
# todo: translate headers
|
sheet.cell(row=1, column=1, value=str(_("Vorname")))
|
||||||
sheet.cell(row=1, column=1, value=_("Vorname"))
|
sheet.cell(row=1, column=2, value=str(_("Nachname")))
|
||||||
sheet.cell(row=1, column=2, value=_("Nachname"))
|
sheet.cell(row=1, column=3, value=str(_("Email")))
|
||||||
sheet.cell(row=1, column=3, value=_("Email"))
|
sheet.cell(row=1, column=4, value=str(_("Lehrvertragsnummer")))
|
||||||
sheet.cell(row=1, column=4, value=_("Lehrvertragsnummer"))
|
|
||||||
|
|
||||||
return 5 # return the next column index
|
return 5 # return the next column index
|
||||||
|
|
||||||
|
|
@ -132,7 +136,7 @@ def add_user_export_data(sheet, user: CourseSessionUser, row_idx: int) -> int:
|
||||||
sheet.cell(
|
sheet.cell(
|
||||||
row=row_idx,
|
row=row_idx,
|
||||||
column=4,
|
column=4,
|
||||||
value=user.user.additional_json_data.get(_("Lehrvertragsnummer"), ""),
|
value=user.user.additional_json_data.get("Lehrvertragsnummer", ""),
|
||||||
)
|
)
|
||||||
|
|
||||||
return 5 # return the next column index
|
return 5 # return the next column index
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import io
|
import io
|
||||||
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
from django.utils.translation import activate, deactivate
|
||||||
from openpyxl import load_workbook
|
from openpyxl import load_workbook
|
||||||
|
|
||||||
from vbv_lernwelt.core.constants import TEST_STUDENT1_USER_ID, TEST_STUDENT2_USER_ID
|
from vbv_lernwelt.core.constants import TEST_STUDENT1_USER_ID, TEST_STUDENT2_USER_ID
|
||||||
|
|
@ -19,6 +20,10 @@ class ExportBaseTestCase(TestCase):
|
||||||
cell.value, expected_data[row[0].row - 1][row.index(cell)]
|
cell.value, expected_data[row[0].row - 1][row.index(cell)]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
# Deactivate the language after the test
|
||||||
|
deactivate()
|
||||||
|
|
||||||
|
|
||||||
class AttendanceExportTestCase(ExportBaseTestCase):
|
class AttendanceExportTestCase(ExportBaseTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
@ -41,7 +46,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
||||||
self.test_student2.additional_json_data = {"Lehrvertragsnummer": 1987654321}
|
self.test_student2.additional_json_data = {"Lehrvertragsnummer": 1987654321}
|
||||||
self.test_student2.save()
|
self.test_student2.save()
|
||||||
|
|
||||||
test_student3 = User.objects.get(email="test-student3@example.com")
|
self.test_student3 = User.objects.get(email="test-student3@example.com")
|
||||||
self.attendance_course_be.attendance_user_list = [
|
self.attendance_course_be.attendance_user_list = [
|
||||||
{
|
{
|
||||||
"email": self.test_student1.email,
|
"email": self.test_student1.email,
|
||||||
|
|
@ -69,9 +74,9 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
||||||
"Nicht anwesend",
|
"Nicht anwesend",
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
test_student3.first_name,
|
self.test_student3.first_name,
|
||||||
test_student3.last_name,
|
self.test_student3.last_name,
|
||||||
test_student3.email,
|
self.test_student3.email,
|
||||||
None,
|
None,
|
||||||
"Nicht anwesend",
|
"Nicht anwesend",
|
||||||
],
|
],
|
||||||
|
|
@ -135,3 +140,79 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
||||||
|
|
||||||
wb.active = wb["Test Zürich 2022 a"]
|
wb.active = wb["Test Zürich 2022 a"]
|
||||||
self._check_export(wb, expected_data_zh, 2, 5)
|
self._check_export(wb, expected_data_zh, 2, 5)
|
||||||
|
|
||||||
|
def test_french_export(self):
|
||||||
|
activate("fr")
|
||||||
|
wb = self._generate_workbook([self.course_session_be.id])
|
||||||
|
|
||||||
|
header = [
|
||||||
|
"Prénom",
|
||||||
|
"Nom de famille",
|
||||||
|
"E-mail",
|
||||||
|
"Numéro de contrat d'apprentissage",
|
||||||
|
f"Présence {self.attendance_course_be.get_circle().title} {self.attendance_course_be.due_date.start.strftime('%d.%m.%Y')}",
|
||||||
|
]
|
||||||
|
|
||||||
|
expected_data_be = [
|
||||||
|
header,
|
||||||
|
[
|
||||||
|
self.test_student1.first_name,
|
||||||
|
self.test_student1.last_name,
|
||||||
|
self.test_student1.email,
|
||||||
|
self.test_student1.additional_json_data["Lehrvertragsnummer"],
|
||||||
|
"Présent",
|
||||||
|
],
|
||||||
|
[
|
||||||
|
self.test_student2.first_name,
|
||||||
|
self.test_student2.last_name,
|
||||||
|
self.test_student2.email,
|
||||||
|
self.test_student2.additional_json_data["Lehrvertragsnummer"],
|
||||||
|
"Pas présent",
|
||||||
|
],
|
||||||
|
[
|
||||||
|
self.test_student3.first_name,
|
||||||
|
self.test_student3.last_name,
|
||||||
|
self.test_student3.email,
|
||||||
|
None,
|
||||||
|
"Pas présent",
|
||||||
|
],
|
||||||
|
]
|
||||||
|
self._check_export(wb, expected_data_be, 4, 5)
|
||||||
|
|
||||||
|
def test_italian_export(self):
|
||||||
|
activate("it")
|
||||||
|
wb = self._generate_workbook([self.course_session_be.id])
|
||||||
|
|
||||||
|
header = [
|
||||||
|
"Nome",
|
||||||
|
"Cognome",
|
||||||
|
"Email",
|
||||||
|
"Numero di contratto di tirocinio",
|
||||||
|
f"Presenza {self.attendance_course_be.get_circle().title} {self.attendance_course_be.due_date.start.strftime('%d.%m.%Y')}",
|
||||||
|
]
|
||||||
|
|
||||||
|
expected_data_be = [
|
||||||
|
header,
|
||||||
|
[
|
||||||
|
self.test_student1.first_name,
|
||||||
|
self.test_student1.last_name,
|
||||||
|
self.test_student1.email,
|
||||||
|
self.test_student1.additional_json_data["Lehrvertragsnummer"],
|
||||||
|
"Presente",
|
||||||
|
],
|
||||||
|
[
|
||||||
|
self.test_student2.first_name,
|
||||||
|
self.test_student2.last_name,
|
||||||
|
self.test_student2.email,
|
||||||
|
self.test_student2.additional_json_data["Lehrvertragsnummer"],
|
||||||
|
"Non presente",
|
||||||
|
],
|
||||||
|
[
|
||||||
|
self.test_student3.first_name,
|
||||||
|
self.test_student3.last_name,
|
||||||
|
self.test_student3.email,
|
||||||
|
None,
|
||||||
|
"Non presente",
|
||||||
|
],
|
||||||
|
]
|
||||||
|
self._check_export(wb, expected_data_be, 4, 5)
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ from typing import List, Tuple
|
||||||
|
|
||||||
import structlog
|
import structlog
|
||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from openpyxl import Workbook
|
from openpyxl import Workbook
|
||||||
|
|
||||||
from vbv_lernwelt.course_session.services.export_attendance import (
|
from vbv_lernwelt.course_session.services.export_attendance import (
|
||||||
|
|
@ -147,11 +147,11 @@ def _create_sheet(wb: Workbook, title: str, data: list[FeedbackResponse]):
|
||||||
)
|
)
|
||||||
|
|
||||||
# add header
|
# add header
|
||||||
sheet.cell(row=1, column=1, value=_("Durchführung"))
|
sheet.cell(row=1, column=1, value=str(_("Durchführung")))
|
||||||
sheet.cell(row=1, column=2, value=_("Datum"))
|
sheet.cell(row=1, column=2, value=str(_("Datum")))
|
||||||
questions = [q[1] for q in question_data]
|
questions = [q[1] for q in question_data]
|
||||||
for col_idx, title in enumerate(questions, start=3):
|
for col_idx, title in enumerate(questions, start=3):
|
||||||
sheet.cell(row=1, column=col_idx, value=title)
|
sheet.cell(row=1, column=col_idx, value=str(title))
|
||||||
|
|
||||||
_add_rows(sheet, data, question_data)
|
_add_rows(sheet, data, question_data)
|
||||||
return sheet
|
return sheet
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import datetime
|
import datetime
|
||||||
import io
|
import io
|
||||||
|
|
||||||
|
from django.utils.translation import activate
|
||||||
from openpyxl import load_workbook
|
from openpyxl import load_workbook
|
||||||
|
|
||||||
from vbv_lernwelt.core.constants import TEST_STUDENT1_USER_ID, TEST_STUDENT2_USER_ID
|
from vbv_lernwelt.core.constants import TEST_STUDENT1_USER_ID, TEST_STUDENT2_USER_ID
|
||||||
|
|
@ -201,3 +202,53 @@ class FeedbackExportTestCase(ExportBaseTestCase):
|
||||||
self.assertEqual(wb.sheetnames[0], "Fahrzeug")
|
self.assertEqual(wb.sheetnames[0], "Fahrzeug")
|
||||||
|
|
||||||
self._check_export(wb, self.expected_data_fahrzeug, 3, 12)
|
self._check_export(wb, self.expected_data_fahrzeug, 3, 12)
|
||||||
|
|
||||||
|
def test_french_export(self):
|
||||||
|
activate("fr")
|
||||||
|
wb = self._generate_workbook(
|
||||||
|
[self.course_session_be.id, self.course_session_zh.id]
|
||||||
|
)
|
||||||
|
|
||||||
|
header = [
|
||||||
|
"Opérations",
|
||||||
|
"Date",
|
||||||
|
"Degré de satisfaction au global",
|
||||||
|
"Degré de réalisation des objectifs",
|
||||||
|
"As-tu l’impression de bien maîtriser les sujets qui ont été abordés pendant le cours ?",
|
||||||
|
"Les travaux préparatoires étaient-ils clairs et compréhensibles ?",
|
||||||
|
"Que penses-tu des compétences techniques de la personne chargée du cours et de sa maîtrise du sujet ?",
|
||||||
|
"Les questions et les suggestions des participants ont-elles été prises au sérieux et traitées correctement ?",
|
||||||
|
"Souhaites-tu ajouter quelque chose à l’intention de la personne chargée du cours ?",
|
||||||
|
"Est-ce que tu recommandes ce cours ?",
|
||||||
|
"Qu’est-ce qui t’a particulièrement plu ?",
|
||||||
|
"À ton avis, quels sont les points qui pourraient être améliorés ?",
|
||||||
|
]
|
||||||
|
|
||||||
|
self.expected_data_fahrzeug[0] = header
|
||||||
|
|
||||||
|
self._check_export(wb, self.expected_data_fahrzeug, 3, 12)
|
||||||
|
|
||||||
|
def test_italian_export(self):
|
||||||
|
activate("it")
|
||||||
|
wb = self._generate_workbook(
|
||||||
|
[self.course_session_be.id, self.course_session_zh.id]
|
||||||
|
)
|
||||||
|
|
||||||
|
header = [
|
||||||
|
"Svolgimenti",
|
||||||
|
"Data",
|
||||||
|
"Soddisfazione complessiva",
|
||||||
|
"Raggiungimento complessivo degli obiettivi",
|
||||||
|
"Come valuti il tuo livello di preparazione sui temi dopo il corso?",
|
||||||
|
"Gli incarichi di preparazione erano chiari e comprensibili?",
|
||||||
|
"Come valuti il livello di preparazione sui temi e le competenze specialistiche dell’istruttore/istruttrice del corso?",
|
||||||
|
"Le domande e i suggerimenti dei/delle partecipanti al corso sono stati accolti e presi sul serio?",
|
||||||
|
"Cos’altro vorresti ancora dire all’istruttore/istruttrice del corso?",
|
||||||
|
"Raccomanderesti il corso?",
|
||||||
|
"Cos’hai apprezzato particolarmente?",
|
||||||
|
"Dove vedi un potenziale di miglioramento?",
|
||||||
|
]
|
||||||
|
|
||||||
|
self.expected_data_fahrzeug[0] = header
|
||||||
|
|
||||||
|
self._check_export(wb, self.expected_data_fahrzeug, 3, 12)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M14.0002 3.57463C13.8229 3.57463 13.6456 3.63996 13.5056 3.77996L6.55224 10.7333L7.54158 11.7226L13.3002 5.96396L13.3002 20.8226L14.7002 20.8226L14.7002 5.96396L20.4589 11.7226L21.4482 10.7333L14.4949 3.77996C14.3549 3.63996 14.1776 3.57463 14.0002 3.57463V3.57463Z" fill="#00224D"/>
|
||||||
|
<path d="M23.3802 23.184H4.61084V24.584H23.3802V23.184Z" fill="#00224D"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 470 B |
Loading…
Reference in New Issue