Import trainer from excel file

This commit is contained in:
Daniel Egger 2023-05-31 21:19:28 +02:00
parent 2e7a069d0a
commit f42aae19ee
5 changed files with 59 additions and 8 deletions

View File

@ -52,7 +52,10 @@ from vbv_lernwelt.course.models import (
)
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
from vbv_lernwelt.importer.services import (
import_course_sessions_from_excel,
import_trainers_from_excel,
)
from vbv_lernwelt.learnpath.create_vv_new_learning_path import (
create_vv_new_learning_path,
)
@ -453,6 +456,10 @@ def create_course_training_de():
course,
f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx",
)
import_trainers_from_excel(
course,
f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx",
)
for cs in CourseSession.objects.filter(course_id=COURSE_UK_TRAINING):
cs.assignment_details_list = [

View File

@ -1,5 +1,6 @@
from typing import Dict, Any
import structlog
from openpyxl.reader.excel import load_workbook
from vbv_lernwelt.core.models import User
@ -7,10 +8,20 @@ from vbv_lernwelt.course.models import Course, CourseSession, CourseSessionUser
from vbv_lernwelt.importer.utils import try_parse_datetime, parse_circle_group_string
from vbv_lernwelt.learnpath.models import LearningContentAttendanceCourse, Circle
logger = structlog.get_logger(__name__)
def create_or_update_user(
email: str, first_name: str = "", last_name: str = "", sso_id: str = None
):
logger.debug(
"create_or_update_user",
email=email,
first_name=first_name,
last_name=last_name,
sso_id=sso_id,
label="import",
)
user = None
if sso_id:
user_qs = User.objects.filter(sso_id=sso_id)
@ -56,6 +67,13 @@ def create_or_update_course_session(course: Course, data: Dict[str, Any], circle
:return:
"""
logger.debug(
"create_or_update_course_session",
course=course.title,
data=data,
label="import",
)
if circles is None:
circles = []
@ -102,7 +120,25 @@ def create_or_update_course_session(course: Course, data: Dict[str, Any], circle
return cs
def import_trainers_from_excel(course: Course, filename: str):
workbook = load_workbook(filename=filename)
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))
create_or_update_trainer(course, dict(row_with_header))
def create_or_update_trainer(course: Course, data: Dict[str, Any]):
logger.debug(
"create_or_update_trainer",
course=course.title,
data=data,
label="import",
)
user = create_or_update_user(
email=data["Email"],
first_name=data["Vorname"],

View File

@ -26,6 +26,7 @@ class ImportTrainerTestCase(TestCase):
for row in sheet.iter_rows(min_row=2, values_only=True):
row_with_header = list(zip(header, row))
print(row_with_header)
create_or_update_trainer(self.course, dict(row_with_header))
class CreateOrUpdateCourseSessionTestCase(TestCase):

View File

@ -1,6 +1,6 @@
import logging
from typing import Optional
import structlog
from notifications.signals import notify
from sendgrid import Mail, SendGridAPIClient
from storages.utils import setting
@ -8,7 +8,7 @@ from storages.utils import setting
from vbv_lernwelt.core.models import User
from vbv_lernwelt.notify.models import Notification, NotificationType
logger = logging.getLogger(__name__)
logger = structlog.get_logger(__name__)
class EmailService:
@ -25,10 +25,14 @@ class EmailService:
)
try:
cls._sendgrid_client.send(message)
logger.info(f"Successfully sent email to {recipient}")
logger.info(f"Successfully sent email to {recipient}", label="email")
return True
except Exception as e:
logger.error(f"Failed to send email to {recipient}: {e}")
logger.error(
f"Failed to send email to {recipient}: {e}",
exc_info=True,
label="email",
)
return False

View File

@ -1,8 +1,9 @@
import base64
import json
import logging
logger = logging.getLogger(__name__)
import structlog
logger = structlog.get_logger(__name__)
def decode_jwt(jwt: str):
@ -11,7 +12,9 @@ def decode_jwt(jwt: str):
payload_bytes = base64.urlsafe_b64decode(_correct_padding(jwt_parts[1]))
payload = json.loads(payload_bytes.decode("UTF-8"))
except Exception as e:
logger.warning(f"OAuthToken error: Could not decode jwt: {e}")
logger.warning(
f"OAuthToken error: Could not decode jwt: {e}", exc_info=True, label="sso"
)
return None
return payload