From 08324b3efbc5d3b8adcf90f7312bfecfb962f290 Mon Sep 17 00:00:00 2001 From: Tom Teichler <tom.teichler@teckids.org> Date: Wed, 9 Mar 2022 19:40:07 +0100 Subject: [PATCH] Add ui for creating clients --- aleksis/apps/tezor/forms.py | 10 ++++++ aleksis/apps/tezor/menus.py | 29 +++++++++++++++ aleksis/apps/tezor/tables.py | 14 ++++++++ .../tezor/templates/tezor/client/create.html | 19 ++++++++++ .../tezor/templates/tezor/client/edit.html | 18 ++++++++++ .../tezor/templates/tezor/client/list.html | 14 ++++++++ aleksis/apps/tezor/templates/tezor/empty.html | 8 ----- aleksis/apps/tezor/urls.py | 15 ++++++++ aleksis/apps/tezor/views.py | 35 +++++++++++++++++++ 9 files changed, 154 insertions(+), 8 deletions(-) create mode 100644 aleksis/apps/tezor/forms.py create mode 100644 aleksis/apps/tezor/menus.py create mode 100644 aleksis/apps/tezor/templates/tezor/client/create.html create mode 100644 aleksis/apps/tezor/templates/tezor/client/edit.html create mode 100644 aleksis/apps/tezor/templates/tezor/client/list.html delete mode 100644 aleksis/apps/tezor/templates/tezor/empty.html diff --git a/aleksis/apps/tezor/forms.py b/aleksis/apps/tezor/forms.py new file mode 100644 index 0000000..8c01843 --- /dev/null +++ b/aleksis/apps/tezor/forms.py @@ -0,0 +1,10 @@ +from aleksis.core.mixins import ExtensibleForm + +from .models.base import Client + +class EditEventForm(ExtensibleForm): + """Form to create or edit clients.""" + + class Meta: + model = Client + exclude = [] diff --git a/aleksis/apps/tezor/menus.py b/aleksis/apps/tezor/menus.py new file mode 100644 index 0000000..49c9644 --- /dev/null +++ b/aleksis/apps/tezor/menus.py @@ -0,0 +1,29 @@ +from django.utils.translation import gettext_lazy as _ + +MENUS = { + "NAV_MENU_CORE": [ + { + "name": _("Payments"), + "url": "#", + "root": True, + "icon": "price_check", + "validators": [ + "menu_generator.validators.is_authenticated", + "aleksis.core.util.core_helpers.has_person", + ], + "submenu": [ + { + "name": _("Clients"), + "url": "clients", + "icon": "account_balance", + "validators": [ + ( + "aleksis.core.util.predicates.permission_validator", + "tezor.can_view_clients", + ) + ], + }, + ], + } + ] +} diff --git a/aleksis/apps/tezor/tables.py b/aleksis/apps/tezor/tables.py index 3cf4813..f240d17 100644 --- a/aleksis/apps/tezor/tables.py +++ b/aleksis/apps/tezor/tables.py @@ -32,3 +32,17 @@ class TotalsTable(tables.Table): class Meta: show_header = False orderable = False + + +class ClientsTable(tables.Table): + class Meta: + attrs = {"class": "responsive-table highlight"} + + name = tables.Column() + + edit = tables.LinkColumn( + "edit_client_by_pk", + args=[A("id")], + verbose_name=_("Edit"), + text=_("Edit"), + ) diff --git a/aleksis/apps/tezor/templates/tezor/client/create.html b/aleksis/apps/tezor/templates/tezor/client/create.html new file mode 100644 index 0000000..634500f --- /dev/null +++ b/aleksis/apps/tezor/templates/tezor/client/create.html @@ -0,0 +1,19 @@ +{% extends "core/base.html" %} +{% load material_form i18n %} + +{% block page_title %}{% blocktrans %}Create client{% endblocktrans %}{% endblock %} +{% block browser_title %}{% blocktrans %}Create client{% endblocktrans %}{% endblock %} + +{% block extra_head %} + {{ form.media.css }} +{% endblock %} + +{% block content %} + <form method="post"> + {% csrf_token %} + {% form form=form %}{% endform %} + {% include "core/partials/save_button.html" %} + </form> + + {{ form.media.js }} +{% endblock %} diff --git a/aleksis/apps/tezor/templates/tezor/client/edit.html b/aleksis/apps/tezor/templates/tezor/client/edit.html new file mode 100644 index 0000000..3c19395 --- /dev/null +++ b/aleksis/apps/tezor/templates/tezor/client/edit.html @@ -0,0 +1,18 @@ +{% extends "core/base.html" %} +{% load material_form i18n %} + +{% block page_title %}{% blocktrans %}Edit client{% endblocktrans %}{% endblock %} +{% block browser_title %}{% blocktrans %}Edit client{% endblocktrans %}{% endblock %} + +{% block extra_head %} + {{ form.media.css }} +{% endblock %} + +{% block content %} + <form method="post"> + {% csrf_token %} + {% form form=form %}{% endform %} + {% include "core/partials/save_button.html" %} + </form> + {{ form.media.js }} +{% endblock %} diff --git a/aleksis/apps/tezor/templates/tezor/client/list.html b/aleksis/apps/tezor/templates/tezor/client/list.html new file mode 100644 index 0000000..e8b3226 --- /dev/null +++ b/aleksis/apps/tezor/templates/tezor/client/list.html @@ -0,0 +1,14 @@ +{% extends "core/base.html" %} +{% load material_form i18n %} + +{% load render_table from django_tables2 %} + +{% block page_title %}{% blocktrans %}Clients{% endblocktrans %}{% endblock %} +{% block browser_title %}{% blocktrans %}Clients{% endblocktrans %}{% endblock %} + +{% block content %} + + <a class="btn colour-primary waves-effect waves-light" href="{% url 'create_client' %}">{% trans "Create client" %}</a> + {% render_table table %} + +{% endblock %} diff --git a/aleksis/apps/tezor/templates/tezor/empty.html b/aleksis/apps/tezor/templates/tezor/empty.html deleted file mode 100644 index 2fb4415..0000000 --- a/aleksis/apps/tezor/templates/tezor/empty.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends 'core/base.html' %} -{% load i18n %} - -{% block content %} - <p class="flow-text"> - {% blocktrans %}Tezor (account and payment system){% endblocktrans %} - </p> -{% endblock %} diff --git a/aleksis/apps/tezor/urls.py b/aleksis/apps/tezor/urls.py index 571809c..441f581 100644 --- a/aleksis/apps/tezor/urls.py +++ b/aleksis/apps/tezor/urls.py @@ -5,4 +5,19 @@ from . import views urlpatterns = [ path("payments/", include("payments.urls")), path("invoice/<int:pk>/print", views.GetInvoicePDF.as_view(), name="get_invoice_by_pk") + path( + "clients/list", + views.ClientListView.as_view(), + name="clients", + ), + path( + "clients/create", + views.ClientCreateView.as_view(), + name="create_client", + ), + path( + "clients/<int:pk>/edit", + views.ClientEditView.as_view(), + name="edit_client_by_pk", + ), ] diff --git a/aleksis/apps/tezor/views.py b/aleksis/apps/tezor/views.py index 22fe108..1723edc 100644 --- a/aleksis/apps/tezor/views.py +++ b/aleksis/apps/tezor/views.py @@ -5,6 +5,9 @@ from rules.contrib.views import PermissionRequiredMixin from aleksis.core.views import RenderPDFView +from .tables import ClientsTable +from .forms import EditClientForm +from .models.base import Client from .models.invoice import Invoice @@ -20,3 +23,35 @@ class GetInvoicePDF(PermissionRequiredMixin, RenderPDFView): print(invoice.group.__dict__) return context + +class ClientListView(PermissionRequiredMixin, SingleTableView): + """Table of all clients.""" + + model = Client + table_class = ClientsTable + permission_required = "teor.view_clients" + template_name = "teor/client/list.html" + + +@method_decorator(never_cache, name="dispatch") +class ClientCreateView(PermissionRequiredMixin, AdvancedCreateView): + """Create view for clients.""" + + model = Client + form_class = EditClientForm + permission_required = "teor.add_clients" + template_name = "teor/client/create.html" + success_url = reverse_lazy("clients") + success_message = _("The client has been created.") + + +@method_decorator(never_cache, name="dispatch") +class ClientEditView(PermissionRequiredMixin, AdvancedEditView): + """Edit view for clients.""" + + model = Client + form_class = EditClientForm + permission_required = "teor.edit_clients" + template_name = "teor/client/edit.html" + success_url = reverse_lazy("clients") + success_message = _("The client has been saved.") -- GitLab