Add trainer import code
This commit is contained in:
parent
281521a8d0
commit
2e7a069d0a
|
|
@ -3,9 +3,9 @@ from typing import Dict, Any
|
||||||
from openpyxl.reader.excel import load_workbook
|
from openpyxl.reader.excel import load_workbook
|
||||||
|
|
||||||
from vbv_lernwelt.core.models import User
|
from vbv_lernwelt.core.models import User
|
||||||
from vbv_lernwelt.course.models import Course, CourseSession
|
from vbv_lernwelt.course.models import Course, CourseSession, CourseSessionUser
|
||||||
from vbv_lernwelt.importer.utils import try_parse_datetime
|
from vbv_lernwelt.importer.utils import try_parse_datetime, parse_circle_group_string
|
||||||
from vbv_lernwelt.learnpath.models import LearningContentAttendanceCourse
|
from vbv_lernwelt.learnpath.models import LearningContentAttendanceCourse, Circle
|
||||||
|
|
||||||
|
|
||||||
def create_or_update_user(
|
def create_or_update_user(
|
||||||
|
|
@ -27,7 +27,7 @@ def create_or_update_user(
|
||||||
user = User(sso_id=sso_id, email=email, username=email)
|
user = User(sso_id=sso_id, email=email, username=email)
|
||||||
|
|
||||||
user.email = email
|
user.email = email
|
||||||
user.sso_id = sso_id
|
user.sso_id = user.sso_id or sso_id
|
||||||
user.username = email
|
user.username = email
|
||||||
user.first_name = first_name
|
user.first_name = first_name
|
||||||
user.last_name = last_name
|
user.last_name = last_name
|
||||||
|
|
@ -100,3 +100,52 @@ def create_or_update_course_session(course: Course, data: Dict[str, Any], circle
|
||||||
cs.save()
|
cs.save()
|
||||||
|
|
||||||
return cs
|
return cs
|
||||||
|
|
||||||
|
|
||||||
|
def create_or_update_trainer(course: Course, data: Dict[str, Any]):
|
||||||
|
user = create_or_update_user(
|
||||||
|
email=data["Email"],
|
||||||
|
first_name=data["Vorname"],
|
||||||
|
last_name=data["Name"],
|
||||||
|
)
|
||||||
|
|
||||||
|
# TODO: handle language
|
||||||
|
|
||||||
|
import_id = data["Generation"].strip()
|
||||||
|
groups = [g.strip() for g in data["Klasse"].strip().split(",")]
|
||||||
|
|
||||||
|
# general expert handling
|
||||||
|
for group in groups:
|
||||||
|
course_session = CourseSession.objects.filter(
|
||||||
|
import_id=import_id, group=group, course=course
|
||||||
|
).first()
|
||||||
|
if course_session:
|
||||||
|
csu, _created = CourseSessionUser.objects.get_or_create(
|
||||||
|
course_session_id=course_session.id, user_id=user.id
|
||||||
|
)
|
||||||
|
csu.role = CourseSessionUser.Role.EXPERT
|
||||||
|
csu.save()
|
||||||
|
|
||||||
|
# circle expert handling
|
||||||
|
circle_data = parse_circle_group_string(data["Circles"])
|
||||||
|
for circle_string in circle_data:
|
||||||
|
parts = circle_string.split("(", 1)
|
||||||
|
circle_name = parts[0].strip()
|
||||||
|
groups = [g.strip() for g in parts[1].rstrip(")").strip().split(",")]
|
||||||
|
|
||||||
|
# print(circle_name, groups)
|
||||||
|
for group in groups:
|
||||||
|
course_session = CourseSession.objects.filter(
|
||||||
|
import_id=import_id, group=group, course=course
|
||||||
|
).first()
|
||||||
|
circle = Circle.objects.filter(
|
||||||
|
slug=f"{course.slug}-lp-circle-{circle_name.lower()}"
|
||||||
|
).first()
|
||||||
|
|
||||||
|
if course_session and circle:
|
||||||
|
csu = CourseSessionUser.objects.filter(
|
||||||
|
course_session_id=course_session.id, user_id=user.id
|
||||||
|
).first()
|
||||||
|
if csu:
|
||||||
|
csu.expert.add(circle)
|
||||||
|
csu.save()
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,76 @@
|
||||||
|
import os
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from django.test import TestCase
|
||||||
|
from openpyxl.reader.excel import load_workbook
|
||||||
|
|
||||||
|
from vbv_lernwelt.course.creators.test_course import create_test_course
|
||||||
|
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
|
||||||
|
from vbv_lernwelt.importer.services import create_or_update_trainer
|
||||||
|
|
||||||
|
test_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
|
|
||||||
|
class ImportTrainerTestCase(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.course = create_test_course(include_vv=False)
|
||||||
|
|
||||||
|
def test_import_excel_file(self):
|
||||||
|
workbook = load_workbook(
|
||||||
|
filename=f"{test_dir}/Schulungen_Durchfuehrung_Trainer.xlsx"
|
||||||
|
)
|
||||||
|
sheet = workbook["Schulungen Trainer"]
|
||||||
|
|
||||||
|
header = [cell.value for cell in sheet[1]]
|
||||||
|
|
||||||
|
for row in sheet.iter_rows(min_row=2, values_only=True):
|
||||||
|
row_with_header = list(zip(header, row))
|
||||||
|
print(row_with_header)
|
||||||
|
|
||||||
|
|
||||||
|
class CreateOrUpdateCourseSessionTestCase(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.course = create_test_course(include_vv=False)
|
||||||
|
self.course_session_a = CourseSession.objects.create(
|
||||||
|
course=self.course,
|
||||||
|
title="Deutschschweiz 2023 A",
|
||||||
|
import_id="DE 2023",
|
||||||
|
group="A",
|
||||||
|
)
|
||||||
|
self.course_session_a = CourseSession.objects.create(
|
||||||
|
course=self.course,
|
||||||
|
title="Deutschschweiz 2023 B",
|
||||||
|
import_id="DE 2023",
|
||||||
|
group="B",
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_create_course_session(self):
|
||||||
|
row = [
|
||||||
|
("Name", "Hänni"),
|
||||||
|
("Vorname", "Fabienne"),
|
||||||
|
("Email", "fabienne.haenni@vbv-afa.ch"),
|
||||||
|
("Sprache", "de"),
|
||||||
|
("Generation", "DE 2023"),
|
||||||
|
("Klasse", "A, B"),
|
||||||
|
("Circles", "Fahrzeug (A, B), Reisen (A), KMU (B)"),
|
||||||
|
("Status Referenten", "ok"),
|
||||||
|
(None, "Schulung D"),
|
||||||
|
("Klasse foo", datetime(2023, 6, 6, 0, 0)),
|
||||||
|
]
|
||||||
|
|
||||||
|
create_or_update_trainer(self.course, dict(row))
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
CourseSessionUser.objects.filter(
|
||||||
|
user__email="fabienne.haenni@vbv-afa.ch"
|
||||||
|
).count(),
|
||||||
|
2,
|
||||||
|
)
|
||||||
|
|
||||||
|
csu = CourseSessionUser.objects.get(
|
||||||
|
course_session=self.course_session_a,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(csu.role, CourseSessionUser.Role.EXPERT)
|
||||||
|
self.assertEqual(csu.user.email, "fabienne.haenni@vbv-afa.ch")
|
||||||
|
self.assertEqual(csu.expert.all().first().title, "Fahrzeug")
|
||||||
|
|
@ -58,7 +58,6 @@ class CreateOrUpdateUserTestCase(TestCase):
|
||||||
email="daniel@example.com",
|
email="daniel@example.com",
|
||||||
first_name="Daniel",
|
first_name="Daniel",
|
||||||
last_name="Marro",
|
last_name="Marro",
|
||||||
sso_id="12229620-81ea-483d-8d96-6ba8be5f9eb7",
|
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(1, User.objects.count())
|
self.assertEqual(1, User.objects.count())
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ from vbv_lernwelt.importer.utils import (
|
||||||
try_parse_date,
|
try_parse_date,
|
||||||
try_parse_int,
|
try_parse_int,
|
||||||
try_parse_datetime,
|
try_parse_datetime,
|
||||||
|
parse_circle_group_string,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -180,3 +181,12 @@ class TryParseDateTimeTestCase(TestCase):
|
||||||
|
|
||||||
self.assertTrue(flag)
|
self.assertTrue(flag)
|
||||||
self.assertEqual(datetime(2023, 6, 9, 13, 30, 0), value)
|
self.assertEqual(datetime(2023, 6, 9, 13, 30, 0), value)
|
||||||
|
|
||||||
|
|
||||||
|
class ParceCircleGroupStringTestCase(TestCase):
|
||||||
|
def test_withMultipleCircles(self):
|
||||||
|
value = "Fahrzeug (A, B), Reisen (A), KMU (B)"
|
||||||
|
self.assertEqual(
|
||||||
|
["Fahrzeug (A, B)", "Reisen (A)", "KMU (B)"],
|
||||||
|
parse_circle_group_string(value),
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import datetime
|
import datetime
|
||||||
import re
|
import re
|
||||||
from typing import Any, Tuple, Union, Optional
|
from typing import Any, Tuple, Union, Optional, List
|
||||||
|
|
||||||
from dateutil.parser import parse
|
from dateutil.parser import parse
|
||||||
from six import string_types
|
from six import string_types
|
||||||
|
|
@ -88,3 +88,11 @@ def try_parse_datetime(
|
||||||
return False, value
|
return False, value
|
||||||
else:
|
else:
|
||||||
return False, value
|
return False, value
|
||||||
|
|
||||||
|
|
||||||
|
def parse_circle_group_string(value: str) -> List[str]:
|
||||||
|
# This regex pattern matches any comma that is not inside parentheses
|
||||||
|
pattern = r",(?![^()]*\))"
|
||||||
|
|
||||||
|
# re.split() splits the string based on the pattern
|
||||||
|
return [x.strip() for x in re.split(pattern, value)]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue