From a6e7d260eafa70a7faac8d8bba616baa9685972b Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sat, 18 Apr 2020 22:27:51 +0200
Subject: [PATCH] Add model for extra lessons

---
 aleksis/apps/chronos/admin.py                 | 14 +++++
 .../chronos/migrations/0014_extra_lesson.py   | 53 +++++++++++++++++++
 aleksis/apps/chronos/models.py                | 19 +++++++
 3 files changed, 86 insertions(+)
 create mode 100644 aleksis/apps/chronos/migrations/0014_extra_lesson.py

diff --git a/aleksis/apps/chronos/admin.py b/aleksis/apps/chronos/admin.py
index 816f9d16..a734e60f 100644
--- a/aleksis/apps/chronos/admin.py
+++ b/aleksis/apps/chronos/admin.py
@@ -17,6 +17,7 @@ from .models import (
     AbsenceReason,
     Break,
     TimePeriod,
+    ExtraLesson,
 )
 from .util.format import format_date_period, format_m2m
 
@@ -91,6 +92,19 @@ class EventAdmin(admin.ModelAdmin):
 admin.site.register(Event, EventAdmin)
 
 
+class ExtraLessonAdmin(admin.ModelAdmin):
+    def _groups(self, obj):
+        return format_m2m(obj.groups)
+
+    def _teachers(self, obj):
+        return format_m2m(obj.teachers)
+
+    list_display = ("week", "period", "subject", "_groups", "_teachers", "room")
+
+
+admin.site.register(ExtraLesson, ExtraLessonAdmin)
+
+
 class HolidayAdmin(admin.ModelAdmin):
     list_display = ("title", "date_start", "date_end")
 
diff --git a/aleksis/apps/chronos/migrations/0014_extra_lesson.py b/aleksis/apps/chronos/migrations/0014_extra_lesson.py
new file mode 100644
index 00000000..b0610a5e
--- /dev/null
+++ b/aleksis/apps/chronos/migrations/0014_extra_lesson.py
@@ -0,0 +1,53 @@
+# Generated by Django 3.0.5 on 2020-04-18 20:21
+
+import calendarweek.calendarweek
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('chronos', '0013_event_title_optional'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='ExtraLesson',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('extended_data', django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False)),
+                ('week', models.IntegerField(default=calendarweek.calendarweek.CalendarWeek.current_week, verbose_name='Week')),
+                ('comment', models.CharField(blank=True, max_length=255, null=True, verbose_name='Comment')),
+            ],
+            options={
+                'abstract': False,
+            },
+        ),
+        migrations.AddField(
+            model_name='extralesson',
+            name='groups',
+            field=models.ManyToManyField(related_name='extra_lessons', to='core.Group', verbose_name='Groups'),
+        ),
+        migrations.AddField(
+            model_name='extralesson',
+            name='period',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extra_lessons', to='chronos.TimePeriod'),
+        ),
+        migrations.AddField(
+            model_name='extralesson',
+            name='room',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='extra_lessons', to='chronos.Room', verbose_name='Room'),
+        ),
+        migrations.AddField(
+            model_name='extralesson',
+            name='subject',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extra_lessons', to='chronos.Subject', verbose_name='Subject'),
+        ),
+        migrations.AddField(
+            model_name='extralesson',
+            name='teachers',
+            field=models.ManyToManyField(related_name='extra_lessons_as_teacher', to='core.Person', verbose_name='Teachers'),
+        ),
+    ]
diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py
index 8382a44e..0c37b208 100644
--- a/aleksis/apps/chronos/models.py
+++ b/aleksis/apps/chronos/models.py
@@ -1030,3 +1030,22 @@ class Event(ExtensibleModel):
         indexes = [models.Index(fields=["period_from", "period_to", "date_start", "date_end"])]
         verbose_name = _("Event")
         verbose_name_plural = _("Events")
+
+
+class ExtraLesson(ExtensibleModel):
+    week = models.IntegerField(verbose_name=_("Week"), default=CalendarWeek.current_week)
+    period = models.ForeignKey("TimePeriod", models.CASCADE, related_name="extra_lessons")
+
+    subject = models.ForeignKey("Subject", on_delete=models.CASCADE, related_name="extra_lessons", verbose_name=_("Subject"))
+    groups = models.ManyToManyField("core.Group", related_name="extra_lessons", verbose_name=_("Groups"))
+    teachers = models.ManyToManyField("core.Person", related_name="extra_lessons_as_teacher", verbose_name=_("Teachers"))
+    room = models.ForeignKey("Room", models.CASCADE, null=True, related_name="extra_lessons", verbose_name=_("Room"))
+
+    comment = models.CharField(verbose_name=_("Comment"), blank=True, null=True, max_length=255)
+
+    def __str__(self):
+        return "{}, {}, {}".format(self.week, self.period, self.subject)
+
+    class Meta:
+        verbose_name = _("Extra lesson")
+        verbose_name_plural = _("Extra lessons")
-- 
GitLab