From a66dc7a9a445abfc5c5aab8132e9802dcb92da0d Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sat, 18 Jul 2020 17:24:51 +0200
Subject: [PATCH] Remove legacy personal notes filters in favor of extra marks

---
 aleksis/apps/alsijil/forms.py                 | 16 +---
 aleksis/apps/alsijil/menus.py                 |  6 --
 .../0004_delete_personal_notes_filter.py      | 14 ++++
 aleksis/apps/alsijil/models.py                | 23 ------
 aleksis/apps/alsijil/tables.py                | 15 ----
 .../alsijil/personal_note_filter/list.html    | 16 ----
 .../alsijil/personal_note_filter/manage.html  | 34 ---------
 .../alsijil/print/full_register.html          | 23 ------
 aleksis/apps/alsijil/urls.py                  | 20 -----
 aleksis/apps/alsijil/views.py                 | 74 +------------------
 10 files changed, 17 insertions(+), 224 deletions(-)
 create mode 100644 aleksis/apps/alsijil/migrations/0004_delete_personal_notes_filter.py
 delete mode 100644 aleksis/apps/alsijil/templates/alsijil/personal_note_filter/list.html
 delete mode 100644 aleksis/apps/alsijil/templates/alsijil/personal_note_filter/manage.html

diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py
index f27596eef..975dd5d2a 100644
--- a/aleksis/apps/alsijil/forms.py
+++ b/aleksis/apps/alsijil/forms.py
@@ -11,13 +11,7 @@ from material import Layout, Row
 from aleksis.apps.chronos.managers import TimetableType
 from aleksis.core.models import Group, Person
 
-from .models import (
-    ExcuseType,
-    ExtraMark,
-    LessonDocumentation,
-    PersonalNote,
-    PersonalNoteFilter,
-)
+from .models import ExcuseType, ExtraMark, LessonDocumentation, PersonalNote
 
 
 class LessonDocumentationForm(forms.ModelForm):
@@ -115,14 +109,6 @@ class RegisterAbsenceForm(forms.Form):
     remarks = forms.CharField(label=_("Remarks"), max_length=30, required=False)
 
 
-class PersonalNoteFilterForm(forms.ModelForm):
-    layout = Layout(Row("identifier", "description"), Row("regex"))
-
-    class Meta:
-        model = PersonalNoteFilter
-        fields = ["identifier", "description", "regex"]
-
-
 class ExtraMarkForm(forms.ModelForm):
     layout = Layout("short_name", "name")
 
diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py
index 081c1ec2a..a3ec5e9cc 100644
--- a/aleksis/apps/alsijil/menus.py
+++ b/aleksis/apps/alsijil/menus.py
@@ -30,12 +30,6 @@ MENUS = {
                     "icon": "rate_review",
                     "validators": ["menu_generator.validators.is_superuser"],
                 },
-                {
-                    "name": _("Personal note filters"),
-                    "url": "list_personal_note_filters",
-                    "icon": "filter_list",
-                    "validators": ["menu_generator.validators.is_superuser"],
-                },
                 {
                     "name": _("Excuse types"),
                     "url": "excuse_types",
diff --git a/aleksis/apps/alsijil/migrations/0004_delete_personal_notes_filter.py b/aleksis/apps/alsijil/migrations/0004_delete_personal_notes_filter.py
new file mode 100644
index 000000000..d04764b80
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0004_delete_personal_notes_filter.py
@@ -0,0 +1,14 @@
+# Generated by Django 3.0.8 on 2020-07-18 15:23
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("alsijil", "0003_extra_mark"),
+    ]
+
+    operations = [
+        migrations.DeleteModel(name="PersonalNoteFilter",),
+    ]
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 76b3b8a98..8a82caddb 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -110,29 +110,6 @@ class LessonDocumentation(ExtensibleModel):
         ]
 
 
