diff --git a/client/src/pages/DashPage.vue b/client/src/pages/DashPage.vue new file mode 100644 index 00000000..eac1f744 --- /dev/null +++ b/client/src/pages/DashPage.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/server/config/settings/base.py b/server/config/settings/base.py index a1f174d0..7e80cd01 100644 --- a/server/config/settings/base.py +++ b/server/config/settings/base.py @@ -129,6 +129,7 @@ LOCAL_APPS = [ "vbv_lernwelt.duedate", "vbv_lernwelt.importer", "vbv_lernwelt.edoniq_test", + "vbv_lernwelt.course_session_group", ] # https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS diff --git a/server/vbv_lernwelt/course_session_group/__init__.py b/server/vbv_lernwelt/course_session_group/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/server/vbv_lernwelt/course_session_group/admin.py b/server/vbv_lernwelt/course_session_group/admin.py new file mode 100644 index 00000000..5bda3780 --- /dev/null +++ b/server/vbv_lernwelt/course_session_group/admin.py @@ -0,0 +1,8 @@ +from django.contrib import admin + +from vbv_lernwelt.course_session_group.models import CourseSessionGroup + + +@admin.register(CourseSessionGroup) +class CourseSessionAssignmentAdmin(admin.ModelAdmin): + ... diff --git a/server/vbv_lernwelt/course_session_group/apps.py b/server/vbv_lernwelt/course_session_group/apps.py new file mode 100644 index 00000000..5283ad81 --- /dev/null +++ b/server/vbv_lernwelt/course_session_group/apps.py @@ -0,0 +1,9 @@ +from django.apps import AppConfig + + +class CourseSessionGroupConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "vbv_lernwelt.course_session_group" + + def ready(self): + import vbv_lernwelt.course_session_group.signals # noqa F401 diff --git a/server/vbv_lernwelt/course_session_group/migrations/0001_initial.py b/server/vbv_lernwelt/course_session_group/migrations/0001_initial.py new file mode 100644 index 00000000..ca230768 --- /dev/null +++ b/server/vbv_lernwelt/course_session_group/migrations/0001_initial.py @@ -0,0 +1,49 @@ +# Generated by Django 3.2.20 on 2023-10-23 14:53 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("course", "0004_auto_20230823_1744"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="CourseSessionGroup", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=255)), + ( + "course", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="course.course" + ), + ), + ( + "course_session", + models.ManyToManyField(blank=True, to="course.CourseSession"), + ), + ( + "supervisor", + models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL), + ), + ], + options={ + "ordering": ["name"], + }, + ), + ] diff --git a/server/vbv_lernwelt/course_session_group/migrations/__init__.py b/server/vbv_lernwelt/course_session_group/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/server/vbv_lernwelt/course_session_group/models.py b/server/vbv_lernwelt/course_session_group/models.py new file mode 100644 index 00000000..9ae705d3 --- /dev/null +++ b/server/vbv_lernwelt/course_session_group/models.py @@ -0,0 +1,25 @@ +from django.db import models + +from vbv_lernwelt.core.models import User + + +class CourseSessionGroup(models.Model): + name = models.CharField(max_length=255) + + course = models.ForeignKey("course.Course", on_delete=models.CASCADE) + + course_session = models.ManyToManyField( + "course.CourseSession", + blank=True, + ) + + supervisor = models.ManyToManyField( + User, + blank=True, + ) + + class Meta: + ordering = ["name"] + + def __str__(self): + return self.name diff --git a/server/vbv_lernwelt/course_session_group/signals.py b/server/vbv_lernwelt/course_session_group/signals.py new file mode 100644 index 00000000..3443e828 --- /dev/null +++ b/server/vbv_lernwelt/course_session_group/signals.py @@ -0,0 +1,16 @@ +from django.core.exceptions import ValidationError +from django.db.models.signals import m2m_changed +from django.dispatch import receiver + +from .models import CourseSessionGroup + + +@receiver(m2m_changed, sender=CourseSessionGroup.course_session.through) +def validate_course(sender, instance, action, reverse, model, pk_set, **kwargs): + if action == "pre_add": + course_sessions = model.objects.filter(pk__in=pk_set) + for session in course_sessions: + if session.course != instance.course: + raise ValidationError( + "CourseSession does not match the Course of this Group." + ) diff --git a/server/vbv_lernwelt/course_session_group/tests.py b/server/vbv_lernwelt/course_session_group/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/server/vbv_lernwelt/course_session_group/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/vbv_lernwelt/dashboard/graphql/types/competence.py b/server/vbv_lernwelt/dashboard/graphql/types/competence.py index aad79e28..07823dd2 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/competence.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/competence.py @@ -1,9 +1,6 @@ import graphene -from vbv_lernwelt.course.models import ( - CourseCompletion, - CourseCompletionStatus, -) +from vbv_lernwelt.course.models import CourseCompletion, CourseCompletionStatus class CompletionSummary(graphene.ObjectType):