vbv/server/vbv_lernwelt/duedate/admin.py

88 lines
2.8 KiB
Python

from django.contrib import admin
from wagtail.models import Page
from vbv_lernwelt.course_session.models import (
CourseSessionAssignment,
CourseSessionAttendanceCourse,
CourseSessionEdoniqTest,
)
from vbv_lernwelt.duedate.models import DueDate
from vbv_lernwelt.learnpath.models import (
Circle,
LearningContentAttendanceCourse,
LearningContentEdoniqTest,
)
@admin.action(description="Re-sync URLs from LearningContent")
def sync_wagtail_due_date_url(modeladmin, request, queryset):
for assignment in CourseSessionAssignment.objects.all():
assignment.save()
for edoniq_test in CourseSessionEdoniqTest.objects.all():
edoniq_test.save()
for attendance in CourseSessionAttendanceCourse.objects.all():
attendance.save()
@admin.register(DueDate)
class DueDateAdmin(admin.ModelAdmin):
date_hierarchy = "start"
list_display = [
"course_session",
"circle",
"title",
"display_subtitle",
"start",
"end",
]
list_filter = ["course_session__course", "course_session"]
readonly_fields = ["course_session", "page"]
actions = [sync_wagtail_due_date_url]
def get_readonly_fields(self, request, obj=None):
default_readonly = super(DueDateAdmin, self).get_readonly_fields(request, obj)
if obj is None:
return default_readonly
if not obj.manual_override_fields:
return default_readonly + [
"circle",
"title",
"subtitle",
"assignment_type_translation_key",
"date_type_translation_key",
"url",
"url_expert",
]
return default_readonly
def circle(self, obj):
try:
return obj.page.get_ancestors().exact_type(Circle).first().title
except Exception:
# noop
pass
return None
# Create a method that serves as a form field
def circle_display(self, obj=None):
if obj:
return self.circle(obj)
return None
circle_display.short_description = "Circle"
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "page":
if request.resolver_match.kwargs.get("object_id"):
object_id = int(request.resolver_match.kwargs.get("object_id"))
csd = DueDate.objects.get(id=object_id)
kwargs["queryset"] = Page.objects.descendant_of(
csd.course_session.course.coursepage
).exact_type(LearningContentAttendanceCourse, LearningContentEdoniqTest)
else:
kwargs["queryset"] = Page.objects.none()
return super().formfield_for_foreignkey(db_field, request, **kwargs)