From f1f479a6f46765c0bf6e779bae5a4856f65722fc Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Mon, 14 Aug 2023 17:20:33 +0200 Subject: [PATCH] Add due date for casework --- client/src/locales/de/translation.json | 6 +-- client/src/locales/fr/translation.json | 44 +++++++++++++++++-- client/src/locales/it/translation.json | 44 +++++++++++++++++-- client/src/utils/typeMaps.ts | 2 +- server/vbv_lernwelt/importer/services.py | 14 +++++- .../tests/test_import_course_sessions.py | 15 ++++++- 6 files changed, 111 insertions(+), 14 deletions(-) diff --git a/client/src/locales/de/translation.json b/client/src/locales/de/translation.json index 9bd5b593..b6228c71 100644 --- a/client/src/locales/de/translation.json +++ b/client/src/locales/de/translation.json @@ -152,7 +152,7 @@ "imprintText": "Impressum" }, "general": { - "back": "capit", + "back": "Zurück", "backCapitalized": "Zurück", "backToCircle": "zurück zum Circle", "backToLearningPath": "zurück zum Lernpfad", @@ -211,7 +211,7 @@ "login": { "demoLogin": "Demo Login", "guidelineFile": "Registrierung _myVBV.pptx", - "guidelineText": "Erfahre wie du dich als üK-Lernende/r registrieren kannst", + "guidelineText": "Erfahre wie du dich als Lernende/r registrieren kannst", "login": "Login", "ssoLogin": "SSO Login/Registration", "ssoText": "Klicke auf den Button, um dich über SSO anzumelden oder zu registrieren.", @@ -269,7 +269,7 @@ "dashboard": { "allClear": "Alles klar?", "nextSteps": "Als lernende Person wirst in den kommenden Tagen einem üK-Lehrgang zugewiesen. Dann\nerscheint hier Deine personalisierte Lehrgangs-Box mit den weiteren Informationen.", - "welcome": "Es hat alles geklappt, du bist nun auf der digitalen Lernumgebung des Berufsbildungsverbands der\nVersicherungswirtschaft (VBV) registriert!" + "welcome": "Es hat alles geklappt, du bist nun auf der digitalen Lernumgebung des Berufsbildungsverbands derVersicherungswirtschaft (VBV) registriert!" } }, "x von y Bewertungen freigegeben": "{{x}} von {{y}} Bewertungen freigegeben", diff --git a/client/src/locales/fr/translation.json b/client/src/locales/fr/translation.json index ce39c427..4cbd27ce 100644 --- a/client/src/locales/fr/translation.json +++ b/client/src/locales/fr/translation.json @@ -1,8 +1,20 @@ { + "Anwesenheit Präsenzkurse": "Présence aux cours", + "Anwesenheit bestätigen": "Confirmer la présence", + "Anwesenheit prüfen": "Vérifier la présence", + "Anwesenheitskontrolle Präsenzkurse": "Contrôle de présence aux cours", "Benutzername": "Nom d’utilisateur", + "Ergebnisse anschauen": "Consulter les résultats", + "Feedback": "Feedback", + "Feedback anschauen": "Consulter le feedback", "MS Teams öffnen": "Ouvrir MS Teams ", + "Nächste Termine": "Prochaines dates", "Passwort": "Mot de passe", + "Status anschauen": "Consulter le statut", + "TODO: Nächste Termine": "TODO: prochaines dates", "Trainerunterlagen": "Documents du formateur / de la formatrice", + "Vorbereitungsauftrag": "Mandat de préparation", + "Wissens - und Verständnisfragen": "Questions de connaissance et de compréhension ", "Zur Zeit sind keine Termine vorhanden": "Aucune réunion n’est prévue pour le moment", "assignment": { "acceptConditionsDisclaimer": "Accepter les conditions et remettre les résultats", @@ -85,11 +97,14 @@ }, "dashboard": { "courses": "Formation", + "dueDatesTitle": "Dates", "nocourses": "Tu n’as été affecté(e) à aucune formation encore.", "welcome": "Bienvenue, {{name}}" }, "dueDates": { - "nextDueDates": "Prochaines réunions" + "nextDueDates": "Prochaines réunions", + "noDueDatesAvailable": "Pas de dates disponibles", + "showAllDueDates": "Afficher tous les dates" }, "feedback": { "answers": "Réponses", @@ -138,7 +153,7 @@ }, "general": { "back": "Retour", - "backCapitalized": "@.capitalize:general.back", + "backCapitalized": "Retour", "backToCircle": "Revenir au cercle", "backToLearningPath": "Revenir au programme de formation", "certificate_many": "Certificats", @@ -191,6 +206,7 @@ "learningPathPage": { "currentCircle": "Cercle en cours", "listView": "Affichage sous forme de liste", + "nextDueDates": "Prochaines dates", "nextStep": "Étape suivante", "pathView": "Affichage sous forme de parcours", "progressText": "Tu as traité {{ inProgressCount }} de {{ allCount }} cercles", @@ -200,9 +216,13 @@ }, "login": { "demoLogin": "Connexion Demo", + "guidelineFile": "Régistration _myAFA.pptx", + "guidelineText": "Découvre comment t'inscrire en tant qu'apprenant-e", "login": "Login", "ssoLogin": "Connexion SSO / Inscription", - "ssoText": "Clique sur le bouton pour te connecter via le SSO ou t’inscrire." + "ssoText": "Clique sur le bouton pour te connecter via le SSO ou t’inscrire.", + "welcomeText": "Bienvenue sur la page de login pour les cours interentreprises de la branche de formation et d'examens ommerciales \"Assurance privée\".", + "welcomeUk": "Bienvenue" }, "mainNavigation": { "logout": "Se déconnecter", @@ -246,5 +266,21 @@ }, "settings": { "emailNotifications": "Notifications par e-mail" - } + }, + "uk": { + "contact": { + "address": "Laupenstrasse 10, 3008 Berne", + "team": "Équipe Dévelopement de la relève", + "title": "Association pour la formation professionnelle en assurance" + }, + "dashboard": { + "allClear": "Tout est clair ?", + "nextSteps": "En tant que personne en formation, tu seras attribué(e) à un cours interentreprise dans les prochains jours. Puis tu verras apparaître ici ta boîte de formation personnalisée avec les informations complémentaires.", + "welcome": "Tout s'est bien passé, tu es maintenant inscrit/e à l'environnement d'apprentissage numérique de l'Association pour la formation professionnelle en assurance (AFA) !" + } + }, + "x von y Bewertungen freigegeben": "{{x}} de {{y}} évaluations validée/s", + "x von y Ergebnisse abgegeben": "{{x}} de {{y}} résultats remis", + "x von y Feedbacks abgegeben": "{{x}} de {{y}} feedbacks remis", + "x von y abgeschlossen": "{{x}} de {{y}} achevée/s" } diff --git a/client/src/locales/it/translation.json b/client/src/locales/it/translation.json index 8948cffc..e37814c3 100644 --- a/client/src/locales/it/translation.json +++ b/client/src/locales/it/translation.json @@ -1,8 +1,20 @@ { + "Anwesenheit Präsenzkurse": "Presenza ai corsi", + "Anwesenheit bestätigen": "Confermare la presenza", + "Anwesenheit prüfen": "Verificare la presenza", + "Anwesenheitskontrolle Präsenzkurse": "Controllo di presenza ai corsi", "Benutzername": "Nome utente", + "Ergebnisse anschauen": "Vedere i risultati", + "Feedback": "Feedback", + "Feedback anschauen": "Vedere il feedback", "MS Teams öffnen": "Aprire MS Teams", + "Nächste Termine": "Prossime date", "Passwort": "Password", + "Status anschauen": "Vedere lo stato", + "TODO: Nächste Termine": "TODO: prossime date", "Trainerunterlagen": "Documenti del/della trainer", + "Vorbereitungsauftrag": "Incarico di preparazione", + "Wissens - und Verständnisfragen": "Domande di conoscenza e di comprensione", "Zur Zeit sind keine Termine vorhanden": "Al momento non ci sono scadenze", "assignment": { "acceptConditionsDisclaimer": "Accettare le condizioni e consegnare i risultati", @@ -85,11 +97,14 @@ }, "dashboard": { "courses": "Corso", + "dueDatesTitle": "Date", "nocourses": "Non sei ancora stato/a assegnato/a a nessun corso.", "welcome": "Ti diamo il benvenuto, {{name}}" }, "dueDates": { - "nextDueDates": "Prossime scadenze" + "nextDueDates": "Prossime scadenze", + "noDueDatesAvailable": "Nessuna data disponibile", + "showAllDueDates": "Mostrare tutte le date" }, "feedback": { "answers": "Risposte", @@ -138,7 +153,7 @@ }, "general": { "back": "Indietro", - "backCapitalized": "@.capitalize:general.back", + "backCapitalized": "Indietro", "backToCircle": "Torna al Circle", "backToLearningPath": "Torna al percorso formativo", "certificate_many": "Certificati", @@ -191,6 +206,7 @@ "learningPathPage": { "currentCircle": "Circle attuale", "listView": "Vista elenco", + "nextDueDates": "Prossime date", "nextStep": "Prossimo passo", "pathView": "Vista percorso", "progressText": "Hai svolto {{ inProgressCount }} Circle su {{ allCount }}", @@ -200,9 +216,13 @@ }, "login": { "demoLogin": "Login Demo", + "guidelineFile": "Registrazione _myAFA.pptx", + "guidelineText": "Scopri come iscriverti come apprendista professionale", "login": "Login", "ssoLogin": "Login/Registrazione SSO", - "ssoText": "Clicca sul pulsante per effettuare il login o registrarti tramite SSO." + "ssoText": "Clicca sul pulsante per effettuare il login o registrarti tramite SSO.", + "welcomeText": "Benvenuti nella pagina di login per i corsi interaziendali del ramo di formazione e degli esami commerciali \"Assicurazione privata\".", + "welcomeUk": "Benvenuti" }, "mainNavigation": { "logout": "Logout", @@ -246,5 +266,21 @@ }, "settings": { "emailNotifications": "Notifiche e-mail" - } + }, + "uk": { + "contact": { + "address": "Laupenstrasse 10, 3008 Berna", + "team": "Team Sviluppo delle giovani leve", + "title": "Associazione per la formazione professionale nell'assicurzione" + }, + "dashboard": { + "allClear": "È tutto chiaro?", + "nextSteps": "In qualità di apprendista, nei prossimi giorni sarai assegnata/o a un corso interaziendale. Poi il riquadro di formazione personalizzato del corso apparirà qui con ulteriori informazioni.", + "welcome": "Tutto ha funzionato, ora sei registrata/o nell'ambiente di apprendimento digitale dell'Associazione per la formazione professionale nell'assicurazione (AFA)!" + } + }, + "x von y Bewertungen freigegeben": "{{x}} di {{y}} valutazioni approvate/a", + "x von y Ergebnisse abgegeben": "{{x}} di {{y}} risultati consegnati/o", + "x von y Feedbacks abgegeben": "{{x}} di {{y}} feedback consegnati/o", + "x von y abgeschlossen": "{{x}} di {{y}} completate/a" } diff --git a/client/src/utils/typeMaps.ts b/client/src/utils/typeMaps.ts index 34198631..82d41546 100644 --- a/client/src/utils/typeMaps.ts +++ b/client/src/utils/typeMaps.ts @@ -21,7 +21,7 @@ export function learningContentTypeData( } else if (lc.assignment_type === "REFLECTION") { title = t("Reflexion"); } else if (lc.assignment_type === "CONDITION_ACCEPTANCE") { - title = t("Vorbedingung"); + title = t("Auftrag"); } return { title: title, diff --git a/server/vbv_lernwelt/importer/services.py b/server/vbv_lernwelt/importer/services.py index 26381553..24de03ca 100644 --- a/server/vbv_lernwelt/importer/services.py +++ b/server/vbv_lernwelt/importer/services.py @@ -357,12 +357,24 @@ def create_or_update_course_session( csa.submission_deadline.end = timezone.make_aware(start) csa.submission_deadline.save() + elif ( + csa.learning_content.assignment_type + == AssignmentType.CASEWORK.value + and end + ): + csa.submission_deadline.end = timezone.make_aware(start) + timezone.timedelta(days=30) + csa.submission_deadline.save() + return cs def validate_row_data(data: Dict[str, any], required_headers: List[str]): + logger.debug( + "validate_row_data_missing_header", + data={"data": data}, + label="import", + ) for header in required_headers: - some = str(data.get(header, "")).strip() if str(data.get(header, "")).strip() in ["", "None"]: logger.debug( "validate_row_data_missing_header", diff --git a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py index 9a76e169..b9469c66 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py +++ b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py @@ -3,11 +3,12 @@ import os from django.test import TestCase from openpyxl.reader.excel import load_workbook +from vbv_lernwelt.assignment.models import AssignmentType from vbv_lernwelt.core.create_default_users import create_default_users from vbv_lernwelt.core.models import User from vbv_lernwelt.course.creators.test_course import create_test_course from vbv_lernwelt.course.models import CourseSession, CourseSessionUser -from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse +from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse, CourseSessionAssignment from vbv_lernwelt.duedate.models import DueDate from vbv_lernwelt.importer.services import ( create_or_update_course_session, @@ -87,6 +88,12 @@ class CreateOrUpdateCourseSessionTestCase(TestCase): self.assertEqual("", attendance_course.trainer) self.assertEqual(4, DueDate.objects.count()) + casework = CourseSessionAssignment.objects.filter( + learning_content__assignment_type=AssignmentType.CASEWORK.value).first() + self.assertEqual( + casework.submission_deadline.end.isoformat(), "2023-07-06T11:30:00+00:00" + ) + def test_update_course_session(self): row = [ ("ID", "AG 2023 A"), @@ -164,6 +171,12 @@ class CreateOrUpdateCourseSessionTestCase(TestCase): ) self.assertEqual(4, DueDate.objects.count()) + casework = CourseSessionAssignment.objects.filter( + learning_content__assignment_type=AssignmentType.CASEWORK.value).first() + self.assertEqual( + casework.submission_deadline.end.isoformat(), "2023-07-06T12:30:00+00:00" + ) + def test_import_course_session_twice(self): """ importing the course session twice should create the