71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
import csv
|
|
from datetime import date
|
|
from typing import List
|
|
|
|
from django.contrib.admin.views.decorators import staff_member_required
|
|
from django.http import HttpResponse
|
|
|
|
from vbv_lernwelt.course.consts import COURSE_UK, COURSE_UK_FR, COURSE_UK_IT
|
|
from vbv_lernwelt.course.models import CourseSessionUser
|
|
|
|
UK_COURSE_IDS = [COURSE_UK, COURSE_UK_FR, COURSE_UK_IT]
|
|
|
|
|
|
@staff_member_required
|
|
def export_students(request):
|
|
course_session_users = fetch_course_session_users(UK_COURSE_IDS)
|
|
return generate_export_response(course_session_users)
|
|
|
|
|
|
def fetch_course_session_users(courses: List[int]):
|
|
# if a user is in multiple courses, he should be exported multiple times
|
|
# todo: check if this is the case otherwise use .distinct("user")
|
|
return CourseSessionUser.objects.filter(
|
|
course_session__course__id__in=courses, role=CourseSessionUser.Role.MEMBER
|
|
).order_by("user__email")
|
|
|
|
|
|
def generate_export_response(cs_users: List[CourseSessionUser]) -> HttpResponse:
|
|
response = HttpResponse(content_type="text/csv")
|
|
response[
|
|
"Content-Disposition"
|
|
] = f"attachment; filename=edoniq_user_export_{date.today().strftime('%Y%m%d')}.csv"
|
|
|
|
writer = csv.writer(response)
|
|
writer.writerow(
|
|
[
|
|
"login",
|
|
"firstName",
|
|
"lastName",
|
|
"gender",
|
|
"preferredLanguage",
|
|
"emailBusiness",
|
|
"birthday",
|
|
"group",
|
|
"region",
|
|
"division",
|
|
"organisationUnit",
|
|
"superiorLogin",
|
|
]
|
|
)
|
|
|
|
for cs_user in cs_users:
|
|
writer.writerow(
|
|
[
|
|
cs_user.user.email,
|
|
cs_user.user.first_name,
|
|
cs_user.user.last_name,
|
|
"m",
|
|
cs_user.user.language,
|
|
cs_user.user.email,
|
|
cs_user.user.additional_json_data.get("Geburtsdatum", ""),
|
|
"Lernender",
|
|
cs_user.user.additional_json_data.get("Firmenname", ""),
|
|
cs_user.user.additional_json_data.get("Lehrvertragsnummer", ""),
|
|
cs_user.course_session.import_id,
|
|
"",
|
|
]
|
|
)
|
|
|
|
return response
|