Import students from excel
This commit is contained in:
parent
d6df9b624b
commit
32233ec38e
|
|
@ -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()),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ class CourseSessionUserAdmin(admin.ModelAdmin):
|
|||
]
|
||||
list_filter = [
|
||||
"course_session",
|
||||
"role",
|
||||
]
|
||||
|
||||
fieldsets = [
|
||||
|
|
|
|||
|
|
@ -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 = [
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue