From 8666add00b4890feeb68081bb04f12edd935048e Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Tue, 14 Jun 2022 21:46:38 +0200
Subject: [PATCH] Add option to mark instructions as done in lesson
 documentation

---
 aleksis/apps/alsijil/forms.py                 |  4 ++-
 .../migrations/0018_done_instructions.py      | 19 ++++++++++++++
 aleksis/apps/alsijil/models.py                |  8 ++++++
 .../partials/lesson/tabs/documentation.html   | 25 ++++++++++++++++++-
 aleksis/apps/alsijil/views.py                 |  6 +++++
 5 files changed, 60 insertions(+), 2 deletions(-)
 create mode 100644 aleksis/apps/alsijil/migrations/0018_done_instructions.py

diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py
index 1a4dc2a72..cc4921487 100644
--- a/aleksis/apps/alsijil/forms.py
+++ b/aleksis/apps/alsijil/forms.py
@@ -38,9 +38,11 @@ from .models import (
 
 
 class LessonDocumentationForm(forms.ModelForm):
+    layout = Layout("topic", "homework", "group_note")
+
     class Meta:
         model = LessonDocumentation
-        fields = ["topic", "homework", "group_note"]
+        fields = ["topic", "homework", "group_note", "done_instructions"]
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
diff --git a/aleksis/apps/alsijil/migrations/0018_done_instructions.py b/aleksis/apps/alsijil/migrations/0018_done_instructions.py
new file mode 100644
index 000000000..968d8491a
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0018_done_instructions.py
@@ -0,0 +1,19 @@
+# Generated by Django 3.2.13 on 2022-06-14 13:51
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0019_fix_uniqueness_per_site'),
+        ('alsijil', '0017_instruction'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='lessondocumentation',
+            name='done_instructions',
+            field=models.ManyToManyField(blank=True, null=True, related_name='documentations', to='alsijil.Instruction', verbose_name='Done instructions'),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index f5ac86590..2adfc9668 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -350,6 +350,14 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel):
     homework = models.CharField(verbose_name=_("Homework"), max_length=200, blank=True)
     group_note = models.CharField(verbose_name=_("Group note"), max_length=200, blank=True)
 
+    done_instructions = models.ManyToManyField(
+        "Instruction",
+        blank=True,
+        null=True,
+        related_name="documentations",
+        verbose_name=_("Done instructions"),
+    )
+
     def carry_over_data(self, all_periods_of_lesson: LessonPeriod):
         """Carry over data to given periods in this lesson if data is not already set.
 
diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html b/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html
index ef0f42048..a5e68e5ad 100644
--- a/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html
+++ b/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html
@@ -1,4 +1,4 @@
-{% load i18n material_form_internal material_form %}
+{% load i18n material_form_internal material_form data_helpers %}
 
 {% include "alsijil/partials/lesson/heading.html" %}
 {% include "alsijil/partials/lesson/prev_next.html" with with_save=0 %}
@@ -19,6 +19,29 @@
 
     {% if can_edit_lesson_documentation %}
       {% form form=lesson_documentation_form %}{% endform %}
+
+      {% if instructions %}
+        <h6>{% trans "Instructions" %}</h6>
+        <div class="collection">
+          {% for instruction in instructions %}
+            <div class="collection-item">
+              <i class="material-icons  primary-color-text left">{{ instruction.icon|default:"rule" }}</i>
+              {{ instruction.name }}
+              <div class="right grey-text darken-4">
+                {% trans "Instruction done" %}&nbsp;&nbsp;
+                <label class="secondary-content right">
+                  <input type="checkbox"
+                         class="filled-in"
+                         name="lesson_documentation-done_instructions"
+                         value="{{ instruction.pk }}"
+                         {% if instruction.pk|slugify in lesson_documentation_form.done_instructions.value %}checked{% endif %}>
+                  <span></span>
+                </label>
+              </div>
+            </div>
+          {% endfor %}
+        </div>
+      {% endif %}
     {% elif can_view_lesson_documentation %}
       <table>
         <tr>
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index 50c5f9267..a3751bcc2 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -220,11 +220,17 @@ def register_object(
         lesson_documentation = register_object.get_or_create_lesson_documentation(wanted_week)
         context["has_documentation"] = bool(lesson_documentation.topic)
 
+        instructions = Instruction.objects.on_day(date_of_lesson).filter(
+            Q(groups__in=groups) | Q(groups__isnull=True)
+        )
+        context["instructions"] = instructions
+
         lesson_documentation_form = LessonDocumentationForm(
             request.POST or None,
             instance=lesson_documentation,
             prefix="lesson_documentation",
         )
+        lesson_documentation_form.fields["done_instructions"].queryset = instructions
 
         # Prefetch object permissions for all related groups of the register object
         # because the object permissions are checked for all groups of the register object
-- 
GitLab