Import students from excel

This commit is contained in:
Daniel Egger 2023-05-31 22:09:36 +02:00
parent d6df9b624b
commit 32233ec38e
10 changed files with 115 additions and 54 deletions

View File

@ -7,14 +7,14 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('core', '0001_initial'),
("core", "0001_initial"),
]
operations = [
migrations.AlterModelManagers(
name='user',
name="user",
managers=[
('objects', django.contrib.auth.models.UserManager()),
("objects", django.contrib.auth.models.UserManager()),
],
),
]

View File

@ -46,6 +46,7 @@ class CourseSessionUserAdmin(admin.ModelAdmin):
]
list_filter = [
"course_session",
"role",
]
fieldsets = [

View File

@ -45,15 +45,16 @@ from vbv_lernwelt.course.creators.versicherungsvermittlerin import (
create_versicherungsvermittlerin_with_categories,
)
from vbv_lernwelt.course.models import (
Course,
CoursePage,
CourseSession,
CourseSessionUser,
Course,
)
from vbv_lernwelt.course.services import mark_course_completion
from vbv_lernwelt.feedback.creators.create_demo_feedback import create_feedback
from vbv_lernwelt.importer.services import (
import_course_sessions_from_excel,
import_students_from_excel,
import_trainers_from_excel,
)
from vbv_lernwelt.learnpath.create_vv_new_learning_path import (
@ -460,6 +461,10 @@ def create_course_training_de():
course,
f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx",
)
import_students_from_excel(
course,
f"{current_dir}/../../../importer/tests/Schulungen_Teilnehmende.xlsx",
)
for cs in CourseSession.objects.filter(course_id=COURSE_UK_TRAINING):
cs.assignment_details_list = [

View File

@ -6,33 +6,33 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('course', '0003_rename_attendance_days_coursesession_attendance_courses'),
("course", "0003_rename_attendance_days_coursesession_attendance_courses"),
]
operations = [
migrations.AddField(
model_name='coursesession',
name='generation',
field=models.TextField(blank=True, default=''),
model_name="coursesession",
name="generation",
field=models.TextField(blank=True, default=""),
),
migrations.AddField(
model_name='coursesession',
name='group',
field=models.TextField(blank=True, default=''),
model_name="coursesession",
name="group",
field=models.TextField(blank=True, default=""),
),
migrations.AddField(
model_name='coursesession',
name='import_id',
field=models.TextField(blank=True, default=''),
model_name="coursesession",
name="import_id",
field=models.TextField(blank=True, default=""),
),
migrations.AddField(
model_name='coursesession',
name='region',
field=models.TextField(blank=True, default=''),
model_name="coursesession",
name="region",
field=models.TextField(blank=True, default=""),
),
migrations.AlterField(
model_name='coursesession',
name='title',
model_name="coursesession",
name="title",
field=models.TextField(unique=True),
),
]

View File

@ -1,4 +1,4 @@
from typing import Dict, Any
from typing import Any, Dict
import structlog
from openpyxl.reader.excel import load_workbook
@ -6,11 +6,11 @@ from openpyxl.reader.excel import load_workbook
from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.models import Course, CourseSession, CourseSessionUser
from vbv_lernwelt.importer.utils import (
try_parse_datetime,
parse_circle_group_string,
calc_header_tuple_list_from_pyxl_sheet,
parse_circle_group_string,
try_parse_datetime,
)
from vbv_lernwelt.learnpath.models import LearningContentAttendanceCourse, Circle
from vbv_lernwelt.learnpath.models import Circle, LearningContentAttendanceCourse
logger = structlog.get_logger(__name__)
@ -183,3 +183,41 @@ def create_or_update_trainer(course: Course, data: Dict[str, Any]):
if csu:
csu.expert.add(circle)
csu.save()
def import_students_from_excel(course: Course, filename: str):
workbook = load_workbook(filename=filename)
sheet = workbook.active
tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet)
for row in tuple_list:
create_or_update_student(course, dict(row))
def create_or_update_student(course: Course, data: Dict[str, Any]):
logger.debug(
"create_or_update_student",
course=course.title,
data=data,
label="import",
)
user = create_or_update_user(
email=data["Email"],
first_name=data["Vorname"],
last_name=data["Name"],
)
# TODO: handle language
# general expert handling
import_ids = [i.strip() for i in data["Durchführungen"].split(",")]
for import_id in import_ids:
course_session = CourseSession.objects.filter(
import_id=import_id, course=course
).first()
if course_session:
csu, _created = CourseSessionUser.objects.get_or_create(
course_session_id=course_session.id, user_id=user.id
)
csu.save()

