Select Circle expert/trainer on the admin field (not dynamic)

This commit is contained in:
Daniel Egger 2022-11-07 17:43:29 +01:00
parent a119cc122d
commit efd8892d6a
6 changed files with 87 additions and 1 deletions

View File

@ -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)

View File

@ -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'),
),
]

View File

@ -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'),
),
]

View File

@ -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(

View File

@ -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

View File

@ -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",
]