vbv/server/vbv_lernwelt/course/views.py

72 lines
2.2 KiB
Python

import structlog
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, circle_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, circle_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)