diff --git a/biscuit/apps/alsijil/forms.py b/biscuit/apps/alsijil/forms.py index cf9d90aab49a684d3a9b4269ae34290d6a049c3c..fde563a0e8b367fe0316acb696fab30e10cc5022 100644 --- a/biscuit/apps/alsijil/forms.py +++ b/biscuit/apps/alsijil/forms.py @@ -7,7 +7,7 @@ from datetime import datetime from biscuit.apps.chronos.models import Room from biscuit.core.models import Group, Person -from .models import LessonDocumentation, PersonalNote +from .models import LessonDocumentation, PersonalNote, PersonalNoteFilter class LessonDocumentationForm(forms.ModelForm): @@ -58,3 +58,9 @@ class RegisterAbsenceForm(forms.Form): absent = forms.BooleanField(label=_('Absent'), initial=True, required=False) excused = forms.BooleanField(label=_('Excused'), initial=True, required=False) remarks = forms.CharField(label=_('Remarks'), max_length=30, required=False) + + +class PersonalNoteFilterForm(forms.ModelForm): + class Meta: + model = PersonalNoteFilter + fields = ['identifier', 'description', 'regex'] diff --git a/biscuit/apps/alsijil/menus.py b/biscuit/apps/alsijil/menus.py index 9dbabfd9c4387fe3d5456d94d4b48579cc1d750c..71a57bda5b2c6e651712250c8755a50887b5bdb9 100644 --- a/biscuit/apps/alsijil/menus.py +++ b/biscuit/apps/alsijil/menus.py @@ -22,6 +22,11 @@ MENUS = { 'name': _('Register absence'), 'url': 'register_absence', 'validators': ['menu_generator.validators.is_superuser'] + }, + { + 'name': _('Personal note filters'), + 'url': 'list_personal_note_filters', + 'validators': ['menu_generator.validators.is_superuser'] } ] } diff --git a/biscuit/apps/alsijil/tables.py b/biscuit/apps/alsijil/tables.py new file mode 100644 index 0000000000000000000000000000000000000000..83737766d548541a91bcb96f320c9740b6d9ea60 --- /dev/null +++ b/biscuit/apps/alsijil/tables.py @@ -0,0 +1,14 @@ +from django.utils.translation import ugettext_lazy as _ +import django_tables2 as tables +from django_tables2.utils import A + + +class PersonalNoteFilterTable(tables.Table): + class Meta: + attrs = {'class': 'table table-striped table-bordered table-hover table-responsive-xl'} + + identifier = tables.Column() + description = tables.Column() + regex = tables.Column() + edit_filter = tables.LinkColumn( + 'edit_personal_note_filter', args=[A('id')], text=_('Edit')) diff --git a/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filter.html b/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filter.html new file mode 100644 index 0000000000000000000000000000000000000000..4382f9cfc5ae41f1260b247abcf0c389f971defc --- /dev/null +++ b/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filter.html @@ -0,0 +1,38 @@ +{# -*- engine:django -*- #} +{% extends "core/base.html" %} +{% load bootstrap4 i18n static font_awesome %} + +{% block bootstrap4_extra_head %} + {{ block.super }} + {{ personal_note_filter_form.media.css }} +{% endblock %} + +{% block bootstrap4_extra_script %} + {{ block.super }} + {{ personal_note_filter_form.media.js }} +{% endblock %} + +{% block bootstrap4_title %}{% blocktrans%}Manage personal note filter{% endblocktrans %} - {{ block.super }}{% endblock %} + +{% block page_title %}{% blocktrans %}Manage personal note filter{% endblocktrans %}{% endblock %} + +{% block content %} +<div class="d-flex justify-content-between"> + <div class="btn-group" role="group" aria-label="Filter actions"> + {% if personal_note_filter %} + <a href="{% url 'delete_personal_note_filter' personal_note_filter.id %}" class="btn btn-danger"> + {% fa 'trash-o' %} + </a> + {% endif %} + </div> + </div> + + <form method="post"> + {% csrf_token %} + {% bootstrap_form personal_note_filter_form %} + <button type="submit" class="btn btn-dark"> + {% blocktrans %}Save{% endblocktrans %} + </button> + </form> + +{% endblock %} diff --git a/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filters.html b/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filters.html new file mode 100644 index 0000000000000000000000000000000000000000..6de7779b136ac6ad64ef46907b2df1506c6e5f89 --- /dev/null +++ b/biscuit/apps/alsijil/templates/alsijil/manage_personal_note_filters.html @@ -0,0 +1,38 @@ +{# -*- engine:django -*- #} +{% extends "core/base.html" %} +{% load bootstrap4 i18n static font_awesome %} + +{% block bootstrap4_extra_head %} + {{ block.super }} + {{ personal_note_filters_form.media.css }} +{% endblock %} + +{% block bootstrap4_extra_script %} + {{ block.super }} + {{ personal_note_filters_form.media.js }} +{% endblock %} + +{% block bootstrap4_title %}{% blocktrans%}Manage personal note filters{% endblocktrans %} - {{ block.super }}{% endblock %} + +{% block page_title %}{% blocktrans %}Manage personal note filters{% endblocktrans %}{% endblock %} + +{% block content %} +<div class="d-flex justify-content-between"> + <div class="btn-group" role="group" aria-label="Filter actions"> + {% if personal_note_filters %} + <a href="{% url 'delete_personal_note_filters' personal_note_filters.id %}" class="btn btn-danger"> + {% fa 'trash-o' %} + </a> + {% endif %} + </div> + </div> + + <form method="post"> + {% csrf_token %} + {% bootstrap_form personal_note_filters_form %} + <button type="submit" class="btn btn-dark"> + {% blocktrans %}Save{% endblocktrans %} + </button> + </form> + +{% endblock %} diff --git a/biscuit/apps/alsijil/templates/alsijil/personal_note_filters.html b/biscuit/apps/alsijil/templates/alsijil/personal_note_filters.html new file mode 100644 index 0000000000000000000000000000000000000000..071b664dbfba56f9a2789e655ae683aba84e309b --- /dev/null +++ b/biscuit/apps/alsijil/templates/alsijil/personal_note_filters.html @@ -0,0 +1,18 @@ +{# -*- engine:django -*- #} + +{% extends "core/base.html" %} +{% load bootstrap4 i18n font_awesome %} +{% load render_table from django_tables2 %} + +{% block bootstrap4_title %}{% blocktrans %}List of all personal note filters{% endblocktrans %} - {{ block.super }}{% endblock %} +{% block page_title %}{% blocktrans %}List of all personal note filters{% endblocktrans %}{% endblock %} + +{% block content %} + <div class="btn-group" role="group" aria-lable="Filter actions"> + <a href="{% url 'create_personal_note_filter' %}" class="btn btn-dark"> + {% fa 'plus' %} + </a> + </div> + + {% render_table personal_note_filters_table %} +{% endblock %} diff --git a/biscuit/apps/alsijil/urls.py b/biscuit/apps/alsijil/urls.py index 7aa5cd22ba0cd7f660077cf28ed98c95d5aa3d92..20327ec13f758353bcc9c7e8ecd3a2f78f39ab8a 100644 --- a/biscuit/apps/alsijil/urls.py +++ b/biscuit/apps/alsijil/urls.py @@ -14,4 +14,12 @@ urlpatterns = [ 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') ] diff --git a/biscuit/apps/alsijil/views.py b/biscuit/apps/alsijil/views.py index f0d4a3d293c35fec4cb5997fe558ad456656ccbe..bea753276aa3130eafffe7aeb28f08ad816bb312 100644 --- a/biscuit/apps/alsijil/views.py +++ b/biscuit/apps/alsijil/views.py @@ -9,14 +9,17 @@ from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.translation import ugettext as _ +from django_tables2 import RequestConfig + from biscuit.apps.chronos.models import LessonPeriod from biscuit.apps.chronos.util import CalendarWeek from biscuit.core.models import Group, Person from biscuit.core.decorators import admin_required from biscuit.core.util import messages -from .forms import LessonDocumentationForm, PersonalNoteFormSet, RegisterAbsenceForm, SelectForm +from .forms import LessonDocumentationForm, PersonalNoteFormSet, RegisterAbsenceForm, SelectForm, PersonalNoteFilterForm from .models import LessonDocumentation, PersonalNoteFilter +from .tables import PersonalNoteFilterTable @login_required @@ -247,3 +250,54 @@ def register_absence(request: HttpRequest) -> HttpResponse: context['register_absence_form'] = register_absence_form return render(request, 'alsijil/register_absence.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_filters.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/manage_personal_note_filter.html', context) + +@admin_required +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')