Add completion app
This commit is contained in:
parent
ff23e3b4f7
commit
08e5672623
|
|
@ -2,9 +2,10 @@
|
|||
Base settings to build other settings files upon.
|
||||
"""
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
||||
import structlog
|
||||
from environs import Env
|
||||
from pathlib import Path
|
||||
|
||||
from vbv_lernwelt.core.utils import structlog_add_app_info
|
||||
|
||||
|
|
@ -103,6 +104,7 @@ LOCAL_APPS = [
|
|||
"vbv_lernwelt.simpletodo",
|
||||
"vbv_lernwelt.sso",
|
||||
"vbv_lernwelt.learnpath",
|
||||
"vbv_lernwelt.completion",
|
||||
]
|
||||
# https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
|
||||
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ urlpatterns = [
|
|||
path('documents/', include(wagtaildocs_urls)),
|
||||
path('pages/', include(wagtail_urls)),
|
||||
path('learnpath/', include("vbv_lernwelt.learnpath.urls")),
|
||||
path('api/completion/', include("vbv_lernwelt.completion.urls")),
|
||||
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
if settings.DEBUG:
|
||||
# Static file serving when using Gunicorn + Uvicorn for local web socket development
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class CompletionConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'vbv_lernwelt.completion'
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
# Generated by Django 3.2.13 on 2022-06-08 13:52
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='UserCircleCompletion',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('circle_key', models.UUIDField()),
|
||||
('json_data', models.JSONField(blank=True, default=dict)),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='LearningUnitQuestionCompletion',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('question_key', models.UUIDField()),
|
||||
('circle_key', models.UUIDField()),
|
||||
('completed', models.BooleanField(default=True)),
|
||||
('json_data', models.JSONField(blank=True, default=dict)),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='LearningContentCompletion',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('learning_content_key', models.UUIDField()),
|
||||
('circle_key', models.UUIDField()),
|
||||
('completed', models.BooleanField(default=True)),
|
||||
('json_data', models.JSONField(blank=True, default=dict)),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
migrations.AddConstraint(
|
||||
model_name='usercirclecompletion',
|
||||
constraint=models.UniqueConstraint(fields=('user', 'circle_key'), name='unique_user_circle_completion'),
|
||||
),
|
||||
migrations.AddConstraint(
|
||||
model_name='learningunitquestioncompletion',
|
||||
constraint=models.UniqueConstraint(fields=('user', 'question_key'), name='unique_user_question_key'),
|
||||
),
|
||||
migrations.AddConstraint(
|
||||
model_name='learningcontentcompletion',
|
||||
constraint=models.UniqueConstraint(fields=('user', 'learning_content_key'), name='unique_user_learning_content_key'),
|
||||
),
|
||||
]
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
from django.db import models
|
||||
from django.db.models import UniqueConstraint
|
||||
|
||||
from vbv_lernwelt.core.models import User
|
||||
|
||||
|
||||
class LearningContentCompletion(models.Model):
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||
learning_content_key = models.UUIDField()
|
||||
circle_key = models.UUIDField()
|
||||
|
||||
completed = models.BooleanField(default=True)
|
||||
json_data = models.JSONField(default=dict, blank=True)
|
||||
|
||||
class Meta:
|
||||
constraints = [
|
||||
UniqueConstraint(
|
||||
fields=['user', 'learning_content_key', ],
|
||||
name='unique_user_learning_content_key'
|
||||
)
|
||||
]
|
||||
|
||||
|
||||
class LearningUnitQuestionCompletion(models.Model):
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||
question_key = models.UUIDField()
|
||||
circle_key = models.UUIDField()
|
||||
|
||||
completed = models.BooleanField(default=True)
|
||||
json_data = models.JSONField(default=dict, blank=True)
|
||||
|
||||
class Meta:
|
||||
constraints = [
|
||||
UniqueConstraint(
|
||||
fields=['user', 'question_key', ],
|
||||
name='unique_user_question_key'
|
||||
)
|
||||
]
|
||||
|
||||
|
||||
class UserCircleCompletion(models.Model):
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||
circle_key = models.UUIDField()
|
||||
|
||||
json_data = models.JSONField(default=dict, blank=True)
|
||||
|
||||
class Meta:
|
||||
constraints = [
|
||||
UniqueConstraint(fields=['user', 'circle_key'], name='unique_user_circle_completion')
|
||||
]
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
from rest_framework.test import APITestCase, APIClient
|
||||
|
||||
from vbv_lernwelt.core.create_default_users import create_default_users
|
||||
from vbv_lernwelt.core.models import User
|
||||
from vbv_lernwelt.learnpath.models import LearningContent
|
||||
from vbv_lernwelt.learnpath.tests.create_default_learning_path import create_default_learning_path
|
||||
from vbv_lernwelt.learnpath.tests.test_create_default_learning_path import create_locales_for_wagtail
|
||||
|
||||
|
||||
class CompletionApiTestCase(APITestCase):
|
||||
@classmethod
|
||||
def setUpClass(cls) -> None:
|
||||
super(CompletionApiTestCase, cls).setUpClass()
|
||||
create_locales_for_wagtail()
|
||||
create_default_users()
|
||||
create_default_learning_path()
|
||||
|
||||
def setUp(self) -> None:
|
||||
self.user = User.objects.get(username='student')
|
||||
self.client.login(username='student', password='student')
|
||||
|
||||
def test_completeLearningContent_works(self):
|
||||
learning_content_key = LearningContent.objects.get(title='Einleitung Circle "Anlayse"').translation_key
|
||||
response = self.client.post(f'/api/completion/complete_learning_content/', {
|
||||
'learning_content_key': learning_content_key
|
||||
})
|
||||
print(response.content)
|
||||
self.assertEqual(response.status_code, 201)
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
from django.urls import path
|
||||
|
||||
from vbv_lernwelt.completion.views import complete_learning_content
|
||||
|
||||
urlpatterns = [
|
||||
path(r"complete_learning_content/", complete_learning_content, name="complete_learning_content"),
|
||||
]
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
from rest_framework.decorators import api_view
|
||||
from rest_framework.response import Response
|
||||
|
||||
from vbv_lernwelt.completion.models import LearningContentCompletion
|
||||
from vbv_lernwelt.learnpath.models import LearningContent
|
||||
|
||||
|
||||
@api_view(['POST'])
|
||||
def complete_learning_content(request):
|
||||
learning_content_key = request.data.get('learning_content_key')
|
||||
learning_content = LearningContent.objects.get(translation_key=learning_content_key)
|
||||
|
||||
LearningContentCompletion.objects.create(
|
||||
user=request.user,
|
||||
learning_content_key=learning_content_key,
|
||||
circle_key=learning_content.get_parent().translation_key,
|
||||
)
|
||||
|
||||
return Response(status=201)
|
||||
Loading…
Reference in New Issue