import structlog from django.views.decorators.cache import cache_page from rest_framework.decorators import api_view from rest_framework.response import Response from wagtail.models import Page from vbv_lernwelt.course.models import CourseCompletion, CoursePage from vbv_lernwelt.course.serializers import CourseCompletionSerializer from vbv_lernwelt.learnpath.utils import get_wagtail_type logger = structlog.get_logger(__name__) @api_view(["GET"]) @cache_page(60 * 60 * 8, cache="api_page_cache") def page_api_view(request, slug): try: page = Page.objects.get(slug=slug, locale__language_code="de-CH") serializer = page.specific.get_serializer_class()(page.specific) return Response(serializer.data) except Exception as e: logger.error(e) return Response({"error": str(e)}, status=404) @api_view(["GET"]) def request_course_completion(request, course_id): response_data = CourseCompletionSerializer( CourseCompletion.objects.filter(user=request.user, course_id=course_id), many=True, ).data return Response(status=200, data=response_data) @api_view(["POST"]) def mark_course_completion(request): page_key = request.data.get("page_key") completion_status = request.data.get("completion_status", "success") page = Page.objects.get(translation_key=page_key, locale__language_code="de-CH") page_type = get_wagtail_type(page.specific) course = CoursePage.objects.ancestor_of(page).first().specific.course cc, created = CourseCompletion.objects.get_or_create( user=request.user, page_key=page_key, course_id=course.id, ) cc.page_slug = page.slug cc.page_type = page_type cc.completion_status = completion_status cc.save() response_data = CourseCompletionSerializer( CourseCompletion.objects.filter(user=request.user, course_id=course.id), many=True, ).data logger.debug( "mark_course_completion successful", label="completion_api", page_key=page_key, page_type=page_type, page_slug=page.slug, page_title=page.title, user_id=request.user.id, course_id=course.id, completion_status=completion_status, ) return Response(status=200, data=response_data)