From efd8892d6a7322463b5ef2753ec7e5c8920d12aa Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Mon, 7 Nov 2022 17:43:29 +0100 Subject: [PATCH] Select Circle expert/trainer on the admin field (not dynamic) --- server/vbv_lernwelt/course/admin.py | 24 +++++++++++++++++++ .../0004_coursesessionuser_expert.py | 19 +++++++++++++++ .../0005_alter_coursesessionuser_expert.py | 19 +++++++++++++++ server/vbv_lernwelt/course/models.py | 4 ++++ server/vbv_lernwelt/course/permissions.py | 2 +- server/vbv_lernwelt/course/serializers.py | 20 ++++++++++++++++ 6 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 server/vbv_lernwelt/course/migrations/0004_coursesessionuser_expert.py create mode 100644 server/vbv_lernwelt/course/migrations/0005_alter_coursesessionuser_expert.py diff --git a/server/vbv_lernwelt/course/admin.py b/server/vbv_lernwelt/course/admin.py index 59789610..c1788250 100644 --- a/server/vbv_lernwelt/course/admin.py +++ b/server/vbv_lernwelt/course/admin.py @@ -1,6 +1,7 @@ from django.contrib import admin from vbv_lernwelt.course.models import CourseSession, CourseSessionUser +from vbv_lernwelt.learnpath.models import Circle @admin.register(CourseSession) @@ -35,3 +36,26 @@ class CourseSessionUserAdmin(admin.ModelAdmin): "course_session__course", "course_session", ] + + fieldsets = [ + (None, {"fields": ("user", "course_session")}), + ( + "Expert/Trainer", + { + "fields": ("expert",), + "description": "Expert/Trainer kann erst ausgewählt werden, wenn der Kurs ausgewählt und bereits einmal gespeichert wurde.", + }, + ), + ] + + def formfield_for_manytomany(self, db_field, request, **kwargs): + if db_field.name == "expert": + if request.resolver_match.kwargs.get("object_id"): + object_id = int(request.resolver_match.kwargs.get("object_id")) + csu = CourseSessionUser.objects.get(id=object_id) + kwargs["queryset"] = Circle.objects.descendant_of( + csu.course_session.course.coursepage + ) + else: + kwargs["queryset"] = Circle.objects.none() + return super().formfield_for_manytomany(db_field, request, **kwargs) diff --git a/server/vbv_lernwelt/course/migrations/0004_coursesessionuser_expert.py b/server/vbv_lernwelt/course/migrations/0004_coursesessionuser_expert.py new file mode 100644 index 00000000..5827c37e --- /dev/null +++ b/server/vbv_lernwelt/course/migrations/0004_coursesessionuser_expert.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2022-11-07 15:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('learnpath', '0008_alter_learningcontent_contents'), + ('course', '0003_alter_coursepage_course'), + ] + + operations = [ + migrations.AddField( + model_name='coursesessionuser', + name='expert', + field=models.ManyToManyField(related_name='expert', to='learnpath.Circle'), + ), + ] diff --git a/server/vbv_lernwelt/course/migrations/0005_alter_coursesessionuser_expert.py b/server/vbv_lernwelt/course/migrations/0005_alter_coursesessionuser_expert.py new file mode 100644 index 00000000..4f26fea8 --- /dev/null +++ b/server/vbv_lernwelt/course/migrations/0005_alter_coursesessionuser_expert.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2022-11-07 15:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('learnpath', '0008_alter_learningcontent_contents'), + ('course', '0004_coursesessionuser_expert'), + ] + + operations = [ + migrations.AlterField( + model_name='coursesessionuser', + name='expert', + field=models.ManyToManyField(blank=True, related_name='expert', to='learnpath.Circle'), + ), + ] diff --git a/server/vbv_lernwelt/course/models.py b/server/vbv_lernwelt/course/models.py index bcc93401..9109f257 100644 --- a/server/vbv_lernwelt/course/models.py +++ b/server/vbv_lernwelt/course/models.py @@ -197,6 +197,10 @@ class CourseSessionUser(models.Model): course_session = models.ForeignKey("course.CourseSession", on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE) + expert = models.ManyToManyField( + "learnpath.Circle", related_name="expert", blank=True + ) + class Meta: constraints = [ UniqueConstraint( diff --git a/server/vbv_lernwelt/course/permissions.py b/server/vbv_lernwelt/course/permissions.py index aafad8d2..67335bb8 100644 --- a/server/vbv_lernwelt/course/permissions.py +++ b/server/vbv_lernwelt/course/permissions.py @@ -29,6 +29,6 @@ def course_sessions_for_user_qs(user): course_sessions = CourseSession.objects.filter( course_session_user__user=user - ).distinct() + ).select_related("coursesessionuser") return course_sessions diff --git a/server/vbv_lernwelt/course/serializers.py b/server/vbv_lernwelt/course/serializers.py index 6d2840a9..e4507eea 100644 --- a/server/vbv_lernwelt/course/serializers.py +++ b/server/vbv_lernwelt/course/serializers.py @@ -5,7 +5,9 @@ from vbv_lernwelt.course.models import ( CourseCategory, CourseCompletion, CourseSession, + CourseSessionUser, ) +from vbv_lernwelt.learnpath.models import Circle class CourseSerializer(serializers.ModelSerializer): @@ -46,6 +48,7 @@ class CourseSessionSerializer(serializers.ModelSerializer): competence_url = serializers.SerializerMethodField() media_library_url = serializers.SerializerMethodField() course = serializers.SerializerMethodField() + experts = serializers.SerializerMethodField() def get_course(self, obj): return CourseSerializer(obj.course).data @@ -59,6 +62,22 @@ class CourseSessionSerializer(serializers.ModelSerializer): def get_competence_url(self, obj): return obj.course.get_competence_url() + def get_experts(self, obj): + expert_relations = CourseSessionUser.objects.filter( + expert__in=Circle.objects.descendant_of(obj.course.coursepage) + ) + expert_result = [] + for er in expert_relations: + for circle in er.expert.all(): + expert_result.append( + { + "user_id": er.user.id, + "circle_id": circle.id, + "circle_translation_key": circle.translation_key, + } + ) + return expert_result + class Meta: model = CourseSession fields = [ @@ -73,4 +92,5 @@ class CourseSessionSerializer(serializers.ModelSerializer): "learning_path_url", "competence_url", "media_library_url", + "experts", ]