View File

@ -6,7 +6,7 @@ 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
from vbv_lernwelt.importer.services import create_or_update_student
from vbv_lernwelt.importer.utils import calc_header_tuple_list_from_pyxl_sheet
test_dir = os.path.dirname(os.path.abspath(__file__))
@ -15,6 +15,12 @@ test_dir = os.path.dirname(os.path.abspath(__file__))
class ImportStudentsTestCase(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 A",
group="A",
)
def test_import_excel_file(self):
workbook = load_workbook(filename=f"{test_dir}/Schulungen_Teilnehmende.xlsx")
@ -23,51 +29,48 @@ class ImportStudentsTestCase(TestCase):
tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet)
for row in tuple_list:
print(row)
create_or_update_student(self.course, dict(row))
self.assertEqual(CourseSessionUser.objects.count(), 26)
class CreateOrUpdateCourseSessionTestCase(TestCase):
class CreateOrUpdateStudentTestCase(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",
import_id="DE 2023 A",
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):
def test_create_student(self):
row = [
("Name", "Hänni"),
("Vorname", "Fabienne"),
("Email", "fabienne.haenni@vbv-afa.ch"),
("Name", "Rascher"),
("Vorname", "Barbara"),
("Email", "barbara.rascher@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)),
("Durchführungen", "DE 2023 A"),
("Datum", datetime(2023, 9, 6, 0, 0)),
(None, "VBV"),
(None, None),
(None, None),
(None, None),
(None, None),
]
create_or_update_trainer(self.course, dict(row))
create_or_update_student(self.course, dict(row))
self.assertEqual(
CourseSessionUser.objects.filter(
user__email="fabienne.haenni@vbv-afa.ch"
user__email="barbara.rascher@vbv-afa.ch"
).count(),
2,
1,
)
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")
self.assertEqual(csu.role, CourseSessionUser.Role.MEMBER)
self.assertEqual(csu.user.email, "barbara.rascher@vbv-afa.ch")

View File

@ -14,6 +14,18 @@ test_dir = os.path.dirname(os.path.abspath(__file__))
class ImportTrainerTestCase(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 A",
group="A",
)
self.course_session_a = CourseSession.objects.create(
course=self.course,
title="Deutschschweiz 2023 B",
import_id="DE 2023 B",
group="B",
)
def test_import_excel_file(self):
workbook = load_workbook(
@ -26,8 +38,10 @@ class ImportTrainerTestCase(TestCase):
print(row)
create_or_update_trainer(self.course, dict(row))
self.assertEqual(CourseSessionUser.objects.count(), 4)
class CreateOrUpdateCourseSessionTestCase(TestCase):
class CreateOrUpdateTrainerTestCase(TestCase):
def setUp(self):
self.course = create_test_course(include_vv=False)
self.course_session_a = CourseSession.objects.create(
@ -43,7 +57,7 @@ class CreateOrUpdateCourseSessionTestCase(TestCase):
group="B",
)
def test_create_course_session(self):
def test_create_trainer(self):
row = [
("Name", "Hänni"),
("Vorname", "Fabienne"),

View File

@ -2,10 +2,10 @@ from datetime import date, datetime
from unittest import TestCase
from vbv_lernwelt.importer.utils import (
try_parse_date,
try_parse_int,
try_parse_datetime,
parse_circle_group_string,
try_parse_date,
try_parse_datetime,
try_parse_int,
)

View File

@ -1,6 +1,6 @@
import datetime
import re
from typing import Any, Tuple, Union, Optional, List
from typing import Any, List, Optional, Tuple, Union
from dateutil.parser import parse
from six import string_types