Add drf view to request completion data for user

This commit is contained in:
Daniel Egger 2022-12-02 14:53:49 +01:00
parent 48cf9026d9
commit 218756e3dc
4 changed files with 68 additions and 20 deletions

View File

@ -7,6 +7,9 @@ from django.urls import include, path, re_path
from django.views import defaults as default_views from django.views import defaults as default_views
from grapple import urls as grapple_urls from grapple import urls as grapple_urls
from ratelimit.exceptions import Ratelimited from ratelimit.exceptions import Ratelimited
from wagtail import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.documents import urls as wagtaildocs_urls
from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt
from vbv_lernwelt.core.views import ( from vbv_lernwelt.core.views import (
@ -24,12 +27,10 @@ from vbv_lernwelt.course.views import (
course_page_api_view, course_page_api_view,
get_course_session_users, get_course_session_users,
get_course_sessions, get_course_sessions,
mark_course_completion, mark_course_completion_view,
request_course_completion, request_course_completion,
request_course_completion_for_user,
) )
from wagtail import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.documents import urls as wagtaildocs_urls
def raise_example_error(request): def raise_example_error(request):
@ -67,10 +68,13 @@ urlpatterns = [
name="get_course_session_users"), name="get_course_session_users"),
path(r"api/course/page/<slug>/", course_page_api_view, path(r"api/course/page/<slug>/", course_page_api_view,
name="course_page_api_view"), name="course_page_api_view"),
path(r"api/course/completion/mark/", mark_course_completion, path(r"api/course/completion/mark/", mark_course_completion_view,
name="mark_course_completion"), name="mark_course_completion"),
path(r"api/course/completion/<course_id>/", request_course_completion, path(r"api/course/completion/<course_id>/", request_course_completion,
name="request_course_completion"), name="request_course_completion"),
path(r"api/course/completion/<course_id>/<user_id>/",
request_course_completion_for_user,
name="request_course_completion_for_user"),
# testing and debug # testing and debug
path('server/raise_error/', path('server/raise_error/',

View File

@ -1,4 +1,5 @@
import djclick as click import djclick as click
from wagtail.models import Page
from vbv_lernwelt.competence.create_default_competence_profile import ( from vbv_lernwelt.competence.create_default_competence_profile import (
create_default_competence_profile, create_default_competence_profile,
@ -15,6 +16,7 @@ from vbv_lernwelt.course.creators.versicherungsvermittlerin import (
create_versicherungsvermittlerin_with_categories, create_versicherungsvermittlerin_with_categories,
) )
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
from vbv_lernwelt.course.services import mark_course_completion
from vbv_lernwelt.learnpath.create_default_learning_path import ( from vbv_lernwelt.learnpath.create_default_learning_path import (
create_default_learning_path, create_default_learning_path,
) )
@ -114,7 +116,7 @@ def command():
# user=User.objects.get(username="student-uk1-bern@eiger-versicherungen.ch"), # user=User.objects.get(username="student-uk1-bern@eiger-versicherungen.ch"),
# ) # )
# figma demo users # figma demo users and data
csu = CourseSessionUser.objects.create( csu = CourseSessionUser.objects.create(
course_session=cs, course_session=cs,
user=User.objects.get(username="patrizia.huggel@eiger-versicherung.ch"), user=User.objects.get(username="patrizia.huggel@eiger-versicherung.ch"),
@ -127,6 +129,24 @@ def command():
course_session=cs, course_session=cs,
user=User.objects.get(username="michael.meier@example.com"), user=User.objects.get(username="michael.meier@example.com"),
) )
for slug in [
"überbetriebliche-kurse-lp-circle-einstieg-lc-verschaff-dir-einen-überblick",
"überbetriebliche-kurse-lp-circle-einstieg-lc-mediathek",
"überbetriebliche-kurse-lp-circle-einstieg-lc-patrizia-marco-sichern-sich-ab",
"überbetriebliche-kurse-lp-circle-einstieg-lc-fachcheck-einkommenssicherung",
"überbetriebliche-kurse-competence-crit-a21-einkommenssicherung",
"überbetriebliche-kurse-competence-crit-a22-einkommenssicherung",
"überbetriebliche-kurse-competence-crit-a23-einkommenssicherung",
"überbetriebliche-kurse-competence-crit-a24-einkommenssicherung",
"überbetriebliche-kurse-competence-crit-a25-einkommenssicherung",
"überbetriebliche-kurse-competence-crit-b11-einkommenssicherung",
"überbetriebliche-kurse-competence-crit-b12-einkommenssicherung",
"überbetriebliche-kurse-competence-crit-b23-einkommenssicherung",
"überbetriebliche-kurse-lp-circle-einstieg-lc-rafael-fasel-wechselt-sein-auto",
"überbetriebliche-kurse-lp-circle-einstieg-lc-der-erste-eindruck-zählt",
]:
mark_course_completion(Page.objects.get(slug=slug).translation_key, csu.user)
csu = CourseSessionUser.objects.create( csu = CourseSessionUser.objects.create(
course_session=cs, course_session=cs,
user=User.objects.get(username="lina.egger@example.com"), user=User.objects.get(username="lina.egger@example.com"),

View File

@ -0,0 +1,20 @@
from wagtail.models import Page
from vbv_lernwelt.course.models import CourseCompletion
from vbv_lernwelt.learnpath.utils import get_wagtail_type
def mark_course_completion(page_key, user, completion_status="success"):
page = Page.objects.get(translation_key=page_key, locale__language_code="de-CH")
page_type = get_wagtail_type(page.specific)
course = page.specific.get_course()
cc, created = CourseCompletion.objects.get_or_create(
user=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()
return cc

View File

@ -14,6 +14,7 @@ from vbv_lernwelt.course.serializers import (
CourseCompletionSerializer, CourseCompletionSerializer,
CourseSessionSerializer, CourseSessionSerializer,
) )
from vbv_lernwelt.course.services import mark_course_completion
from vbv_lernwelt.learnpath.utils import get_wagtail_type from vbv_lernwelt.learnpath.utils import get_wagtail_type
logger = structlog.get_logger(__name__) logger = structlog.get_logger(__name__)
@ -39,11 +40,10 @@ def course_page_api_view(request, slug):
return Response({"error": str(e)}, status=404) return Response({"error": str(e)}, status=404)
@api_view(["GET"]) def _request_course_completion(course_id, user_id):
def request_course_completion(request, course_id):
try: try:
response_data = CourseCompletionSerializer( response_data = CourseCompletionSerializer(
CourseCompletion.objects.filter(user=request.user, course_id=course_id), CourseCompletion.objects.filter(user_id=user_id, course_id=course_id),
many=True, many=True,
).data ).data
@ -55,28 +55,32 @@ def request_course_completion(request, course_id):
return Response({"error": str(e)}, status=404) return Response({"error": str(e)}, status=404)
@api_view(["GET"])
def request_course_completion(request, course_id):
return _request_course_completion(course_id, request.user.id)
@api_view(["GET"])
def request_course_completion_for_user(request, course_id, user_id):
# TODO: check permissions to access this users data
return _request_course_completion(course_id, user_id)
@api_view(["POST"]) @api_view(["POST"])
def mark_course_completion(request): def mark_course_completion_view(request):
try: try:
page_key = request.data.get("page_key") page_key = request.data.get("page_key")
completion_status = request.data.get("completion_status", "success") completion_status = request.data.get("completion_status", "success")
page = Page.objects.get(translation_key=page_key, locale__language_code="de-CH") page = Page.objects.get(translation_key=page_key, locale__language_code="de-CH")
if not has_course_access_by_page_request(request, page): if not has_course_access_by_page_request(request, page):
raise PermissionDenied() raise PermissionDenied()
page_type = get_wagtail_type(page.specific) page_type = get_wagtail_type(page.specific)
course = page.specific.get_course() course = page.specific.get_course()
cc, created = CourseCompletion.objects.get_or_create( mark_course_completion(page_key, request.user,
user=request.user, completion_status=completion_status)
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( response_data = CourseCompletionSerializer(
CourseCompletion.objects.filter(user=request.user, course_id=course.id), CourseCompletion.objects.filter(user=request.user, course_id=course.id),