From a0554aef9916ecb7b5837f5e8003ed26b700c6a8 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sat, 22 Aug 2020 17:44:58 +0200
Subject: [PATCH] Add delete view and button for personal notes

---
 aleksis/apps/alsijil/models.py                | 21 +++++++++++++++++++
 .../alsijil/class_register/person.html        | 16 ++++++++++++++
 aleksis/apps/alsijil/urls.py                  |  5 +++++
 aleksis/apps/alsijil/views.py                 | 14 +++++++++++++
 4 files changed, 56 insertions(+)

diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 721648bc4..da7fea85b 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -1,6 +1,8 @@
 from django.db import models
+from django.utils.formats import date_format
 from django.utils.translation import gettext_lazy as _
 
+import reversion
 from calendarweek import CalendarWeek
 
 from aleksis.apps.chronos.mixins import WeekRelatedMixin
@@ -82,6 +84,25 @@ class PersonalNote(ExtensibleModel, WeekRelatedMixin):
             self.excuse_type = None
         super().save(*args, **kwargs)
 
+    def reset(self):
+        """Reset all saved data to default values.
+
+        This will create revisions internally.
+        """
+        with reversion.create_revision():
+            self.save()
+        with reversion.create_revision():
+            self.absent = False
+            self.late = 0
+            self.excused = False
+            self.excuse_type = None
+            self.remarks = ""
+            self.extra_marks.clear()
+            self.save()
+
+    def __str__(self):
+        return f"{date_format(self.date)}, {self.lesson_period}, {self.person}"
+
     class Meta:
         verbose_name = _("Personal note")
         verbose_name_plural = _("Personal notes")
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/person.html b/aleksis/apps/alsijil/templates/alsijil/class_register/person.html
index 5a442b81c..dd9073835 100644
--- a/aleksis/apps/alsijil/templates/alsijil/class_register/person.html
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/person.html
@@ -27,6 +27,10 @@
             {% trans "Mark as" %}
             <input type="hidden" value="{{ note.pk }}" name="personal_note">
             {% include "alsijil/partials/mark_as_buttons.html" %}
+            <a class="btn-flat red-text" title="{% trans "Delete note" %}"
+               href="{% url "delete_personal_note" note.pk %}">
+              <i class="material-icons center">cancel</i>
+            </a>
           </form>
           <i class="material-icons left red-text">warning</i>
           <p class="no-margin">
@@ -40,6 +44,10 @@
             {% trans "Mark as" %}
             <input type="hidden" value="{{ note.pk }}" name="personal_note">
             {% include "alsijil/partials/mark_as_buttons.html" %}
+            <a class="btn-flat red-text" title="{% trans "Delete note" %}"
+               href="{% url "delete_personal_note" note.pk %}">
+              <i class="material-icons center">cancel</i>
+            </a>
           </form>
         </li>
       {% empty %}
@@ -152,6 +160,10 @@
                         {% trans "Mark as" %}
                         <input type="hidden" value="{{ note.pk }}" name="personal_note">
                         {% include "alsijil/partials/mark_as_buttons.html" %}
+                        <a class="btn-flat red-text" title="{% trans "Delete note" %}"
+                           href="{% url "delete_personal_note" note.pk %}">
+                          <i class="material-icons center">cancel</i>
+                        </a>
                       </form>
                     {% endif %}
 
@@ -190,6 +202,10 @@
                         {% trans "Mark as" %}
                         <input type="hidden" value="{{ note.pk }}" name="personal_note">
                         {% include "alsijil/partials/mark_as_buttons.html" %}
+                        <a class="btn-flat red-text" title="{% trans "Delete note" %}"
+                           href="{% url "delete_personal_note" note.pk %}">
+                          <i class="material-icons center">cancel</i>
+                        </a>
                       </form>
                     {% endif %}
                   </div>
diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py
index 0482571bd..76e12ea7b 100644
--- a/aleksis/apps/alsijil/urls.py
+++ b/aleksis/apps/alsijil/urls.py
@@ -29,6 +29,11 @@ urlpatterns = [
     path("persons/", views.my_students, name="my_students"),
     path("persons/<int:id_>/", views.overview_person, name="overview_person"),
     path("me/", views.overview_person, name="overview_me"),
+    path(
+        "notes/<int:id_>/delete/",
+        views.delete_personal_note,
+        name="delete_personal_note",
+    ),
     path("absence/new", views.register_absence, name="register_absence"),
     path("extra_marks/", views.ExtraMarkListView.as_view(), name="extra_marks"),
     path(
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index f9840a124..c467ee72b 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -638,6 +638,20 @@ def register_absence(request: HttpRequest) -> HttpResponse:
     return render(request, "alsijil/absences/register.html", context)
 
 
+def delete_personal_note(request: HttpRequest, id_: int) -> HttpResponse:
+    context = {}
+
+    personal_note = get_object_or_404(PersonalNote, pk=id_)
+
+    context["object"] = personal_note
+
+    if request.method == "POST":
+        personal_note.reset()
+        return redirect("overview_person", personal_note.person.pk)
+    else:
+        return render(request, "core/pages/delete.html", context)
+
+
 class ExtraMarkListView(SingleTableView, PermissionRequiredMixin):
     """Table of all extra marks."""
 
-- 
GitLab