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.core.models import User 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 export_trainers(request): course_session_users = fetch_course_session_users( UK_COURSE_IDS, role=CourseSessionUser.Role.EXPERT ) return generate_export_response(course_session_users, role="Trainer") def fetch_course_session_users(courses: List[int], role=CourseSessionUser.Role.MEMBER): # 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 ( User.objects.filter( coursesessionuser__course_session__course__id__in=courses, coursesessionuser__role=role, ) .order_by("email") .distinct() ) def generate_export_response(cs_users: List[User], role="Lernende") -> 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", "preferred_language", "email", "birthday", "group", "region", "division", "oe", "superior_login", ] ) for cs_user in cs_users: writer.writerow( [ cs_user.id, cs_user.first_name, cs_user.last_name, "m", cs_user.language, cs_user.email, cs_user.additional_json_data.get("Geburtsdatum", ""), role, cs_user.additional_json_data.get("Firmenname", ""), cs_user.additional_json_data.get("Lehrvertragsnummer", ""), cs_user.coursesessionuser_set.first().course_session.import_id, "", ] ) return response