From f1b6dd9992d0b94307bb097faa1a824e447bec7b Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sun, 12 Jul 2020 14:53:57 +0200
Subject: [PATCH] Add extra mark model

---
 .../alsijil/migrations/0002_extra_mark.py     | 72 +++++++++++++++++++
 aleksis/apps/alsijil/models.py                | 28 ++++++++
 2 files changed, 100 insertions(+)
 create mode 100644 aleksis/apps/alsijil/migrations/0002_extra_mark.py

diff --git a/aleksis/apps/alsijil/migrations/0002_extra_mark.py b/aleksis/apps/alsijil/migrations/0002_extra_mark.py
new file mode 100644
index 000000000..15715ae1d
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0002_extra_mark.py
@@ -0,0 +1,72 @@
+# Generated by Django 3.0.8 on 2020-07-12 12:43
+
+import django.contrib.postgres.fields.jsonb
+import django.contrib.sites.managers
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("sites", "0002_alter_domain_unique"),
+        ("alsijil", "0001_initial"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="ExtraMark",
+            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
+                    ),
+                ),
+                (
+                    "short_name",
+                    models.CharField(
+                        max_length=255, unique=True, verbose_name="Short name"
+                    ),
+                ),
+                (
+                    "name",
+                    models.CharField(max_length=255, unique=True, verbose_name="Name"),
+                ),
+                (
+                    "site",
+                    models.ForeignKey(
+                        default=1,
+                        editable=False,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to="sites.Site",
+                    ),
+                ),
+            ],
+            options={
+                "verbose_name": "Extra mark",
+                "verbose_name_plural": "Extra marks",
+                "ordering": ["short_name"],
+            },
+            managers=[("objects", django.contrib.sites.managers.CurrentSiteManager()),],
+        ),
+        migrations.AddField(
+            model_name="personalnote",
+            name="extra_marks",
+            field=models.ManyToManyField(
+                blank=True,
+                null=True,
+                to="alsijil.ExtraMark",
+                verbose_name="Extra marks",
+            ),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index eb1bc4eb6..9473f54a0 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -30,6 +30,10 @@ class PersonalNote(ExtensibleModel):
 
     remarks = models.CharField(max_length=200, blank=True)
 
+    extra_marks = models.ManyToManyField(
+        "ExtraMark", null=True, blank=True, verbose_name=_("Extra marks")
+    )
+
     class Meta:
         verbose_name = _("Personal note")
         verbose_name_plural = _("Personal notes")
@@ -91,3 +95,27 @@ class PersonalNoteFilter(ExtensibleModel):
         verbose_name = _("Personal note filter")
         verbose_name_plural = _("Personal note filters")
         ordering = ["identifier"]
+
+
+class ExtraMark(ExtensibleModel):
+    """A model for extra marks.
+
+    Can be used for lesson-based counting of things (like forgotten homework).
+    """
+
+    short_name = models.CharField(
+        max_length=255, unique=True, verbose_name=_("Short name")
+    )
+    name = models.CharField(max_length=255, unique=True, verbose_name=_("Name"))
+
+    def __str__(self):
+        return f"{self.name} ({self.short_name})"
+
+    @property
+    def count_label(self):
+        return f"{self.short_name}_count"
+
+    class Meta:
+        ordering = ["short_name"]
+        verbose_name = _("Extra mark")
+        verbose_name_plural = _("Extra marks")
-- 
GitLab