Add trainer and combined export
This commit is contained in:
parent
57cd5fe871
commit
3447de19ca
|
|
@ -37,7 +37,11 @@ from vbv_lernwelt.course.views import (
|
|||
request_course_completion,
|
||||
request_course_completion_for_user,
|
||||
)
|
||||
from vbv_lernwelt.edoniq_test.views import export_students, export_trainers
|
||||
from vbv_lernwelt.edoniq_test.views import (
|
||||
export_students,
|
||||
export_students_and_trainers,
|
||||
export_trainers,
|
||||
)
|
||||
from vbv_lernwelt.feedback.views import (
|
||||
get_expert_feedbacks_for_course,
|
||||
get_feedback_for_circle,
|
||||
|
|
@ -148,6 +152,8 @@ urlpatterns = [
|
|||
# edoniq test
|
||||
path(r'api/core/edoniq-test/export-users/', export_students, name='edoniq_export_students'),
|
||||
path(r'api/core/edoniq-test/export-trainers/', export_trainers, name='edoniq_export_trainers'),
|
||||
path(r'api/core/edoniq-test/export-users-trainers/', export_students_and_trainers,
|
||||
name='edoniq_export_students_and_trainers'),
|
||||
|
||||
# importer
|
||||
path(
|
||||
|
|
|
|||
|
|
@ -6,7 +6,9 @@ from vbv_lernwelt.core.admin import User
|
|||
from vbv_lernwelt.core.create_default_users import create_default_users
|
||||
from vbv_lernwelt.course.consts import COURSE_TEST_ID
|
||||
from vbv_lernwelt.course.creators.test_course import create_test_course
|
||||
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
|
||||
from vbv_lernwelt.edoniq_test.views import (
|
||||
fetch_course_session_all_users,
|
||||
fetch_course_session_users,
|
||||
generate_export_response,
|
||||
)
|
||||
|
|
@ -36,6 +38,37 @@ class EdoniqUserExportTestCase(TestCase):
|
|||
users = fetch_course_session_users([COURSE_TEST_ID])
|
||||
self.assertEqual(len(users), 2)
|
||||
|
||||
def test_fetch_course_session_trainers(self):
|
||||
users = fetch_course_session_users(
|
||||
[COURSE_TEST_ID], role=CourseSessionUser.Role.EXPERT
|
||||
)
|
||||
self.assertEqual(len(users), 1)
|
||||
|
||||
def test_remove_eiger_versicherungen(self):
|
||||
user1 = User.objects.get(email="test-student1@example.com")
|
||||
user1.email = "some@eiger-versicherungen.ch"
|
||||
user1.save()
|
||||
users = fetch_course_session_users([COURSE_TEST_ID])
|
||||
self.assertEqual(len(users), 1)
|
||||
|
||||
def test_export_students_and_trainers(self):
|
||||
users = fetch_course_session_all_users([COURSE_TEST_ID])
|
||||
self.assertEqual(len(users), 3)
|
||||
|
||||
def test_deduplicates_users(self):
|
||||
trainer1 = User.objects.get(email="test-trainer1@example.com")
|
||||
cs_zrh = CourseSession.objects.get(
|
||||
title="Test Zürich 2022 a",
|
||||
)
|
||||
_csu = CourseSessionUser.objects.create(
|
||||
course_session=cs_zrh,
|
||||
user=trainer1,
|
||||
)
|
||||
users = fetch_course_session_all_users([COURSE_TEST_ID])
|
||||
for u in users:
|
||||
print(u.edoniq_role, u.email)
|
||||
self.assertEqual(len(users), 3)
|
||||
|
||||
def test_response_csv(self):
|
||||
users = fetch_course_session_users([COURSE_TEST_ID])
|
||||
response = generate_export_response(users)
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
import csv
|
||||
from datetime import date
|
||||
from itertools import chain
|
||||
from typing import List
|
||||
|
||||
from django.contrib.admin.views.decorators import staff_member_required
|
||||
from django.db.models import CharField, Value
|
||||
from django.http import HttpResponse
|
||||
|
||||
from vbv_lernwelt.core.models import User
|
||||
|
|
@ -18,26 +20,53 @@ def export_students(request):
|
|||
return generate_export_response(course_session_users)
|
||||
|
||||
|
||||
@staff_member_required
|
||||
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")
|
||||
return generate_export_response(course_session_users)
|
||||
|
||||
|
||||
@staff_member_required
|
||||
def export_students_and_trainers(request):
|
||||
course_session_users = fetch_course_session_all_users(UK_COURSE_IDS)
|
||||
return generate_export_response(course_session_users)
|
||||
|
||||
|
||||
def fetch_course_session_users(courses: List[int], role=CourseSessionUser.Role.MEMBER):
|
||||
if role == CourseSessionUser.Role.EXPERT:
|
||||
edoniq_role = "Trainer"
|
||||
else:
|
||||
edoniq_role = "Lernende"
|
||||
|
||||
# if users should be exported per course session, remove the distinct() call
|
||||
return (
|
||||
User.objects.filter(
|
||||
coursesessionuser__course_session__course__id__in=courses,
|
||||
coursesessionuser__role=role,
|
||||
)
|
||||
.exclude(email__contains="eiger-versicherungen.ch") # exclude test users
|
||||
.exclude(email__contains="assurance.ch")
|
||||
.order_by("email")
|
||||
.annotate(edoniq_role=Value(edoniq_role, output_field=CharField()))
|
||||
.distinct()
|
||||
)
|
||||
|
||||
|
||||
def generate_export_response(cs_users: List[User], role="Lernende") -> HttpResponse:
|
||||
def fetch_course_session_all_users(courses: List[int]):
|
||||
course_session_users = fetch_course_session_users(courses)
|
||||
course_session_trainers = fetch_course_session_users(
|
||||
courses, role=CourseSessionUser.Role.EXPERT
|
||||
)
|
||||
combined_queryset = chain(course_session_users, course_session_trainers)
|
||||
|
||||
# use email as key to remove duplicates. Maybe we can use the sso id in the future, but it is not set for all users
|
||||
unique_dict = {obj.email: obj for obj in combined_queryset}
|
||||
return list(unique_dict.values())
|
||||
|
||||
|
||||
def generate_export_response(cs_users: List[User]) -> HttpResponse:
|
||||
response = HttpResponse(content_type="text/csv")
|
||||
response[
|
||||
"Content-Disposition"
|
||||
|
|
@ -71,7 +100,7 @@ def generate_export_response(cs_users: List[User], role="Lernende") -> HttpRespo
|
|||
cs_user.language,
|
||||
cs_user.email,
|
||||
cs_user.additional_json_data.get("Geburtsdatum", ""),
|
||||
role,
|
||||
cs_user.edoniq_role,
|
||||
cs_user.additional_json_data.get("Firmenname", ""),
|
||||
cs_user.additional_json_data.get("Lehrvertragsnummer", ""),
|
||||
cs_user.coursesessionuser_set.first().course_session.import_id,
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -31,9 +31,13 @@
|
|||
<h2>Export Edoniq Teilnehmer</h2>
|
||||
<a href="{% url 'edoniq_export_students' %}" class="btn btn-primary">Teilnehmer exportieren</a>
|
||||
|
||||
<h2>Export Edoniq Trainer</h2>
|
||||
<h2>Export Edoniq Trainer</h2>
|
||||
<a href="{% url 'edoniq_export_trainers' %}" class="btn btn-primary">Trainer exportieren</a>
|
||||
|
||||
<h2>Export Edoniq Teilnehmer und Trainer</h2>
|
||||
<a href="{% url 'edoniq_export_students_and_trainers' %}" class="btn btn-primary">Teilnehmer und Trainer exportieren</a>
|
||||
|
||||
|
||||
<h1>Reset</h1>
|
||||
<form action="/api/core/cypressreset/" method="post">
|
||||
{% csrf_token %}
|
||||
|
|
|
|||
Loading…
Reference in New Issue