-class PersonalNoteFilter(ExtensibleModel):
-    """A filter definition that can generate statistics on personal note texts."""
-
-    identifier = models.CharField(
-        verbose_name=_("Identifier"),
-        max_length=30,
-        validators=[isidentifier],
-        unique=True,
-    )
-    description = models.CharField(
-        verbose_name=_("Description"), max_length=60, blank=True, unique=True
-    )
-
-    regex = models.CharField(
-        verbose_name=_("Match expression"), max_length=100, unique=True
-    )
-
-    class Meta:
-        verbose_name = _("Personal note filter")
-        verbose_name_plural = _("Personal note filters")
-        ordering = ["identifier"]
-
-
 class ExtraMark(ExtensibleModel):
     """A model for extra marks.
 
diff --git a/aleksis/apps/alsijil/tables.py b/aleksis/apps/alsijil/tables.py
index 866da69e0..bd6b47a73 100644
--- a/aleksis/apps/alsijil/tables.py
+++ b/aleksis/apps/alsijil/tables.py
@@ -4,21 +4,6 @@ import django_tables2 as tables
 from django_tables2.utils import A
 
 
-class PersonalNoteFilterTable(tables.Table):
-    class Meta:
-        attrs = {"class": "highlight"}
-
-    identifier = tables.Column()
-    description = tables.Column()
-    regex = tables.Column()
-    edit_filter = tables.LinkColumn(
-        "edit_personal_note_filter",
-        args=[A("id")],
-        text=_("Edit"),
-        attrs={"a": {"class": "btn-flat waves-effect waves-orange"}},
-    )
-
-
 class ExtraMarkTable(tables.Table):
     class Meta:
         attrs = {"class": "highlight"}
diff --git a/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/list.html b/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/list.html
deleted file mode 100644
index 3673e60ab..000000000
--- a/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/list.html
+++ /dev/null
@@ -1,16 +0,0 @@
-{# -*- engine:django -*- #}
-
-{% extends "core/base.html" %}
-{% load i18n %}
-{% load render_table from django_tables2 %}
-
-{% block browser_title %}{% blocktrans %}All personal note filters{% endblocktrans %}{% endblock %}
-{% block page_title %}{% blocktrans %}Personal note filters{% endblocktrans %}{% endblock %}
-
-{% block content %}
-  <a href="{% url 'create_personal_note_filter' %}" class="waves-effect waves-light green btn">
-    <i class="material-icons left">add</i>{% blocktrans %}Add filter{% endblocktrans %}
-  </a>
-
-  {% render_table personal_note_filters_table %}
-{% endblock %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/manage.html b/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/manage.html
deleted file mode 100644
index 427777439..000000000
--- a/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/manage.html
+++ /dev/null
@@ -1,34 +0,0 @@
-{# -*- engine:django -*- #}
-{% extends "core/base.html" %}
-{% load material_form i18n static %}
-
-{% block browser_title %}
-  {% if personal_note_filter %}
-    {% trans "Update personal note filter" %}
-  {% else %}
-    {% trans "Create personal note filter" %}
-  {% endif %}
-{% endblock %}
-{% block page_title %}
-  {% if personal_note_filter %}
-    {% trans "Update personal note filter" %}
-  {% else %}
-    {% trans "Create personal note filter" %}
-  {% endif %}
-{% endblock %}
-
-
-{% block content %}
-  <form method="post">
-    {% csrf_token %}
-    {% form form=personal_note_filter_form %}{% endform %}
-    {% include "core/partials/save_button.html" %}
-    {% if personal_note_filter %}
-      <a href="{% url 'delete_personal_note_filter' personal_note_filter.id %}"
-         class="waves-effect waves-light btn red">
-        <i class="material-icons left">delete</i>{% blocktrans %}Delete filter{% endblocktrans %}
-      </a>
-    {% endif %}
-  </form>
-
-{% endblock %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html
index daedc5509..6d0ddbacc 100644
--- a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html
+++ b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html
@@ -263,29 +263,6 @@
       </tr>
     </table>
 
-    {% if personal_note_filters %}
-      <h5>{% trans 'Statistics on remarks' %}</h5>
-      <table>
-        <thead>
-        <tr>
-          <th>{% trans 'Description' %}</th>
-          <th>{% trans 'Count' %}</th>
-        </tr>
-        </thead>
-
-        <tbody>
-        {% for note_filter in personal_note_filters %}
-          <tr>
-            <td>{{ note_filter.description }}</td>
-            {% with "_personal_notes_with_"|add:note_filter.identifier as identifier %}
-              <td>{{ person|get_dict:identifier }}</td>
-            {% endwith %}
-          </tr>
-        {% endfor %}
-        </tbody>
-      </table>
-    {% endif %}
-
     <h5>{% trans 'Absences and tardiness' %}</h5>
     <table>
       <tr>
diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py
index 12c12bc44..3f6836259 100644
--- a/aleksis/apps/alsijil/urls.py
+++ b/aleksis/apps/alsijil/urls.py
@@ -21,26 +21,6 @@ urlpatterns = [
         "print/group/<int:id_>", views.full_register_group, name="full_register_group"
     ),
     path("absence/new", views.register_absence, name="register_absence"),
-    path(
-        "filters/list",
-        views.list_personal_note_filters,
-        name="list_personal_note_filters",
-    ),
-    path(
-        "filters/create",
-        views.edit_personal_note_filter,
-        name="create_personal_note_filter",
-    ),
-    path(
-        "filters/edit/<int:id_>",
-        views.edit_personal_note_filter,
-        name="edit_personal_note_filter",
-    ),
-    path(
-        "filters/delete/<int:id_>",
-        views.delete_personal_note_filter,
-        name="delete_personal_note_filter",
-    ),
     path("extra_marks/", views.ExtraMarkListView.as_view(), name="extra_marks"),
     path(
         "extra_marks/create/",
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index 1e109d7e5..d97bbc24b 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -24,13 +24,12 @@ from .forms import (
     ExcuseTypeForm,
     ExtraMarkForm,
     LessonDocumentationForm,
-    PersonalNoteFilterForm,
     PersonalNoteFormSet,
     RegisterAbsenceForm,
     SelectForm,
 )
-from .models import ExcuseType, ExtraMark, LessonDocumentation, PersonalNoteFilter
-from .tables import ExcuseTypeTable, ExtraMarkTable, PersonalNoteFilterTable
+from .models import ExcuseType, ExtraMark, LessonDocumentation
+from .tables import ExcuseTypeTable, ExtraMarkTable
 
 
 def lesson(
@@ -392,24 +391,8 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
             }
         )
 
-    # FIXME Move to manager
-    personal_note_filters = PersonalNoteFilter.objects.all()
-    for personal_note_filter in personal_note_filters:
-        persons = persons.annotate(
-            **{
-                "_personal_notes_with_%s"
-                % personal_note_filter.identifier: Count(
-                    "personal_notes__remarks",
-                    filter=Q(
-                        personal_notes__remarks__iregex=personal_note_filter.regex
-                    ),
-                )
-            }
-        )
-
     context["school_term"] = current_school_term
     context["persons"] = persons
-    context["personal_note_filters"] = personal_note_filters
     context["excuse_types"] = ExcuseType.objects.all()
     context["extra_marks"] = ExtraMark.objects.all()
     context["group"] = group
@@ -451,59 +434,6 @@ def register_absence(request: HttpRequest) -> HttpResponse:
     return render(request, "alsijil/absences/register.html", context)
 
 
-def list_personal_note_filters(request: HttpRequest) -> HttpResponse:
-    context = {}
-
-    personal_note_filters = PersonalNoteFilter.objects.all()
-
-    # Prepare table
-    personal_note_filters_table = PersonalNoteFilterTable(personal_note_filters)
-    RequestConfig(request).configure(personal_note_filters_table)
-
-    context["personal_note_filters_table"] = personal_note_filters_table
-
-    return render(request, "alsijil/personal_note_filter/list.html", context)
-
-
-def edit_personal_note_filter(
-    request: HttpRequest, id_: Optional["int"] = None
-) -> HttpResponse:
-    context = {}
-
-    if id_:
-        personal_note_filter = PersonalNoteFilter.objects.get(id=id_)
-        context["personal_note_filter"] = personal_note_filter
-        personal_note_filter_form = PersonalNoteFilterForm(
-            request.POST or None, instance=personal_note_filter
-        )
-    else:
-        personal_note_filter_form = PersonalNoteFilterForm(request.POST or None)
-
-    if request.method == "POST":
-        if personal_note_filter_form.is_valid():
-            personal_note_filter_form.save(commit=True)
-
-            messages.success(request, _("The filter has been saved"))
-            return redirect("list_personal_note_filters")
-
-    context["personal_note_filter_form"] = personal_note_filter_form
-
-    return render(request, "alsijil/personal_note_filter/manage.html", context)
-
-
-def delete_personal_note_filter(request: HttpRequest, id_: int) -> HttpResponse:
-    context = {}
-
-    personal_note_filter = get_object_or_404(PersonalNoteFilter, pk=id_)
-
-    PersonalNoteFilter.objects.filter(pk=id_).delete()
-
-    messages.success(request, _("The filter has been deleted."))
-
-    context["personal_note_filter"] = personal_note_filter
-    return redirect("list_personal_note_filters")
-
-
 class ExtraMarkListView(SingleTableView, PermissionRequiredMixin):
     """Table of all extra marks."""
 
-- 
GitLab