diff --git a/server/config/urls.py b/server/config/urls.py index a479c973..e388a89e 100644 --- a/server/config/urls.py +++ b/server/config/urls.py @@ -8,15 +8,12 @@ from django.urls import include, path, re_path from django.views import defaults as default_views from grapple import urls as grapple_urls 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.assignment.views import ( + grade_assignment_completion, request_assignment_completion, request_assignment_completion_for_user, upsert_user_assignment_completion, - grade_assignment_completion, ) from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt from vbv_lernwelt.core.views import ( @@ -47,6 +44,9 @@ from vbv_lernwelt.feedback.views import ( get_feedback_for_circle, ) from vbv_lernwelt.notify.views import email_notification_settings +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): diff --git a/server/vbv_lernwelt/assignment/migrations/0002_auto_20230425_0849.py b/server/vbv_lernwelt/assignment/migrations/0002_auto_20230425_0849.py index 53f4398d..185a5b58 100644 --- a/server/vbv_lernwelt/assignment/migrations/0002_auto_20230425_0849.py +++ b/server/vbv_lernwelt/assignment/migrations/0002_auto_20230425_0849.py @@ -1,55 +1,161 @@ # Generated by Django 3.2.13 on 2023-04-25 06:49 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('course', '0004_coursesession_assignment_details_list'), + ("course", "0004_coursesession_assignment_details_list"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('assignment', '0001_initial'), + ("assignment", "0001_initial"), ] operations = [ migrations.CreateModel( - name='AssignmentCompletionAuditLog', + name="AssignmentCompletionAuditLog", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('completion_status', models.CharField(choices=[(1, 'in_progress'), (2, 'submitted'), (3, 'grading_in_progress'), (4, 'graded')], default='in_progress', max_length=255)), - ('completion_data', models.JSONField(default=dict)), - ('additional_json_data', models.JSONField(default=dict)), - ('assignment_user_email', models.CharField(max_length=255)), - ('assignment_slug', models.CharField(max_length=255)), - ('grading_user_email', models.CharField(blank=True, default='', max_length=255)), - ('assignment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='assignment.assignment')), - ('assignment_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('course_session', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='course.coursesession')), - ('grading_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True)), + ( + "completion_status", + models.CharField( + choices=[ + (1, "in_progress"), + (2, "submitted"), + (3, "grading_in_progress"), + (4, "graded"), + ], + default="in_progress", + max_length=255, + ), + ), + ("completion_data", models.JSONField(default=dict)), + ("additional_json_data", models.JSONField(default=dict)), + ("assignment_user_email", models.CharField(max_length=255)), + ("assignment_slug", models.CharField(max_length=255)), + ( + "grading_user_email", + models.CharField(blank=True, default="", max_length=255), + ), + ( + "assignment", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="assignment.assignment", + ), + ), + ( + "assignment_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "course_session", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="course.coursesession", + ), + ), + ( + "grading_user", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), ], ), migrations.CreateModel( - name='AssignmentCompletion', + name="AssignmentCompletion", 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)), - ('submitted_at', models.DateTimeField(blank=True, null=True)), - ('graded_at', models.DateTimeField(blank=True, null=True)), - ('completion_status', models.CharField(choices=[(1, 'in_progress'), (2, 'submitted'), (3, 'grading_in_progress'), (4, 'graded')], default='in_progress', max_length=255)), - ('completion_data', models.JSONField(default=dict)), - ('additional_json_data', models.JSONField(default=dict)), - ('assignment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='assignment.assignment')), - ('assignment_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('course_session', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.coursesession')), - ('grading_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), + ( + "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)), + ("submitted_at", models.DateTimeField(blank=True, null=True)), + ("graded_at", models.DateTimeField(blank=True, null=True)), + ( + "completion_status", + models.CharField( + choices=[ + (1, "in_progress"), + (2, "submitted"), + (3, "grading_in_progress"), + (4, "graded"), + ], + default="in_progress", + max_length=255, + ), + ), + ("completion_data", models.JSONField(default=dict)), + ("additional_json_data", models.JSONField(default=dict)), + ( + "assignment", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="assignment.assignment", + ), + ), + ( + "assignment_user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "course_session", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="course.coursesession", + ), + ), + ( + "grading_user", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), ], ), migrations.AddConstraint( - model_name='assignmentcompletion', - constraint=models.UniqueConstraint(fields=('assignment_user', 'assignment', 'course_session'), name='assignment_completion_unique_user_assignment_course_session'), + model_name="assignmentcompletion", + constraint=models.UniqueConstraint( + fields=("assignment_user", "assignment", "course_session"), + name="assignment_completion_unique_user_assignment_course_session", + ), ), ] diff --git a/server/vbv_lernwelt/assignment/services.py b/server/vbv_lernwelt/assignment/services.py index ae111579..fc6ac4df 100644 --- a/server/vbv_lernwelt/assignment/services.py +++ b/server/vbv_lernwelt/assignment/services.py @@ -7,8 +7,8 @@ from rest_framework import serializers from vbv_lernwelt.assignment.models import ( Assignment, AssignmentCompletion, - AssignmentCompletionStatus, AssignmentCompletionAuditLog, + AssignmentCompletionStatus, ) from vbv_lernwelt.core.models import User from vbv_lernwelt.core.utils import find_first