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 @@
+
+
+
+
+ {{ queryResult.data }}
+
+
+
+
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):