From 06c8cab4bf6b275c5e5518e742418e05b7d17265 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 13:27:58 +0200 Subject: [PATCH 001/213] Move PKGBUILD to pkgbuild dir --- PKGBUILD => pkgbuild/PKGBUILD | 0 nummi.nginx => pkgbuild/nummi.nginx | 0 nummi.service => pkgbuild/nummi.service | 0 nummi.sysusers => pkgbuild/nummi.sysusers | 0 nummi.tmpfiles => pkgbuild/nummi.tmpfiles | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename PKGBUILD => pkgbuild/PKGBUILD (100%) rename nummi.nginx => pkgbuild/nummi.nginx (100%) rename nummi.service => pkgbuild/nummi.service (100%) rename nummi.sysusers => pkgbuild/nummi.sysusers (100%) rename nummi.tmpfiles => pkgbuild/nummi.tmpfiles (100%) diff --git a/PKGBUILD b/pkgbuild/PKGBUILD similarity index 100% rename from PKGBUILD rename to pkgbuild/PKGBUILD diff --git a/nummi.nginx b/pkgbuild/nummi.nginx similarity index 100% rename from nummi.nginx rename to pkgbuild/nummi.nginx diff --git a/nummi.service b/pkgbuild/nummi.service similarity index 100% rename from nummi.service rename to pkgbuild/nummi.service diff --git a/nummi.sysusers b/pkgbuild/nummi.sysusers similarity index 100% rename from nummi.sysusers rename to pkgbuild/nummi.sysusers diff --git a/nummi.tmpfiles b/pkgbuild/nummi.tmpfiles similarity index 100% rename from nummi.tmpfiles rename to pkgbuild/nummi.tmpfiles From 2d45fef9752af2d1c865174080ca2bd8a8aa64a9 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 13:31:12 +0200 Subject: [PATCH 002/213] Move config.toml to pkgbuild dir --- config.toml => pkgbuild/config.toml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename config.toml => pkgbuild/config.toml (100%) diff --git a/config.toml b/pkgbuild/config.toml similarity index 100% rename from config.toml rename to pkgbuild/config.toml From 62f360e77bbcf800c3410ff876bffd19ad8051e2 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 13:33:12 +0200 Subject: [PATCH 003/213] Hide connected as when not logged in --- nummi/main/templates/main/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html index 274bfd4..98da0b8 100644 --- a/nummi/main/templates/main/base.html +++ b/nummi/main/templates/main/base.html @@ -79,7 +79,7 @@ {% endif %} - {% if user %} + {% if user.is_authenticated %}

{% blocktranslate %}Logged in as {{ user }}{% endblocktranslate %}

From f0a232f366d5cfc2a220b7b423eda490ed34dd96 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 13:47:43 +0200 Subject: [PATCH 004/213] Moved views to adequate apps --- .../templates/account/account_form.html | 18 ++++++++++-------- .../templates/category/category_form.html | 4 ++-- .../templates/category/category_plot.html} | 0 nummi/main/templates/main/index.html | 6 +++--- nummi/search/forms.py | 2 +- .../templates/search/search_form.html} | 0 .../templates/statement/statement_form.html | 4 ++-- .../templates/statement/statement_list.html | 2 +- .../templates/statement/statement_table.html} | 0 .../templates/transaction/history_plot.html} | 0 .../templates/transaction/invoice_table.html} | 0 .../transaction/transaction_form.html | 2 +- .../transaction/transaction_list.html | 2 +- .../transaction/transaction_table.html} | 0 14 files changed, 21 insertions(+), 19 deletions(-) rename nummi/{main/templates/main/plot/category.html => category/templates/category/category_plot.html} (100%) rename nummi/{main/templates/main/form/search.html => search/templates/search/search_form.html} (100%) rename nummi/{main/templates/main/table/statement.html => statement/templates/statement/statement_table.html} (100%) rename nummi/{main/templates/main/plot/history.html => transaction/templates/transaction/history_plot.html} (100%) rename nummi/{main/templates/main/table/invoice.html => transaction/templates/transaction/invoice_table.html} (100%) rename nummi/{main/templates/main/table/transaction.html => transaction/templates/transaction/transaction_table.html} (100%) diff --git a/nummi/account/templates/account/account_form.html b/nummi/account/templates/account/account_form.html index 0e18fbb..91cd0af 100644 --- a/nummi/account/templates/account/account_form.html +++ b/nummi/account/templates/account/account_form.html @@ -10,13 +10,15 @@ {% block h2 %}{{ form.instance.icon|remix }}{{ form.instance }}{% endblock %} {% block tables %} {% if not form.instance|adding %} -

{% translate "Statements" %}

- {% include "main/table/statement.html" %} - {% endif %} - {% if transactions %} -

{% translate "Transactions" %}

- {% include "main/table/transaction.html" %} -

{% translate "History" %}

- {% include "main/plot/history.html" %} + {% if statements %} +

{% translate "Statements" %}

+ {% include "statement/statement_table.html" %} + {% endif %} + {% if transactions %} +

{% translate "Transactions" %}

+ {% include "transaction/transaction_table.html" %} +

{% translate "History" %}

+ {% include "transaction/history_plot.html" %} + {% endif %} {% endif %} {% endblock %} diff --git a/nummi/category/templates/category/category_form.html b/nummi/category/templates/category/category_form.html index 6223526..d995b04 100644 --- a/nummi/category/templates/category/category_form.html +++ b/nummi/category/templates/category/category_form.html @@ -11,10 +11,10 @@ {% block tables %} {% if transactions %}

{% translate "Transactions" %}

- {% include "main/table/transaction.html" %} + {% include "transaction/transaction_table.html" %} {% endif %} {% if history.data %}

{% translate "History" %}

- {% include "main/plot/history.html" %} + {% include "transaction/history_plot.html" %} {% endif %} {% endblock %} diff --git a/nummi/main/templates/main/plot/category.html b/nummi/category/templates/category/category_plot.html similarity index 100% rename from nummi/main/templates/main/plot/category.html rename to nummi/category/templates/category/category_plot.html diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index b2dbbaa..9da7a05 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -24,7 +24,7 @@ {% endif %} {% if transactions %}

{% translate "Transactions" %}

- {% include "main/table/transaction.html" %} + {% include "transaction/transaction_table.html" %} {% endif %} {% if categories %}

{% translate "Categories" %}

@@ -38,10 +38,10 @@ {% endif %} {% if statements %}

{% translate "Statements" %}

- {% include "main/table/statement.html" %} + {% include "statement/statement_table.html" %} {% endif %} {% if history.data %}

{% translate "History" %}

- {% include "main/plot/history.html" %} + {% include "transaction/history_plot.html" %} {% endif %} {% endblock %} diff --git a/nummi/search/forms.py b/nummi/search/forms.py index 70d6e60..0aba785 100644 --- a/nummi/search/forms.py +++ b/nummi/search/forms.py @@ -3,5 +3,5 @@ from django.utils.translation import gettext_lazy as _ class SearchForm(forms.Form): - template_name = "main/form/search.html" + template_name = "search/search_form.html" search = forms.CharField(label=_("Search"), max_length=128) diff --git a/nummi/main/templates/main/form/search.html b/nummi/search/templates/search/search_form.html similarity index 100% rename from nummi/main/templates/main/form/search.html rename to nummi/search/templates/search/search_form.html diff --git a/nummi/statement/templates/statement/statement_form.html b/nummi/statement/templates/statement/statement_form.html index feaf251..06fe238 100644 --- a/nummi/statement/templates/statement/statement_form.html +++ b/nummi/statement/templates/statement/statement_form.html @@ -21,10 +21,10 @@ {% block tables %} {% if categories %}

{% translate "Categories" %}

- {% include "main/plot/category.html" %} + {% include "category/category_plot.html" %} {% endif %} {% if not form.instance|adding %}

{% translate "Transactions" %} ({{ form.instance.sum|pmvalue }} / {{ form.instance.diff|pmvalue }})

- {% include "main/table/transaction.html" %} + {% include "transaction/transaction_table.html" %} {% endif %} {% endblock %} diff --git a/nummi/statement/templates/statement/statement_list.html b/nummi/statement/templates/statement/statement_list.html index f6b31a9..9522c3e 100644 --- a/nummi/statement/templates/statement/statement_list.html +++ b/nummi/statement/templates/statement/statement_list.html @@ -31,7 +31,7 @@ {% endif %} {% if statements %} {% include "main/list/pagination.html" %} - {% include "main/table/statement.html" %} + {% include "statement/statement_table.html" %} {% include "main/list/pagination.html" %} {% else %}

{% translate "No statements to show" %}

diff --git a/nummi/main/templates/main/table/statement.html b/nummi/statement/templates/statement/statement_table.html similarity index 100% rename from nummi/main/templates/main/table/statement.html rename to nummi/statement/templates/statement/statement_table.html diff --git a/nummi/main/templates/main/plot/history.html b/nummi/transaction/templates/transaction/history_plot.html similarity index 100% rename from nummi/main/templates/main/plot/history.html rename to nummi/transaction/templates/transaction/history_plot.html diff --git a/nummi/main/templates/main/table/invoice.html b/nummi/transaction/templates/transaction/invoice_table.html similarity index 100% rename from nummi/main/templates/main/table/invoice.html rename to nummi/transaction/templates/transaction/invoice_table.html diff --git a/nummi/transaction/templates/transaction/transaction_form.html b/nummi/transaction/templates/transaction/transaction_form.html index 39e10fb..75eb0d4 100644 --- a/nummi/transaction/templates/transaction/transaction_form.html +++ b/nummi/transaction/templates/transaction/transaction_form.html @@ -17,6 +17,6 @@ {% block tables %} {% if not form.instance|adding %}

{% translate "Invoices" %}

- {% include "main/table/invoice.html" %} + {% include "transaction/invoice_table.html" %} {% endif %} {% endblock %} diff --git a/nummi/transaction/templates/transaction/transaction_list.html b/nummi/transaction/templates/transaction/transaction_list.html index ee087e7..cc44397 100644 --- a/nummi/transaction/templates/transaction/transaction_list.html +++ b/nummi/transaction/templates/transaction/transaction_list.html @@ -43,7 +43,7 @@ {% endif %} {% if transactions %} {% include "main/list/pagination.html" %} - {% include "main/table/transaction.html" %} + {% include "transaction/transaction_table.html" %} {% include "main/list/pagination.html" %} {% else %}

{% translate "No transactions to show" %}

diff --git a/nummi/main/templates/main/table/transaction.html b/nummi/transaction/templates/transaction/transaction_table.html similarity index 100% rename from nummi/main/templates/main/table/transaction.html rename to nummi/transaction/templates/transaction/transaction_table.html From 2d5f209c41ca5800c2dd1c1bad21bed86a523425 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 13:53:45 +0200 Subject: [PATCH 005/213] Move history to separate app --- nummi/account/templates/account/account_form.html | 2 +- nummi/account/views.py | 2 +- nummi/category/templates/category/category_form.html | 2 +- nummi/category/views.py | 2 +- nummi/history/__init__.py | 0 nummi/history/apps.py | 6 ++++++ nummi/history/migrations/__init__.py | 0 .../templates/history/plot.html} | 0 nummi/{transaction => history}/utils.py | 0 nummi/main/templates/main/index.html | 2 +- nummi/main/views.py | 2 +- nummi/nummi/settings.py | 1 + 12 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 nummi/history/__init__.py create mode 100644 nummi/history/apps.py create mode 100644 nummi/history/migrations/__init__.py rename nummi/{transaction/templates/transaction/history_plot.html => history/templates/history/plot.html} (100%) rename nummi/{transaction => history}/utils.py (100%) diff --git a/nummi/account/templates/account/account_form.html b/nummi/account/templates/account/account_form.html index 91cd0af..bb9f369 100644 --- a/nummi/account/templates/account/account_form.html +++ b/nummi/account/templates/account/account_form.html @@ -18,7 +18,7 @@

{% translate "Transactions" %}

{% include "transaction/transaction_table.html" %}

{% translate "History" %}

- {% include "transaction/history_plot.html" %} + {% include "history/plot.html" %} {% endif %} {% endif %} {% endblock %} diff --git a/nummi/account/views.py b/nummi/account/views.py index a73c7a8..446ac30 100644 --- a/nummi/account/views.py +++ b/nummi/account/views.py @@ -1,8 +1,8 @@ from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy +from history.utils import history from main.views import NummiCreateView, NummiDeleteView, NummiUpdateView from statement.views import StatementListView -from transaction.utils import history from transaction.views import TransactionListView from .forms import AccountForm diff --git a/nummi/category/templates/category/category_form.html b/nummi/category/templates/category/category_form.html index d995b04..b97f71b 100644 --- a/nummi/category/templates/category/category_form.html +++ b/nummi/category/templates/category/category_form.html @@ -15,6 +15,6 @@ {% endif %} {% if history.data %}

{% translate "History" %}

- {% include "transaction/history_plot.html" %} + {% include "history/plot.html" %} {% endif %} {% endblock %} diff --git a/nummi/category/views.py b/nummi/category/views.py index 53d8609..2e2fc1c 100644 --- a/nummi/category/views.py +++ b/nummi/category/views.py @@ -1,7 +1,7 @@ from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy +from history.utils import history from main.views import NummiCreateView, NummiDeleteView, NummiUpdateView -from transaction.utils import history from transaction.views import TransactionListView from .forms import CategoryForm diff --git a/nummi/history/__init__.py b/nummi/history/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nummi/history/apps.py b/nummi/history/apps.py new file mode 100644 index 0000000..af5c1f4 --- /dev/null +++ b/nummi/history/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class HistoryConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "history" diff --git a/nummi/history/migrations/__init__.py b/nummi/history/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nummi/transaction/templates/transaction/history_plot.html b/nummi/history/templates/history/plot.html similarity index 100% rename from nummi/transaction/templates/transaction/history_plot.html rename to nummi/history/templates/history/plot.html diff --git a/nummi/transaction/utils.py b/nummi/history/utils.py similarity index 100% rename from nummi/transaction/utils.py rename to nummi/history/utils.py diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 9da7a05..5f194d8 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -42,6 +42,6 @@ {% endif %} {% if history.data %}

{% translate "History" %}

- {% include "transaction/history_plot.html" %} + {% include "history/plot.html" %} {% endif %} {% endblock %} diff --git a/nummi/main/views.py b/nummi/main/views.py index e7fbea9..8095486 100644 --- a/nummi/main/views.py +++ b/nummi/main/views.py @@ -10,9 +10,9 @@ from django.views.generic import ( TemplateView, UpdateView, ) +from history.utils import history from statement.models import Statement from transaction.models import Transaction -from transaction.utils import history class IndexView(LoginRequiredMixin, TemplateView): diff --git a/nummi/nummi/settings.py b/nummi/nummi/settings.py index 28af502..d1cd960 100644 --- a/nummi/nummi/settings.py +++ b/nummi/nummi/settings.py @@ -51,6 +51,7 @@ INSTALLED_APPS = [ "statement", "transaction", "search", + "history", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", From 210268928bc7c6268727e07f60d3064176c56578 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 13:58:30 +0200 Subject: [PATCH 006/213] Move pagination file up --- nummi/main/templates/main/{list => }/pagination.html | 0 nummi/statement/templates/statement/statement_list.html | 4 ++-- nummi/transaction/templates/transaction/transaction_list.html | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename nummi/main/templates/main/{list => }/pagination.html (100%) diff --git a/nummi/main/templates/main/list/pagination.html b/nummi/main/templates/main/pagination.html similarity index 100% rename from nummi/main/templates/main/list/pagination.html rename to nummi/main/templates/main/pagination.html diff --git a/nummi/statement/templates/statement/statement_list.html b/nummi/statement/templates/statement/statement_list.html index 9522c3e..3e4d97f 100644 --- a/nummi/statement/templates/statement/statement_list.html +++ b/nummi/statement/templates/statement/statement_list.html @@ -30,9 +30,9 @@

{% endif %} {% if statements %} - {% include "main/list/pagination.html" %} + {% include "main/pagination.html" %} {% include "statement/statement_table.html" %} - {% include "main/list/pagination.html" %} + {% include "main/pagination.html" %} {% else %}

{% translate "No statements to show" %}

{% endif %} diff --git a/nummi/transaction/templates/transaction/transaction_list.html b/nummi/transaction/templates/transaction/transaction_list.html index cc44397..069e6aa 100644 --- a/nummi/transaction/templates/transaction/transaction_list.html +++ b/nummi/transaction/templates/transaction/transaction_list.html @@ -42,9 +42,9 @@

{% endif %} {% if transactions %} - {% include "main/list/pagination.html" %} + {% include "main/pagination.html" %} {% include "transaction/transaction_table.html" %} - {% include "main/list/pagination.html" %} + {% include "main/pagination.html" %} {% else %}

{% translate "No transactions to show" %}

{% endif %} From 2e3d76ad19e15599e06853cb960733f4d6bfd772 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 13:59:39 +0200 Subject: [PATCH 007/213] Remove unused templates --- nummi/main/templates/main/tag/pmvalue.html | 9 --------- nummi/main/templates/main/tag/value.html | 5 ----- 2 files changed, 14 deletions(-) delete mode 100644 nummi/main/templates/main/tag/pmvalue.html delete mode 100644 nummi/main/templates/main/tag/value.html diff --git a/nummi/main/templates/main/tag/pmvalue.html b/nummi/main/templates/main/tag/pmvalue.html deleted file mode 100644 index db9eb45..0000000 --- a/nummi/main/templates/main/tag/pmvalue.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends "main/tag/value.html" %} -{% block "value" %} - {% if value %} - {% if value > 0 %}+{% endif %} - {{ block.super }} - {% else %} - – - {% endif %} -{% endblock %} diff --git a/nummi/main/templates/main/tag/value.html b/nummi/main/templates/main/tag/value.html deleted file mode 100644 index 3cdbb41..0000000 --- a/nummi/main/templates/main/tag/value.html +++ /dev/null @@ -1,5 +0,0 @@ -{% spaceless %} - - {% block "value" %}{{ value }} €{% endblock %} - -{% endspaceless %} From a3f28631df0b94487e320354212bd89147425306 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 14:06:24 +0200 Subject: [PATCH 008/213] Create base template for lists --- nummi/main/static/main/css/page.css | 3 -- nummi/main/templates/main/list.html | 42 +++++++++++++++ .../templates/statement/statement_list.html | 40 +++----------- .../transaction/transaction_list.html | 52 +++---------------- 4 files changed, 54 insertions(+), 83 deletions(-) delete mode 100644 nummi/main/static/main/css/page.css create mode 100644 nummi/main/templates/main/list.html diff --git a/nummi/main/static/main/css/page.css b/nummi/main/static/main/css/page.css deleted file mode 100644 index 188aa6d..0000000 --- a/nummi/main/static/main/css/page.css +++ /dev/null @@ -1,3 +0,0 @@ -.pagination .current { - font-feature-settings: "tnum", "ss01"; -} diff --git a/nummi/main/templates/main/list.html b/nummi/main/templates/main/list.html new file mode 100644 index 0000000..1e9d53f --- /dev/null +++ b/nummi/main/templates/main/list.html @@ -0,0 +1,42 @@ +{% extends "main/base.html" %} +{% load static %} +{% load main_extras %} +{% load i18n %} +{% block title %} + {% block name %}{% endblock %} + {% if account %}– {{ account }}{% endif %} + {% if category %}– {{ category }}{% endif %} + {% if search %} + – {% translate "Search" %} + {% endif %} + – Nummi +{% endblock %} +{% block link %} + {{ block.super }} + +{% endblock %} +{% block body %} +

+ {% block h2 %}{% endblock %} +

+ {% if account %} +

+ {{ account.icon|remix }}{{ account }} +

+ {% endif %} + {% if category %} +

+ {{ category.icon|remix }}{{ category }} +

+ {% endif %} + {% if search %} +

+ {% translate "Search" %} +

+ {% endif %} + {% include "main/pagination.html" %} + {% block table %}{% endblock %} + {% include "main/pagination.html" %} +{% endblock %} diff --git a/nummi/statement/templates/statement/statement_list.html b/nummi/statement/templates/statement/statement_list.html index 3e4d97f..73bc595 100644 --- a/nummi/statement/templates/statement/statement_list.html +++ b/nummi/statement/templates/statement/statement_list.html @@ -1,39 +1,11 @@ -{% extends "main/base.html" %} -{% load static %} -{% load main_extras %} +{% extends "main/list.html" %} {% load i18n %} -{% block title %} +{% block name %} {% translate "Statements" %} - {% if account %}– {{ account }}{% endif %} - {% if category %}– {{ category }}{% endif %} - – Nummi {% endblock %} -{% block link %} - {{ block.super }} - - +{% block h2 %} + {% translate "Statements" %} {% endblock %} -{% block body %} -

{% translate "Statements" %}

- {% if account %} -

- {{ account.icon|remix }}{{ account }} -

- {% endif %} - {% if category %} -

- {{ category.icon|remix }}{{ category }} -

- {% endif %} - {% if statements %} - {% include "main/pagination.html" %} - {% include "statement/statement_table.html" %} - {% include "main/pagination.html" %} - {% else %} -

{% translate "No statements to show" %}

- {% endif %} +{% block table %} + {% include "statement/statement_table.html" %} {% endblock %} diff --git a/nummi/transaction/templates/transaction/transaction_list.html b/nummi/transaction/templates/transaction/transaction_list.html index 069e6aa..a7e8dea 100644 --- a/nummi/transaction/templates/transaction/transaction_list.html +++ b/nummi/transaction/templates/transaction/transaction_list.html @@ -1,51 +1,11 @@ -{% extends "main/base.html" %} -{% load static %} -{% load main_extras %} +{% extends "main/list.html" %} {% load i18n %} -{% block title %} +{% block name %} {% translate "Transactions" %} - {% if account %}– {{ account }}{% endif %} - {% if category %}– {{ category }}{% endif %} - {% if search %} - – {% translate "Search" %} - {% endif %} - – Nummi {% endblock %} -{% block link %} - {{ block.super }} - - +{% block h2 %} + {% translate "Transactions" %} {% endblock %} -{% block body %} -

- {% block h2 %} - {% translate "Transactions" %} - {% endblock %} -

- {% if account %} -

- {{ account.icon|remix }}{{ account }} -

- {% endif %} - {% if category %} -

- {{ category.icon|remix }}{{ category }} -

- {% endif %} - {% if search %} -

- {% translate "Search" %} -

- {% endif %} - {% if transactions %} - {% include "main/pagination.html" %} - {% include "transaction/transaction_table.html" %} - {% include "main/pagination.html" %} - {% else %} -

{% translate "No transactions to show" %}

- {% endif %} +{% block table %} + {% include "transaction/transaction_table.html" %} {% endblock %} From 2d7957b813866a0a356fc35c6e2c2d01fabdd890 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 14:28:49 +0200 Subject: [PATCH 009/213] Empty tables are now visible --- .../templates/account/account_form.html | 12 +++---- .../templates/category/category_form.html | 6 ++-- nummi/category/views.py | 11 ++++--- nummi/main/static/main/css/table.css | 5 +++ .../templates/statement/statement_table.html | 4 +++ .../templates/transaction/invoice_table.html | 32 +++++++++---------- .../transaction/transaction_table.html | 7 ++++ 7 files changed, 45 insertions(+), 32 deletions(-) diff --git a/nummi/account/templates/account/account_form.html b/nummi/account/templates/account/account_form.html index bb9f369..93918d4 100644 --- a/nummi/account/templates/account/account_form.html +++ b/nummi/account/templates/account/account_form.html @@ -10,13 +10,11 @@ {% block h2 %}{{ form.instance.icon|remix }}{{ form.instance }}{% endblock %} {% block tables %} {% if not form.instance|adding %} - {% if statements %} -

{% translate "Statements" %}

- {% include "statement/statement_table.html" %} - {% endif %} - {% if transactions %} -

{% translate "Transactions" %}

- {% include "transaction/transaction_table.html" %} +

{% translate "Statements" %}

+ {% include "statement/statement_table.html" %} +

{% translate "Transactions" %}

+ {% include "transaction/transaction_table.html" %} + {% if history.data %}

{% translate "History" %}

{% include "history/plot.html" %} {% endif %} diff --git a/nummi/category/templates/category/category_form.html b/nummi/category/templates/category/category_form.html index b97f71b..aa16a70 100644 --- a/nummi/category/templates/category/category_form.html +++ b/nummi/category/templates/category/category_form.html @@ -9,10 +9,8 @@ {% endblock %} {% block h2 %}{{ form.instance.icon|remix }}{{ form.instance }}{% endblock %} {% block tables %} - {% if transactions %} -

{% translate "Transactions" %}

- {% include "transaction/transaction_table.html" %} - {% endif %} +

{% translate "Transactions" %}

+ {% include "transaction/transaction_table.html" %} {% if history.data %}

{% translate "History" %}

{% include "history/plot.html" %} diff --git a/nummi/category/views.py b/nummi/category/views.py index 2e2fc1c..36fe0d0 100644 --- a/nummi/category/views.py +++ b/nummi/category/views.py @@ -19,14 +19,17 @@ class CategoryUpdateView(NummiUpdateView): pk_url_kwarg = "category" def get_context_data(self, **kwargs): + _max = 8 data = super().get_context_data(**kwargs) category = data["form"].instance - return data | { - "transactions": category.transaction_set.all()[:8], - "transactions_url": reverse_lazy( + data["transactions"] = category.transaction_set.all()[:_max] + if len(data["transactions"]) == _max: + data["transactions_url"] = reverse_lazy( "category_transactions", args=(category.pk,) - ), + ) + + return data | { "history": history(category.transaction_set), } diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index 1fd4076..ddab001 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -47,3 +47,8 @@ th { .date { text-align: center; } +td.empty { + text-align: center; + opacity: 0.8; + font-weight: 300; +} diff --git a/nummi/statement/templates/statement/statement_table.html b/nummi/statement/templates/statement/statement_table.html index ebe81b7..12cdccc 100644 --- a/nummi/statement/templates/statement/statement_table.html +++ b/nummi/statement/templates/statement/statement_table.html @@ -51,6 +51,10 @@ {{ snap.diff|pmvalue }} {{ snap.sum|pmvalue }} + {% empty %} + + {% translate "No transaction" %} + {% endfor %} diff --git a/nummi/transaction/templates/transaction/invoice_table.html b/nummi/transaction/templates/transaction/invoice_table.html index 87b6447..82a4406 100644 --- a/nummi/transaction/templates/transaction/invoice_table.html +++ b/nummi/transaction/templates/transaction/invoice_table.html @@ -11,25 +11,23 @@ {% translate "Delete" %} - {% if transaction.invoices %} - {% for invoice in transaction.invoices %} - - - {{ invoice.name }} - - - {% translate "File" %} [{{ invoice.file|extension }}] + {% for invoice in transaction.invoices %} + + + {{ invoice.name }} + + + {% translate "File" %} [{{ invoice.file|extension }}] + + + {% translate "Delete" %} - - {% translate "Delete" %} - - - {% endfor %} - {% else %} - - {% translate "No invoice" %} - {% endif %} + {% empty %} + + {% translate "No invoice" %} + + {% endfor %} diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index fe7c34b..27543d2 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -64,6 +64,13 @@ {% endif %} + {% empty %} + + + {% translate "No transaction" %} + + {% endfor %} From a77cfbe339efa238a72432a11a03018f5df8103b Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 14:33:07 +0200 Subject: [PATCH 010/213] Fix urls --- nummi/account/urls.py | 2 +- nummi/category/urls.py | 2 +- nummi/search/urls.py | 4 ++-- nummi/transaction/views.py | 3 --- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/nummi/account/urls.py b/nummi/account/urls.py index 43bc302..b46816f 100644 --- a/nummi/account/urls.py +++ b/nummi/account/urls.py @@ -5,7 +5,7 @@ from transaction.views import TransactionMonthView from . import views urlpatterns = [ - path("", views.AccountCreateView.as_view(), name="new_account"), + path("new", views.AccountCreateView.as_view(), name="new_account"), path("", views.AccountUpdateView.as_view(), name="account"), path( "/transactions", diff --git a/nummi/category/urls.py b/nummi/category/urls.py index 3d72bca..4809677 100644 --- a/nummi/category/urls.py +++ b/nummi/category/urls.py @@ -4,7 +4,7 @@ from transaction.views import TransactionMonthView from . import views urlpatterns = [ - path("", views.CategoryCreateView.as_view(), name="new_category"), + path("new", views.CategoryCreateView.as_view(), name="new_category"), path("", views.CategoryUpdateView.as_view(), name="category"), path( "/transactions", diff --git a/nummi/search/urls.py b/nummi/search/urls.py index fb383ab..bec1649 100644 --- a/nummi/search/urls.py +++ b/nummi/search/urls.py @@ -3,6 +3,6 @@ from django.urls import path from . import views urlpatterns = [ - path("search", views.SearchFormView.as_view(), name="search"), - path("search/", views.SearchView.as_view(), name="search"), + path("", views.SearchFormView.as_view(), name="search"), + path("", views.SearchView.as_view(), name="search"), ] diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index e30825b..0a54fc7 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -115,9 +115,6 @@ class TransactionMonthView(UserMixin, MonthArchiveView): context_object_name = "transactions" month_format = "%m" - account = None - category = None - def get_queryset(self): if "account" in self.kwargs: self.account = get_object_or_404( From 13b014e16ef4f107aea5437748e730e71a402ba9 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 14:46:34 +0200 Subject: [PATCH 011/213] Update translations --- nummi/locale/fr_fr/LC_MESSAGES/django.mo | Bin 0 -> 3289 bytes nummi/locale/fr_fr/LC_MESSAGES/django.po | 315 +++++++++++++++++ nummi/main/locale/fr/LC_MESSAGES/django.mo | Bin 3538 -> 0 bytes nummi/main/locale/fr/LC_MESSAGES/django.po | 324 ------------------ nummi/main/templates/main/login.html | 2 +- .../templates/statement/statement_form.html | 4 +- 6 files changed, 318 insertions(+), 327 deletions(-) create mode 100644 nummi/locale/fr_fr/LC_MESSAGES/django.mo create mode 100644 nummi/locale/fr_fr/LC_MESSAGES/django.po delete mode 100644 nummi/main/locale/fr/LC_MESSAGES/django.mo delete mode 100644 nummi/main/locale/fr/LC_MESSAGES/django.po diff --git a/nummi/locale/fr_fr/LC_MESSAGES/django.mo b/nummi/locale/fr_fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..75a8c0ec814a85c28a537e12cd67a01c0cb3f815 GIT binary patch literal 3289 zcma)-ON<=V6^3sJhA=od5C{+RxJiK6;2Mv|2Fze=#-1@AWKSm3V+$!nsN8j@r|jyg zrXFKv0TPjt1&<8~B`nA$L1-jc<)KJ%#G+vVY!DJkR#?g+S)c?(LI@!i`Tpu#-Hp7- zRh|Cs`<{Ewxu-wA=F*o9c9%)V^mSTbdrc7M_Dz|2)+G zzk*u#Ti^dC)cimD@wedjXul7o*FT{4{S@k)&)|3Am+(4x6_?)i4P$PH>i-FwYd;5> zViI@*Ea74Jf*=3DkN*uyuM1FmeggT-=lp0Nb;_@oL!Ea6lz%7T)o>O{-xidfXQ0l_ zp!PWjwf{4oFL=HJW#`wR=KUUO-CrS}dB?XufYRgdzJ0;-Ur_%36v|FtK>2G6hwX;f zLFqFO^&}pF^4}tqoqh&&uP30^{T#|)FG9_G9qOKcf;#72sB=E_;};;G`42xFZN7vz z!7WVEdJDDhZm4@5g4*X{sC7%8k3qfPHOOav;rm~Ny7zCO?E4zjyz>xu*EXAhyAYMT z5S^oqb>mq3R_eO1Y_$)$ANe7oqWj;C$WMxC#m_y6 z{M?l7RODBS>_Oz~JCUaRsHs3wCKufig{9kB*rJ48mzHL>-Oj2J3o{!t{2-{_x zrF7)ZZe*1$DqlGlrlpNC8@a@l&K@YrJWD$V@7R%@KI7Wu&f>ss-(?S(!&TIAr8yF& zZI^)3b+SBmMN{1{N3wJ^&b#JF?ils3q1S8BYukf`%&uqII9<=;_Hg#-K7M@c24+s% z&bigFN=hiDLDA0Ro^EL7;?-4`I}|kYX=G)hy0RW76}2aOE-g^_Xq-56EH26{-!R9r zt}_d5RxhOOy6zQP7_czMvkqF;$f{E8xQHGb7Gox>3YU)=%$&&5a?LD;?7ryE4XvR1 z&;)8U_g8&%d9}uGzLzA7G_w2Hl){|ECgxOa{8KSE3X^1X z$HENz#%@}er94yc1q)Gd%H;)qonc{bEu2_(y(}+-6GbPEg2Pp(2v)KgJF)cRVA-w5 zni(iUX6*FT^xj}N*rhHX zD7}=qC@$^Z$?3`I3A4;2SnqGzsIpB;;2Cy%ICTJC{TZUxwI448&dU@Ps)&G?fX4AAva5YJxzd6bZzTV^oP00J3L)c2eIMB83r^D%S z4A+f%SIJ>yEx&H*gcw^nA6$!>`>sjy)_3To@n)NiI{^qDnm}mqq zy403R$!tAl_=_`3T$shIi&X0_tQsTM%_RAn35R`+0h=|A`Gyn5-k_PS+Hys+#y7`j zEQRslU#B*l{KUa#xxX2waT$k6te4*k(T_)@)UoW^YmQt*b(X2Qt@YOXs4StDw&Pxy z)LxStu+M4y<~`x}lzr=HZ^&Oy)+I>$uVb|FgjD|#c-LMW_jL+r{u57@G0Nios?Jn3 Z^a4sfi^LU8oRO`3H;<+s7&Av<{s%ix6m|dr literal 0 HcmV?d00001 diff --git a/nummi/locale/fr_fr/LC_MESSAGES/django.po b/nummi/locale/fr_fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..4bbca6e --- /dev/null +++ b/nummi/locale/fr_fr/LC_MESSAGES/django.po @@ -0,0 +1,315 @@ +# Nummi. +# Copyright (C) 2023 +# This file is distributed under the same license as the Nummi package. +# edpibu , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: alpha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-22 14:45+0200\n" +"PO-Revision-Date: 2023-04-22 14:46+0200\n" +"Last-Translator: Edgar P. Burkhart \n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.2.2\n" + +#: .\account\models.py:11 .\account\models.py:37 .\account\models.py:45 +#: .\statement\templates\statement\statement_table.html:24 +#: .\transaction\models.py:48 +#: .\transaction\templates\transaction\transaction_table.html:35 +msgid "Account" +msgstr "Compte" + +#: .\account\models.py:11 .\category\models.py:12 .\transaction\models.py:19 +#: .\transaction\models.py:89 +#: .\transaction\templates\transaction\invoice_table.html:9 +#: .\transaction\templates\transaction\transaction_table.html:28 +msgid "Name" +msgstr "Nom" + +#: .\account\models.py:15 .\category\models.py:17 +msgid "Icon" +msgstr "Icône" + +#: .\account\models.py:17 +msgid "Default" +msgstr "Défaut" + +#: .\account\models.py:38 .\main\templates\main\index.html:16 +msgid "Accounts" +msgstr "Comptes" + +#: .\account\templates\account\account_form.html:5 +#: .\main\templates\main\base.html:50 +msgid "Create account" +msgstr "Créer un compte" + +#: .\account\templates\account\account_form.html:8 +msgid "New account" +msgstr "Nouveau compte" + +#: .\account\templates\account\account_form.html:13 +#: .\main\templates\main\base.html:38 .\main\templates\main\index.html:40 +#: .\statement\models.py:90 +#: .\statement\templates\statement\statement_list.html:4 +#: .\statement\templates\statement\statement_list.html:7 +msgid "Statements" +msgstr "Relevés" + +#: .\account\templates\account\account_form.html:15 +#: .\category\templates\category\category_form.html:12 +#: .\main\templates\main\base.html:44 .\main\templates\main\index.html:26 +#: .\statement\templates\statement\statement_form.html:27 +#: .\statement\templates\statement\statement_table.html:28 +#: .\transaction\models.py:83 +#: .\transaction\templates\transaction\transaction_list.html:4 +#: .\transaction\templates\transaction\transaction_list.html:7 +msgid "Transactions" +msgstr "Transactions" + +#: .\account\templates\account\account_form.html:18 +#: .\category\templates\category\category_form.html:15 +#: .\main\templates\main\index.html:44 +msgid "History" +msgstr "Historique" + +#: .\category\models.py:12 .\category\models.py:32 +#: .\category\templates\category\category_plot.html:14 +#: .\transaction\models.py:38 +#: .\transaction\templates\transaction\transaction_table.html:32 +msgid "Category" +msgstr "Catégorie" + +#: .\category\models.py:19 +msgid "Budget" +msgstr "Budget" + +#: .\category\models.py:33 .\main\templates\main\index.html:30 +#: .\statement\templates\statement\statement_form.html:23 +msgid "Categories" +msgstr "Catégories" + +#: .\category\templates\category\category_form.html:5 +#: .\main\templates\main\base.html:60 +msgid "Create category" +msgstr "Créer une catégorie" + +#: .\category\templates\category\category_form.html:8 +msgid "New category" +msgstr "Nouvelle catégorie" + +#: .\category\templates\category\category_plot.html:15 +#: .\history\templates\history\plot.html:16 +msgid "Expenses" +msgstr "Dépenses" + +#: .\category\templates\category\category_plot.html:16 +#: .\history\templates\history\plot.html:17 +msgid "Income" +msgstr "Revenus" + +#: .\history\templates\history\plot.html:15 +msgid "Month" +msgstr "Mois" + +#: .\main\models.py:10 +msgid "User" +msgstr "Utilisateur" + +#: .\main\templates\main\base.html:27 +msgid "Skip to main content" +msgstr "Aller au contenu principal" + +#: .\main\templates\main\base.html:33 +msgid "Home" +msgstr "Accueil" + +#: .\main\templates\main\base.html:55 +#: .\statement\templates\statement\statement_form.html:5 +#: .\statement\templates\statement\statement_table.html:5 +msgid "Create statement" +msgstr "Créer un relevé" + +#: .\main\templates\main\base.html:65 +#: .\transaction\templates\transaction\transaction_form.html:5 +#: .\transaction\templates\transaction\transaction_table.html:5 +msgid "Create transaction" +msgstr "Créer une transaction" + +#: .\main\templates\main\base.html:70 .\main\templates\main\list.html:10 +#: .\main\templates\main\list.html:36 .\search\forms.py:7 +#: .\search\templates\search\search.html:6 +#: .\search\templates\search\search.html:18 +#: .\search\templates\search\search_form.html:5 +msgid "Search" +msgstr "Rechercher" + +#: .\main\templates\main\base.html:73 +msgid "Log out" +msgstr "Se déconnecter" + +#: .\main\templates\main\base.html:78 .\main\templates\main\form\login.html:6 +#: .\main\templates\main\login.html:14 +msgid "Log in" +msgstr "Se connecter" + +#: .\main\templates\main\base.html:84 +#, python-format +msgid "Logged in as %(user)s" +msgstr "Connecté en tant que %(user)s" + +#: .\main\templates\main\confirm_delete.html:19 +#, python-format +msgid "Are you sure you want do delete %(object)s ?" +msgstr "Êtes-vous sûr de vouloir supprimer %(object)s ?" + +#: .\main\templates\main\confirm_delete.html:23 +msgid "Cancel" +msgstr "Annuler" + +#: .\main\templates\main\confirm_delete.html:24 +msgid "Confirm" +msgstr "Confirmer" + +#: .\main\templates\main\form\fileinput.html:8 .\statement\models.py:42 +#: .\transaction\models.py:94 +#: .\transaction\templates\transaction\invoice_table.html:10 +#: .\transaction\templates\transaction\invoice_table.html:20 +msgid "File" +msgstr "Fichier" + +#: .\main\templates\main\form\form_base.html:30 +#: .\transaction\templates\transaction\invoice_table.html:11 +#: .\transaction\templates\transaction\invoice_table.html:23 +msgid "Delete" +msgstr "Supprimer" + +#: .\main\templates\main\form\form_base.html:32 +msgid "Reset" +msgstr "Réinitialiser" + +#: .\main\templates\main\form\form_base.html:34 +msgid "Create" +msgstr "Créer" + +#: .\main\templates\main\form\form_base.html:36 +msgid "Save" +msgstr "Sauvegarder" + +#: .\statement\forms.py:28 +msgid "Add transactions" +msgstr "Ajouter des transactions" + +#: .\statement\models.py:15 +msgid "End date" +msgstr "Date de fin" + +#: .\statement\models.py:17 +msgid "Start date" +msgstr "Date de début" + +#: .\statement\models.py:20 +msgid "End value" +msgstr "Valeur finale" + +#: .\statement\models.py:23 +msgid "Start value" +msgstr "Valeur initiale" + +#: .\statement\models.py:29 +#: .\statement\templates\statement\statement_table.html:27 +msgid "Difference" +msgstr "Différence" + +#: .\statement\models.py:36 +msgid "Transaction difference" +msgstr "Différence des transactions" + +#: .\statement\models.py:49 +#, python-format +msgid "%(date)s statement" +msgstr "Relevé du %(date)s" + +#: .\statement\models.py:89 .\transaction\models.py:43 +msgid "Statement" +msgstr "Relevé" + +#: .\statement\templates\statement\statement_form.html:8 +msgid "New statement" +msgstr "Nouveau relevé" + +#: .\statement\templates\statement\statement_table.html:22 +#: .\transaction\models.py:25 +#: .\transaction\templates\transaction\transaction_table.html:27 +msgid "Date" +msgstr "Date" + +#: .\statement\templates\statement\statement_table.html:26 +#: .\transaction\models.py:23 +#: .\transaction\templates\transaction\transaction_table.html:29 +msgid "Value" +msgstr "Valeur" + +#: .\statement\templates\statement\statement_table.html:56 +#: .\transaction\templates\transaction\transaction_table.html:71 +msgid "No transaction" +msgstr "Aucune transaction" + +#: .\statement\templates\statement\statement_table.html:64 +msgid "View all statements" +msgstr "Voir tous les relevés" + +#: .\transaction\models.py:19 .\transaction\models.py:82 +msgid "Transaction" +msgstr "Transaction" + +#: .\transaction\models.py:21 +msgid "Description" +msgstr "Description" + +#: .\transaction\models.py:26 +msgid "Real date" +msgstr "Date réelle" + +#: .\transaction\models.py:28 +#: .\transaction\templates\transaction\transaction_table.html:30 +msgid "Trader" +msgstr "Commerçant" + +#: .\transaction\models.py:31 +msgid "Payment" +msgstr "Paiement" + +#: .\transaction\models.py:89 .\transaction\models.py:122 +msgid "Invoice" +msgstr "Facture" + +#: .\transaction\models.py:123 +#: .\transaction\templates\transaction\transaction_form.html:19 +msgid "Invoices" +msgstr "Factures" + +#: .\transaction\templates\transaction\invoice_form.html:4 +#: .\transaction\templates\transaction\invoice_table.html:35 +msgid "Create invoice" +msgstr "Créer une facture" + +#: .\transaction\templates\transaction\invoice_form.html:7 +msgid "New invoice" +msgstr "Nouvelle facture" + +#: .\transaction\templates\transaction\invoice_table.html:28 +msgid "No invoice" +msgstr "Aucune facture" + +#: .\transaction\templates\transaction\transaction_form.html:8 +msgid "New transaction" +msgstr "Nouvelle transaction" + +#: .\transaction\templates\transaction\transaction_table.html:80 +msgid "View all transactions" +msgstr "Voir toutes les transactions" diff --git a/nummi/main/locale/fr/LC_MESSAGES/django.mo b/nummi/main/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index a7f3afafc73a0d279d3f4d0c598add86fbdc8f76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3538 zcma)-O^h5z6~~Kw@Ues#5|bE0LJ?xe#_9F!8e(U>yYbpyD=T8N+7C;>h4ysKY=@ri zNq?-p9D*Xm0mFeqq9{T_Mj%<6Z~++!5iVhba?61OLPCTSLI?>7fy5yo@%wkzd<07< zt$F>cs(w}V>b+NQ-n!?G7Y)xD_0C-w%HYKMa2j z7vXQ=d*Oaw;sd;9;KNY*0o44*AwRRk>u$IL_rXoyk9@y?TK^kR`@aBX(haC}ehm4U zo4h^>pT)7%O5{VrZwXTKkR(DM<<&m84- z2p)$V-FyjZ{jWgTJ!o_pd>n_a!KMZ@~TVr|^FG2IOb{$V>MB8EXB%L#_WW zC_DcRHSczel->bY`x|Qiz>h!S$In8|yXe1f!TackP4?*pJ6l%TWke^xfT=m?7A7VU&(#xRc?Lw9`&-?y&pzL|U z_rK@)L&(w1t5E*B>G?WTJl}-J;9F33-Hp=i@Ls4qzaPq*e}J<8FYx2=pHTYyIIQ#zK<)P^)Ok-reLoE~f7Npf z>i&n2CCqbv{M%6ecnQky--pus86+L*z2#3mI)`F^1X0XT89z_b(zzZ$4k9Ozjv@~upG8K`W1|Lq98vD+{^*hal|y=#8`QCRl(u}XN3qbO+NC(@ zOmm2QuJbM-4;rFnln|@bEP>OrX81n()F@DcEzZ< zYtCkAH_rR!Z0`8#VMA|MGip1{M6_!y8>c&2+!<>ZX*ejhGxljdPtNBDrcPweX`6Gd z8&*jPbqG*&@_3*Vn{#ou>vD&|W+jcRTvj)B!la^gb>Py11DuZ&XP%0SGRt?(Q(51c z)ef^)(@x#?2Cg;f^yK zF3daIX5*{zKnwLlj)Xf(<=BRgPGL66Fei89(Wcq>l(tXDajP(!c^J7|80F%0+eVWp zO{o-S3)h)Tb*L`IoIFgDNxBziJT`qqvzBK{-C#8eF1frQ3);3d+nSx5S$BghFM|t3 zFOGsURj&v(v$maC`$Dkpc4BD;%BQxSZ_UpKbMwLcoSi$-KHfUonrpRYo(_vLsO?Ka z5~XcjG>9)(cA*!Sr(M(w^Fi$L+|73LC6v=%74}@P>B9cIQ^k}Es~1)#R?p40X1G!E zd$74Xz_8L?EsqTn0&>cBw!@r|EpBa|4^B?>2T#7o|q>-;i@w1dE>U!nkgqk$GnL6UL%;qlnWzoR)L?~WCw zGRG`e9Ytz1r|yp8VTadk*zLxhZO-Ktr{=!n^I8};e}=WM6>Q8i>%+Y`jmtPpVwIGY zG7=CKI?a, 2022. -# -msgid "" -msgstr "" -"Project-Id-Version: 0.0.1\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-22 09:41+0200\n" -"PO-Revision-Date: 2022-12-21 17:30+0100\n" -"Last-Translator: edpibu \n" -"Language-Team: edpibu \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: .\forms.py:95 -msgid "Add transactions" -msgstr "Ajouter des transactions" - -#: .\forms.py:113 .\templates\main\base.html:70 -#: .\templates\main\form\search.html:5 .\templates\main\list\transaction.html:9 -#: .\templates\main\list\transaction.html:26 .\templates\main\search.html:6 -#: .\templates\main\search.html:18 -msgid "Search" -msgstr "Rechercher" - -#: .\models.py:18 -msgid "User" -msgstr "Utilisateur" - -#: .\models.py:37 .\models.py:71 .\models.py:79 .\models.py:229 -#: .\templates\main\table\snapshot.html:24 -#: .\templates\main\table\transaction.html:35 -msgid "Account" -msgstr "Compte" - -#: .\models.py:37 .\models.py:89 .\models.py:200 .\models.py:270 -#: .\templates\main\table\invoice.html:9 -#: .\templates\main\table\transaction.html:28 -msgid "Name" -msgstr "Nom" - -#: .\models.py:41 .\models.py:94 -msgid "Icon" -msgstr "Icône" - -#: .\models.py:43 -msgid "Default" -msgstr "Défaut" - -#: .\models.py:72 .\templates\main\index.html:16 -msgid "Accounts" -msgstr "Comptes" - -#: .\models.py:89 .\models.py:113 .\models.py:219 -#: .\templates\main\plot\category.html:14 -#: .\templates\main\table\transaction.html:32 -msgid "Category" -msgstr "Catégorie" - -#: .\models.py:96 -msgid "Budget" -msgstr "Budget" - -#: .\models.py:114 .\templates\main\form\snapshot.html:23 -#: .\templates\main\index.html:30 -msgid "Categories" -msgstr "Catégories" - -#: .\models.py:119 -msgid "End date" -msgstr "Date de fin" - -#: .\models.py:121 -msgid "Start date" -msgstr "Date de début" - -#: .\models.py:124 -msgid "End value" -msgstr "Valeur de fin" - -#: .\models.py:127 -msgid "Start value" -msgstr "Valeur de début" - -#: .\models.py:133 .\templates\main\table\snapshot.html:27 -msgid "Difference" -msgstr "Différence" - -#: .\models.py:140 -msgid "Transaction difference" -msgstr "Différence des transactions" - -#: .\models.py:146 .\models.py:275 .\templates\main\form\fileinput.html:8 -#: .\templates\main\table\invoice.html:10 -#: .\templates\main\table\invoice.html:21 -msgid "File" -msgstr "Fichier" - -#: .\models.py:153 -#, python-format -msgid "%(date)s statement" -msgstr "Relevé du %(date)s" - -#: .\models.py:193 .\models.py:224 -msgid "Statement" -msgstr "Relevé" - -#: .\models.py:194 .\templates\main\form\account.html:13 -#: .\templates\main\list\snapshot.html:6 .\templates\main\list\snapshot.html:20 -msgid "Statements" -msgstr "Relevés" - -#: .\models.py:200 .\models.py:263 -msgid "Transaction" -msgstr "Transaction" - -#: .\models.py:202 -msgid "Description" -msgstr "Description" - -#: .\models.py:204 .\templates\main\table\snapshot.html:26 -#: .\templates\main\table\transaction.html:29 -msgid "Value" -msgstr "Valeur" - -#: .\models.py:206 .\templates\main\table\snapshot.html:22 -#: .\templates\main\table\transaction.html:27 -msgid "Date" -msgstr "Date" - -#: .\models.py:207 -msgid "Real date" -msgstr "Date réelle" - -#: .\models.py:209 .\templates\main\table\transaction.html:30 -msgid "Trader" -msgstr "Commerçant" - -#: .\models.py:212 -msgid "Payment" -msgstr "Paiement" - -#: .\models.py:264 .\templates\main\base.html:44 -#: .\templates\main\form\account.html:17 .\templates\main\form\category.html:13 -#: .\templates\main\form\snapshot.html:27 .\templates\main\index.html:26 -#: .\templates\main\list\transaction.html:6 -#: .\templates\main\list\transaction.html:23 -#: .\templates\main\month\transaction.html:15 -#: .\templates\main\table\snapshot.html:28 -msgid "Transactions" -msgstr "Transactions" - -#: .\models.py:270 .\models.py:307 -msgid "Invoice" -msgstr "Facture" - -#: .\models.py:308 .\templates\main\form\transaction.html:18 -msgid "Invoices" -msgstr "Factures" - -#: .\templates\main\base.html:27 -msgid "Skip to main content" -msgstr "Aller au contenu principal" - -#: .\templates\main\base.html:33 -msgid "Home" -msgstr "Accueil" - -#: .\templates\main\base.html:38 .\templates\main\index.html:40 -msgid "Snapshots" -msgstr "Relevés" - -#: .\templates\main\base.html:50 .\templates\main\form\account.html:5 -msgid "Create account" -msgstr "Créer un compte" - -#: .\templates\main\base.html:55 .\templates\main\form\snapshot.html:5 -msgid "Create snapshot" -msgstr "Créer un relevé" - -#: .\templates\main\base.html:60 .\templates\main\form\category.html:5 -msgid "Create category" -msgstr "Créer une catégorie" - -#: .\templates\main\base.html:65 .\templates\main\form\transaction.html:4 -#: .\templates\main\table\transaction.html:5 -msgid "Create transaction" -msgstr "Créer une transaction" - -#: .\templates\main\base.html:73 -msgid "Log out" -msgstr "Se déconnecter" - -#: .\templates\main\base.html:78 .\templates\main\form\login.html:6 -msgid "Log in" -msgstr "Se connecter" - -#: .\templates\main\base.html:83 -msgid "Logged in as %(user)s" -msgstr "Connecté en tant que %(user)s" - -#: .\templates\main\confirm_delete.html:19 -#, python-format -msgid "Are you sure you want do delete %(object)s ?" -msgstr "Êtes-vous sûr de vouloir supprimer %(object)s ?" - -#: .\templates\main\confirm_delete.html:23 -msgid "Cancel" -msgstr "Annuler" - -#: .\templates\main\confirm_delete.html:24 -msgid "Confirm" -msgstr "Confirmer" - -#: .\templates\main\form\account.html:8 -msgid "New account" -msgstr "Nouveau compte" - -#: .\templates\main\form\account.html:19 .\templates\main\form\category.html:15 -#: .\templates\main\index.html:44 -msgid "History" -msgstr "Historique" - -#: .\templates\main\form\category.html:8 -msgid "New category" -msgstr "Nouvelle catégorie" - -#: .\templates\main\form\form_base.html:29 -#: .\templates\main\table\invoice.html:11 -#: .\templates\main\table\invoice.html:24 -msgid "Delete" -msgstr "Supprimer" - -#: .\templates\main\form\form_base.html:31 -msgid "Reset" -msgstr "Réinitialiser" - -#: .\templates\main\form\form_base.html:33 -msgid "Create" -msgstr "Créer" - -#: .\templates\main\form\form_base.html:35 -msgid "Save" -msgstr "Enregistrer" - -#: .\templates\main\form\invoice.html:4 .\templates\main\table\invoice.html:37 -msgid "Create invoice" -msgstr "Créer une facture" - -#: .\templates\main\form\invoice.html:7 -msgid "New invoice" -msgstr "Nouvelle facture" - -#: .\templates\main\form\snapshot.html:8 -msgid "New snapshot" -msgstr "Nouveau relevé" - -#: .\templates\main\form\transaction.html:7 -msgid "New transaction" -msgstr "Nouvelle transaction" - -#: .\templates\main\list\snapshot.html:27 -msgid "No snapshots to show" -msgstr "Aucun relevé à afficher" - -#: .\templates\main\list\transaction.html:33 -msgid "No transactions to show" -msgstr "Aucune transaction à afficher" - -#: .\templates\main\login.html:14 -msgid "Log In" -msgstr "Se connecter" - -#: .\templates\main\plot\category.html:15 .\templates\main\plot\history.html:16 -msgid "Expenses" -msgstr "Dépenses" - -#: .\templates\main\plot\category.html:16 .\templates\main\plot\history.html:17 -msgid "Income" -msgstr "Revenus" - -#: .\templates\main\plot\history.html:15 -msgid "Month" -msgstr "Mois" - -#: .\templates\main\table\invoice.html:30 -msgid "No invoice" -msgstr "Aucune facture" - -#: .\templates\main\table\snapshot.html:5 -msgid "Create statement" -msgstr "Créer un relevé" - -#: .\templates\main\table\snapshot.html:60 -msgid "View all statements" -msgstr "Voir tous les relevés" - -#: .\templates\main\table\transaction.html:73 -msgid "View all transactions" -msgstr "Voir toutes les transactions" - -#~ msgid "New statement" -#~ msgstr "Nouveau relevé" - -#~ msgid "Create Account" -#~ msgstr "Créer Compte" - -#~ msgid "Create Snapshot" -#~ msgstr "Créer Relevé" - -#~ msgid "Create Category" -#~ msgstr "Créer Catégorie" - -#~ msgid "Create Transaction" -#~ msgstr "Créer Transaction" - -#, python-format -#~ msgid "Create %(name)s" -#~ msgstr "Créer %(name)s" diff --git a/nummi/main/templates/main/login.html b/nummi/main/templates/main/login.html index 8cc7cc7..ab579cb 100644 --- a/nummi/main/templates/main/login.html +++ b/nummi/main/templates/main/login.html @@ -11,7 +11,7 @@ type="text/css" /> {% endblock %} {% block body %} -

{% translate "Log In" %}

+

{% translate "Log in" %}

{% csrf_token %} {% include "main/form/login.html" %} diff --git a/nummi/statement/templates/statement/statement_form.html b/nummi/statement/templates/statement/statement_form.html index 06fe238..bb40e07 100644 --- a/nummi/statement/templates/statement/statement_form.html +++ b/nummi/statement/templates/statement/statement_form.html @@ -2,10 +2,10 @@ {% load main_extras %} {% load i18n %} {% block title_new %} - {% translate "Create snapshot" %} + {% translate "Create statement" %} {% endblock %} {% block h2_new %} - {% translate "New snapshot" %} + {% translate "New statement" %} {% endblock %} {% block h2 %} {{ form.instance.sum|check:form.instance.diff }} From 5abb9a3b3067a0bd60ed7a069bde851c4dbd0cf0 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 15:08:21 +0200 Subject: [PATCH 012/213] Update settings for locale --- nummi/nummi/settings.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nummi/nummi/settings.py b/nummi/nummi/settings.py index d1cd960..282d93c 100644 --- a/nummi/nummi/settings.py +++ b/nummi/nummi/settings.py @@ -63,6 +63,7 @@ INSTALLED_APPS = [ MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.locale.LocaleMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", @@ -118,9 +119,10 @@ AUTH_PASSWORD_VALIDATORS = [] LANGUAGE_CODE = "fr-fr" TIME_ZONE = CONFIG.get("time_zone", "CET") USE_I18N = True +USE_L10N = True USE_TZ = True LOCALE_PATHS = [ - "locale", + BASE_DIR.joinpath("locale"), ] # Static files (CSS, JavaScript, Images) From d478f038ba60f65948dd36f08b395c9c24f2df54 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 15:10:34 +0200 Subject: [PATCH 013/213] Log BASE_DIR --- nummi/nummi/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nummi/nummi/settings.py b/nummi/nummi/settings.py index 282d93c..a3f7d18 100644 --- a/nummi/nummi/settings.py +++ b/nummi/nummi/settings.py @@ -24,6 +24,7 @@ else: # Build paths inside the project like this: BASE_DIR / 'subdir'. MEDIA_CONF = CONFIG.get("media", {}) BASE_DIR = Path(__file__).resolve().parent.parent +print(BASE_DIR) MEDIA_ROOT = Path(MEDIA_CONF.get("root", "/var/lib/nummi")) MEDIA_URL = "media/" From 068dab59d88a3a75686f04ced26b10d56850b3f5 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 15:11:51 +0200 Subject: [PATCH 014/213] Log LOCALE_PATHS --- nummi/nummi/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nummi/nummi/settings.py b/nummi/nummi/settings.py index a3f7d18..d3b1906 100644 --- a/nummi/nummi/settings.py +++ b/nummi/nummi/settings.py @@ -125,6 +125,7 @@ USE_TZ = True LOCALE_PATHS = [ BASE_DIR.joinpath("locale"), ] +print(LOCALE_PATHS) # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.0/howto/static-files/ From 681651109a762263a3d4d6f6b15029c489fe0576 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 15:24:12 +0200 Subject: [PATCH 015/213] Fix translations --- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 0 -> 762 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 58 ++++ .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 0 -> 813 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 63 ++++ .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 0 -> 454 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 30 ++ nummi/locale/fr_fr/LC_MESSAGES/django.mo | Bin 3289 -> 0 bytes nummi/locale/fr_fr/LC_MESSAGES/django.po | 315 ------------------ nummi/main/locale/fr_FR/LC_MESSAGES/django.mo | Bin 0 -> 1596 bytes nummi/main/locale/fr_FR/LC_MESSAGES/django.po | 118 +++++++ nummi/nummi/settings.py | 5 - .../search/locale/fr_FR/LC_MESSAGES/django.mo | Bin 0 -> 395 bytes .../search/locale/fr_FR/LC_MESSAGES/django.po | 24 ++ .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 0 -> 1305 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 107 ++++++ .../templates/statement/statement_table.html | 2 +- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 0 -> 1392 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 125 +++++++ 18 files changed, 526 insertions(+), 321 deletions(-) create mode 100644 nummi/account/locale/fr_FR/LC_MESSAGES/django.mo create mode 100644 nummi/account/locale/fr_FR/LC_MESSAGES/django.po create mode 100644 nummi/category/locale/fr_FR/LC_MESSAGES/django.mo create mode 100644 nummi/category/locale/fr_FR/LC_MESSAGES/django.po create mode 100644 nummi/history/locale/fr_FR/LC_MESSAGES/django.mo create mode 100644 nummi/history/locale/fr_FR/LC_MESSAGES/django.po delete mode 100644 nummi/locale/fr_fr/LC_MESSAGES/django.mo delete mode 100644 nummi/locale/fr_fr/LC_MESSAGES/django.po create mode 100644 nummi/main/locale/fr_FR/LC_MESSAGES/django.mo create mode 100644 nummi/main/locale/fr_FR/LC_MESSAGES/django.po create mode 100644 nummi/search/locale/fr_FR/LC_MESSAGES/django.mo create mode 100644 nummi/search/locale/fr_FR/LC_MESSAGES/django.po create mode 100644 nummi/statement/locale/fr_FR/LC_MESSAGES/django.mo create mode 100644 nummi/statement/locale/fr_FR/LC_MESSAGES/django.po create mode 100644 nummi/transaction/locale/fr_FR/LC_MESSAGES/django.mo create mode 100644 nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po diff --git a/nummi/account/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/account/locale/fr_FR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..1829874bb523006c772335f1cf9474c1f6b15411 GIT binary patch literal 762 zcmZ9JJCD;q5XTodUIw8%IwXn}4Fy``_&^-yA@1^k2y#RrJi61KJu!xO*R0op`yhyp z5-B|rB}F%sMUC)Q02R;YSg8SfQNJA&!e>l48{}Eh=|Ec!BfUfQ<=<>dS z$G{(;oBtDZ`}_u7-#;K)F3shghTMFFm*#eJ?`X``9Hb4L4l<#y|Y(~sm#Z|!H+dm-+VBC}e0s42-T-}FO2^jKTxg{2zq28%fvUMU{0K6DmyoT0fw_NF2n ZV)0qw3Oa|X8Of?i9?_I$i}`=2_zRS>w-5jT literal 0 HcmV?d00001 diff --git a/nummi/account/locale/fr_FR/LC_MESSAGES/django.po b/nummi/account/locale/fr_FR/LC_MESSAGES/django.po new file mode 100644 index 0000000..0d61184 --- /dev/null +++ b/nummi/account/locale/fr_FR/LC_MESSAGES/django.po @@ -0,0 +1,58 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-22 15:16+0200\n" +"PO-Revision-Date: 2023-04-22 15:17+0200\n" +"Last-Translator: Edgar P. Burkhart \n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.2.2\n" + +#: .\account\models.py:11 .\account\models.py:37 .\account\models.py:45 +msgid "Account" +msgstr "Compte" + +#: .\account\models.py:11 +msgid "Name" +msgstr "Nom" + +#: .\account\models.py:15 +msgid "Icon" +msgstr "Icône" + +#: .\account\models.py:17 +msgid "Default" +msgstr "Défaut" + +#: .\account\models.py:38 +msgid "Accounts" +msgstr "Comptes" + +#: .\account\templates\account\account_form.html:5 +msgid "Create account" +msgstr "Créer un compte" + +#: .\account\templates\account\account_form.html:8 +msgid "New account" +msgstr "Nouveau compte" + +#: .\account\templates\account\account_form.html:13 +msgid "Statements" +msgstr "Relevés" + +#: .\account\templates\account\account_form.html:15 +msgid "Transactions" +msgstr "Transactions" + +#: .\account\templates\account\account_form.html:18 +msgid "History" +msgstr "Historique" diff --git a/nummi/category/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/category/locale/fr_FR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..4dfa16e82cd635d8d957ae5b6163dbe69f6c8601 GIT binary patch literal 813 zcmY+B!EO^V5QYsDC`%;-h#LoU0tq>6Hbsh-f>6>FA~hw7Qp5!zcXzTF5IxUxQ)a(K1$G(9lbM0`J1Vz(d`)^Nd{ue}F+}0p0?C zf>*#l%luz3)c*s69=lLIY!keRa0?7N9K_KKWuc_9kPjC63ulINf(6~68UAZ!7qO_$ zZyS%%G@z-mUi4g{a?vUaCx!;;{tGdnV-f-j9UT%c_T`6uwRsSxdE% zeS+<}C}lxnNOA(%Rh;sXeX}=+dfi@U-E6%UM{T1$X=u)-Xv))xe=r?Or62JOYL5Kl z!{MH2uIs`LjL3=(?kHEfNO|)}`RJ8+Mw;wt(|tp^^1M+?YDvV_<5, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-22 15:16+0200\n" +"PO-Revision-Date: 2023-04-22 15:18+0200\n" +"Last-Translator: Edgar P. Burkhart \n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.2.2\n" + +#: .\category\models.py:12 .\category\models.py:32 +#: .\category\templates\category\category_plot.html:14 +msgid "Category" +msgstr "Catégorie" + +#: .\category\models.py:12 +msgid "Name" +msgstr "Nom" + +#: .\category\models.py:17 +msgid "Icon" +msgstr "Icône" + +#: .\category\models.py:19 +msgid "Budget" +msgstr "Budget" + +#: .\category\models.py:33 +msgid "Categories" +msgstr "Catégories" + +#: .\category\templates\category\category_form.html:5 +msgid "Create category" +msgstr "Créer une catégorie" + +#: .\category\templates\category\category_form.html:8 +msgid "New category" +msgstr "Nouvelle catégorie" + +#: .\category\templates\category\category_form.html:12 +msgid "Transactions" +msgstr "Transactions" + +#: .\category\templates\category\category_form.html:15 +msgid "History" +msgstr "Historique" + +#: .\category\templates\category\category_plot.html:15 +msgid "Expenses" +msgstr "Dépenses" + +#: .\category\templates\category\category_plot.html:16 +msgid "Income" +msgstr "Revenus" diff --git a/nummi/history/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/history/locale/fr_FR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..c369f8dc5a4f3023676a06c1e9925a36ca66799f GIT binary patch literal 454 zcmYL_y-ve05XTLauZ+wL-WZTWnu1h?f>3FSDp65Y1u-BY(_B+Saf0oj!p6iC@DNPQ zjEMK(S@?$!)$&jOv+sO&zOS{)3&W~_bu$iB2NU$XJ!>hzAeWJHWnBub|duU{$Wor@#V fWPY3OWt1q#Ykug59&3HR{*4bKAYE9@Pg(X2v5, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-22 15:16+0200\n" +"PO-Revision-Date: 2023-04-22 15:18+0200\n" +"Last-Translator: Edgar P. Burkhart \n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.2.2\n" + +#: .\history\templates\history\plot.html:15 +msgid "Month" +msgstr "Mois" + +#: .\history\templates\history\plot.html:16 +msgid "Expenses" +msgstr "Dépenses" + +#: .\history\templates\history\plot.html:17 +msgid "Income" +msgstr "Revenus" diff --git a/nummi/locale/fr_fr/LC_MESSAGES/django.mo b/nummi/locale/fr_fr/LC_MESSAGES/django.mo deleted file mode 100644 index 75a8c0ec814a85c28a537e12cd67a01c0cb3f815..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3289 zcma)-ON<=V6^3sJhA=od5C{+RxJiK6;2Mv|2Fze=#-1@AWKSm3V+$!nsN8j@r|jyg zrXFKv0TPjt1&<8~B`nA$L1-jc<)KJ%#G+vVY!DJkR#?g+S)c?(LI@!i`Tpu#-Hp7- zRh|Cs`<{Ewxu-wA=F*o9c9%)V^mSTbdrc7M_Dz|2)+G zzk*u#Ti^dC)cimD@wedjXul7o*FT{4{S@k)&)|3Am+(4x6_?)i4P$PH>i-FwYd;5> zViI@*Ea74Jf*=3DkN*uyuM1FmeggT-=lp0Nb;_@oL!Ea6lz%7T)o>O{-xidfXQ0l_ zp!PWjwf{4oFL=HJW#`wR=KUUO-CrS}dB?XufYRgdzJ0;-Ur_%36v|FtK>2G6hwX;f zLFqFO^&}pF^4}tqoqh&&uP30^{T#|)FG9_G9qOKcf;#72sB=E_;};;G`42xFZN7vz z!7WVEdJDDhZm4@5g4*X{sC7%8k3qfPHOOav;rm~Ny7zCO?E4zjyz>xu*EXAhyAYMT z5S^oqb>mq3R_eO1Y_$)$ANe7oqWj;C$WMxC#m_y6 z{M?l7RODBS>_Oz~JCUaRsHs3wCKufig{9kB*rJ48mzHL>-Oj2J3o{!t{2-{_x zrF7)ZZe*1$DqlGlrlpNC8@a@l&K@YrJWD$V@7R%@KI7Wu&f>ss-(?S(!&TIAr8yF& zZI^)3b+SBmMN{1{N3wJ^&b#JF?ils3q1S8BYukf`%&uqII9<=;_Hg#-K7M@c24+s% z&bigFN=hiDLDA0Ro^EL7;?-4`I}|kYX=G)hy0RW76}2aOE-g^_Xq-56EH26{-!R9r zt}_d5RxhOOy6zQP7_czMvkqF;$f{E8xQHGb7Gox>3YU)=%$&&5a?LD;?7ryE4XvR1 z&;)8U_g8&%d9}uGzLzA7G_w2Hl){|ECgxOa{8KSE3X^1X z$HENz#%@}er94yc1q)Gd%H;)qonc{bEu2_(y(}+-6GbPEg2Pp(2v)KgJF)cRVA-w5 zni(iUX6*FT^xj}N*rhHX zD7}=qC@$^Z$?3`I3A4;2SnqGzsIpB;;2Cy%ICTJC{TZUxwI448&dU@Ps)&G?fX4AAva5YJxzd6bZzTV^oP00J3L)c2eIMB83r^D%S z4A+f%SIJ>yEx&H*gcw^nA6$!>`>sjy)_3To@n)NiI{^qDnm}mqq zy403R$!tAl_=_`3T$shIi&X0_tQsTM%_RAn35R`+0h=|A`Gyn5-k_PS+Hys+#y7`j zEQRslU#B*l{KUa#xxX2waT$k6te4*k(T_)@)UoW^YmQt*b(X2Qt@YOXs4StDw&Pxy z)LxStu+M4y<~`x}lzr=HZ^&Oy)+I>$uVb|FgjD|#c-LMW_jL+r{u57@G0Nios?Jn3 Z^a4sfi^LU8oRO`3H;<+s7&Av<{s%ix6m|dr diff --git a/nummi/locale/fr_fr/LC_MESSAGES/django.po b/nummi/locale/fr_fr/LC_MESSAGES/django.po deleted file mode 100644 index 4bbca6e..0000000 --- a/nummi/locale/fr_fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,315 +0,0 @@ -# Nummi. -# Copyright (C) 2023 -# This file is distributed under the same license as the Nummi package. -# edpibu , 2023 -# -msgid "" -msgstr "" -"Project-Id-Version: alpha\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-22 14:45+0200\n" -"PO-Revision-Date: 2023-04-22 14:46+0200\n" -"Last-Translator: Edgar P. Burkhart \n" -"Language-Team: \n" -"Language: fr_FR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.2.2\n" - -#: .\account\models.py:11 .\account\models.py:37 .\account\models.py:45 -#: .\statement\templates\statement\statement_table.html:24 -#: .\transaction\models.py:48 -#: .\transaction\templates\transaction\transaction_table.html:35 -msgid "Account" -msgstr "Compte" - -#: .\account\models.py:11 .\category\models.py:12 .\transaction\models.py:19 -#: .\transaction\models.py:89 -#: .\transaction\templates\transaction\invoice_table.html:9 -#: .\transaction\templates\transaction\transaction_table.html:28 -msgid "Name" -msgstr "Nom" - -#: .\account\models.py:15 .\category\models.py:17 -msgid "Icon" -msgstr "Icône" - -#: .\account\models.py:17 -msgid "Default" -msgstr "Défaut" - -#: .\account\models.py:38 .\main\templates\main\index.html:16 -msgid "Accounts" -msgstr "Comptes" - -#: .\account\templates\account\account_form.html:5 -#: .\main\templates\main\base.html:50 -msgid "Create account" -msgstr "Créer un compte" - -#: .\account\templates\account\account_form.html:8 -msgid "New account" -msgstr "Nouveau compte" - -#: .\account\templates\account\account_form.html:13 -#: .\main\templates\main\base.html:38 .\main\templates\main\index.html:40 -#: .\statement\models.py:90 -#: .\statement\templates\statement\statement_list.html:4 -#: .\statement\templates\statement\statement_list.html:7 -msgid "Statements" -msgstr "Relevés" - -#: .\account\templates\account\account_form.html:15 -#: .\category\templates\category\category_form.html:12 -#: .\main\templates\main\base.html:44 .\main\templates\main\index.html:26 -#: .\statement\templates\statement\statement_form.html:27 -#: .\statement\templates\statement\statement_table.html:28 -#: .\transaction\models.py:83 -#: .\transaction\templates\transaction\transaction_list.html:4 -#: .\transaction\templates\transaction\transaction_list.html:7 -msgid "Transactions" -msgstr "Transactions" - -#: .\account\templates\account\account_form.html:18 -#: .\category\templates\category\category_form.html:15 -#: .\main\templates\main\index.html:44 -msgid "History" -msgstr "Historique" - -#: .\category\models.py:12 .\category\models.py:32 -#: .\category\templates\category\category_plot.html:14 -#: .\transaction\models.py:38 -#: .\transaction\templates\transaction\transaction_table.html:32 -msgid "Category" -msgstr "Catégorie" - -#: .\category\models.py:19 -msgid "Budget" -msgstr "Budget" - -#: .\category\models.py:33 .\main\templates\main\index.html:30 -#: .\statement\templates\statement\statement_form.html:23 -msgid "Categories" -msgstr "Catégories" - -#: .\category\templates\category\category_form.html:5 -#: .\main\templates\main\base.html:60 -msgid "Create category" -msgstr "Créer une catégorie" - -#: .\category\templates\category\category_form.html:8 -msgid "New category" -msgstr "Nouvelle catégorie" - -#: .\category\templates\category\category_plot.html:15 -#: .\history\templates\history\plot.html:16 -msgid "Expenses" -msgstr "Dépenses" - -#: .\category\templates\category\category_plot.html:16 -#: .\history\templates\history\plot.html:17 -msgid "Income" -msgstr "Revenus" - -#: .\history\templates\history\plot.html:15 -msgid "Month" -msgstr "Mois" - -#: .\main\models.py:10 -msgid "User" -msgstr "Utilisateur" - -#: .\main\templates\main\base.html:27 -msgid "Skip to main content" -msgstr "Aller au contenu principal" - -#: .\main\templates\main\base.html:33 -msgid "Home" -msgstr "Accueil" - -#: .\main\templates\main\base.html:55 -#: .\statement\templates\statement\statement_form.html:5 -#: .\statement\templates\statement\statement_table.html:5 -msgid "Create statement" -msgstr "Créer un relevé" - -#: .\main\templates\main\base.html:65 -#: .\transaction\templates\transaction\transaction_form.html:5 -#: .\transaction\templates\transaction\transaction_table.html:5 -msgid "Create transaction" -msgstr "Créer une transaction" - -#: .\main\templates\main\base.html:70 .\main\templates\main\list.html:10 -#: .\main\templates\main\list.html:36 .\search\forms.py:7 -#: .\search\templates\search\search.html:6 -#: .\search\templates\search\search.html:18 -#: .\search\templates\search\search_form.html:5 -msgid "Search" -msgstr "Rechercher" - -#: .\main\templates\main\base.html:73 -msgid "Log out" -msgstr "Se déconnecter" - -#: .\main\templates\main\base.html:78 .\main\templates\main\form\login.html:6 -#: .\main\templates\main\login.html:14 -msgid "Log in" -msgstr "Se connecter" - -#: .\main\templates\main\base.html:84 -#, python-format -msgid "Logged in as %(user)s" -msgstr "Connecté en tant que %(user)s" - -#: .\main\templates\main\confirm_delete.html:19 -#, python-format -msgid "Are you sure you want do delete %(object)s ?" -msgstr "Êtes-vous sûr de vouloir supprimer %(object)s ?" - -#: .\main\templates\main\confirm_delete.html:23 -msgid "Cancel" -msgstr "Annuler" - -#: .\main\templates\main\confirm_delete.html:24 -msgid "Confirm" -msgstr "Confirmer" - -#: .\main\templates\main\form\fileinput.html:8 .\statement\models.py:42 -#: .\transaction\models.py:94 -#: .\transaction\templates\transaction\invoice_table.html:10 -#: .\transaction\templates\transaction\invoice_table.html:20 -msgid "File" -msgstr "Fichier" - -#: .\main\templates\main\form\form_base.html:30 -#: .\transaction\templates\transaction\invoice_table.html:11 -#: .\transaction\templates\transaction\invoice_table.html:23 -msgid "Delete" -msgstr "Supprimer" - -#: .\main\templates\main\form\form_base.html:32 -msgid "Reset" -msgstr "Réinitialiser" - -#: .\main\templates\main\form\form_base.html:34 -msgid "Create" -msgstr "Créer" - -#: .\main\templates\main\form\form_base.html:36 -msgid "Save" -msgstr "Sauvegarder" - -#: .\statement\forms.py:28 -msgid "Add transactions" -msgstr "Ajouter des transactions" - -#: .\statement\models.py:15 -msgid "End date" -msgstr "Date de fin" - -#: .\statement\models.py:17 -msgid "Start date" -msgstr "Date de début" - -#: .\statement\models.py:20 -msgid "End value" -msgstr "Valeur finale" - -#: .\statement\models.py:23 -msgid "Start value" -msgstr "Valeur initiale" - -#: .\statement\models.py:29 -#: .\statement\templates\statement\statement_table.html:27 -msgid "Difference" -msgstr "Différence" - -#: .\statement\models.py:36 -msgid "Transaction difference" -msgstr "Différence des transactions" - -#: .\statement\models.py:49 -#, python-format -msgid "%(date)s statement" -msgstr "Relevé du %(date)s" - -#: .\statement\models.py:89 .\transaction\models.py:43 -msgid "Statement" -msgstr "Relevé" - -#: .\statement\templates\statement\statement_form.html:8 -msgid "New statement" -msgstr "Nouveau relevé" - -#: .\statement\templates\statement\statement_table.html:22 -#: .\transaction\models.py:25 -#: .\transaction\templates\transaction\transaction_table.html:27 -msgid "Date" -msgstr "Date" - -#: .\statement\templates\statement\statement_table.html:26 -#: .\transaction\models.py:23 -#: .\transaction\templates\transaction\transaction_table.html:29 -msgid "Value" -msgstr "Valeur" - -#: .\statement\templates\statement\statement_table.html:56 -#: .\transaction\templates\transaction\transaction_table.html:71 -msgid "No transaction" -msgstr "Aucune transaction" - -#: .\statement\templates\statement\statement_table.html:64 -msgid "View all statements" -msgstr "Voir tous les relevés" - -#: .\transaction\models.py:19 .\transaction\models.py:82 -msgid "Transaction" -msgstr "Transaction" - -#: .\transaction\models.py:21 -msgid "Description" -msgstr "Description" - -#: .\transaction\models.py:26 -msgid "Real date" -msgstr "Date réelle" - -#: .\transaction\models.py:28 -#: .\transaction\templates\transaction\transaction_table.html:30 -msgid "Trader" -msgstr "Commerçant" - -#: .\transaction\models.py:31 -msgid "Payment" -msgstr "Paiement" - -#: .\transaction\models.py:89 .\transaction\models.py:122 -msgid "Invoice" -msgstr "Facture" - -#: .\transaction\models.py:123 -#: .\transaction\templates\transaction\transaction_form.html:19 -msgid "Invoices" -msgstr "Factures" - -#: .\transaction\templates\transaction\invoice_form.html:4 -#: .\transaction\templates\transaction\invoice_table.html:35 -msgid "Create invoice" -msgstr "Créer une facture" - -#: .\transaction\templates\transaction\invoice_form.html:7 -msgid "New invoice" -msgstr "Nouvelle facture" - -#: .\transaction\templates\transaction\invoice_table.html:28 -msgid "No invoice" -msgstr "Aucune facture" - -#: .\transaction\templates\transaction\transaction_form.html:8 -msgid "New transaction" -msgstr "Nouvelle transaction" - -#: .\transaction\templates\transaction\transaction_table.html:80 -msgid "View all transactions" -msgstr "Voir toutes les transactions" diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..1e6d0d3f4cc7e1f1acf7fdcf5b36f70079b899ef GIT binary patch literal 1596 zcmZvbyN_E%6vhYgHi3i?5{M{9LLrIJ^?IEkCC+Avce6`^vcj?*M2BYYJ$rY^^~}vY z7ED7!fe;cE1(Y<%5)v&Er5pZ*G*lE6sR9L}f$!YC#^y27_;=5l*EeTA|8(l$7Xs}? z^q0_oMn8}K?GyMxyZNLLN5L+51AG%a41NMOz|X-W;8%72Yw#Jw6YvE1J$MrQ5j+Jx z1bO`<@F4gr$m@TvV{u@A{1C|b)8g6gCmgVeF$E_ zT|NSNzi*IS1HS_~ehfYZ{sA5X591Kt_aw-=&w|f`7r|%2Rqzbh19^T9@;(nhK7U-t zAA_vpGmz`>CAb7mK(5b2kk9=ErG@qK9nPY2?O4xZveBo~x{z%7TxZEz%zZMnNcY}K`n0EcQgRE|?8tVjeK~1e zN!o3>{90%E+N-U0tJS!xd`POJ3WYm%u>9*>7y!+1i+kU2e7-cqzVVG8~r>73hPoR2C?~b(!Kc z6zRsj;bwAmK99?=LoV4csm-*>JM!wb4vlw`H^`9N7u~az=^!sR+s$?ZW*C(LrkH+; z-(=55Fa7if2X9FPh1CweD@&(GFFNrTd25U) literal 0 HcmV?d00001 diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po new file mode 100644 index 0000000..9d1766a --- /dev/null +++ b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po @@ -0,0 +1,118 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-22 15:16+0200\n" +"PO-Revision-Date: 2023-04-22 15:19+0200\n" +"Last-Translator: Edgar P. Burkhart \n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.2.2\n" + +#: .\main\models.py:10 +msgid "User" +msgstr "Utilisateur" + +#: .\main\templates\main\base.html:27 +msgid "Skip to main content" +msgstr "Aller au contenu principal" + +#: .\main\templates\main\base.html:33 +msgid "Home" +msgstr "Accueil" + +#: .\main\templates\main\base.html:38 .\main\templates\main\index.html:40 +msgid "Statements" +msgstr "Relevés" + +#: .\main\templates\main\base.html:44 .\main\templates\main\index.html:26 +msgid "Transactions" +msgstr "Transactions" + +#: .\main\templates\main\base.html:50 +msgid "Create account" +msgstr "Créer un compte" + +#: .\main\templates\main\base.html:55 +msgid "Create statement" +msgstr "Créer un relevé" + +#: .\main\templates\main\base.html:60 +msgid "Create category" +msgstr "Créer une catégorie" + +#: .\main\templates\main\base.html:65 +msgid "Create transaction" +msgstr "Créer une transaction" + +#: .\main\templates\main\base.html:70 .\main\templates\main\list.html:10 +#: .\main\templates\main\list.html:36 +msgid "Search" +msgstr "Rechercher" + +#: .\main\templates\main\base.html:73 +msgid "Log out" +msgstr "Se déconnecter" + +#: .\main\templates\main\base.html:78 .\main\templates\main\form\login.html:6 +#: .\main\templates\main\login.html:14 +msgid "Log in" +msgstr "Se connecter" + +#: .\main\templates\main\base.html:84 +#, python-format +msgid "Logged in as %(user)s" +msgstr "Connecté en tant que %(user)s" + +#: .\main\templates\main\confirm_delete.html:19 +#, python-format +msgid "Are you sure you want do delete %(object)s ?" +msgstr "Êtes-vous sûr de vouloir supprimer %(object)s ?" + +#: .\main\templates\main\confirm_delete.html:23 +msgid "Cancel" +msgstr "Annuler" + +#: .\main\templates\main\confirm_delete.html:24 +msgid "Confirm" +msgstr "Confirmer" + +#: .\main\templates\main\form\fileinput.html:8 +msgid "File" +msgstr "Fichier" + +#: .\main\templates\main\form\form_base.html:30 +msgid "Delete" +msgstr "Supprimer" + +#: .\main\templates\main\form\form_base.html:32 +msgid "Reset" +msgstr "Réinitialiser" + +#: .\main\templates\main\form\form_base.html:34 +msgid "Create" +msgstr "Créer" + +#: .\main\templates\main\form\form_base.html:36 +msgid "Save" +msgstr "Enregistrer" + +#: .\main\templates\main\index.html:16 +msgid "Accounts" +msgstr "Comptes" + +#: .\main\templates\main\index.html:30 +msgid "Categories" +msgstr "Catégories" + +#: .\main\templates\main\index.html:44 +msgid "History" +msgstr "Historique" diff --git a/nummi/nummi/settings.py b/nummi/nummi/settings.py index d3b1906..144c198 100644 --- a/nummi/nummi/settings.py +++ b/nummi/nummi/settings.py @@ -24,7 +24,6 @@ else: # Build paths inside the project like this: BASE_DIR / 'subdir'. MEDIA_CONF = CONFIG.get("media", {}) BASE_DIR = Path(__file__).resolve().parent.parent -print(BASE_DIR) MEDIA_ROOT = Path(MEDIA_CONF.get("root", "/var/lib/nummi")) MEDIA_URL = "media/" @@ -122,10 +121,6 @@ TIME_ZONE = CONFIG.get("time_zone", "CET") USE_I18N = True USE_L10N = True USE_TZ = True -LOCALE_PATHS = [ - BASE_DIR.joinpath("locale"), -] -print(LOCALE_PATHS) # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.0/howto/static-files/ diff --git a/nummi/search/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/search/locale/fr_FR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..6a801881555d84c3a628006c279ccacd4db33abb GIT binary patch literal 395 zcmYL_O-{ow5QPH*7Fn`p;T;Q@;JP4Hp&(R9Q6(xu2&g+`l4)uvb~JGi?6?Hi<19=- z&?kTL-;CdrzqU6%1J*jT!|XGg%#i7nGF!|Iv%3}qGoC}{gV#L%)%E}A7Bv-%ASL&N zg@;KA_ehO#HWp!qwIdJHrZOdr+Ny!v@o{<$8NQmX2rjh8SSYFbAP+$)(L0Kj+>=Vm z@Jcrxa?-Y0YVRl(Nm*$UX(UE1JuftQG4!O%w($Ja8Fsg|K_ZOibjt0vYITK>qkduA zzkMv`^f1oC>13L$!uBE=o;&N&vgdovp*+6%gLOV literal 0 HcmV?d00001 diff --git a/nummi/search/locale/fr_FR/LC_MESSAGES/django.po b/nummi/search/locale/fr_FR/LC_MESSAGES/django.po new file mode 100644 index 0000000..5517665 --- /dev/null +++ b/nummi/search/locale/fr_FR/LC_MESSAGES/django.po @@ -0,0 +1,24 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-22 15:16+0200\n" +"PO-Revision-Date: 2023-04-22 15:20+0200\n" +"Last-Translator: Edgar P. Burkhart \n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.2.2\n" + +#: .\search\forms.py:7 .\search\templates\search\search.html:6 +#: .\search\templates\search\search.html:18 +#: .\search\templates\search\search_form.html:5 +msgid "Search" +msgstr "Rechercher" diff --git a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..d4b610942111d253874c027edf8d6c8edff418c8 GIT binary patch literal 1305 zcmZXSJ8u&~5XYAgUWV`p4+RONZ4gB0jB^1g7>LNjL6MSRjAPM7m%H_4!}-?Q-E%;c zsi_bWEu|~?02ByQ(9%#M_ySaPAjE&p=ZBJ!*T0>)*?H}LA0K_qAm_0zVSUEBj1?Wg zALIu(4*mp>fWN`h;9oEYj*WEn32+qpBuMr=coe)19s}pI?KY>?K%ePGbcaX8eu#cmd3GgCFab55XI1A#(%9(vV zqX$x54UqbL0iFVPGy5y>B=onL{XIy2A3^H#3rO?(3R0cFK&s;pNcE4PXq1`Gnf$4C z5{f}Wxk%ui&I9eFbyH20mu5mjcR_+S`$BoBH@X*^4do{}M}JqY1)dd?h8qhuL~Pld z@2i9u1l(#bHlA;#iVa(UN2s(E*lGb~=+GimwkYd$p+)QqR*C~ok<(4fixR<>WF**{ z*cm#triPTq*3-6osJrbR!#*plzcZ{lsEY@KtV3qQYH8M*L`E-)28j$SYqc$W>nsOO zO=yGWiab{lO{J}~YC;(}^GRr&s)D)v(5Z-)BqxWOEONKtPCJF0j_dNNTSeEsUT_PA z+=^$clje^+t8|f0osXlL_C@Y@X8_md*@g43Xn-TWjdUeT}8Tir2 za6L{b_EjL`u*hdNrOiEY9*9`zZqa2W0%`el-p#u?RuPeCb=o{gc<-IC1=VQcTIaS^ zVuj{`F#8@!r`>-goi==unCosN)_*3QcK4l-0YP|O#&lsK(X_<|&&A)ueAt>wTEa{E zA?6Z)Pe3{!blRJV?S+uBw332k9rS3@Cz|EnU;EzYgKAh!NzJWF43E%i)`wyL0hAy? A82|tP literal 0 HcmV?d00001 diff --git a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po new file mode 100644 index 0000000..88593df --- /dev/null +++ b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po @@ -0,0 +1,107 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-22 15:22+0200\n" +"PO-Revision-Date: 2023-04-22 15:22+0200\n" +"Last-Translator: Edgar P. Burkhart \n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.2.2\n" + +#: .\statement\forms.py:28 +msgid "Add transactions" +msgstr "Ajouter des transactions" + +#: .\statement\models.py:15 +msgid "End date" +msgstr "Date de fin" + +#: .\statement\models.py:17 +msgid "Start date" +msgstr "Date de début" + +#: .\statement\models.py:20 +msgid "End value" +msgstr "Valeur finale" + +#: .\statement\models.py:23 +msgid "Start value" +msgstr "Valeur initiale" + +#: .\statement\models.py:29 +#: .\statement\templates\statement\statement_table.html:27 +msgid "Difference" +msgstr "Différence" + +#: .\statement\models.py:36 +msgid "Transaction difference" +msgstr "Différence des transactions" + +#: .\statement\models.py:42 +msgid "File" +msgstr "Fichier" + +#: .\statement\models.py:49 +#, python-format +msgid "%(date)s statement" +msgstr "Relevé du %(date)s" + +#: .\statement\models.py:89 +msgid "Statement" +msgstr "Relevé" + +#: .\statement\models.py:90 +#: .\statement\templates\statement\statement_list.html:4 +#: .\statement\templates\statement\statement_list.html:7 +msgid "Statements" +msgstr "Relevés" + +#: .\statement\templates\statement\statement_form.html:5 +#: .\statement\templates\statement\statement_table.html:5 +msgid "Create statement" +msgstr "Créer un relevé" + +#: .\statement\templates\statement\statement_form.html:8 +msgid "New statement" +msgstr "Nouveau relevé" + +#: .\statement\templates\statement\statement_form.html:23 +msgid "Categories" +msgstr "Catégories" + +#: .\statement\templates\statement\statement_form.html:27 +#: .\statement\templates\statement\statement_table.html:28 +msgid "Transactions" +msgstr "Transactions" + +#: .\statement\templates\statement\statement_table.html:22 +msgid "Date" +msgstr "Date" + +#: .\statement\templates\statement\statement_table.html:24 +msgid "Account" +msgstr "Compte" + +#: .\statement\templates\statement\statement_table.html:26 +msgid "Value" +msgstr "Valeur" + +#: .\statement\templates\statement\statement_table.html:56 +msgid "No statement" +msgstr "Aucun relevé" + +#: .\statement\templates\statement\statement_table.html:64 +msgid "View all statements" +msgstr "Voir tous les relevés" + +#~ msgid "No transaction" +#~ msgstr "Aucune transaction" diff --git a/nummi/statement/templates/statement/statement_table.html b/nummi/statement/templates/statement/statement_table.html index 12cdccc..e6bc79b 100644 --- a/nummi/statement/templates/statement/statement_table.html +++ b/nummi/statement/templates/statement/statement_table.html @@ -53,7 +53,7 @@ {% empty %} - {% translate "No transaction" %} + {% translate "No statement" %} {% endfor %} diff --git a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..3084334d48152f76c48ebead1d8e0a054790250c GIT binary patch literal 1392 zcmY+CJ8Tm{5QY~BkC;awJPRbYi73z+#|9~wXW}F%QWA_~BD!cfkDZ0{?P+h%5Q&B| z4FwW{f(|4Ui4IzjP-+?^Is_%6qoShVpUcI$jJ)@)XLo1**_|K51J4EQ6vkJ zIsVyS^BOap6^2E|n`@>4H}-%h8L~a^+m9Tq+f2RqVV}L7<$mRXNq_C@bql zIg!{0%gQ==#X)nD-r)`6)ku@IRBYR8I39Kq)giA*s*ALn|EscXm!=zqxtY1CEwQ7; zQlVx-hs*JrD-lFFdgRVWfzsh+=_6ZA?&_W9v^Tc3k8i3?)|(1_)6!w5D#z|=SGeol zq>$`}=(?encCu0|7s~}vGu;T6j@DRTLvLvAhV?bFG6_kx(G7{+=0bh_$4HxGA&DZZ zyLhKb%J+%CjLOAy79k^A#dI-}9tFWx{JtX}eLV5=8nVCn9d)HQ8ij>OmW`n3q=0(s kYg`#rt-n?1u4YbkZl1OfB~~mNZKX4bqgVzQxh%2x5AdQy{{R30 literal 0 HcmV?d00001 diff --git a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po new file mode 100644 index 0000000..92fd5e2 --- /dev/null +++ b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po @@ -0,0 +1,125 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-22 15:16+0200\n" +"PO-Revision-Date: 2023-04-22 15:23+0200\n" +"Last-Translator: Edgar P. Burkhart \n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.2.2\n" + +#: .\transaction\models.py:19 .\transaction\models.py:82 +msgid "Transaction" +msgstr "Transaction" + +#: .\transaction\models.py:19 .\transaction\models.py:89 +#: .\transaction\templates\transaction\invoice_table.html:9 +#: .\transaction\templates\transaction\transaction_table.html:28 +msgid "Name" +msgstr "Nom" + +#: .\transaction\models.py:21 +msgid "Description" +msgstr "Description" + +#: .\transaction\models.py:23 +#: .\transaction\templates\transaction\transaction_table.html:29 +msgid "Value" +msgstr "Valeur" + +#: .\transaction\models.py:25 +#: .\transaction\templates\transaction\transaction_table.html:27 +msgid "Date" +msgstr "Date" + +#: .\transaction\models.py:26 +msgid "Real date" +msgstr "Date réelle" + +#: .\transaction\models.py:28 +#: .\transaction\templates\transaction\transaction_table.html:30 +msgid "Trader" +msgstr "Commerçant" + +#: .\transaction\models.py:31 +msgid "Payment" +msgstr "Paiement" + +#: .\transaction\models.py:38 +#: .\transaction\templates\transaction\transaction_table.html:32 +msgid "Category" +msgstr "Catégorie" + +#: .\transaction\models.py:43 +msgid "Statement" +msgstr "Relevé" + +#: .\transaction\models.py:48 +#: .\transaction\templates\transaction\transaction_table.html:35 +msgid "Account" +msgstr "Compte" + +#: .\transaction\models.py:83 +#: .\transaction\templates\transaction\transaction_list.html:4 +#: .\transaction\templates\transaction\transaction_list.html:7 +msgid "Transactions" +msgstr "Transactions" + +#: .\transaction\models.py:89 .\transaction\models.py:122 +msgid "Invoice" +msgstr "Facture" + +#: .\transaction\models.py:94 +#: .\transaction\templates\transaction\invoice_table.html:10 +#: .\transaction\templates\transaction\invoice_table.html:20 +msgid "File" +msgstr "Fichier" + +#: .\transaction\models.py:123 +#: .\transaction\templates\transaction\transaction_form.html:19 +msgid "Invoices" +msgstr "Factures" + +#: .\transaction\templates\transaction\invoice_form.html:4 +#: .\transaction\templates\transaction\invoice_table.html:35 +msgid "Create invoice" +msgstr "Créer une facture" + +#: .\transaction\templates\transaction\invoice_form.html:7 +msgid "New invoice" +msgstr "Nouvelle facture" + +#: .\transaction\templates\transaction\invoice_table.html:11 +#: .\transaction\templates\transaction\invoice_table.html:23 +msgid "Delete" +msgstr "Supprimer" + +#: .\transaction\templates\transaction\invoice_table.html:28 +msgid "No invoice" +msgstr "Aucune facture" + +#: .\transaction\templates\transaction\transaction_form.html:5 +#: .\transaction\templates\transaction\transaction_table.html:5 +msgid "Create transaction" +msgstr "Créer une transaction" + +#: .\transaction\templates\transaction\transaction_form.html:8 +msgid "New transaction" +msgstr "Nouvelle transaction" + +#: .\transaction\templates\transaction\transaction_table.html:71 +msgid "No transaction" +msgstr "Aucune transaction" + +#: .\transaction\templates\transaction\transaction_table.html:80 +msgid "View all transactions" +msgstr "Voir toutes les transactions" From b828324220dff4d8c67b5b129e7395253c98e79e Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 15:44:27 +0200 Subject: [PATCH 016/213] Add category plot on history pages --- .../templates/category/category_plot.html | 2 +- nummi/category/utils.py | 22 +++++++++++++++++++ nummi/main/static/main/css/main.css | 4 +++- nummi/statement/views.py | 21 ++---------------- .../transaction_archive_month.html | 14 ++++++++++++ nummi/transaction/views.py | 12 ++++++---- 6 files changed, 50 insertions(+), 25 deletions(-) create mode 100644 nummi/category/utils.py diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index 71cddaa..344500b 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -20,7 +20,7 @@ {% spaceless %} {% for cat in categories.data %} - + {% if cat.category %}{{ cat.category__name }}{% endif %} diff --git a/nummi/category/utils.py b/nummi/category/utils.py new file mode 100644 index 0000000..b3b0ea8 --- /dev/null +++ b/nummi/category/utils.py @@ -0,0 +1,22 @@ +from django.db import models + + +def get_categories(transactions): + categories = ( + transactions.values("category", "category__name", "category__icon") + .annotate( + sum=models.Sum("value"), + sum_m=models.Sum("value", filter=models.Q(value__lt=0)), + sum_p=models.Sum("value", filter=models.Q(value__gt=0)), + ) + .order_by("-sum") + ) + return { + "data": categories, + "max": max( + categories.aggregate( + max=models.Max("sum_p", default=0), + min=models.Min("sum_m", default=0), + ).values(), + ), + } diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 523338c..892b449 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -163,8 +163,10 @@ footer { a.big-link { margin-right: 1em; } -[class^="ri-"] { +a [class^="ri-"] { margin-right: 0.5em; +} +[class^="ri-"] { font-weight: normal; } diff --git a/nummi/statement/views.py b/nummi/statement/views.py index cbbbc6a..9121ba3 100644 --- a/nummi/statement/views.py +++ b/nummi/statement/views.py @@ -1,5 +1,5 @@ from account.models import Account -from django.db import models +from category.utils import get_categories from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy from main.views import NummiCreateView, NummiDeleteView, NummiListView, NummiUpdateView @@ -43,24 +43,7 @@ class StatementUpdateView(NummiUpdateView): _transactions = statement.transaction_set.all() if _transactions: - _categories = ( - _transactions.values("category", "category__name", "category__icon") - .annotate( - sum=models.Sum("value"), - sum_m=models.Sum("value", filter=models.Q(value__lt=0)), - sum_p=models.Sum("value", filter=models.Q(value__gt=0)), - ) - .order_by("-sum") - ) - data["categories"] = { - "data": _categories, - "max": max( - _categories.aggregate( - max=models.Max("sum_p", default=0), - min=models.Min("sum_m", default=0), - ).values(), - ), - } + data["categories"] = get_categories(_transactions) return data | { "account": statement.account, diff --git a/nummi/transaction/templates/transaction/transaction_archive_month.html b/nummi/transaction/templates/transaction/transaction_archive_month.html index efd440f..93561c0 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_month.html +++ b/nummi/transaction/templates/transaction/transaction_archive_month.html @@ -1,2 +1,16 @@ {% extends "transaction/transaction_list.html" %} +{% load i18n %} +{% load static %} +{% block link %} + {{ block.super }} + +{% endblock %} {% block h2 %}{{ month|date:"F Y"|capfirst }}{% endblock %} +{% block table %} +

{% translate "Transactions" %}

+ {{ block.super }} +

{% translate "History" %}

+ {% include "category/category_plot.html" %} +{% endblock %} diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 0a54fc7..238d19a 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -1,5 +1,6 @@ from account.models import Account from category.models import Category +from category.utils import get_categories from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy from django.views.generic.dates import MonthArchiveView @@ -132,8 +133,11 @@ class TransactionMonthView(UserMixin, MonthArchiveView): return super().get_queryset() def get_context_data(self, **kwargs): - if "account" in self.kwargs: - return super().get_context_data(**kwargs) | {"account": self.account} + context_data = super().get_context_data(**kwargs) if "category" in self.kwargs: - return super().get_context_data(**kwargs) | {"category": self.category} - return super().get_context_data(**kwargs) + return context_data | {"category": self.category} + + context_data["categories"] = get_categories(context_data["transactions"]) + if "account" in self.kwargs: + return context_data | {"account": self.account} + return context_data From f7564eb2828d714b514428fb2ee2bdbe616d0c67 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 15:52:32 +0200 Subject: [PATCH 017/213] Add links to category in month category plot --- nummi/category/templates/category/category_plot.html | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index 344500b..1a0fc4a 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -21,7 +21,13 @@ {% for cat in categories.data %} - {% if cat.category %}{{ cat.category__name }}{% endif %} + {% if cat.category %} + {% if month %} +
{{ cat.category__name }} + {% else %} + {{ cat.category__name }} + {% endif %} + {% endif %} {% if cat.category %}{{ cat.category__icon|remix }}{% endif %} From b6326bdc8fa2239aba12ff2da9d5133c3c7b9113 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 15:57:36 +0200 Subject: [PATCH 018/213] Fix category plot on month page --- .../templates/transaction/transaction_archive_month.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/nummi/transaction/templates/transaction/transaction_archive_month.html b/nummi/transaction/templates/transaction/transaction_archive_month.html index 93561c0..431e4db 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_month.html +++ b/nummi/transaction/templates/transaction/transaction_archive_month.html @@ -11,6 +11,8 @@ {% block table %}

{% translate "Transactions" %}

{{ block.super }} -

{% translate "History" %}

- {% include "category/category_plot.html" %} + {% if categories %} +

{% translate "Categories" %}

+ {% include "category/category_plot.html" %} + {% endif %} {% endblock %} From 517dd28b2e6d020a2e652d106e0b084c1686a61b Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 19:41:03 +0200 Subject: [PATCH 019/213] Fix navbar scrolling --- nummi/main/static/main/css/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 892b449..7a5f2f0 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -91,6 +91,7 @@ nav { height: 100vh; position: sticky; top: 0; + overflow-y: auto; background: var(--bg-01); line-height: 2rem; From b9cd7a8460cb8142c7a047cdaf6a3dbbe33f8ab9 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 19:43:31 +0200 Subject: [PATCH 020/213] Fix icon margin --- nummi/main/static/main/css/main.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 7a5f2f0..761186d 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -164,7 +164,7 @@ footer { a.big-link { margin-right: 1em; } -a [class^="ri-"] { +[class^="ri-"]:last-child { margin-right: 0.5em; } [class^="ri-"] { From 1bad7d7291c42b5c599ef15e0356d995ad262eac Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 22 Apr 2023 19:47:58 +0200 Subject: [PATCH 021/213] Fix icon margin --- nummi/main/static/main/css/main.css | 2 +- nummi/main/templates/main/list.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 761186d..6aa5a99 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -164,7 +164,7 @@ footer { a.big-link { margin-right: 1em; } -[class^="ri-"]:last-child { +a.big-link [class^="ri-"] { margin-right: 0.5em; } [class^="ri-"] { diff --git a/nummi/main/templates/main/list.html b/nummi/main/templates/main/list.html index 1e9d53f..aa90d98 100644 --- a/nummi/main/templates/main/list.html +++ b/nummi/main/templates/main/list.html @@ -23,12 +23,12 @@ {% if account %}

- {{ account.icon|remix }}{{ account }} + {{ account.icon|remix }}{{ account }}

{% endif %} {% if category %}

- {{ category.icon|remix }}{{ category }} + {{ category.icon|remix }}{{ category }}

{% endif %} {% if search %} From a0872b65c4f1337889c74f5bc73be8bdd19cf982 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sun, 23 Apr 2023 08:08:43 +0200 Subject: [PATCH 022/213] Use get_absolute_url to get model urls --- nummi/main/locale/fr_FR/LC_MESSAGES/django.mo | Bin 1596 -> 1682 bytes nummi/main/locale/fr_FR/LC_MESSAGES/django.po | 18 ++++++++++---- nummi/main/templates/main/index.html | 22 +++++++++--------- .../templates/statement/statement_table.html | 4 ++-- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 1392 -> 1431 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 9 +++++-- nummi/transaction/models.py | 2 +- .../transaction/transaction_table.html | 6 ++--- 8 files changed, 37 insertions(+), 24 deletions(-) diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo index 1e6d0d3f4cc7e1f1acf7fdcf5b36f70079b899ef..4685846eef54e3eb6b0be73dad20de77fa8de525 100644 GIT binary patch delta 636 zcmXZZzb^w}9LMqJuBFAHe${VjBqb6_34=7LghgVonG7_igoH}dOLP#6u$Wv77L$Pq zX=1>{Bq1?&kj5nb0E^B0Q+<-}z3zFQ?|q-=p6AgyY1}Wj22TyGm*^vYh&b_T@u02P z#)L7ADcreihXpaW$2lRjz~g zZX)VicBj==?6wE3=t4G@cHOMEoj1I?>3n8An=AOqz;S3IHa3+Un<%~o9D88KbG_}D Xo88*UXH2D&QTFo{=^GipRI~aAAJ{`2 delta 531 zcmXZZzb^w}9LMqRU9Ua#O4V@`i68M}t4a(dL=6TZ@i#D-3~ajGVvvwXTnvmBX(BOn zG57=g3tdbG5)%fo@cw9@L#wRgmu&nH8HzM@=BtOUs%Ln)Rh\n" "Language-Team: \n" "Language: fr_FR\n" @@ -33,7 +33,7 @@ msgstr "Accueil" msgid "Statements" msgstr "Relevés" -#: .\main\templates\main\base.html:44 .\main\templates\main\index.html:26 +#: .\main\templates\main\base.html:44 .\main\templates\main\index.html:24 msgid "Transactions" msgstr "Transactions" @@ -105,14 +105,22 @@ msgstr "Créer" msgid "Save" msgstr "Enregistrer" -#: .\main\templates\main\index.html:16 +#: .\main\templates\main\index.html:15 msgid "Accounts" msgstr "Comptes" -#: .\main\templates\main\index.html:30 +#: .\main\templates\main\index.html:20 +msgid "No account" +msgstr "Aucun compte" + +#: .\main\templates\main\index.html:28 msgid "Categories" msgstr "Catégories" +#: .\main\templates\main\index.html:34 +msgid "No category" +msgstr "Aucune catégorie" + #: .\main\templates\main\index.html:44 msgid "History" msgstr "Historique" diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 5f194d8..cdadde8 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -12,16 +12,14 @@ type="text/css" /> {% endblock %} {% block body %} - {% if accounts %} -

{% translate "Accounts" %}

- {% spaceless %} -

- {% for acc in accounts %} - {{ acc.icon|remix }}{{ acc }} - {% endfor %} -

- {% endspaceless %} - {% endif %} +

{% translate "Accounts" %}

+

+ {% for acc in accounts %} + {{ acc.icon|remix }}{{ acc }} + {% empty %} + {% translate "No account" %} + {% endfor %} +

{% if transactions %}

{% translate "Transactions" %}

{% include "transaction/transaction_table.html" %} @@ -31,7 +29,9 @@ {% spaceless %}

{% for cat in categories %} - {{ cat.icon|remix }}{{ cat }} + {{ cat.icon|remix }}{{ cat }} + {% empty %} + {% translate "No category" %} {% endfor %}

{% endspaceless %} diff --git a/nummi/statement/templates/statement/statement_table.html b/nummi/statement/templates/statement/statement_table.html index e6bc79b..e4310e4 100644 --- a/nummi/statement/templates/statement/statement_table.html +++ b/nummi/statement/templates/statement/statement_table.html @@ -39,12 +39,12 @@ {% if snap.file %}{{ "attachment"|remix }}{% endif %} - {{ snap.date|date:"Y-m-d" }} + {{ snap.date|date:"Y-m-d" }} {% if not account %} {{ snap.account.icon|remix }} - {{ snap.account }} + {{ snap.account }} {% endif %} {{ snap.value|value }} diff --git a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.mo index 3084334d48152f76c48ebead1d8e0a054790250c..b34179b90b20d71fd55363e1e3f5378f254f26e2 100644 GIT binary patch delta 627 zcmX}py-UMD7{~ET8(U4ZYJI7K1qVfND(Fz1S_HwxML`f8q|_G>15LZ=kVRY^MT+3) zs2~fC)T97cZjsb<{pLsP(s<_kp=*poxz-h|j1(Z>RzvsD&-; z!*=8^s*oM;taq`W{~7GT863lToTHfnYW@MIR6P$J6Bu*KKpmXpI9?+^^T0y|pHK^4 zPzQO9d`ETiiR^8fID{=6#UE4yDNdvPv#9ww)IpapNqw`*Kn2z#x1$Mrs1y6BPjiCN zR|((iwzMG^@gFLvy%Z`kOlC;kXg72#-Pjsnq;Idz6*@TwHzOqV!p?LH>Rd5FsvCv6 q4Wn2pd9~xJS=p_Y_r1zt*>B`yi&kP`I+tJ0T~^}XmfzU0v(_I){V`zx delta 598 zcmX}pzb`{k7{>AUwpY0=%0(F@EKOG}1|kt=2C3apivag6nl{C#p~f z`|$^RFiM+^VIE5iQAC|zr%UDEL^ZyJ1?t-Y8~&`xLxoOJi7!zN+<0$M6Wk#=?H-5l z5l8VE)%XXhz&GlAL|1AsM&+AAX@rNSQO7jwCQ#REL@~}9cDui8a@&7JIMi>Xbi5M#! diff --git a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po index 92fd5e2..fc73dd9 100644 --- a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-22 15:16+0200\n" -"PO-Revision-Date: 2023-04-22 15:23+0200\n" +"POT-Creation-Date: 2023-04-23 08:02+0200\n" +"PO-Revision-Date: 2023-04-23 08:03+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" "Language: fr_FR\n" @@ -69,6 +69,7 @@ msgid "Account" msgstr "Compte" #: .\transaction\models.py:83 +#: .\transaction\templates\transaction\transaction_archive_month.html:12 #: .\transaction\templates\transaction\transaction_list.html:4 #: .\transaction\templates\transaction\transaction_list.html:7 msgid "Transactions" @@ -107,6 +108,10 @@ msgstr "Supprimer" msgid "No invoice" msgstr "Aucune facture" +#: .\transaction\templates\transaction\transaction_archive_month.html:15 +msgid "Categories" +msgstr "Catégories" + #: .\transaction\templates\transaction\transaction_form.html:5 #: .\transaction\templates\transaction\transaction_table.html:5 msgid "Create transaction" diff --git a/nummi/transaction/models.py b/nummi/transaction/models.py index 7f20c7c..46cdd20 100644 --- a/nummi/transaction/models.py +++ b/nummi/transaction/models.py @@ -64,7 +64,7 @@ class Transaction(UserModel): return f"{self.name}" def get_absolute_url(self): - return reverse("transaction", kwargs={"pk": self.pk}) + return reverse("transaction", args=(self.pk,)) def get_delete_url(self): return reverse("del_transaction", args=(self.pk,)) diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index 27543d2..3af719e 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -43,7 +43,7 @@ {{ trans.date|date:"Y-m-d" }} - {{ trans.name }} + {{ trans.name }} {{ trans.value|pmvalue }} {{ trans.trader|default_if_none:"" }} @@ -51,7 +51,7 @@ {% if trans.category %} {{ trans.category.icon|remix }} - {{ trans.category }} + {{ trans.category }} {% else %} @@ -60,7 +60,7 @@ {% if not account %} {{ trans.account.icon|remix }} - {{ trans.account }} + {{ trans.account }} {% endif %} From 9a666b6d22ffaffda458cd14019c2f0a3454da90 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sun, 23 Apr 2023 08:10:30 +0200 Subject: [PATCH 023/213] Fix .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 542fc9c..acf92f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -env* +/env* __pycache__ *.pkg.tar.zst /nummi-git/ From 09c8da0650f62b9423f74561a2dccd2901eb2ece Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sun, 23 Apr 2023 14:07:54 +0200 Subject: [PATCH 024/213] Update PKGBUILD with version --- .gitignore | 4 ---- pkgbuild/.gitignore | 3 +++ pkgbuild/PKGBUILD | 33 +++++++++++++++++---------------- 3 files changed, 20 insertions(+), 20 deletions(-) create mode 100644 pkgbuild/.gitignore diff --git a/.gitignore b/.gitignore index acf92f2..89291af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,3 @@ /env* __pycache__ -*.pkg.tar.zst -/nummi-git/ -/pkg/ -/src/ /media diff --git a/pkgbuild/.gitignore b/pkgbuild/.gitignore new file mode 100644 index 0000000..19f79ea --- /dev/null +++ b/pkgbuild/.gitignore @@ -0,0 +1,3 @@ +/*.pkg.tar.zst +/src/ +/nummi/ diff --git a/pkgbuild/PKGBUILD b/pkgbuild/PKGBUILD index bad6c31..871eefd 100644 --- a/pkgbuild/PKGBUILD +++ b/pkgbuild/PKGBUILD @@ -1,5 +1,5 @@ -pkgname=nummi-git -pkgver=r298.2c95379 +pkgname=nummi +pkgver=v0.9 pkgrel=1 pkgdesc="Web-based accounting interface" arch=("any") @@ -13,13 +13,14 @@ depends=( ) makedepends=("git") optdepends=("postgresql: database") -backup=("etc/${pkgname%-git}/config.toml") +backup=("etc/${pkgname}/config.toml") +_tag=c29a01ed5821787bfcef7afbdb100604feab97d0 source=( - "${pkgname}::git+https://git.edgarpierre.fr/edpibu/nummi" - "${pkgname%-git}.service" - "${pkgname%-git}.tmpfiles" - "${pkgname%-git}.sysusers" - "${pkgname%-git}.nginx" + "${pkgname}::git+https://git.edgarpierre.fr/edpibu/nummi?signed#tag=$_tag" + "${pkgname}.service" + "${pkgname}.tmpfiles" + "${pkgname}.sysusers" + "${pkgname}.nginx" "config.toml" ) b2sums=('SKIP' @@ -31,16 +32,16 @@ b2sums=('SKIP' pkgver() { cd "$pkgname" - printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" + git describe } package() { - install -Dm644 ${pkgname%-git}.service -t "${pkgdir}"/usr/lib/systemd/system/ - install -Dm644 ${pkgname%-git}.tmpfiles "${pkgdir}"/usr/lib/tmpfiles.d/${pkgname%-git}.conf - install -Dm644 ${pkgname%-git}.sysusers "${pkgdir}"/usr/lib/sysusers.d/${pkgname%-git}.conf - install -Dm644 ${pkgname%-git}.nginx "${pkgdir}"/etc/nginx/sites-enabled/${pkgname%-git}.conf - install -Dm750 -o nummi -g nummi config.toml -t "${pkgdir}"/etc/${pkgname%-git}/ + install -Dm644 ${pkgname}.service -t "${pkgdir}"/usr/lib/systemd/system/ + install -Dm644 ${pkgname}.tmpfiles "${pkgdir}"/usr/lib/tmpfiles.d/${pkgname}.conf + install -Dm644 ${pkgname}.sysusers "${pkgdir}"/usr/lib/sysusers.d/${pkgname}.conf + install -Dm644 ${pkgname}.nginx "${pkgdir}"/etc/nginx/sites-enabled/${pkgname}.conf + install -Dm600 -o nummi -g nummi config.toml -t "${pkgdir}"/etc/${pkgname}/ - cd ${pkgname}/${pkgname%-git} - find * -type f -exec install -Dm0644 "{}" "${pkgdir}/usr/share/webapps/${pkgname%-git}/{}" \; + cd ${pkgname}/${pkgname} + find * -type f -exec install -Dm0644 "{}" "${pkgdir}/usr/share/webapps/${pkgname}/{}" \; } From 3980f2230c97d5abee06401508fa6f4d8271ee3f Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sun, 23 Apr 2023 16:54:28 +0200 Subject: [PATCH 025/213] Add colors to logo --- .pre-commit-config.yaml | 2 +- nummi/main/static/main/svg/logo-white.svg | 22 ---------------------- nummi/main/static/main/svg/logo.svg | 10 +++++++--- 3 files changed, 8 insertions(+), 26 deletions(-) delete mode 100644 nummi/main/static/main/svg/logo-white.svg diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2da9f62..68993c2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,4 +22,4 @@ repos: rev: "v3.0.0-alpha.6" hooks: - id: prettier - types_or: ["css", "javascript"] + types_or: ["css", "javascript", "svg"] diff --git a/nummi/main/static/main/svg/logo-white.svg b/nummi/main/static/main/svg/logo-white.svg deleted file mode 100644 index ed0bb05..0000000 --- a/nummi/main/static/main/svg/logo-white.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/nummi/main/static/main/svg/logo.svg b/nummi/main/static/main/svg/logo.svg index 0c7fc52..6ea8b87 100644 --- a/nummi/main/static/main/svg/logo.svg +++ b/nummi/main/static/main/svg/logo.svg @@ -6,6 +6,10 @@ + + + + @@ -15,8 +19,8 @@ + fill="url('#grad')" + mask="url('#mask')" + transform-origin="center center" transform="rotate(10)" /> From 3d9424a1d517477ebad367c0d742a17bc800b413 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sun, 23 Apr 2023 17:14:56 +0200 Subject: [PATCH 026/213] Remove LocaleMiddleware --- nummi/nummi/settings.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nummi/nummi/settings.py b/nummi/nummi/settings.py index 144c198..346c749 100644 --- a/nummi/nummi/settings.py +++ b/nummi/nummi/settings.py @@ -63,7 +63,6 @@ INSTALLED_APPS = [ MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", - "django.middleware.locale.LocaleMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", From 819bd20fdf64442ef3deb4159a123c1c6623dfa3 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Mon, 24 Apr 2023 09:07:30 +0200 Subject: [PATCH 027/213] Fix file uploads (borken by missing enctype on form) --- nummi/main/templates/main/form/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/main/templates/main/form/base.html b/nummi/main/templates/main/form/base.html index def3515..65c6f6e 100644 --- a/nummi/main/templates/main/form/base.html +++ b/nummi/main/templates/main/form/base.html @@ -34,7 +34,7 @@ {% endif %} {% block pre %}{% endblock %} - + {% csrf_token %} {% if instance|adding %}{% endif %} {{ form }} From fcdfd0e9adac0225cd224c61bab6b707e3530a7b Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Mon, 24 Apr 2023 09:12:22 +0200 Subject: [PATCH 028/213] Update PKGBUILD to v0.9.1 --- pkgbuild/.gitignore | 1 + pkgbuild/PKGBUILD | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pkgbuild/.gitignore b/pkgbuild/.gitignore index 19f79ea..96cce92 100644 --- a/pkgbuild/.gitignore +++ b/pkgbuild/.gitignore @@ -1,3 +1,4 @@ /*.pkg.tar.zst +/pkg/ /src/ /nummi/ diff --git a/pkgbuild/PKGBUILD b/pkgbuild/PKGBUILD index 871eefd..16ac39e 100644 --- a/pkgbuild/PKGBUILD +++ b/pkgbuild/PKGBUILD @@ -1,5 +1,5 @@ pkgname=nummi -pkgver=v0.9 +pkgver=v0.9.1 pkgrel=1 pkgdesc="Web-based accounting interface" arch=("any") @@ -9,12 +9,12 @@ depends=( "gunicorn" "python-django" "python-toml" - "python-psycopg2" + "python-psycopg" ) makedepends=("git") optdepends=("postgresql: database") backup=("etc/${pkgname}/config.toml") -_tag=c29a01ed5821787bfcef7afbdb100604feab97d0 +_tag=bd6447606b8fb6a8f5006ef504f73618b179f9ac source=( "${pkgname}::git+https://git.edgarpierre.fr/edpibu/nummi?signed#tag=$_tag" "${pkgname}.service" From b9e129e80a46ee165942f2c2b87c16b867a1513b Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 May 2023 12:01:25 +0200 Subject: [PATCH 029/213] Move category plot to templatetag, hide non-budget categories --- .../templates/category/category_plot.html | 16 +++++++++------- nummi/category/templatetags/__init__.py | 0 .../{utils.py => templatetags/category.py} | 11 ++++++++--- .../templates/statement/statement_form.html | 9 +++------ nummi/statement/views.py | 3 --- .../transaction/transaction_archive_month.html | 7 +++---- nummi/transaction/views.py | 3 --- 7 files changed, 23 insertions(+), 26 deletions(-) create mode 100644 nummi/category/templatetags/__init__.py rename nummi/category/{utils.py => templatetags/category.py} (62%) diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index 1a0fc4a..1313da6 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -18,7 +18,7 @@ {% spaceless %} - {% for cat in categories.data %} + {% for cat in categories %} {% if cat.category %} @@ -34,25 +34,27 @@ {{ cat.sum_m|pmrvalue }} -
+
{% if cat.sum < 0 %} -
+
{{ cat.sum|pmrvalue }}
{% endif %} -
+
{% if cat.sum > 0 %} -
+
{{ cat.sum|pmrvalue }}
{% endif %} {{ cat.sum_p|pmrvalue }} + {% empty %} + + {% translate "No transaction" %} + {% endfor %} {% endspaceless %} diff --git a/nummi/category/templatetags/__init__.py b/nummi/category/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nummi/category/utils.py b/nummi/category/templatetags/category.py similarity index 62% rename from nummi/category/utils.py rename to nummi/category/templatetags/category.py index b3b0ea8..c43256b 100644 --- a/nummi/category/utils.py +++ b/nummi/category/templatetags/category.py @@ -1,9 +1,14 @@ +from django import template from django.db import models +register = template.Library() -def get_categories(transactions): + +@register.inclusion_tag("category/category_plot.html") +def category_plot(transactions): categories = ( - transactions.values("category", "category__name", "category__icon") + transactions.filter(category__budget=True) + .values("category", "category__name", "category__icon") .annotate( sum=models.Sum("value"), sum_m=models.Sum("value", filter=models.Q(value__lt=0)), @@ -12,7 +17,7 @@ def get_categories(transactions): .order_by("-sum") ) return { - "data": categories, + "categories": categories, "max": max( categories.aggregate( max=models.Max("sum_p", default=0), diff --git a/nummi/statement/templates/statement/statement_form.html b/nummi/statement/templates/statement/statement_form.html index bb40e07..ef28ce5 100644 --- a/nummi/statement/templates/statement/statement_form.html +++ b/nummi/statement/templates/statement/statement_form.html @@ -1,6 +1,5 @@ {% extends "main/form/base.html" %} -{% load main_extras %} -{% load i18n %} +{% load i18n main_extras category %} {% block title_new %} {% translate "Create statement" %} {% endblock %} @@ -19,11 +18,9 @@ {% endif %} {% endblock %} {% block tables %} - {% if categories %} -

{% translate "Categories" %}

- {% include "category/category_plot.html" %} - {% endif %} {% if not form.instance|adding %} +

{% translate "Categories" %}

+ {% category_plot transactions %}

{% translate "Transactions" %} ({{ form.instance.sum|pmvalue }} / {{ form.instance.diff|pmvalue }})

{% include "transaction/transaction_table.html" %} {% endif %} diff --git a/nummi/statement/views.py b/nummi/statement/views.py index 9121ba3..435cb85 100644 --- a/nummi/statement/views.py +++ b/nummi/statement/views.py @@ -1,5 +1,4 @@ from account.models import Account -from category.utils import get_categories from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy from main.views import NummiCreateView, NummiDeleteView, NummiListView, NummiUpdateView @@ -42,8 +41,6 @@ class StatementUpdateView(NummiUpdateView): statement = data["form"].instance _transactions = statement.transaction_set.all() - if _transactions: - data["categories"] = get_categories(_transactions) return data | { "account": statement.account, diff --git a/nummi/transaction/templates/transaction/transaction_archive_month.html b/nummi/transaction/templates/transaction/transaction_archive_month.html index 431e4db..9c5ea87 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_month.html +++ b/nummi/transaction/templates/transaction/transaction_archive_month.html @@ -1,6 +1,5 @@ {% extends "transaction/transaction_list.html" %} -{% load i18n %} -{% load static %} +{% load i18n static category %} {% block link %} {{ block.super }} {% translate "Transactions" %} {{ block.super }} - {% if categories %} + {% if not category %}

{% translate "Categories" %}

- {% include "category/category_plot.html" %} + {% category_plot transactions %} {% endif %} {% endblock %} diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 238d19a..f7464cd 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -1,6 +1,5 @@ from account.models import Account from category.models import Category -from category.utils import get_categories from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy from django.views.generic.dates import MonthArchiveView @@ -136,8 +135,6 @@ class TransactionMonthView(UserMixin, MonthArchiveView): context_data = super().get_context_data(**kwargs) if "category" in self.kwargs: return context_data | {"category": self.category} - - context_data["categories"] = get_categories(context_data["transactions"]) if "account" in self.kwargs: return context_data | {"account": self.account} return context_data From 574d1d28750ef025d398c99c07946e34e470e843 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 May 2023 12:18:20 +0200 Subject: [PATCH 030/213] Add total line to category plot Closes #9 --- .../templates/category/category_plot.html | 25 +++++++++++++++++++ nummi/category/templatetags/category.py | 14 +++++------ nummi/main/static/main/css/plot.css | 4 +++ 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index 1313da6..33d67fd 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -58,5 +58,30 @@ {% endfor %} {% endspaceless %} + {% if categories %} + + + {% translate "Total" %} + {{ total_m|pmrvalue }} + +
+ {% if total < 0 %} +
+ {{ total|pmrvalue }} +
+ {% endif %} + + +
+ {% if total > 0 %} +
+ {{ total|pmrvalue }} +
+ {% endif %} + + {{ total_p|pmrvalue }} + + + {% endif %}
diff --git a/nummi/category/templatetags/category.py b/nummi/category/templatetags/category.py index c43256b..5709af0 100644 --- a/nummi/category/templatetags/category.py +++ b/nummi/category/templatetags/category.py @@ -1,5 +1,6 @@ from django import template from django.db import models +from django.db.models.functions import Greatest register = template.Library() @@ -18,10 +19,9 @@ def category_plot(transactions): ) return { "categories": categories, - "max": max( - categories.aggregate( - max=models.Max("sum_p", default=0), - min=models.Min("sum_m", default=0), - ).values(), - ), - } + } | categories.aggregate( + max=Greatest(models.Sum("sum_m"), models.Sum("sum_p")), + total_m=models.Sum("sum_m"), + total_p=models.Sum("sum_p"), + total=models.Sum("value"), + ) diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index d38d575..15fc7ab 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -70,3 +70,7 @@ table.full-width col.bar { overflow: hidden; } } + +.plot tfoot { + background: var(--bg-01); +} From eabdaf2516300614a4ff7cd4efe180621e27effb Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 May 2023 12:20:19 +0200 Subject: [PATCH 031/213] Fix urls in category plot on month page --- nummi/category/templatetags/category.py | 20 +++++++++++-------- .../transaction_archive_month.html | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/nummi/category/templatetags/category.py b/nummi/category/templatetags/category.py index 5709af0..8bfd4e4 100644 --- a/nummi/category/templatetags/category.py +++ b/nummi/category/templatetags/category.py @@ -6,7 +6,7 @@ register = template.Library() @register.inclusion_tag("category/category_plot.html") -def category_plot(transactions): +def category_plot(transactions, **kwargs): categories = ( transactions.filter(category__budget=True) .values("category", "category__name", "category__icon") @@ -17,11 +17,15 @@ def category_plot(transactions): ) .order_by("-sum") ) - return { - "categories": categories, - } | categories.aggregate( - max=Greatest(models.Sum("sum_m"), models.Sum("sum_p")), - total_m=models.Sum("sum_m"), - total_p=models.Sum("sum_p"), - total=models.Sum("value"), + return ( + kwargs + | { + "categories": categories, + } + | categories.aggregate( + max=Greatest(models.Sum("sum_m"), models.Sum("sum_p")), + total_m=models.Sum("sum_m"), + total_p=models.Sum("sum_p"), + total=models.Sum("value"), + ) ) diff --git a/nummi/transaction/templates/transaction/transaction_archive_month.html b/nummi/transaction/templates/transaction/transaction_archive_month.html index 9c5ea87..3f5dc1b 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_month.html +++ b/nummi/transaction/templates/transaction/transaction_archive_month.html @@ -12,6 +12,6 @@ {{ block.super }} {% if not category %}

{% translate "Categories" %}

- {% category_plot transactions %} + {% category_plot transactions month=month %} {% endif %} {% endblock %} From a5dd41b53385db28ea5b37b3f1baa2ce7572462c Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 May 2023 12:56:00 +0200 Subject: [PATCH 032/213] In category_plot templatetag, replace filter budget with exclude not budget --- nummi/category/templatetags/category.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/category/templatetags/category.py b/nummi/category/templatetags/category.py index 8bfd4e4..8af8c24 100644 --- a/nummi/category/templatetags/category.py +++ b/nummi/category/templatetags/category.py @@ -8,7 +8,7 @@ register = template.Library() @register.inclusion_tag("category/category_plot.html") def category_plot(transactions, **kwargs): categories = ( - transactions.filter(category__budget=True) + transactions.exclude(category__budget=False) .values("category", "category__name", "category__icon") .annotate( sum=models.Sum("value"), From 02bd1853d5dfd239ae8699a74909b5954f084d7a Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 4 May 2023 22:00:36 +0200 Subject: [PATCH 033/213] Fix wrong total values (#10) --- nummi/category/templatetags/category.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/category/templatetags/category.py b/nummi/category/templatetags/category.py index 8af8c24..e344471 100644 --- a/nummi/category/templatetags/category.py +++ b/nummi/category/templatetags/category.py @@ -26,6 +26,6 @@ def category_plot(transactions, **kwargs): max=Greatest(models.Sum("sum_m"), models.Sum("sum_p")), total_m=models.Sum("sum_m"), total_p=models.Sum("sum_p"), - total=models.Sum("value"), + total=models.Sum("sum"), ) ) From 3c1e4ac45da193344335c960b01fe2ccbadb87be Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 4 May 2023 22:02:22 +0200 Subject: [PATCH 034/213] Fix broken negative bars when total is negative (fixes #10) --- nummi/category/templatetags/category.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/category/templatetags/category.py b/nummi/category/templatetags/category.py index e344471..5f76341 100644 --- a/nummi/category/templatetags/category.py +++ b/nummi/category/templatetags/category.py @@ -23,7 +23,7 @@ def category_plot(transactions, **kwargs): "categories": categories, } | categories.aggregate( - max=Greatest(models.Sum("sum_m"), models.Sum("sum_p")), + max=Greatest(-models.Sum("sum_m"), models.Sum("sum_p")), total_m=models.Sum("sum_m"), total_p=models.Sum("sum_p"), total=models.Sum("sum"), From 76ac6bc7fbd87ab783f5b333e291a417c6da6341 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 25 Nov 2023 10:44:57 +0100 Subject: [PATCH 035/213] Use tomllib instead of toml --- nummi/nummi/settings.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/nummi/nummi/settings.py b/nummi/nummi/settings.py index 346c749..1050bab 100644 --- a/nummi/nummi/settings.py +++ b/nummi/nummi/settings.py @@ -11,15 +11,14 @@ https://docs.djangoproject.com/en/4.0/ref/settings/ """ import os +import tomllib from pathlib import Path -import toml - CONFIG_PATH = os.environ.get("NUMMI_CONFIG", None) -if CONFIG_PATH is None: - CONFIG = dict() -else: - CONFIG = toml.load(CONFIG_PATH) +CONFIG = dict() +if CONFIG_PATH is not None: + with Path(CONFIG_PATH).open("rb") as CONFIG_FILE: + CONFIG = tomllib.load(CONFIG_FILE) # Build paths inside the project like this: BASE_DIR / 'subdir'. MEDIA_CONF = CONFIG.get("media", {}) From 8dd29be8bf8b3f915153bab0311b60f3ae058461 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 25 Nov 2023 11:28:20 +0100 Subject: [PATCH 036/213] Add success message on object creation with link to object --- nummi/main/templates/main/base.html | 5 +++++ nummi/main/views.py | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html index 98da0b8..61de121 100644 --- a/nummi/main/templates/main/base.html +++ b/nummi/main/templates/main/base.html @@ -88,6 +88,11 @@ {% endspaceless %} {% endblock %}
+ {% if messages %} +
    + {% for message in messages %}
  • {{ message }}
  • {% endfor %} +
+ {% endif %} {% block body %}{% endblock %}
diff --git a/nummi/main/views.py b/nummi/main/views.py index 8095486..51a7131 100644 --- a/nummi/main/views.py +++ b/nummi/main/views.py @@ -1,8 +1,10 @@ from account.models import Account from category.models import Category +from django.contrib import messages from django.contrib.auth import views as auth_views from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse_lazy +from django.utils.html import format_html from django.views.generic import ( CreateView, DeleteView, @@ -55,7 +57,18 @@ class NummiCreateView(UserMixin, CreateView): return super().form_valid(form) def get_success_url(self): - return self.next or super().get_success_url() + surl = super().get_success_url() + messages.success( + self.request, + format_html( + "{name} {msg}", + surl=surl, + name=self.object, + msg="was created successfully", + ), + ) + + return self.next or surl class NummiUpdateView(UserMixin, UpdateView): From ffc0fa3ce1c1da8a57f11e709ba2e86c71b166a7 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 25 Nov 2023 11:56:14 +0100 Subject: [PATCH 037/213] Update messages styling --- nummi/main/static/main/css/main.css | 22 ++++++++++++++++++++++ nummi/main/templates/main/base.html | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 6aa5a99..8930bbd 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -194,3 +194,25 @@ main h2.new { p { margin: 0.5em 0; } + +ul.messages { + font-weight: 550; + list-style-type: none; + margin: 0; + background: var(--bg-01); + padding: 0; +} +ul.messages li { + padding: calc(var(--gap) / 2) var(--gap); + border-left: var(--border) solid var(--gray); +} + +ul.messages li.msg-level-25 { + border-left-color: var(--green-1); +} +ul.messages li.msg-level-30 { + border-left-color: var(--red-1); +} +ul.messages li.msg-level-40 { + border-left-color: var(--red); +} diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html index 61de121..3b3d2aa 100644 --- a/nummi/main/templates/main/base.html +++ b/nummi/main/templates/main/base.html @@ -89,8 +89,8 @@ {% endblock %}
{% if messages %} -
    - {% for message in messages %}
  • {{ message }}
  • {% endfor %} +
      + {% for message in messages %}
    • {{ message }}
    • {% endfor %}
    {% endif %} {% block body %}{% endblock %} From 4bbb5de3c5547264dbfbde1f18f3eea28691c8f8 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 25 Nov 2023 12:07:01 +0100 Subject: [PATCH 038/213] Update translations --- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 813 -> 899 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 10 +++++++++- nummi/main/locale/fr_FR/LC_MESSAGES/django.mo | Bin 1682 -> 1751 bytes nummi/main/locale/fr_FR/LC_MESSAGES/django.po | 6 +++++- nummi/main/views.py | 3 ++- .../locale/fr_FR/LC_MESSAGES/django.po | 10 +++++----- .../locale/fr_FR/LC_MESSAGES/django.po | 6 +++--- 7 files changed, 24 insertions(+), 11 deletions(-) diff --git a/nummi/category/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/category/locale/fr_FR/LC_MESSAGES/django.mo index 4dfa16e82cd635d8d957ae5b6163dbe69f6c8601..32338f9c0ed8d8e5f6168003298a21f3684d5ae9 100644 GIT binary patch delta 401 zcmZY5y-EW?6o%n%G(W~Q2BLNmw9&%e&cY&S8nH+x3QLkgkXrQ7o8t6q2#u}n6|dvb;RB^`%BDq#y3@fa8I z1Z&vM`x%z$53zuE=yl_~|A0&MpV75muqcf*$p=1goBSlb@Ow^*@CRL3^U@kbSiw#7 z_Z{^7UGxF=kVj2kzDNt}c#0I%CHf%O7<533@QJ+1v=F+0!wY;H&M*zusG7H3%p3V{ rM33v?Z1pJJ$gbj~A9u3zG*LUv;*0m2@EW%E2c1FE`#-AoY<^#VaHK43 delta 315 zcmXxfF%Q8|5Ww+!R9jR8u}Rd#ZnfHsj3k)4RH8PL4i>xk2u6v-z;5>m#ALSH{Excy z@_YAkefQqlIoR=|Z0&^b$QrpKOXQu@@QsL#4a{K+U2J0!J4xL`hkAe(4pIM`Bz1r~ zBTQUk(?~2E7TS1BiRAH&I_Qd3ykQof$^Hwq|BX6O(%(;9tWbKWgM8#@p-o%9q5B$o mK|Rx!x|YAeI#gfwj|>ZE+cl%p#q3R?KOcwDc)AE?VI&_l+Zi|j diff --git a/nummi/category/locale/fr_FR/LC_MESSAGES/django.po b/nummi/category/locale/fr_FR/LC_MESSAGES/django.po index ca5b98a..e5881ca 100644 --- a/nummi/category/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/category/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-22 15:16+0200\n" +"POT-Creation-Date: 2023-11-25 12:05+0100\n" "PO-Revision-Date: 2023-04-22 15:18+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -61,3 +61,11 @@ msgstr "Dépenses" #: .\category\templates\category\category_plot.html:16 msgid "Income" msgstr "Revenus" + +#: .\category\templates\category\category_plot.html:56 +msgid "No transaction" +msgstr "Aucune transaction" + +#: .\category\templates\category\category_plot.html:64 +msgid "Total" +msgstr "Total" diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo index 4685846eef54e3eb6b0be73dad20de77fa8de525..7f2a8f069af009197b2d2fc8c0ebda76e0fe89e9 100644 GIT binary patch delta 551 zcmXZZJ1+!L6u|L2v&$N+WrJ*(ViNJ_XcQ6}5uHXQqM3|Y5nC*?k5HI|W*d!1p;4$z zMY1Fkg~%j?jz%`|XcP(`fJEVc?A+we?>^2w_sq<0@;T|hrQ-*RW=8!N`{^$l4_aPV zstH$d0ynS`FR>Y~F@X=!`V+P>uVD&5u^qoLjYh0~-o&_4zUpHj35MzmY9tC6jn>C; zfc+_y3sqJiS(JW!4HFBG{`O+V<-uyQ9k7y zN+C-qi9GDVO_X1Ah;r^2CGHe^@oMj0+t$qLjJ~X8%C=`YYpz{z7cH;oIIibqi@Dr- a^&Js&bnxzgLK9mF3EP{tv zz!RLnCQjlbhOz69_i>v33(nvWJse{Ke^KjW0kfc4)#hj@LF#|NmQev&e|!yB=x?Al z+{Gz8!VsPziL8QJcZo^7M#VQUh7YK?Hs-k86NcH}MvRu2_(mOMm8{xe9iv!4B`%|G zvW@e&kF$7=3wVo)zenY1q7KmV`#sb_o>4FJiuo-XU;c#0E=rg|Jz*YokRmG4CZ=%* b^-E4s2`^A_H??=?%CXL#d+c;R10U`m;ae(S diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po index 6697c94..18f7b5d 100644 --- a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-23 08:02+0200\n" +"POT-Creation-Date: 2023-11-25 12:05+0100\n" "PO-Revision-Date: 2023-04-23 08:03+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -124,3 +124,7 @@ msgstr "Aucune catégorie" #: .\main\templates\main\index.html:44 msgid "History" msgstr "Historique" + +#: .\main\views.py:68 +msgid "was created successfully" +msgstr "a été créé avec succès" diff --git a/nummi/main/views.py b/nummi/main/views.py index 51a7131..e1d52a3 100644 --- a/nummi/main/views.py +++ b/nummi/main/views.py @@ -5,6 +5,7 @@ from django.contrib.auth import views as auth_views from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse_lazy from django.utils.html import format_html +from django.utils.translation import gettext as _ from django.views.generic import ( CreateView, DeleteView, @@ -64,7 +65,7 @@ class NummiCreateView(UserMixin, CreateView): "{name} {msg}", surl=surl, name=self.object, - msg="was created successfully", + msg=_("was created successfully"), ), ) diff --git a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po index 88593df..c9ae392 100644 --- a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-22 15:22+0200\n" +"POT-Creation-Date: 2023-11-25 12:05+0100\n" "PO-Revision-Date: 2023-04-22 15:22+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -65,20 +65,20 @@ msgstr "Relevé" msgid "Statements" msgstr "Relevés" -#: .\statement\templates\statement\statement_form.html:5 +#: .\statement\templates\statement\statement_form.html:4 #: .\statement\templates\statement\statement_table.html:5 msgid "Create statement" msgstr "Créer un relevé" -#: .\statement\templates\statement\statement_form.html:8 +#: .\statement\templates\statement\statement_form.html:7 msgid "New statement" msgstr "Nouveau relevé" -#: .\statement\templates\statement\statement_form.html:23 +#: .\statement\templates\statement\statement_form.html:22 msgid "Categories" msgstr "Catégories" -#: .\statement\templates\statement\statement_form.html:27 +#: .\statement\templates\statement\statement_form.html:24 #: .\statement\templates\statement\statement_table.html:28 msgid "Transactions" msgstr "Transactions" diff --git a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po index fc73dd9..26f95c0 100644 --- a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-23 08:02+0200\n" +"POT-Creation-Date: 2023-11-25 12:05+0100\n" "PO-Revision-Date: 2023-04-23 08:03+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -69,7 +69,7 @@ msgid "Account" msgstr "Compte" #: .\transaction\models.py:83 -#: .\transaction\templates\transaction\transaction_archive_month.html:12 +#: .\transaction\templates\transaction\transaction_archive_month.html:11 #: .\transaction\templates\transaction\transaction_list.html:4 #: .\transaction\templates\transaction\transaction_list.html:7 msgid "Transactions" @@ -108,7 +108,7 @@ msgstr "Supprimer" msgid "No invoice" msgstr "Aucune facture" -#: .\transaction\templates\transaction\transaction_archive_month.html:15 +#: .\transaction\templates\transaction\transaction_archive_month.html:14 msgid "Categories" msgstr "Catégories" From 9dbbd3d48e6e27366d12fdbc1510b4e0bf50e074 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 28 Dec 2023 15:46:52 +0100 Subject: [PATCH 039/213] Add monthly year chart --- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 454 -> 490 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 6 ++- nummi/history/templates/history/plot.html | 39 ++++++++++++++++++ nummi/history/utils.py | 29 +++++++++++-- nummi/main/static/main/css/plot.css | 25 +++++++++++ 5 files changed, 95 insertions(+), 4 deletions(-) diff --git a/nummi/history/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/history/locale/fr_FR/LC_MESSAGES/django.mo index c369f8dc5a4f3023676a06c1e9925a36ca66799f..cdfe26fffdcf15c1ca75914eaed79c8fc4615fe2 100644 GIT binary patch delta 159 zcmX@c{EE5$o)F7a1|VPsVi_QI0b+I_&H-W&=m264AnpWWHXxn^#2~dZftUq|=L4}i zBLl+{Ak7KHXMk*w{%b%QB!3S`gY-QH(m(_T%s>)k1`|jMq=;c+t`tjTYGTpGHU~y_ L$Gp75D^nQ&ROS-} delta 144 zcmaFGe2lsNo)F7a1|VPoVi_Q|0b*7ljsap2C;(y(AT9)AHXyD7Vvu|z5UVpXFth_{ zP9R\n" "Language-Team: \n" @@ -28,3 +28,7 @@ msgstr "Dépenses" #: .\history\templates\history\plot.html:17 msgid "Income" msgstr "Revenus" + +#: .\history\templates\history\plot.html:68 +msgid "Year" +msgstr "Année" diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 43d94ef..cba9e18 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -61,3 +61,42 @@
+
+ + + + + + + + + + + + + + + + + + + + {% spaceless %} + {% for year in history.years %} + + + {% for m in year.d %} + {% if m %} + + {% else %} + + {% endif %} + {% endfor %} + + {% endfor %} + {% endspaceless %} + +
{% translate "Year" %}010203040506070809101112
{{ year.y }} +
+
diff --git a/nummi/history/utils.py b/nummi/history/utils.py index ef0a353..adf1c35 100644 --- a/nummi/history/utils.py +++ b/nummi/history/utils.py @@ -1,6 +1,8 @@ +import datetime + from django.db import models from django.db.models import Func, Max, Min, Q, Sum, Value -from django.db.models.functions import Now, TruncMonth +from django.db.models.functions import Abs, Now, TruncMonth class GenerateMonth(Func): @@ -22,11 +24,17 @@ def history(transaction_set): ) ) .annotate( - sum_m=Value(0), sum_p=Value(0), sum=Value(0), has_transactions=Value(0) + sum_m=Value(0), + sum_p=Value(0), + sum=Value(0), + has_transactions=Value(0), ) .difference( _transaction_month.annotate( - sum_m=Value(0), sum_p=Value(0), sum=Value(0), has_transactions=Value(0) + sum_m=Value(0), + sum_p=Value(0), + sum=Value(0), + has_transactions=Value(0), ) ) ) @@ -39,10 +47,25 @@ def history(transaction_set): return { "data": _history.union(_months).order_by("-month"), + "years": [ + { + "y": y, + "d": [ + _history.filter(month=datetime.date(y, m + 1, 1)).first() + for m in range(12) + ], + } + for y in range( + _transaction_month.first()["month"].year, + _transaction_month.last()["month"].year - 1, + -1, + ) + ], "max": max( _history.aggregate( max=Max("sum_p", default=0), min=-Min("sum_m", default=0), ).values(), ), + "years_max": _history.aggregate(max=Max(Abs("sum")))["max"], } diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index 15fc7ab..a55a06f 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -74,3 +74,28 @@ table.full-width col.bar { .plot tfoot { background: var(--bg-01); } + +.calendar { + margin-top: var(--gap); +} +.calendar .p { + background: var(--green); +} +.calendar .o-0 { + opacity: 0.1; +} +.calendar .o-1 { + opacity: 0.5; +} +.calendar .o-2 { + opacity: 0.75; +} +.calendar .o-3 { + opacity: 0.9; +} +.calendar .o-4 { + opacity: 1; +} +.calendar .m { + background: var(--red); +} From 6f631607b8c289f117bd462a5de42a29fcb0364b Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 28 Dec 2023 16:31:13 +0100 Subject: [PATCH 040/213] Reduce computations in history generation --- .../templates/category/category_form.html | 2 +- nummi/history/templates/history/plot.html | 85 ++++++++++--------- nummi/history/utils.py | 40 +++------ nummi/main/static/main/css/plot.css | 3 + nummi/main/templates/main/index.html | 2 +- 5 files changed, 63 insertions(+), 69 deletions(-) diff --git a/nummi/category/templates/category/category_form.html b/nummi/category/templates/category/category_form.html index aa16a70..ed9e399 100644 --- a/nummi/category/templates/category/category_form.html +++ b/nummi/category/templates/category/category_form.html @@ -11,7 +11,7 @@ {% block tables %}

{% translate "Transactions" %}

{% include "transaction/transaction_table.html" %} - {% if history.data %} + {% if history %}

{% translate "History" %}

{% include "history/plot.html" %} {% endif %} diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index cba9e18..3f0b456 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -19,43 +19,51 @@ {% spaceless %} - {% for date in history.data %} - - - - - - {% if date.has_transactions %} - {% if account %} - {{ date.month|date:"Y-m" }} - {% elif category %} - {{ date.month|date:"Y-m" }} - {% else %} - {{ date.month|date:"Y-m" }} - {% endif %} - {% else %} - {{ date.month|date:"Y-m" }} - {% endif %} - - {{ date.sum_m|pmrvalue }} - -
- {% if date.sum < 0 %} -
- {{ date.sum|pmrvalue }} -
- {% endif %} - - -
- {% if date.sum > 0 %} -
- {{ date.sum|pmrvalue }} -
- {% endif %} - - {{ date.sum_p|pmrvalue }} - + {% for y in history.years reversed %} + {% for date in y.d reversed %} + {% if date %} + + + + + + {% if date.has_transactions %} + {% if account %} + {{ date.month|date:"Y-m" }} + {% elif category %} + {{ date.month|date:"Y-m" }} + {% else %} + {{ date.month|date:"Y-m" }} + {% endif %} + {% else %} + {{ date.month|date:"Y-m" }} + {% endif %} + + {{ date.sum_m|pmrvalue }} + +
+ {% if date.sum < 0 %} +
+ {{ date.sum|pmrvalue }} +
+ {% endif %} + + +
+ {% if date.sum > 0 %} +
+ {{ date.sum|pmrvalue }} +
+ {% endif %} + + {{ date.sum_p|pmrvalue }} + + {% else %} + + + + {% endif %} + {% endfor %} {% endfor %} {% endspaceless %} @@ -82,7 +90,7 @@ {% spaceless %} - {% for year in history.years %} + {% for year in history.years reversed %} {{ year.y }} {% for m in year.d %} @@ -100,3 +108,4 @@ +{{ history.years|json_script }} diff --git a/nummi/history/utils.py b/nummi/history/utils.py index adf1c35..2af095f 100644 --- a/nummi/history/utils.py +++ b/nummi/history/utils.py @@ -1,8 +1,7 @@ import datetime -from django.db import models from django.db.models import Func, Max, Min, Q, Sum, Value -from django.db.models.functions import Abs, Now, TruncMonth +from django.db.models.functions import Abs, TruncMonth class GenerateMonth(Func): @@ -13,31 +12,13 @@ class GenerateMonth(Func): def history(transaction_set): if not transaction_set.exists(): return None + _transaction_month = transaction_set.values(month=TruncMonth("date")).order_by( "-date" ) - _months = ( - transaction_set.values( - month=GenerateMonth( - _transaction_month.last()["month"], - Now(output_field=models.DateField()), - ) - ) - .annotate( - sum_m=Value(0), - sum_p=Value(0), - sum=Value(0), - has_transactions=Value(0), - ) - .difference( - _transaction_month.annotate( - sum_m=Value(0), - sum_p=Value(0), - sum=Value(0), - has_transactions=Value(0), - ) - ) - ) + _first_month = _transaction_month.last()["month"] + _last_month = _transaction_month.first()["month"] + _history = _transaction_month.annotate( sum_p=Sum("value", filter=Q(value__gt=0)), sum_m=Sum("value", filter=Q(value__lt=0)), @@ -46,19 +27,20 @@ def history(transaction_set): ).order_by("-month") return { - "data": _history.union(_months).order_by("-month"), "years": [ { "y": y, "d": [ _history.filter(month=datetime.date(y, m + 1, 1)).first() - for m in range(12) + for m in range( + 0, + _last_month.month if _last_month.year == y else 12, + ) ], } for y in range( - _transaction_month.first()["month"].year, - _transaction_month.last()["month"].year - 1, - -1, + _first_month.year, + _last_month.year + 1, ) ], "max": max( diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index a55a06f..52dd617 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -63,6 +63,9 @@ table.full-width col.bar { .plot td.bar.m div.tot span { right: 0; } +.plot tr.empty { + height: 0.5rem; +} @media (width < 720px) { .plot .bar { diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index cdadde8..a6fd1c0 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -40,7 +40,7 @@

{% translate "Statements" %}

{% include "statement/statement_table.html" %} {% endif %} - {% if history.data %} + {% if history %}

{% translate "History" %}

{% include "history/plot.html" %} {% endif %} From 8652eb0b57d3e04d44834bac024f1091e7420a2c Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 29 Dec 2023 09:23:51 +0100 Subject: [PATCH 041/213] Remove borders in calendar table --- nummi/main/static/main/css/plot.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index 52dd617..0d1223c 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -102,3 +102,9 @@ table.full-width col.bar { .calendar .m { background: var(--red); } +.calendar tbody tr:not(:last-child) { + border-bottom: none; +} +.calendar tbody tr:not(:first-child) { + border-top: none; +} From 4bb682fc8806a04d496294f432ef4f993089170e Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 29 Dec 2023 09:50:08 +0100 Subject: [PATCH 042/213] Fix HTML for index page --- nummi/history/templates/history/plot.html | 17 ++++++--- nummi/history/utils.py | 35 ++++++++++--------- nummi/main/templates/main/base.html | 12 +++---- nummi/main/templates/main/index.html | 4 +-- .../templates/statement/statement_table.html | 20 ++++++----- .../transaction/transaction_table.html | 24 +++++++------ 6 files changed, 64 insertions(+), 48 deletions(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 3f0b456..16e2b94 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -41,7 +41,9 @@ {{ date.sum_m|pmrvalue }} -
+ {% if date.sum_m %} +
+ {% endif %} {% if date.sum < 0 %}
{{ date.sum|pmrvalue }} @@ -49,7 +51,9 @@ {% endif %} -
+ {% if date.sum_p %} +
+ {% endif %} {% if date.sum > 0 %}
{{ date.sum|pmrvalue }} @@ -60,7 +64,7 @@ {% else %} - + {% endif %} {% endfor %} @@ -94,6 +98,9 @@ {{ year.y }} {% for m in year.d %} + {% if forloop.parentloop.last and forloop.first %} + {% for _ in history.offset.0 %}{% endfor %} + {% endif %} {% if m %} @@ -101,6 +108,9 @@ {% else %} {% endif %} + {% if forloop.parentloop.first and forloop.last %} + {% for _ in history.offset.1 %}{% endfor %} + {% endif %} {% endfor %} {% endfor %} @@ -108,4 +118,3 @@
-{{ history.years|json_script }} diff --git a/nummi/history/utils.py b/nummi/history/utils.py index 2af095f..282d354 100644 --- a/nummi/history/utils.py +++ b/nummi/history/utils.py @@ -26,23 +26,26 @@ def history(transaction_set): has_transactions=Value(1), ).order_by("-month") + _data = [ + { + "y": y, + "d": [ + _history.filter(month=datetime.date(y, m + 1, 1)).first() + for m in range( + _first_month.month if _first_month.year == y else 0, + _last_month.month if _last_month.year == y else 12, + ) + ], + } + for y in range( + _first_month.year, + _last_month.year + 1, + ) + ] + return { - "years": [ - { - "y": y, - "d": [ - _history.filter(month=datetime.date(y, m + 1, 1)).first() - for m in range( - 0, - _last_month.month if _last_month.year == y else 12, - ) - ], - } - for y in range( - _first_month.year, - _last_month.year + 1, - ) - ], + "years": _data, + "offset": [range(_first_month.month), range(12 - _last_month.month)], "max": max( _history.aggregate( max=Max("sum_p", default=0), diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html index 3b3d2aa..6c60492 100644 --- a/nummi/main/templates/main/base.html +++ b/nummi/main/templates/main/base.html @@ -3,15 +3,15 @@ - - + + {% block title %}Nummi{% endblock %} {% block link %} - - - + + + {% endblock %} @@ -19,7 +19,7 @@ {% spaceless %}
@@ -95,28 +93,26 @@ - {% spaceless %} - {% for year in history.years reversed %} - - {{ year.y }} - {% for m in year.d %} - {% if forloop.parentloop.last and forloop.first %} - {% for _ in history.offset.0 %}{% endfor %} - {% endif %} - {% if m %} - - - {% else %} - - {% endif %} - {% if forloop.parentloop.first and forloop.last %} - {% for _ in history.offset.1 %}{% endfor %} - {% endif %} - {% endfor %} - - {% endfor %} - {% endspaceless %} + {% for year in history.years reversed %} + + {{ year.y }} + {% for m in year.d %} + {% if forloop.parentloop.last and forloop.first %} + {% for _ in history.offset.0 %}{% endfor %} + {% endif %} + {% if m %} + + + {% else %} + + {% endif %} + {% if forloop.parentloop.first and forloop.last %} + {% for _ in history.offset.1 %}{% endfor %} + {% endif %} + {% endfor %} + + {% endfor %} From 0e5b8ea85d4fad42f9dc1df606ae105afb050112 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 30 Dec 2023 10:24:24 +0100 Subject: [PATCH 053/213] Use :is css pseudo-class --- nummi/main/static/main/css/form.css | 4 +--- nummi/main/static/main/css/main.css | 12 ++++-------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 520470a..3f792b5 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -9,9 +9,7 @@ form > table > tbody > tr > th { background: var(--bg-01); background-clip: padding-box; } -form tbody input, -form tbody select, -form tbody textarea { +form tbody :is(input, select, textarea) { font: inherit; border: none; background: transparent; diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 28b67c4..de17985 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -61,8 +61,7 @@ a { text-decoration: none; display: inline-block; } -a:hover, -a:focus { +a:is(:hover, :focus) { text-decoration: underline; } @@ -109,8 +108,7 @@ nav ul { nav .skip-link { font-weight: 300; } -nav .skip-link:active, -nav .skip-link:focus { +nav .skip-link:is(:active, :focus) { font-weight: 500; } nav a { @@ -124,8 +122,7 @@ nav a.cur::after { position: absolute; right: 0; } -nav > :first-child, -main > :first-child { +:is(nav, main) > :first-child { margin-top: 0; } footer { @@ -146,8 +143,7 @@ footer { font-weight: 650; text-decoration: underline dotted; } -.pagination a.cur:hover, -.pagination a.cur:focus { +.pagination a.cur:is(:hover, :focus) { text-decoration: underline; } From 7f3b9c7b5c961d9398aeef9e00a15b10da29c056 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 30 Dec 2023 10:38:30 +0100 Subject: [PATCH 054/213] Structure page content with sections --- .../templates/account/account_form.html | 18 ++++-- .../templates/category/category_form.html | 12 ++-- nummi/main/templates/main/index.html | 58 +++++++++++-------- .../templates/statement/statement_form.html | 12 ++-- .../transaction/transaction_form.html | 6 +- 5 files changed, 66 insertions(+), 40 deletions(-) diff --git a/nummi/account/templates/account/account_form.html b/nummi/account/templates/account/account_form.html index 7045203..eaba124 100644 --- a/nummi/account/templates/account/account_form.html +++ b/nummi/account/templates/account/account_form.html @@ -10,13 +10,19 @@ {% block h2 %}{{ form.instance.icon|remix }}{{ form.instance }}{% endblock %} {% block tables %} {% if not form.instance|adding %} -

{% translate "Statements" %}

- {% include "statement/statement_table.html" %} -

{% translate "Transactions" %}

- {% include "transaction/transaction_table.html" %} +
+

{% translate "Statements" %}

+ {% include "statement/statement_table.html" %} +
+
+

{% translate "Transactions" %}

+ {% include "transaction/transaction_table.html" %} +
{% if history %} -

{% translate "History" %}

- {% include "history/plot.html" %} +
+

{% translate "History" %}

+ {% include "history/plot.html" %} +
{% endif %} {% endif %} {% endblock %} diff --git a/nummi/category/templates/category/category_form.html b/nummi/category/templates/category/category_form.html index ed9e399..f4aaa6d 100644 --- a/nummi/category/templates/category/category_form.html +++ b/nummi/category/templates/category/category_form.html @@ -9,10 +9,14 @@ {% endblock %} {% block h2 %}{{ form.instance.icon|remix }}{{ form.instance }}{% endblock %} {% block tables %} -

{% translate "Transactions" %}

- {% include "transaction/transaction_table.html" %} +
+

{% translate "Transactions" %}

+ {% include "transaction/transaction_table.html" %} +
{% if history %} -

{% translate "History" %}

- {% include "history/plot.html" %} +
+

{% translate "History" %}

+ {% include "history/plot.html" %} +
{% endif %} {% endblock %} diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index df0474b..d3fd7d7 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -12,36 +12,46 @@ type="text/css"> {% endblock %} {% block body %} -

{% translate "Accounts" %}

-

- {% for acc in accounts %} - {{ acc.icon|remix }}{{ acc }} - {% empty %} - {% translate "No account" %} - {% endfor %} -

+
+

{% translate "Accounts" %}

+

+ {% for acc in accounts %} + {{ acc.icon|remix }}{{ acc }} + {% empty %} + {% translate "No account" %} + {% endfor %} +

+
{% if transactions %} -

{% translate "Transactions" %}

- {% include "transaction/transaction_table.html" %} +
+

{% translate "Transactions" %}

+ {% include "transaction/transaction_table.html" %} +
{% endif %} {% if categories %} -

{% translate "Categories" %}

- {% spaceless %} -

- {% for cat in categories %} - {{ cat.icon|remix }}{{ cat }} - {% empty %} - {% translate "No category" %} - {% endfor %} -

- {% endspaceless %} +
+

{% translate "Categories" %}

+ {% spaceless %} +

+ {% for cat in categories %} + {{ cat.icon|remix }}{{ cat }} + {% empty %} + {% translate "No category" %} + {% endfor %} +

+ {% endspaceless %} +
{% endif %} {% if statements %} -

{% translate "Statements" %}

- {% include "statement/statement_table.html" %} +
+

{% translate "Statements" %}

+ {% include "statement/statement_table.html" %} +
{% endif %} {% if history %} -

{% translate "History" %}

- {% include "history/plot.html" %} +
+

{% translate "History" %}

+ {% include "history/plot.html" %} +
{% endif %} {% endblock %} diff --git a/nummi/statement/templates/statement/statement_form.html b/nummi/statement/templates/statement/statement_form.html index ef28ce5..b09e993 100644 --- a/nummi/statement/templates/statement/statement_form.html +++ b/nummi/statement/templates/statement/statement_form.html @@ -19,9 +19,13 @@ {% endblock %} {% block tables %} {% if not form.instance|adding %} -

{% translate "Categories" %}

- {% category_plot transactions %} -

{% translate "Transactions" %} ({{ form.instance.sum|pmvalue }} / {{ form.instance.diff|pmvalue }})

- {% include "transaction/transaction_table.html" %} +
+

{% translate "Categories" %}

+ {% category_plot transactions %} +
+
+

{% translate "Transactions" %} ({{ form.instance.sum|pmvalue }} / {{ form.instance.diff|pmvalue }})

+ {% include "transaction/transaction_table.html" %} +
{% endif %} {% endblock %} diff --git a/nummi/transaction/templates/transaction/transaction_form.html b/nummi/transaction/templates/transaction/transaction_form.html index 75eb0d4..8674742 100644 --- a/nummi/transaction/templates/transaction/transaction_form.html +++ b/nummi/transaction/templates/transaction/transaction_form.html @@ -16,7 +16,9 @@ {% endblock %} {% block tables %} {% if not form.instance|adding %} -

{% translate "Invoices" %}

- {% include "transaction/invoice_table.html" %} +
+

{% translate "Invoices" %}

+ {% include "transaction/invoice_table.html" %} +
{% endif %} {% endblock %} From 47d8ff0382aaacd7bbd87d1e5110dbf246b9633d Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 30 Dec 2023 10:54:01 +0100 Subject: [PATCH 055/213] Create tag for css imports --- nummi/main/templates/main/base.html | 5 +++-- nummi/main/templates/main/confirm_delete.html | 8 ++------ nummi/main/templates/main/form/base.html | 12 +++--------- nummi/main/templates/main/index.html | 8 ++------ nummi/main/templates/main/list.html | 4 +--- nummi/main/templates/main/login.html | 8 ++------ nummi/main/templatetags/main_extras.py | 8 ++++++++ nummi/search/templates/search/search.html | 8 ++------ .../transaction/transaction_archive_month.html | 4 +--- 9 files changed, 24 insertions(+), 41 deletions(-) diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html index 6c60492..e725fcc 100644 --- a/nummi/main/templates/main/base.html +++ b/nummi/main/templates/main/base.html @@ -1,5 +1,6 @@ {% load static %} {% load i18n %} +{% load main_extras %} @@ -10,8 +11,8 @@ {% block link %} - - + {% css "main/css/main.css" %} + {% css "main/remixicon/remixicon.css" %} {% endblock %} diff --git a/nummi/main/templates/main/confirm_delete.html b/nummi/main/templates/main/confirm_delete.html index 7ad791e..19dd77b 100644 --- a/nummi/main/templates/main/confirm_delete.html +++ b/nummi/main/templates/main/confirm_delete.html @@ -4,12 +4,8 @@ {% load i18n %} {% block link %} {{ block.super }} - - + {% css "main/css/form.css" %} + {% css "main/css/table.css" %} {% endblock %} {% block body %} {% spaceless %} diff --git a/nummi/main/templates/main/form/base.html b/nummi/main/templates/main/form/base.html index 65c6f6e..e2b273e 100644 --- a/nummi/main/templates/main/form/base.html +++ b/nummi/main/templates/main/form/base.html @@ -12,15 +12,9 @@ {% endblock %} {% block link %} {{ block.super }} - - - + {% css "main/css/form.css" %} + {% css "main/css/table.css" %} + {% css "main/css/plot.css" %} {% endblock %} {% block body %} {% with instance=form.instance %} diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index d3fd7d7..3f56a84 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -4,12 +4,8 @@ {% load i18n %} {% block link %} {{ block.super }} - - + {% css "main/css/table.css" %} + {% css "main/css/plot.css" %} {% endblock %} {% block body %}
diff --git a/nummi/main/templates/main/list.html b/nummi/main/templates/main/list.html index aa90d98..ee3050e 100644 --- a/nummi/main/templates/main/list.html +++ b/nummi/main/templates/main/list.html @@ -13,9 +13,7 @@ {% endblock %} {% block link %} {{ block.super }} - + {% css "main/css/table.css" %} {% endblock %} {% block body %}

diff --git a/nummi/main/templates/main/login.html b/nummi/main/templates/main/login.html index ab579cb..83258a1 100644 --- a/nummi/main/templates/main/login.html +++ b/nummi/main/templates/main/login.html @@ -3,12 +3,8 @@ {% load i18n %} {% block link %} {{ block.super }} - - + {% css "main/css/table.css" %} + {% css "main/css/form.css" %} {% endblock %} {% block body %}

{% translate "Log in" %}

diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index 6b57178..a85d8db 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -1,4 +1,5 @@ from django import template +from django.templatetags.static import static from django.utils import formats from django.utils.safestring import mark_safe @@ -59,3 +60,10 @@ def verbose_name(obj): @register.filter def adding(obj): return obj._state.adding + + +@register.simple_tag +def css(href): + return mark_safe( + f"""""" + ) diff --git a/nummi/search/templates/search/search.html b/nummi/search/templates/search/search.html index 33e5ba1..18ecdc8 100644 --- a/nummi/search/templates/search/search.html +++ b/nummi/search/templates/search/search.html @@ -7,12 +7,8 @@ {% endblock %} {% block link %} {{ block.super }} - - + {% css "main/css/form.css" %} + {% css "main/css/table.css" %} {% endblock %} {% block body %}

{% translate "Search" %}

diff --git a/nummi/transaction/templates/transaction/transaction_archive_month.html b/nummi/transaction/templates/transaction/transaction_archive_month.html index 3f5dc1b..0b72f35 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_month.html +++ b/nummi/transaction/templates/transaction/transaction_archive_month.html @@ -2,9 +2,7 @@ {% load i18n static category %} {% block link %} {{ block.super }} - + {% css "main/css/plot.css" %} {% endblock %} {% block h2 %}{{ month|date:"F Y"|capfirst }}{% endblock %} {% block table %} From fe95222474aef8724e7afbe9c1dd486d9c330bd9 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 30 Dec 2023 11:12:38 +0100 Subject: [PATCH 056/213] Fix bugs in html templates --- .../templates/category/category_plot.html | 8 +++- nummi/main/templates/main/form/base.html | 2 +- nummi/main/templates/main/form/form_base.html | 6 +-- nummi/main/templates/main/form/login.html | 6 +-- nummi/main/templates/main/login.html | 1 + .../templates/transaction/invoice_table.html | 40 ++++++++++--------- .../transaction_archive_month.html | 2 +- 7 files changed, 36 insertions(+), 29 deletions(-) diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index 91d919e..ca855a0 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -34,7 +34,9 @@ {{ cat.sum_m|pmrvalue }} -
+ {% if cat.sum_m %} +
+ {% endif %} {% if cat.sum < 0 %}
{{ cat.sum|pmrvalue }} @@ -42,7 +44,9 @@ {% endif %} -
+ {% if cat.sum_p %} +
+ {% endif %} {% if cat.sum > 0 %}
{{ cat.sum|pmrvalue }} diff --git a/nummi/main/templates/main/form/base.html b/nummi/main/templates/main/form/base.html index e2b273e..fc9a4e3 100644 --- a/nummi/main/templates/main/form/base.html +++ b/nummi/main/templates/main/form/base.html @@ -30,7 +30,7 @@ {% block pre %}{% endblock %} {% csrf_token %} - {% if instance|adding %}{% endif %} + {% if instance|adding %}{% endif %} {{ form }} {% block tables %}{% endblock %} diff --git a/nummi/main/templates/main/form/form_base.html b/nummi/main/templates/main/form/form_base.html index 7fb6952..4d61bf7 100644 --- a/nummi/main/templates/main/form/form_base.html +++ b/nummi/main/templates/main/form/form_base.html @@ -29,11 +29,11 @@ {% if not form.instance|adding %} {% translate "Delete" %} {% endif %} - + {% if form.instance|adding %} - + {% else %} - + {% endif %} {% endblock %} diff --git a/nummi/main/templates/main/form/login.html b/nummi/main/templates/main/form/login.html index 8a74bc7..38e1726 100644 --- a/nummi/main/templates/main/form/login.html +++ b/nummi/main/templates/main/form/login.html @@ -1,7 +1,7 @@ {% extends "main/form/form_base.html" %} {% load i18n %} {% block buttons %} - - - + + + {% endblock %} diff --git a/nummi/main/templates/main/login.html b/nummi/main/templates/main/login.html index 83258a1..0182a8c 100644 --- a/nummi/main/templates/main/login.html +++ b/nummi/main/templates/main/login.html @@ -1,4 +1,5 @@ {% extends "main/base.html" %} +{% load main_extras %} {% load static %} {% load i18n %} {% block link %} diff --git a/nummi/transaction/templates/transaction/invoice_table.html b/nummi/transaction/templates/transaction/invoice_table.html index 82a4406..444509c 100644 --- a/nummi/transaction/templates/transaction/invoice_table.html +++ b/nummi/transaction/templates/transaction/invoice_table.html @@ -6,9 +6,11 @@ - {% translate "Name" %} - {% translate "File" %} - {% translate "Delete" %} + + {% translate "Name" %} + {% translate "File" %} + {% translate "Delete" %} + {% for invoice in transaction.invoices %} @@ -20,21 +22,21 @@ {% translate "File" %} [{{ invoice.file|extension }}] - {% translate "Delete" %} - - - {% empty %} - - {% translate "No invoice" %} - - {% endfor %} - - - - - {% translate "Create invoice" %} + {% translate "Delete" %} - - -
+ {% empty %} + + {% translate "No invoice" %} + + {% endfor %} + + + + + {% translate "Create invoice" %} + + + + +
diff --git a/nummi/transaction/templates/transaction/transaction_archive_month.html b/nummi/transaction/templates/transaction/transaction_archive_month.html index 0b72f35..3b71c4e 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_month.html +++ b/nummi/transaction/templates/transaction/transaction_archive_month.html @@ -1,5 +1,5 @@ {% extends "transaction/transaction_list.html" %} -{% load i18n static category %} +{% load i18n main_extras static category %} {% block link %} {{ block.super }} {% css "main/css/plot.css" %} From ee043d3956c6cd882a834df6767ca945b1203a1f Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sun, 31 Dec 2023 09:03:49 +0100 Subject: [PATCH 057/213] Fix back link in transation form (fix #12) --- nummi/transaction/templates/transaction/transaction_form.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nummi/transaction/templates/transaction/transaction_form.html b/nummi/transaction/templates/transaction/transaction_form.html index 8674742..5b40a0e 100644 --- a/nummi/transaction/templates/transaction/transaction_form.html +++ b/nummi/transaction/templates/transaction/transaction_form.html @@ -8,9 +8,9 @@ {% translate "New transaction" %} {% endblock %} {% block pre %} - {% if snapshot %} + {% if statement %}

- {{ snapshot }} + {{ statement }}

{% endif %} {% endblock %} From e4e0f56be045af8afd66be037ab1f7e199418ff4 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sun, 31 Dec 2023 09:37:29 +0100 Subject: [PATCH 058/213] Use css nesting --- nummi/main/static/main/css/form.css | 106 ++++++++------- nummi/main/static/main/css/main.css | 132 ++++++++++--------- nummi/main/static/main/css/plot.css | 185 ++++++++++++--------------- nummi/main/static/main/css/table.css | 74 ++++++----- 4 files changed, 249 insertions(+), 248 deletions(-) diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 3f792b5..1ee72a6 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -5,56 +5,64 @@ form ul.errorlist { margin: 0; } -form > table > tbody > tr > th { - background: var(--bg-01); - background-clip: padding-box; +form { + > table > tbody > tr > th { + background: var(--bg-01); + background-clip: padding-box; + } + tbody :is(input, select, textarea) { + font: inherit; + border: none; + background: transparent; + width: 100%; + height: 100%; + line-height: 1.5; + } + input[type="checkbox"] { + width: initial; + } + tfoot { + text-align: right; + } } -form tbody :is(input, select, textarea) { - font: inherit; - border: none; - background: transparent; - width: 100%; - height: 100%; - line-height: 1.5; -} -form input[type="checkbox"] { - width: initial; -} -table.file-input tr { - border: none; -} -table.file-input th { - text-align: left; -} -table.file-input tr :first-child { - padding-left: 0; -} -table.file-input tr :last-child { - padding-right: 0; +table.file-input { + tr { + border: none; + + :first-child { + padding-left: 0; + } + :last-child { + padding-right: 0; + } + } + th { + text-align: left; + } } -form tfoot { - text-align: right; -} -.buttons input { - font: inherit; - line-height: 1.5; - margin-left: var(--gap); - border-radius: var(--radius); - padding: 0 var(--gap); - cursor: pointer; -} -.buttons input:hover { - text-decoration: underline; -} -.buttons input[type="submit"] { - border: 0.1rem solid var(--green); - background: var(--green-1); -} -.buttons input[type="reset"] { - border: 0.1rem solid var(--red); - background: var(--red-1); -} -.buttons a.del { - color: var(--red); +.buttons { + input { + font: inherit; + line-height: 1.5; + margin-left: var(--gap); + border-radius: var(--radius); + padding: 0 var(--gap); + cursor: pointer; + + &:hover { + text-decoration: underline; + } + &[type="submit"] { + border: 0.1rem solid var(--green); + background: var(--green-1); + } + &[type="reset"] { + border: 0.1rem solid var(--red); + background: var(--red-1); + } + } + a.del { + color: var(--red); + } } diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index de17985..4ec7b8e 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -60,9 +60,17 @@ a { color: var(--text-link); text-decoration: none; display: inline-block; -} -a:is(:hover, :focus) { - text-decoration: underline; + + &:is(:hover, :focus) { + text-decoration: underline; + } + + &.big-link { + margin-right: 1em; + } + &.big-link [class^="ri-"] { + margin-right: 0.5em; + } } .red { @@ -83,6 +91,9 @@ main { grid-column: 2; grid-row: 1; overflow-x: hidden; + h2.new { + opacity: 0.8; + } } nav { grid-column: 1; @@ -95,32 +106,34 @@ nav { background: var(--bg-01); line-height: 2rem; -} -nav h1 img { - height: 1cap; -} -nav ul { - list-style: none; - padding: 0; - margin: 0; - position: relative; -} -nav .skip-link { - font-weight: 300; -} -nav .skip-link:is(:active, :focus) { - font-weight: 500; -} -nav a { - display: block; -} -nav a.cur { - font-weight: 550; -} -nav a.cur::after { - content: "◎"; - position: absolute; - right: 0; + + h1 img { + height: 1cap; + } + ul { + list-style: none; + padding: 0; + margin: 0; + position: relative; + } + a { + &.skip-link { + font-weight: 300; + + &:is(:active, :focus) { + font-weight: 500; + } + } + display: block; + &.cur { + font-weight: 550; + &::after { + content: "◎"; + position: absolute; + right: 0; + } + } + } } :is(nav, main) > :first-child { margin-top: 0; @@ -134,17 +147,19 @@ footer { .pagination { text-align: center; font-feature-settings: var(--num); -} -.pagination a { - min-width: 1rem; - padding: 0 0.5rem; -} -.pagination a.cur { - font-weight: 650; - text-decoration: underline dotted; -} -.pagination a.cur:is(:hover, :focus) { - text-decoration: underline; + a { + min-width: 1rem; + padding: 0 0.5rem; + + &.cur { + font-weight: 650; + text-decoration: underline dotted; + + &:is(:hover, :focus) { + text-decoration: underline; + } + } + } } @media (width < 1024px) { @@ -160,13 +175,6 @@ footer { height: initial; } } - -a.big-link { - margin-right: 1em; -} -a.big-link [class^="ri-"] { - margin-right: 0.5em; -} [class^="ri-"] { font-weight: normal; } @@ -188,9 +196,6 @@ h2 { h3 { font-size: 1.5rem; } -main h2.new { - opacity: 0.8; -} p { margin: 0.5em 0; } @@ -201,18 +206,19 @@ ul.messages { margin: 0; background: var(--bg-01); padding: 0; -} -ul.messages li { - padding: calc(var(--gap) / 2) var(--gap); - border-left: var(--border) solid var(--gray); -} -ul.messages li.msg-level-25 { - border-left-color: var(--green-1); -} -ul.messages li.msg-level-30 { - border-left-color: var(--red-1); -} -ul.messages li.msg-level-40 { - border-left-color: var(--red); + li { + padding: calc(var(--gap) / 2) var(--gap); + border-left: var(--border) solid var(--gray); + + &.msg-level-25 { + border-left-color: var(--green-1); + } + &.msg-level-30 { + border-left-color: var(--red-1); + } + &.msg-level-40 { + border-left-color: var(--red); + } + } } diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index 1f025d2..631d3c4 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -1,116 +1,99 @@ table.full-width col.bar { width: auto; } + .plot { overflow-x: auto; -} -.plot td.bar { - position: relative; - padding: 0; -} -.plot td.bar div { - position: absolute; - height: 0.5rem; - top: 0; -} + td.bar { + position: relative; + padding: 0; + @media (width < 720px) { + width: 0; + overflow: hidden; + } -.plot td.bar div:not(.tot) { - width: 0; - box-sizing: border-box; - z-index: 1; - display: inline-block; -} -.plot td.bar.p div { - left: 0; - border-radius: 0 var(--radius) var(--radius) 0; -} -.plot td.bar.m div { - right: 0; - border-radius: var(--radius) 0 0 var(--radius); -} -.plot td.bar.m div { - background: var(--red-1); -} -.plot td.bar.p div { - background: var(--green-1); -} + div { + position: absolute; + height: 0.5rem; + top: 0; + &:not(.tot) { + width: 0; + box-sizing: border-box; + z-index: 1; + display: inline-block; + } + &.tot { + z-index: 10; + height: 0.5rem; -.plot td.bar div.tot { - z-index: 10; - height: 0.5rem; -} -.plot td.bar.m div.tot { - background: var(--red); -} -.plot td.bar.p div.tot { - background: var(--green); -} -.plot td.bar div.tot span { - position: absolute; - display: inline-block; - white-space: nowrap; - margin: 0 var(--gap); - font-weight: 650; - top: 0.5rem; - line-height: 1.5rem; - height: 1.5rem; - font-feature-settings: var(--num); -} -.plot td.bar.p div.tot span { - left: 0; -} -.plot td.bar.m div.tot span { - right: 0; -} -.plot tr.empty { - height: 0.5rem; -} -.plot tr.even { - background: #eeeeff; -} + span { + position: absolute; + display: inline-block; + white-space: nowrap; + margin: 0 var(--gap); + font-weight: 650; + top: 0.5rem; + line-height: 1.5rem; + height: 1.5rem; + font-feature-settings: var(--num); + } + } + } + &.p div { + left: 0; + border-radius: 0 var(--radius) var(--radius) 0; + background: var(--green-1); + &.tot { + background: var(--green); -@media (width < 720px) { - .plot .bar { - width: 0; - overflow: hidden; + span { + left: 0; + } + } + } + &.m div { + right: 0; + border-radius: var(--radius) 0 0 var(--radius); + background: var(--red-1); + &.tot { + background: var(--red); + + span { + right: 0; + } + } + } + } + tr.empty { + height: 0.5rem; + } + tr.even { + background: #eeeeff; + } + tfoot { + background: var(--bg-01); } } -.plot tfoot { - background: var(--bg-01); -} - -.calendar tbody tr { - background: initial; -} .calendar { margin-top: var(--gap); -} -.calendar .p { - background: var(--green); -} -.calendar .o-0 { - opacity: 0.1; -} -.calendar .o-1 { - opacity: 0.5; -} -.calendar .o-2 { - opacity: 0.75; -} -.calendar .o-3 { - opacity: 0.9; -} -.calendar .o-4 { - opacity: 1; -} -.calendar .m { - background: var(--red); -} -.calendar tbody tr:not(:last-child) { - border-bottom: none; -} -.calendar tbody tr:not(:first-child) { - border-top: none; + + tbody tr { + background: initial; + } + .p { + background: var(--green); + } + .m { + background: var(--red); + } + tbody tr { + &:not(:last-child) { + border-bottom: none; + } + &:not(:first-child) { + border-top: none; + } + } } diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index 133fb68..5116345 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -4,37 +4,46 @@ form { } table { border-collapse: collapse; + + &.more tbody:last-child tr:last-child { + border-bottom: 1px dashed var(--gray); + } + &.full-width { + width: 100%; + + col { + width: 8rem; + } + } + col.icon { + width: 1ch; + } + thead { + background: var(--bg-01); + } + tr { + border: 1px solid var(--gray); + height: 2rem; + line-height: 2rem; + + tbody &:nth-of-type(even) { + background: #eeeeff; + } + } + td, + th { + padding: 0 var(--gap); + position: relative; + white-space: nowrap; + text-overflow: ellipsis; + &.empty { + text-align: center; + opacity: 0.8; + font-weight: 300; + } + } } -table.more tbody:last-child tr:last-child { - border-bottom: 1px dashed var(--gray); -} -table.full-width { - width: 100%; -} -thead { - background: var(--bg-01); -} -table.full-width col { - width: 8rem; -} -table col.icon { - width: 1ch; -} -tr { - border: 1px solid var(--gray); - height: 2rem; - line-height: 2rem; -} -.table tbody tr:nth-of-type(even) { - background: #eeeeff; -} -td, -th { - padding: 0 var(--gap); - position: relative; - white-space: nowrap; - text-overflow: ellipsis; -} + .date, .value { font-feature-settings: var(--num); @@ -50,8 +59,3 @@ th { .date { text-align: center; } -td.empty { - text-align: center; - opacity: 0.8; - font-weight: 300; -} From 6b50de5e356ebdee7748bdacfe7aca4c361b8b1f Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sun, 31 Dec 2023 18:41:54 +0100 Subject: [PATCH 059/213] Fix opacity calculation on chrome --- nummi/history/templates/history/plot.html | 3 +-- nummi/main/templatetags/main_extras.py | 7 +++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 1f0d858..399bc4e 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -102,8 +102,7 @@ {% endif %} {% if m %} - + style="opacity: {% opacity m.sum history.years_max %}"> {% else %} {% endif %} diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index a85d8db..670bda9 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -1,3 +1,5 @@ +import math + from django import template from django.templatetags.static import static from django.utils import formats @@ -67,3 +69,8 @@ def css(href): return mark_safe( f"""""" ) + + +@register.simple_tag +def opacity(v, vmax): + return f"{math.sin(math.fabs(v/vmax)*math.pi/2):.2f}" From 0940904cd8dd651bec8b9acde927a79197e18c7e Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 10:58:30 +0100 Subject: [PATCH 060/213] Refactor History plot --- nummi/history/templates/history/plot.html | 94 ++++++----------------- nummi/history/utils.py | 38 ++++----- nummi/main/static/main/css/plot.css | 34 ++++---- nummi/main/templatetags/main_extras.py | 69 ++++++++++++++++- 4 files changed, 130 insertions(+), 105 deletions(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 399bc4e..8d9bad4 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -18,57 +18,23 @@ - {% for y in history.years reversed %} - {% for date in y.d reversed %} - {% ifchanged %} - {% if date %} - - - - - - {% if date.has_transactions %} - {% if account %} - {{ date.month|date:"Y-m" }} - {% elif category %} - {{ date.month|date:"Y-m" }} - {% else %} - {{ date.month|date:"Y-m" }} - {% endif %} - {% else %} - {{ date.month|date:"Y-m" }} - {% endif %} - - {{ date.sum_m|pmrvalue }} - - {% if date.sum_m %} -
- {% endif %} - {% if date.sum < 0 %} -
- {{ date.sum|pmrvalue }} -
- {% endif %} - - - {% if date.sum_p %} -
- {% endif %} - {% if date.sum > 0 %} -
- {{ date.sum|pmrvalue }} -
- {% endif %} - - {{ date.sum_p|pmrvalue }} - - {% else %} - - - - {% endif %} - {% endifchanged %} - {% endfor %} + {% for date in history.data reversed %} + {% ifchanged %} + {% if date.sum_m or date.sum_p %} + + {% up_down_icon date.sum %} + {% month_url date.month account=account category=category %} + {{ date.sum_m|pmrvalue }} + {% plot_bar date.sum date.sum_m history.max.pm %} + {% plot_bar date.sum date.sum_p history.max.pm %} + {{ date.sum_p|pmrvalue }} + + {% else %} + + + + {% endif %} + {% endifchanged %} {% endfor %} @@ -78,36 +44,26 @@ {% translate "Year" %} - 01 - 02 - 03 - 04 - 05 - 06 - 07 - 08 - 09 - 10 - 11 - 12 + {% calendar_head %} - {% for year in history.years reversed %} + {% regroup history.data by month.year as years_list %} + {% for y, year in years_list reversed %} - {{ year.y }} - {% for m in year.d %} + {{ y }} + {% for m in year %} {% if forloop.parentloop.last and forloop.first %} - {% for _ in history.offset.0 %}{% endfor %} + {% empty_calendar_cells_start m.month.month %} {% endif %} {% if m %} + style="opacity: {% opacity m.sum history.max.sum %}"> {% else %} {% endif %} {% if forloop.parentloop.first and forloop.last %} - {% for _ in history.offset.1 %}{% endfor %} + {% empty_calendar_cells_end m.month.month %} {% endif %} {% endfor %} diff --git a/nummi/history/utils.py b/nummi/history/utils.py index b15e792..423d34e 100644 --- a/nummi/history/utils.py +++ b/nummi/history/utils.py @@ -1,6 +1,6 @@ import datetime -from django.db.models import Func, Max, Min, Q, Sum, Value +from django.db.models import Func, Max, Min, Q, Sum from django.db.models.functions import Abs, TruncMonth @@ -23,34 +23,30 @@ def history(transaction_set): sum_p=Sum("value", filter=Q(value__gt=0)), sum_m=Sum("value", filter=Q(value__lt=0)), sum=Sum("value"), - has_transactions=Value(1), ).order_by("-month") _data = [ - { - "y": y, - "d": [ - _history.filter(month=datetime.date(y, m + 1, 1)).first() - for m in range( - _first_month.month - 1 if _first_month.year == y else 0, - _last_month.month if _last_month.year == y else 12, - ) - ], - } + _history.filter(month=datetime.date(y, m + 1, 1)).first() + or {"month": datetime.date(y, m + 1, 1), "sum": 0} for y in range( _first_month.year, _last_month.year + 1, ) + for m in range( + _first_month.month - 1 if _first_month.year == y else 0, + _last_month.month if _last_month.year == y else 12, + ) ] return { - "years": _data, - "offset": [range(_first_month.month - 1), range(12 - _last_month.month)], - "max": max( - _history.aggregate( - max=Max("sum_p", default=0), - min=-Min("sum_m", default=0), - ).values(), - ), - "years_max": _history.aggregate(max=Max(Abs("sum")))["max"], + "data": _data, + "max": { + "pm": max( + _history.aggregate( + max=Max("sum_p", default=0), + min=-Min("sum_m", default=0), + ).values(), + ), + "sum": _history.aggregate(max=Max(Abs("sum")))["max"], + }, } diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index 631d3c4..0ec7189 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -65,12 +65,17 @@ table.full-width col.bar { } } } - tr.empty { - height: 0.5rem; - } - tr.even { - background: #eeeeff; + + tbody tr { + background: initial; + &.empty { + height: 0.5rem; + } + &.even { + background: #eeeeff; + } } + tfoot { background: var(--bg-01); } @@ -78,22 +83,23 @@ table.full-width col.bar { .calendar { margin-top: var(--gap); + font-feature-settings: var(--num); - tbody tr { - background: initial; - } .p { background: var(--green); } .m { background: var(--red); } - tbody tr { - &:not(:last-child) { - border-bottom: none; - } - &:not(:first-child) { - border-top: none; + table { + tbody tr { + background: initial; + &:not(:last-child) { + border-bottom: none; + } + &:not(:first-child) { + border-top: none; + } } } } diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index 670bda9..8fca38e 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -1,7 +1,10 @@ +import datetime import math from django import template +from django.template.defaultfilters import date from django.templatetags.static import static +from django.urls import reverse from django.utils import formats from django.utils.safestring import mark_safe @@ -73,4 +76,68 @@ def css(href): @register.simple_tag def opacity(v, vmax): - return f"{math.sin(math.fabs(v/vmax)*math.pi/2):.2f}" + return f"{math.sin(math.fabs(v/vmax)*math.pi/2):.3f}" + + +@register.simple_tag +def empty_calendar_cells(n): + return mark_safe(n * "") + + +@register.simple_tag +def empty_calendar_cells_start(n): + return empty_calendar_cells(n - 1) + + +@register.simple_tag +def empty_calendar_cells_end(n): + return empty_calendar_cells(12 - n) + + +@register.simple_tag +def up_down_icon(val): + if val > 0: + return mark_safe("""""") + elif val < 0: + return mark_safe("""""") + + +@register.simple_tag +def month_url(month, account=None, category=None): + url_name = "transaction_month" + url_params = {"year": month.year, "month": month.month} + + if account: + url_name = "account_" + url_name + url_params |= {"account": account.pk} + elif category: + url_name = "category_" + url_name + url_params |= {"category": category.pk} + + url = reverse(url_name, kwargs=url_params) + return mark_safe(f"""{ date(month, "Y-m") }""") + + +@register.simple_tag +def plot_bar(s, sum_pm, s_max): + _res = "" + + if sum_pm: + _w = abs(sum_pm / s_max) + _res += f"""
""" + if sum_pm is not None and s * sum_pm > 0: + _w = abs(s / s_max) + _res += ( + f"""
""" + f"""{pmrvalue(s)}
""" + ) + + return mark_safe(_res) + + +@register.simple_tag +def calendar_head(): + months = (datetime.date(1, m + 1, 1) for m in range(12)) + th = (f"""{date(month, "m")}""" for month in months) + + return mark_safe("".join(th)) From 003902b43f9323c9a37f1867af0dc013f5b6e60d Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 11:00:56 +0100 Subject: [PATCH 061/213] Minor style updates --- nummi/main/static/main/css/main.css | 4 +++- nummi/main/static/main/css/table.css | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 4ec7b8e..62a7a6b 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -39,7 +39,8 @@ --border: 0.5em; --radius: 0.25em; - --num: "tnum", "ss01", "ss02", "case"; + --default-ffs: "dlig", "ss01", "ss04"; + --num: var(--default-ffs), "tnum", "case"; } body { @@ -51,6 +52,7 @@ body { display: grid; grid-template-columns: max-content 1fr; + font-feature-settings: var(--default-ffs); } p { diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index 5116345..0092937 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -26,7 +26,7 @@ table { height: 2rem; line-height: 2rem; - tbody &:nth-of-type(even) { + tbody &:where(:nth-of-type(even)) { background: #eeeeff; } } From 45b47dd1bac80335fece6ebfe34d41f0843ebadd Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 11:11:05 +0100 Subject: [PATCH 062/213] Move templatetags to history templatetags --- nummi/history/templates/history/plot.html | 3 +- nummi/history/templatetags/history_extras.py | 78 ++++++++++++++++++++ nummi/main/templatetags/main_extras.py | 74 ------------------- 3 files changed, 80 insertions(+), 75 deletions(-) create mode 100644 nummi/history/templatetags/history_extras.py diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 8d9bad4..49a52f2 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -1,4 +1,5 @@ {% load main_extras %} +{% load history_extras %} {% load i18n %}
@@ -58,7 +59,7 @@ {% endif %} {% if m %} + style="opacity: {% calendar_opacity m.sum history.max.sum %}"> {% else %} {% endif %} diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py new file mode 100644 index 0000000..1efb7ec --- /dev/null +++ b/nummi/history/templatetags/history_extras.py @@ -0,0 +1,78 @@ +import math + +from django import template +from django.template.defaultfilters import date +from django.urls import reverse +from django.utils.safestring import mark_safe +from main.templatetags.main_extras import pmrvalue, remix + +register = template.Library() + + +@register.simple_tag +def calendar_opacity(v, vmax): + return f"{math.sin(math.fabs(v/vmax)*math.pi/2):.3f}" + + +@register.simple_tag +def empty_calendar_cells(n): + return mark_safe(n * "") + + +@register.simple_tag +def empty_calendar_cells_start(n): + return empty_calendar_cells(n - 1) + + +@register.simple_tag +def empty_calendar_cells_end(n): + return empty_calendar_cells(12 - n) + + +@register.simple_tag +def up_down_icon(val): + if val > 0: + return remix("arrow-up-s", "green") + elif val < 0: + return remix("arrow-down-s", "red") + + +@register.simple_tag +def month_url(month, account=None, category=None): + url_name = "transaction_month" + url_params = {"year": month.year, "month": month.month} + + if account: + url_name = "account_" + url_name + url_params |= {"account": account.pk} + elif category: + url_name = "category_" + url_name + url_params |= {"category": category.pk} + + url = reverse(url_name, kwargs=url_params) + return mark_safe(f"""{ date(month, "Y-m") }""") + + +@register.simple_tag +def plot_bar(s, sum_pm, s_max): + _res = "" + + if sum_pm: + _w = abs(sum_pm / s_max) + _res += f"""
""" + if sum_pm is not None and s * sum_pm > 0: + _w = abs(s / s_max) + _res += ( + f"""
""" + f"""{pmrvalue(s)}
""" + ) + + return mark_safe(_res) + + +@register.simple_tag +def calendar_head(): + months = range(1, 13) + th = (f"""""" for month in months) + + return mark_safe("".join(th)) diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index 8fca38e..a85d8db 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -1,10 +1,5 @@ -import datetime -import math - from django import template -from django.template.defaultfilters import date from django.templatetags.static import static -from django.urls import reverse from django.utils import formats from django.utils.safestring import mark_safe @@ -72,72 +67,3 @@ def css(href): return mark_safe( f"""""" ) - - -@register.simple_tag -def opacity(v, vmax): - return f"{math.sin(math.fabs(v/vmax)*math.pi/2):.3f}" - - -@register.simple_tag -def empty_calendar_cells(n): - return mark_safe(n * "") - - -@register.simple_tag -def empty_calendar_cells_start(n): - return empty_calendar_cells(n - 1) - - -@register.simple_tag -def empty_calendar_cells_end(n): - return empty_calendar_cells(12 - n) - - -@register.simple_tag -def up_down_icon(val): - if val > 0: - return mark_safe("""""") - elif val < 0: - return mark_safe("""""") - - -@register.simple_tag -def month_url(month, account=None, category=None): - url_name = "transaction_month" - url_params = {"year": month.year, "month": month.month} - - if account: - url_name = "account_" + url_name - url_params |= {"account": account.pk} - elif category: - url_name = "category_" + url_name - url_params |= {"category": category.pk} - - url = reverse(url_name, kwargs=url_params) - return mark_safe(f"""{ date(month, "Y-m") }""") - - -@register.simple_tag -def plot_bar(s, sum_pm, s_max): - _res = "" - - if sum_pm: - _w = abs(sum_pm / s_max) - _res += f"""
""" - if sum_pm is not None and s * sum_pm > 0: - _w = abs(s / s_max) - _res += ( - f"""
""" - f"""{pmrvalue(s)}
""" - ) - - return mark_safe(_res) - - -@register.simple_tag -def calendar_head(): - months = (datetime.date(1, m + 1, 1) for m in range(12)) - th = (f"""""" for month in months) - - return mark_safe("".join(th)) From caa113859d24df4bbf8c10692977e531c7e48c49 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 11:45:06 +0100 Subject: [PATCH 063/213] Add year archive view --- .../transaction/transaction_archive_year.html | 23 +++++++++++ nummi/transaction/urls.py | 5 +++ nummi/transaction/views.py | 39 ++++++++++++++++++- 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 nummi/transaction/templates/transaction/transaction_archive_year.html diff --git a/nummi/transaction/templates/transaction/transaction_archive_year.html b/nummi/transaction/templates/transaction/transaction_archive_year.html new file mode 100644 index 0000000..2f0cf71 --- /dev/null +++ b/nummi/transaction/templates/transaction/transaction_archive_year.html @@ -0,0 +1,23 @@ +{% extends "transaction/transaction_list.html" %} +{% load i18n main_extras static category %} +{% block link %} + {{ block.super }} + {% css "main/css/plot.css" %} +{% endblock %} +{% block h2 %}{{ year|date:"Y" }}{% endblock %} +{% block table %} + {% if history %} +
+

+ {% translate "History" %} +

+ {% include "history/plot.html" %} +
+ {% endif %} + {% if not category %} +

{% translate "Categories" %}

+ {% category_plot transactions month=month %} + {% endif %} +

{% translate "Transactions" %}

+ {{ block.super }} +{% endblock %} diff --git a/nummi/transaction/urls.py b/nummi/transaction/urls.py index cba5e2e..7c62eb8 100644 --- a/nummi/transaction/urls.py +++ b/nummi/transaction/urls.py @@ -4,6 +4,11 @@ from . import views urlpatterns = [ path("list", views.TransactionListView.as_view(), name="transactions"), + path( + "history/", + views.TransactionYearView.as_view(), + name="transaction_year", + ), path( "history//", views.TransactionMonthView.as_view(), diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index f7464cd..fb1a900 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -2,7 +2,8 @@ from account.models import Account from category.models import Category from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy -from django.views.generic.dates import MonthArchiveView +from django.views.generic.dates import MonthArchiveView, YearArchiveView +from history.utils import history from main.views import ( NummiCreateView, NummiDeleteView, @@ -138,3 +139,39 @@ class TransactionMonthView(UserMixin, MonthArchiveView): if "account" in self.kwargs: return context_data | {"account": self.account} return context_data + + +class TransactionYearView(UserMixin, YearArchiveView): + model = Transaction + date_field = "date" + context_object_name = "transactions" + make_object_list = True + + def get_queryset(self): + if "account" in self.kwargs: + self.account = get_object_or_404( + Account.objects.filter(user=self.request.user), + pk=self.kwargs["account"], + ) + return super().get_queryset().filter(account=self.account) + if "category" in self.kwargs: + self.category = get_object_or_404( + Category.objects.filter(user=self.request.user), + pk=self.kwargs["category"], + ) + return super().get_queryset().filter(category=self.category) + + return super().get_queryset() + + def get_context_data(self, **kwargs): + context_data = super().get_context_data(**kwargs) + context_data |= { + "history": history( + context_data["transactions"].exclude(category__budget=False) + ), + } + if "category" in self.kwargs: + return context_data | {"category": self.category} + if "account" in self.kwargs: + return context_data | {"account": self.account} + return context_data From 3dbc31eebccc343a22f609405362d8d050a1b5a2 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 11:47:58 +0100 Subject: [PATCH 064/213] Fix row colors in category plot --- nummi/main/static/main/css/plot.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index 0ec7189..4f7e7fa 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -66,8 +66,10 @@ table.full-width col.bar { } } - tbody tr { + .history & tbody tr { background: initial; + } + tbody tr { &.empty { height: 0.5rem; } From 75df57f42a62cd4cad477e447218f27e37292506 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 11:52:04 +0100 Subject: [PATCH 065/213] Update year view (add link) --- nummi/history/templates/history/plot.html | 4 +++- .../templates/transaction/transaction_archive_year.html | 5 ++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 49a52f2..f8d041c 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -52,7 +52,9 @@ {% regroup history.data by month.year as years_list %} {% for y, year in years_list reversed %}
- + {% for m in year %} {% if forloop.parentloop.last and forloop.first %} {% empty_calendar_cells_start m.month.month %} diff --git a/nummi/transaction/templates/transaction/transaction_archive_year.html b/nummi/transaction/templates/transaction/transaction_archive_year.html index 2f0cf71..671f13c 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_year.html +++ b/nummi/transaction/templates/transaction/transaction_archive_year.html @@ -1,9 +1,10 @@ -{% extends "transaction/transaction_list.html" %} +{% extends "main/list.html" %} {% load i18n main_extras static category %} {% block link %} {{ block.super }} {% css "main/css/plot.css" %} {% endblock %} +{% block name %}{{ year|date:"Y" }}{% endblock %} {% block h2 %}{{ year|date:"Y" }}{% endblock %} {% block table %} {% if history %} @@ -18,6 +19,4 @@

{% translate "Categories" %}

{% category_plot transactions month=month %} {% endif %} -

{% translate "Transactions" %}

- {{ block.super }} {% endblock %} From 309281f5e10496d0b772b8ce742741006cc0b939 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 11:55:54 +0100 Subject: [PATCH 066/213] Fix row colors in history plot --- nummi/history/templates/history/plot.html | 2 +- nummi/main/static/main/css/plot.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index f8d041c..6231995 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -1,7 +1,7 @@ {% load main_extras %} {% load history_extras %} {% load i18n %} -
+
{month:02d}{date(month, "m")}
{{ y }} + {{ y }} +
diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index 4f7e7fa..c568d3d 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -66,7 +66,7 @@ table.full-width col.bar { } } - .history & tbody tr { + &.history tbody tr { background: initial; } tbody tr { From 8b9af8e1a487fe5187b2fada243656e9e2eda4b0 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 11:59:44 +0100 Subject: [PATCH 067/213] Add links to category in year category plot --- nummi/category/templates/category/category_plot.html | 2 ++ nummi/category/urls.py | 7 ++++++- .../templates/transaction/transaction_archive_year.html | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index ca855a0..63577af 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -24,6 +24,8 @@ {% if cat.category %} {% if month %} {{ cat.category__name }} + {% elif year %} + {{ cat.category__name }} {% else %} {{ cat.category__name }} {% endif %} diff --git a/nummi/category/urls.py b/nummi/category/urls.py index 5bdc9c1..64b8ae9 100644 --- a/nummi/category/urls.py +++ b/nummi/category/urls.py @@ -1,5 +1,5 @@ from django.urls import path -from transaction.views import TransactionMonthView +from transaction.views import TransactionMonthView, TransactionYearView from . import views @@ -12,6 +12,11 @@ urlpatterns = [ name="category_transactions", ), path("/delete", views.CategoryDeleteView.as_view(), name="del_category"), + path( + "/history/", + TransactionYearView.as_view(), + name="category_transaction_year", + ), path( "/history//", TransactionMonthView.as_view(), diff --git a/nummi/transaction/templates/transaction/transaction_archive_year.html b/nummi/transaction/templates/transaction/transaction_archive_year.html index 671f13c..e602fc7 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_year.html +++ b/nummi/transaction/templates/transaction/transaction_archive_year.html @@ -17,6 +17,6 @@ {% endif %} {% if not category %}

{% translate "Categories" %}

- {% category_plot transactions month=month %} + {% category_plot transactions year=year %} {% endif %} {% endblock %} From 60f84fe20df2a29bf63ae828d78c9751f69399fd Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 12:06:20 +0100 Subject: [PATCH 068/213] Add pagination to year archive view --- nummi/main/templates/main/pagination.html | 13 +++++++++++++ nummi/main/templates/main/pagination_month.html | 2 +- nummi/main/templates/main/pagination_year.html | 5 +++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 nummi/main/templates/main/pagination_year.html diff --git a/nummi/main/templates/main/pagination.html b/nummi/main/templates/main/pagination.html index 7147be0..7f32ea2 100644 --- a/nummi/main/templates/main/pagination.html +++ b/nummi/main/templates/main/pagination.html @@ -20,3 +20,16 @@ {% endwith %}

{% endif %} +{% if year %} +

+ {% with year=previous_year %} + {% include "main/pagination_year.html" %} + {% endwith %} + {% with cur=True %} + {% include "main/pagination_year.html" %} + {% endwith %} + {% with year=next_year %} + {% include "main/pagination_year.html" %} + {% endwith %} +

+{% endif %} diff --git a/nummi/main/templates/main/pagination_month.html b/nummi/main/templates/main/pagination_month.html index 207b354..288427a 100644 --- a/nummi/main/templates/main/pagination_month.html +++ b/nummi/main/templates/main/pagination_month.html @@ -1,5 +1,5 @@ {% load i18n %} {% if month %} {{ month|date:"F Y"|capfirst }} + href="{% if account %}{% url "account_transaction_month" account.id month.year month.month %}{% elif category %}{% url "category_transaction_month" category.id month.year month.month %}{% else %}{% url "transaction_month" month.year month.month %}{% endif %}">{{ month|date:"F Y"|capfirst }} {% endif %} diff --git a/nummi/main/templates/main/pagination_year.html b/nummi/main/templates/main/pagination_year.html new file mode 100644 index 0000000..5c9bd3c --- /dev/null +++ b/nummi/main/templates/main/pagination_year.html @@ -0,0 +1,5 @@ +{% load i18n %} +{% if year %} + {{ year|date:"Y" }} +{% endif %} From 2f32c2b80f279d4c2c0060d10090e22e0d950094 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 12:13:57 +0100 Subject: [PATCH 069/213] Fix year urls on account pages --- nummi/account/urls.py | 7 +++++- nummi/history/templates/history/plot.html | 4 +--- nummi/history/templatetags/history_extras.py | 24 ++++++++++++-------- nummi/history/utils.py | 11 +++++++++ 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/nummi/account/urls.py b/nummi/account/urls.py index e15f4d4..d9b8c14 100644 --- a/nummi/account/urls.py +++ b/nummi/account/urls.py @@ -1,6 +1,6 @@ from django.urls import path from statement.views import StatementCreateView -from transaction.views import TransactionMonthView +from transaction.views import TransactionMonthView, TransactionYearView from . import views @@ -27,6 +27,11 @@ urlpatterns = [ views.AccountDeleteView.as_view(), name="del_account", ), + path( + "/history/", + TransactionYearView.as_view(), + name="account_transaction_year", + ), path( "/history//", TransactionMonthView.as_view(), diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 6231995..954c3ce 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -52,9 +52,7 @@ {% regroup history.data by month.year as years_list %} {% for y, year in years_list reversed %}
- + {% for m in year %} {% if forloop.parentloop.last and forloop.first %} {% empty_calendar_cells_start m.month.month %} diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py index 1efb7ec..3991f8f 100644 --- a/nummi/history/templatetags/history_extras.py +++ b/nummi/history/templatetags/history_extras.py @@ -6,6 +6,8 @@ from django.urls import reverse from django.utils.safestring import mark_safe from main.templatetags.main_extras import pmrvalue, remix +from ..utils import ac_url + register = template.Library() @@ -38,21 +40,23 @@ def up_down_icon(val): @register.simple_tag -def month_url(month, account=None, category=None): - url_name = "transaction_month" - url_params = {"year": month.year, "month": month.month} - - if account: - url_name = "account_" + url_name - url_params |= {"account": account.pk} - elif category: - url_name = "category_" + url_name - url_params |= {"category": category.pk} +def month_url(month, **kwargs): + url_name, url_params = ac_url( + "transaction_month", {"year": month.year, "month": month.month}, **kwargs + ) url = reverse(url_name, kwargs=url_params) return mark_safe(f"""{ date(month, "Y-m") }""") +@register.simple_tag +def year_url(year, **kwargs): + url_name, url_params = ac_url("transaction_year", {"year": year}, **kwargs) + + url = reverse(url_name, kwargs=url_params) + return mark_safe(f"""{ year }""") + + @register.simple_tag def plot_bar(s, sum_pm, s_max): _res = "" diff --git a/nummi/history/utils.py b/nummi/history/utils.py index 423d34e..530a44f 100644 --- a/nummi/history/utils.py +++ b/nummi/history/utils.py @@ -50,3 +50,14 @@ def history(transaction_set): "sum": _history.aggregate(max=Max(Abs("sum")))["max"], }, } + + +def ac_url(url_name, url_params, account=None, category=None): + if account: + url_name = "account_" + url_name + url_params |= {"account": account.pk} + elif category: + url_name = "category_" + url_name + url_params |= {"category": category.pk} + + return url_name, url_params From 1137cfc1ccaa696f18dbbcc7f9f9dae3c7880e72 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 12:21:36 +0100 Subject: [PATCH 070/213] Fix top-gap in main --- nummi/main/static/main/css/main.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 62a7a6b..d48a265 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -137,7 +137,8 @@ nav { } } } -:is(nav, main) > :first-child { +:is(nav, main) > :first-child, +main > section:first-child > :first-child { margin-top: 0; } footer { From 47c4de8fbb5cd813cbfb3f3064c47d566d29c3fc Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 14:18:57 +0100 Subject: [PATCH 071/213] Fix calendar scroll --- nummi/main/static/main/css/plot.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index c568d3d..dcf1771 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -84,6 +84,8 @@ table.full-width col.bar { } .calendar { + overflow-x: auto; + margin-top: var(--gap); font-feature-settings: var(--num); From 57279b1cda6abcc6ba7a3bfc64b2993f721dd596 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 14:21:58 +0100 Subject: [PATCH 072/213] Simplify duplicated code (archive views) --- nummi/transaction/views.py | 79 +++++++++++++++----------------------- 1 file changed, 31 insertions(+), 48 deletions(-) diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index fb1a900..2421c12 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -110,68 +110,51 @@ class TransactionListView(NummiListView): context_object_name = "transactions" -class TransactionMonthView(UserMixin, MonthArchiveView): +class TransactionACMixin: + model = Transaction + + def get_queryset(self): + if "account" in self.kwargs: + self.account = get_object_or_404( + Account.objects.filter(user=self.request.user), + pk=self.kwargs["account"], + ) + return super().get_queryset().filter(account=self.account) + if "category" in self.kwargs: + self.category = get_object_or_404( + Category.objects.filter(user=self.request.user), + pk=self.kwargs["category"], + ) + return super().get_queryset().filter(category=self.category) + + return super().get_queryset() + + def get_context_data(self, **kwargs): + context_data = super().get_context_data(**kwargs) + if "category" in self.kwargs: + return context_data | {"category": self.category} + if "account" in self.kwargs: + return context_data | {"account": self.account} + return context_data + + +class TransactionMonthView(UserMixin, TransactionACMixin, MonthArchiveView): model = Transaction date_field = "date" context_object_name = "transactions" month_format = "%m" - def get_queryset(self): - if "account" in self.kwargs: - self.account = get_object_or_404( - Account.objects.filter(user=self.request.user), - pk=self.kwargs["account"], - ) - return super().get_queryset().filter(account=self.account) - if "category" in self.kwargs: - self.category = get_object_or_404( - Category.objects.filter(user=self.request.user), - pk=self.kwargs["category"], - ) - return super().get_queryset().filter(category=self.category) - return super().get_queryset() - - def get_context_data(self, **kwargs): - context_data = super().get_context_data(**kwargs) - if "category" in self.kwargs: - return context_data | {"category": self.category} - if "account" in self.kwargs: - return context_data | {"account": self.account} - return context_data - - -class TransactionYearView(UserMixin, YearArchiveView): +class TransactionYearView(UserMixin, TransactionACMixin, YearArchiveView): model = Transaction date_field = "date" context_object_name = "transactions" make_object_list = True - def get_queryset(self): - if "account" in self.kwargs: - self.account = get_object_or_404( - Account.objects.filter(user=self.request.user), - pk=self.kwargs["account"], - ) - return super().get_queryset().filter(account=self.account) - if "category" in self.kwargs: - self.category = get_object_or_404( - Category.objects.filter(user=self.request.user), - pk=self.kwargs["category"], - ) - return super().get_queryset().filter(category=self.category) - - return super().get_queryset() - def get_context_data(self, **kwargs): context_data = super().get_context_data(**kwargs) - context_data |= { + return context_data | { "history": history( context_data["transactions"].exclude(category__budget=False) ), } - if "category" in self.kwargs: - return context_data | {"category": self.category} - if "account" in self.kwargs: - return context_data | {"account": self.account} - return context_data From 35b26f2d1032e160aa3acb5e174a85c7ca7c6e1c Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 14:35:39 +0100 Subject: [PATCH 073/213] Add year link on month view --- nummi/history/templates/history/plot.html | 1 + nummi/history/templatetags/history_extras.py | 22 ------------- nummi/history/utils.py | 18 +---------- nummi/main/templates/main/list.html | 32 ++++++++++--------- nummi/main/templates/main/pagination.html | 3 +- .../transaction_archive_month.html | 2 +- .../templatetags/transaction_extras.py | 26 +++++++++++++++ nummi/transaction/utils.py | 9 ++++++ 8 files changed, 57 insertions(+), 56 deletions(-) create mode 100644 nummi/transaction/templatetags/transaction_extras.py create mode 100644 nummi/transaction/utils.py diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 954c3ce..23a5035 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -1,5 +1,6 @@ {% load main_extras %} {% load history_extras %} +{% load transaction_extras %} {% load i18n %}
- {{ y }} - {% year_url y account=account category=category %}
diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py index 3991f8f..48a8aaf 100644 --- a/nummi/history/templatetags/history_extras.py +++ b/nummi/history/templatetags/history_extras.py @@ -1,13 +1,9 @@ import math from django import template -from django.template.defaultfilters import date -from django.urls import reverse from django.utils.safestring import mark_safe from main.templatetags.main_extras import pmrvalue, remix -from ..utils import ac_url - register = template.Library() @@ -39,24 +35,6 @@ def up_down_icon(val): return remix("arrow-down-s", "red") -@register.simple_tag -def month_url(month, **kwargs): - url_name, url_params = ac_url( - "transaction_month", {"year": month.year, "month": month.month}, **kwargs - ) - - url = reverse(url_name, kwargs=url_params) - return mark_safe(f"""{ date(month, "Y-m") }""") - - -@register.simple_tag -def year_url(year, **kwargs): - url_name, url_params = ac_url("transaction_year", {"year": year}, **kwargs) - - url = reverse(url_name, kwargs=url_params) - return mark_safe(f"""{ year }""") - - @register.simple_tag def plot_bar(s, sum_pm, s_max): _res = "" diff --git a/nummi/history/utils.py b/nummi/history/utils.py index 530a44f..320c10a 100644 --- a/nummi/history/utils.py +++ b/nummi/history/utils.py @@ -1,14 +1,9 @@ import datetime -from django.db.models import Func, Max, Min, Q, Sum +from django.db.models import Max, Min, Q, Sum from django.db.models.functions import Abs, TruncMonth -class GenerateMonth(Func): - function = "generate_series" - template = "%(function)s(%(expressions)s, '1 month')::date" - - def history(transaction_set): if not transaction_set.exists(): return None @@ -50,14 +45,3 @@ def history(transaction_set): "sum": _history.aggregate(max=Max(Abs("sum")))["max"], }, } - - -def ac_url(url_name, url_params, account=None, category=None): - if account: - url_name = "account_" + url_name - url_params |= {"account": account.pk} - elif category: - url_name = "category_" + url_name - url_params |= {"category": category.pk} - - return url_name, url_params diff --git a/nummi/main/templates/main/list.html b/nummi/main/templates/main/list.html index ee3050e..cd223b7 100644 --- a/nummi/main/templates/main/list.html +++ b/nummi/main/templates/main/list.html @@ -19,21 +19,23 @@

{% block h2 %}{% endblock %}

- {% if account %} -

- {{ account.icon|remix }}{{ account }} -

- {% endif %} - {% if category %} -

- {{ category.icon|remix }}{{ category }} -

- {% endif %} - {% if search %} -

- {% translate "Search" %} -

- {% endif %} + {% block backlinks %} + {% if account %} +

+ {{ account.icon|remix }}{{ account }} +

+ {% endif %} + {% if category %} +

+ {{ category.icon|remix }}{{ category }} +

+ {% endif %} + {% if search %} +

+ {% translate "Search" %} +

+ {% endif %} + {% endblock %} {% include "main/pagination.html" %} {% block table %}{% endblock %} {% include "main/pagination.html" %} diff --git a/nummi/main/templates/main/pagination.html b/nummi/main/templates/main/pagination.html index 7f32ea2..54e9e12 100644 --- a/nummi/main/templates/main/pagination.html +++ b/nummi/main/templates/main/pagination.html @@ -1,4 +1,4 @@ -{% load i18n %} +{% load i18n transaction_extras %} {% if page_obj %}

{% for page in paginator.page_range %} @@ -8,6 +8,7 @@

{% endif %} {% if month %} +

{% year_url month.year account=account category=category %}

{% with month=previous_month %} {% include "main/pagination_month.html" %} diff --git a/nummi/transaction/templates/transaction/transaction_archive_month.html b/nummi/transaction/templates/transaction/transaction_archive_month.html index 3b71c4e..4ecaa53 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_month.html +++ b/nummi/transaction/templates/transaction/transaction_archive_month.html @@ -1,5 +1,5 @@ {% extends "transaction/transaction_list.html" %} -{% load i18n main_extras static category %} +{% load i18n main_extras transaction_extras static category %} {% block link %} {{ block.super }} {% css "main/css/plot.css" %} diff --git a/nummi/transaction/templatetags/transaction_extras.py b/nummi/transaction/templatetags/transaction_extras.py new file mode 100644 index 0000000..d55b3e0 --- /dev/null +++ b/nummi/transaction/templatetags/transaction_extras.py @@ -0,0 +1,26 @@ +from django import template +from django.template.defaultfilters import date +from django.urls import reverse +from django.utils.safestring import mark_safe + +from ..utils import ac_url + +register = template.Library() + + +@register.simple_tag +def month_url(month, **kwargs): + url_name, url_params = ac_url( + "transaction_month", {"year": month.year, "month": month.month}, **kwargs + ) + + url = reverse(url_name, kwargs=url_params) + return mark_safe(f"""{ date(month, "Y-m") }""") + + +@register.simple_tag +def year_url(year, **kwargs): + url_name, url_params = ac_url("transaction_year", {"year": year}, **kwargs) + + url = reverse(url_name, kwargs=url_params) + return mark_safe(f"""{ year }""") diff --git a/nummi/transaction/utils.py b/nummi/transaction/utils.py new file mode 100644 index 0000000..25102e9 --- /dev/null +++ b/nummi/transaction/utils.py @@ -0,0 +1,9 @@ +def ac_url(url_name, url_params, account=None, category=None): + if account: + url_name = "account_" + url_name + url_params |= {"account": account.pk} + elif category: + url_name = "category_" + url_name + url_params |= {"category": category.pk} + + return url_name, url_params From 2ba21fbd10cce71942bbe5579505d6c9c5686d01 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 14:56:13 +0100 Subject: [PATCH 074/213] Refactor pagination for month/year --- nummi/history/templates/history/plot.html | 4 +- nummi/main/static/main/css/main.css | 17 +++++++++ nummi/main/templates/main/pagination.html | 38 +++++++++---------- .../main/templates/main/pagination_month.html | 5 --- .../main/templates/main/pagination_year.html | 5 --- .../templatetags/transaction_extras.py | 20 ++++++---- nummi/transaction/utils.py | 6 +-- 7 files changed, 51 insertions(+), 44 deletions(-) delete mode 100644 nummi/main/templates/main/pagination_month.html delete mode 100644 nummi/main/templates/main/pagination_year.html diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 23a5035..fdc756d 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -25,7 +25,7 @@ {% if date.sum_m or date.sum_p %}

- + @@ -53,7 +53,7 @@ {% regroup history.data by month.year as years_list %} {% for y, year in years_list reversed %} - + {% for m in year %} {% if forloop.parentloop.last and forloop.first %} {% empty_calendar_cells_start m.month.month %} diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index d48a265..3fa85f8 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -163,6 +163,23 @@ footer { } } } + + &.n3 { + display: grid; + grid-template-columns: repeat(3, 1fr); + width: max-content; + margin: auto; + + .prev { + grid-column: 1; + } + .cur { + grid-column: 2; + } + .next { + grid-column: 3; + } + } } @media (width < 1024px) { diff --git a/nummi/main/templates/main/pagination.html b/nummi/main/templates/main/pagination.html index 54e9e12..0370ae0 100644 --- a/nummi/main/templates/main/pagination.html +++ b/nummi/main/templates/main/pagination.html @@ -8,29 +8,25 @@

{% endif %} {% if month %} -

{% year_url month.year account=account category=category %}

-

- {% with month=previous_month %} - {% include "main/pagination_month.html" %} - {% endwith %} - {% with cur=True %} - {% include "main/pagination_month.html" %} - {% endwith %} - {% with month=next_month %} - {% include "main/pagination_month.html" %} - {% endwith %} +

{% year_url month %}

+

+ {% if previous_month %} + {% month_url previous_month %} + {% endif %} + {% month_url month cls="cur" %} + {% if next_month %} + {% month_url next_month %} + {% endif %}

{% endif %} {% if year %} -

- {% with year=previous_year %} - {% include "main/pagination_year.html" %} - {% endwith %} - {% with cur=True %} - {% include "main/pagination_year.html" %} - {% endwith %} - {% with year=next_year %} - {% include "main/pagination_year.html" %} - {% endwith %} +

+ {% if previous_year %} + {% year_url previous_year cls="prev" %} + {% endif %} + {% year_url year cls="cur" %} + {% if next_year %} + {% year_url next_year cls="next" %} + {% endif %}

{% endif %} diff --git a/nummi/main/templates/main/pagination_month.html b/nummi/main/templates/main/pagination_month.html deleted file mode 100644 index 288427a..0000000 --- a/nummi/main/templates/main/pagination_month.html +++ /dev/null @@ -1,5 +0,0 @@ -{% load i18n %} -{% if month %} - {{ month|date:"F Y"|capfirst }} -{% endif %} diff --git a/nummi/main/templates/main/pagination_year.html b/nummi/main/templates/main/pagination_year.html deleted file mode 100644 index 5c9bd3c..0000000 --- a/nummi/main/templates/main/pagination_year.html +++ /dev/null @@ -1,5 +0,0 @@ -{% load i18n %} -{% if year %} - {{ year|date:"Y" }} -{% endif %} diff --git a/nummi/transaction/templatetags/transaction_extras.py b/nummi/transaction/templatetags/transaction_extras.py index d55b3e0..f42aafe 100644 --- a/nummi/transaction/templatetags/transaction_extras.py +++ b/nummi/transaction/templatetags/transaction_extras.py @@ -1,3 +1,5 @@ +import datetime + from django import template from django.template.defaultfilters import date from django.urls import reverse @@ -8,19 +10,21 @@ from ..utils import ac_url register = template.Library() -@register.simple_tag -def month_url(month, **kwargs): +@register.simple_tag(takes_context=True) +def month_url(context, month, cls=""): url_name, url_params = ac_url( - "transaction_month", {"year": month.year, "month": month.month}, **kwargs + "transaction_month", {"year": month.year, "month": month.month}, context ) url = reverse(url_name, kwargs=url_params) - return mark_safe(f"""{ date(month, "Y-m") }""") + return mark_safe(f"""{ date(month, "Y-m") }""") -@register.simple_tag -def year_url(year, **kwargs): - url_name, url_params = ac_url("transaction_year", {"year": year}, **kwargs) +@register.simple_tag(takes_context=True) +def year_url(context, year, cls=""): + if isinstance(year, datetime.date): + year = year.year + url_name, url_params = ac_url("transaction_year", {"year": year}, context) url = reverse(url_name, kwargs=url_params) - return mark_safe(f"""{ year }""") + return mark_safe(f"""{ year }""") diff --git a/nummi/transaction/utils.py b/nummi/transaction/utils.py index 25102e9..399dcc2 100644 --- a/nummi/transaction/utils.py +++ b/nummi/transaction/utils.py @@ -1,8 +1,8 @@ -def ac_url(url_name, url_params, account=None, category=None): - if account: +def ac_url(url_name, url_params, context): + if account := context.get("account"): url_name = "account_" + url_name url_params |= {"account": account.pk} - elif category: + elif category := context.get("category"): url_name = "category_" + url_name url_params |= {"category": category.pk} From f8c0f9dced6a763b113012cbc33281dc53267643 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 15:00:27 +0100 Subject: [PATCH 075/213] Change date format in month pagination --- nummi/main/templates/main/pagination.html | 6 +++--- nummi/transaction/templatetags/transaction_extras.py | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/nummi/main/templates/main/pagination.html b/nummi/main/templates/main/pagination.html index 0370ae0..ffb5d3e 100644 --- a/nummi/main/templates/main/pagination.html +++ b/nummi/main/templates/main/pagination.html @@ -11,11 +11,11 @@

{% year_url month %}

{% if previous_month %} - {% month_url previous_month %} + {% month_url previous_month fmt="F Y" %} {% endif %} - {% month_url month cls="cur" %} + {% month_url month cls="cur" fmt="F Y" %} {% if next_month %} - {% month_url next_month %} + {% month_url next_month fmt="F Y" %} {% endif %}

{% endif %} diff --git a/nummi/transaction/templatetags/transaction_extras.py b/nummi/transaction/templatetags/transaction_extras.py index f42aafe..a042cd3 100644 --- a/nummi/transaction/templatetags/transaction_extras.py +++ b/nummi/transaction/templatetags/transaction_extras.py @@ -11,13 +11,15 @@ register = template.Library() @register.simple_tag(takes_context=True) -def month_url(context, month, cls=""): +def month_url(context, month, cls="", fmt="Y-m"): url_name, url_params = ac_url( "transaction_month", {"year": month.year, "month": month.month}, context ) url = reverse(url_name, kwargs=url_params) - return mark_safe(f"""{ date(month, "Y-m") }""") + return mark_safe( + f"""{date(month, fmt).capitalize()}""" + ) @register.simple_tag(takes_context=True) From 3fd87ff370689e1082757a097e7ba20861812472 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 15:03:45 +0100 Subject: [PATCH 076/213] Update month page template --- .../transaction/transaction_archive_month.html | 6 ++++-- .../transaction/transaction_archive_year.html | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/nummi/transaction/templates/transaction/transaction_archive_month.html b/nummi/transaction/templates/transaction/transaction_archive_month.html index 4ecaa53..7c6b8a6 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_month.html +++ b/nummi/transaction/templates/transaction/transaction_archive_month.html @@ -6,10 +6,12 @@ {% endblock %} {% block h2 %}{{ month|date:"F Y"|capfirst }}{% endblock %} {% block table %} -

{% translate "Transactions" %}

- {{ block.super }} {% if not category %}

{% translate "Categories" %}

{% category_plot transactions month=month %} {% endif %} +
+

{% translate "Transactions" %}

+ {{ block.super }} +
{% endblock %} diff --git a/nummi/transaction/templates/transaction/transaction_archive_year.html b/nummi/transaction/templates/transaction/transaction_archive_year.html index e602fc7..da069d7 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_year.html +++ b/nummi/transaction/templates/transaction/transaction_archive_year.html @@ -9,14 +9,14 @@ {% block table %} {% if history %}
-

- {% translate "History" %} -

+

{% translate "History" %}

{% include "history/plot.html" %}
{% endif %} {% if not category %} -

{% translate "Categories" %}

- {% category_plot transactions year=year %} +
+

{% translate "Categories" %}

+ {% category_plot transactions year=year %} +
{% endif %} {% endblock %} From 5ccae7f4a33d9990885b5884a521644b5dba748d Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 15:07:42 +0100 Subject: [PATCH 077/213] Fix spacing with pagination --- nummi/main/static/main/css/main.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 3fa85f8..38500c5 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -150,6 +150,7 @@ footer { .pagination { text-align: center; font-feature-settings: var(--num); + a { min-width: 1rem; padding: 0 0.5rem; @@ -168,7 +169,7 @@ footer { display: grid; grid-template-columns: repeat(3, 1fr); width: max-content; - margin: auto; + margin: 0.5rem auto; .prev { grid-column: 1; @@ -180,6 +181,10 @@ footer { grid-column: 3; } } + + & + section :first-child { + margin-top: 0; + } } @media (width < 1024px) { From 8ebb940f5b40ad5ce10884d0d17b1376d950c80e Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 15:09:50 +0100 Subject: [PATCH 078/213] Add missing section block in month page --- .../templates/transaction/transaction_archive_month.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/nummi/transaction/templates/transaction/transaction_archive_month.html b/nummi/transaction/templates/transaction/transaction_archive_month.html index 7c6b8a6..e6a2600 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_month.html +++ b/nummi/transaction/templates/transaction/transaction_archive_month.html @@ -7,8 +7,10 @@ {% block h2 %}{{ month|date:"F Y"|capfirst }}{% endblock %} {% block table %} {% if not category %} -

{% translate "Categories" %}

- {% category_plot transactions month=month %} +
+

{% translate "Categories" %}

+ {% category_plot transactions month=month %} +
{% endif %}

{% translate "Transactions" %}

From 87c12f47e9c03dcc16b23f0f372e32c029fbc201 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 15:15:57 +0100 Subject: [PATCH 079/213] Fix pagination on small devices --- nummi/main/static/main/css/main.css | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 38500c5..8a2244f 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -165,20 +165,22 @@ footer { } } - &.n3 { - display: grid; - grid-template-columns: repeat(3, 1fr); - width: max-content; - margin: 0.5rem auto; + @media (width > 720px) { + &.n3 { + display: grid; + grid-template-columns: repeat(3, 1fr); + width: max-content; + margin: 0.5rem auto; - .prev { - grid-column: 1; - } - .cur { - grid-column: 2; - } - .next { - grid-column: 3; + .prev { + grid-column: 1; + } + .cur { + grid-column: 2; + } + .next { + grid-column: 3; + } } } From b4c7f88b3d3d29dcab83cd97cc5b099bfea917aa Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 15:28:24 +0100 Subject: [PATCH 080/213] Add time elements for accessibility --- nummi/statement/templates/statement/statement_table.html | 4 +++- .../templates/transaction/transaction_table.html | 4 +++- nummi/transaction/templatetags/transaction_extras.py | 8 ++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/nummi/statement/templates/statement/statement_table.html b/nummi/statement/templates/statement/statement_table.html index 0139811..57b4b8c 100644 --- a/nummi/statement/templates/statement/statement_table.html +++ b/nummi/statement/templates/statement/statement_table.html @@ -41,7 +41,9 @@ {% if snap.file %}{{ "attachment"|remix }}{% endif %}
{% if not account %} diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index 86ba914..fb89dbf 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -43,7 +43,9 @@ - + diff --git a/nummi/transaction/templatetags/transaction_extras.py b/nummi/transaction/templatetags/transaction_extras.py index a042cd3..30cba01 100644 --- a/nummi/transaction/templatetags/transaction_extras.py +++ b/nummi/transaction/templatetags/transaction_extras.py @@ -18,7 +18,8 @@ def month_url(context, month, cls="", fmt="Y-m"): url = reverse(url_name, kwargs=url_params) return mark_safe( - f"""{date(month, fmt).capitalize()}""" + f"""""" ) @@ -29,4 +30,7 @@ def year_url(context, year, cls=""): url_name, url_params = ac_url("transaction_year", {"year": year}, context) url = reverse(url_name, kwargs=url_params) - return mark_safe(f"""{ year }""") + return mark_safe( + f"""""" + f"""""" + ) From e5cdf19fa38bc8c7ac5997ae73531df9cdb9252d Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 15:42:51 +0100 Subject: [PATCH 081/213] Add transaction list on year view --- .../templates/transaction/transaction_archive_year.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nummi/transaction/templates/transaction/transaction_archive_year.html b/nummi/transaction/templates/transaction/transaction_archive_year.html index da069d7..ea5b395 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_year.html +++ b/nummi/transaction/templates/transaction/transaction_archive_year.html @@ -1,4 +1,4 @@ -{% extends "main/list.html" %} +{% extends "transaction/transaction_list.html" %} {% load i18n main_extras static category %} {% block link %} {{ block.super }} @@ -19,4 +19,8 @@ {% category_plot transactions year=year %} {% endif %} +
+

{% translate "Transactions" %}

+ {{ block.super }} +
{% endblock %} From 6b08113f60a404df539546bf6c6e2ae476dc015e Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 16:04:04 +0100 Subject: [PATCH 082/213] Add back link on month and year page --- .../locale/fr_FR/LC_MESSAGES/django.po | 8 +-- .../locale/fr_FR/LC_MESSAGES/django.po | 10 ++-- .../locale/fr_FR/LC_MESSAGES/django.po | 10 ++-- nummi/main/locale/fr_FR/LC_MESSAGES/django.po | 44 ++++++++-------- nummi/main/static/main/css/main.css | 30 +++++++++-- nummi/main/templates/main/list.html | 36 ++++++------- .../search/locale/fr_FR/LC_MESSAGES/django.po | 4 +- .../locale/fr_FR/LC_MESSAGES/django.po | 20 ++++---- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 1431 -> 1494 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 48 +++++++++++------- .../transaction_archive_month.html | 11 ++++ .../transaction/transaction_archive_year.html | 8 +++ 12 files changed, 142 insertions(+), 87 deletions(-) diff --git a/nummi/account/locale/fr_FR/LC_MESSAGES/django.po b/nummi/account/locale/fr_FR/LC_MESSAGES/django.po index 0d61184..e2b3dd5 100644 --- a/nummi/account/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/account/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-22 15:16+0200\n" +"POT-Creation-Date: 2024-01-02 15:52+0100\n" "PO-Revision-Date: 2023-04-22 15:17+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -45,14 +45,14 @@ msgstr "Créer un compte" msgid "New account" msgstr "Nouveau compte" -#: .\account\templates\account\account_form.html:13 +#: .\account\templates\account\account_form.html:14 msgid "Statements" msgstr "Relevés" -#: .\account\templates\account\account_form.html:15 +#: .\account\templates\account\account_form.html:18 msgid "Transactions" msgstr "Transactions" -#: .\account\templates\account\account_form.html:18 +#: .\account\templates\account\account_form.html:23 msgid "History" msgstr "Historique" diff --git a/nummi/category/locale/fr_FR/LC_MESSAGES/django.po b/nummi/category/locale/fr_FR/LC_MESSAGES/django.po index e5881ca..d59e917 100644 --- a/nummi/category/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/category/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-25 12:05+0100\n" +"POT-Creation-Date: 2024-01-02 15:52+0100\n" "PO-Revision-Date: 2023-04-22 15:18+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -46,11 +46,11 @@ msgstr "Créer une catégorie" msgid "New category" msgstr "Nouvelle catégorie" -#: .\category\templates\category\category_form.html:12 +#: .\category\templates\category\category_form.html:13 msgid "Transactions" msgstr "Transactions" -#: .\category\templates\category\category_form.html:15 +#: .\category\templates\category\category_form.html:18 msgid "History" msgstr "Historique" @@ -62,10 +62,10 @@ msgstr "Dépenses" msgid "Income" msgstr "Revenus" -#: .\category\templates\category\category_plot.html:56 +#: .\category\templates\category\category_plot.html:62 msgid "No transaction" msgstr "Aucune transaction" -#: .\category\templates\category\category_plot.html:64 +#: .\category\templates\category\category_plot.html:70 msgid "Total" msgstr "Total" diff --git a/nummi/history/locale/fr_FR/LC_MESSAGES/django.po b/nummi/history/locale/fr_FR/LC_MESSAGES/django.po index 3df2dfa..50fde9f 100644 --- a/nummi/history/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/history/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-28 15:45+0100\n" +"POT-Creation-Date: 2024-01-02 15:52+0100\n" "PO-Revision-Date: 2023-04-22 15:18+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -17,18 +17,18 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.2.2\n" -#: .\history\templates\history\plot.html:15 +#: .\history\templates\history\plot.html:17 msgid "Month" msgstr "Mois" -#: .\history\templates\history\plot.html:16 +#: .\history\templates\history\plot.html:18 msgid "Expenses" msgstr "Dépenses" -#: .\history\templates\history\plot.html:17 +#: .\history\templates\history\plot.html:19 msgid "Income" msgstr "Revenus" -#: .\history\templates\history\plot.html:68 +#: .\history\templates\history\plot.html:48 msgid "Year" msgstr "Année" diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po index 18f7b5d..378d5ba 100644 --- a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-25 12:05+0100\n" +"POT-Creation-Date: 2024-01-02 15:52+0100\n" "PO-Revision-Date: 2023-04-23 08:03+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -21,67 +21,67 @@ msgstr "" msgid "User" msgstr "Utilisateur" -#: .\main\templates\main\base.html:27 +#: .\main\templates\main\base.html:28 msgid "Skip to main content" msgstr "Aller au contenu principal" -#: .\main\templates\main\base.html:33 +#: .\main\templates\main\base.html:34 msgid "Home" msgstr "Accueil" -#: .\main\templates\main\base.html:38 .\main\templates\main\index.html:40 +#: .\main\templates\main\base.html:39 .\main\templates\main\index.html:43 msgid "Statements" msgstr "Relevés" -#: .\main\templates\main\base.html:44 .\main\templates\main\index.html:24 +#: .\main\templates\main\base.html:45 .\main\templates\main\index.html:23 msgid "Transactions" msgstr "Transactions" -#: .\main\templates\main\base.html:50 +#: .\main\templates\main\base.html:51 msgid "Create account" msgstr "Créer un compte" -#: .\main\templates\main\base.html:55 +#: .\main\templates\main\base.html:56 msgid "Create statement" msgstr "Créer un relevé" -#: .\main\templates\main\base.html:60 +#: .\main\templates\main\base.html:61 msgid "Create category" msgstr "Créer une catégorie" -#: .\main\templates\main\base.html:65 +#: .\main\templates\main\base.html:66 msgid "Create transaction" msgstr "Créer une transaction" -#: .\main\templates\main\base.html:70 .\main\templates\main\list.html:10 +#: .\main\templates\main\base.html:71 .\main\templates\main\list.html:10 #: .\main\templates\main\list.html:36 msgid "Search" msgstr "Rechercher" -#: .\main\templates\main\base.html:73 +#: .\main\templates\main\base.html:74 msgid "Log out" msgstr "Se déconnecter" -#: .\main\templates\main\base.html:78 .\main\templates\main\form\login.html:6 -#: .\main\templates\main\login.html:14 +#: .\main\templates\main\base.html:79 .\main\templates\main\form\login.html:6 +#: .\main\templates\main\login.html:11 msgid "Log in" msgstr "Se connecter" -#: .\main\templates\main\base.html:84 +#: .\main\templates\main\base.html:85 #, python-format msgid "Logged in as %(user)s" msgstr "Connecté en tant que %(user)s" -#: .\main\templates\main\confirm_delete.html:19 +#: .\main\templates\main\confirm_delete.html:15 #, python-format msgid "Are you sure you want do delete %(object)s ?" msgstr "Êtes-vous sûr de vouloir supprimer %(object)s ?" -#: .\main\templates\main\confirm_delete.html:23 +#: .\main\templates\main\confirm_delete.html:19 msgid "Cancel" msgstr "Annuler" -#: .\main\templates\main\confirm_delete.html:24 +#: .\main\templates\main\confirm_delete.html:20 msgid "Confirm" msgstr "Confirmer" @@ -105,23 +105,23 @@ msgstr "Créer" msgid "Save" msgstr "Enregistrer" -#: .\main\templates\main\index.html:15 +#: .\main\templates\main\index.html:12 msgid "Accounts" msgstr "Comptes" -#: .\main\templates\main\index.html:20 +#: .\main\templates\main\index.html:17 msgid "No account" msgstr "Aucun compte" -#: .\main\templates\main\index.html:28 +#: .\main\templates\main\index.html:29 msgid "Categories" msgstr "Catégories" -#: .\main\templates\main\index.html:34 +#: .\main\templates\main\index.html:35 msgid "No category" msgstr "Aucune catégorie" -#: .\main\templates\main\index.html:44 +#: .\main\templates\main\index.html:49 msgid "History" msgstr "Historique" diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 8a2244f..6952422 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -69,9 +69,10 @@ a { &.big-link { margin-right: 1em; - } - &.big-link [class^="ri-"] { - margin-right: 0.5em; + + [class^="ri-"] { + margin-right: 0.5em; + } } } @@ -249,3 +250,26 @@ ul.messages { } } } + +.backlinks { + display: grid; + grid-template-columns: repeat(2, 1fr); + + p { + grid-column: 1; + + &.back { + grid-column: 2; + text-align: right; + + .big-link { + margin-right: 0; + margin-left: 1em; + [class^="ri-"] { + margin-right: 0em; + margin-left: 0.5em; + } + } + } + } +} diff --git a/nummi/main/templates/main/list.html b/nummi/main/templates/main/list.html index cd223b7..57adec0 100644 --- a/nummi/main/templates/main/list.html +++ b/nummi/main/templates/main/list.html @@ -19,23 +19,25 @@

{% block h2 %}{% endblock %}

- {% block backlinks %} - {% if account %} -

- {{ account.icon|remix }}{{ account }} -

- {% endif %} - {% if category %} -

- {{ category.icon|remix }}{{ category }} -

- {% endif %} - {% if search %} -

- {% translate "Search" %} -

- {% endif %} - {% endblock %} + {% include "main/pagination.html" %} {% block table %}{% endblock %} {% include "main/pagination.html" %} diff --git a/nummi/search/locale/fr_FR/LC_MESSAGES/django.po b/nummi/search/locale/fr_FR/LC_MESSAGES/django.po index 5517665..21455e6 100644 --- a/nummi/search/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/search/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-22 15:16+0200\n" +"POT-Creation-Date: 2024-01-02 15:52+0100\n" "PO-Revision-Date: 2023-04-22 15:20+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -18,7 +18,7 @@ msgstr "" "X-Generator: Poedit 3.2.2\n" #: .\search\forms.py:7 .\search\templates\search\search.html:6 -#: .\search\templates\search\search.html:18 +#: .\search\templates\search\search.html:14 #: .\search\templates\search\search_form.html:5 msgid "Search" msgstr "Rechercher" diff --git a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po index c9ae392..69017a9 100644 --- a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-25 12:05+0100\n" +"POT-Creation-Date: 2024-01-02 15:52+0100\n" "PO-Revision-Date: 2023-04-22 15:22+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -38,7 +38,7 @@ msgid "Start value" msgstr "Valeur initiale" #: .\statement\models.py:29 -#: .\statement\templates\statement\statement_table.html:27 +#: .\statement\templates\statement\statement_table.html:28 msgid "Difference" msgstr "Différence" @@ -74,32 +74,32 @@ msgstr "Créer un relevé" msgid "New statement" msgstr "Nouveau relevé" -#: .\statement\templates\statement\statement_form.html:22 +#: .\statement\templates\statement\statement_form.html:23 msgid "Categories" msgstr "Catégories" -#: .\statement\templates\statement\statement_form.html:24 -#: .\statement\templates\statement\statement_table.html:28 +#: .\statement\templates\statement\statement_form.html:27 +#: .\statement\templates\statement\statement_table.html:29 msgid "Transactions" msgstr "Transactions" -#: .\statement\templates\statement\statement_table.html:22 +#: .\statement\templates\statement\statement_table.html:23 msgid "Date" msgstr "Date" -#: .\statement\templates\statement\statement_table.html:24 +#: .\statement\templates\statement\statement_table.html:25 msgid "Account" msgstr "Compte" -#: .\statement\templates\statement\statement_table.html:26 +#: .\statement\templates\statement\statement_table.html:27 msgid "Value" msgstr "Valeur" -#: .\statement\templates\statement\statement_table.html:56 +#: .\statement\templates\statement\statement_table.html:60 msgid "No statement" msgstr "Aucun relevé" -#: .\statement\templates\statement\statement_table.html:64 +#: .\statement\templates\statement\statement_table.html:68 msgid "View all statements" msgstr "Voir tous les relevés" diff --git a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.mo index b34179b90b20d71fd55363e1e3f5378f254f26e2..6d872a83dba4ee847d3dc60f6792146778c8c726 100644 GIT binary patch delta 687 zcmX}pKP&@b7{~Fqby`|~OZ_P(kkH-ueyd2voHS($G$jr@EC& zPSe${Rk%iiPSuqpog1zkK96Qf#c|JH5o_6vDH&;5}3qA!x Xb9TWk=E_;ij?~^eYel>KXx;n)p^QOj delta 610 zcmX}pKS;ws6vy$`m|AVL*7&Cix+#K_t6RGWf;e>&oGRj=c2E}`vWSagkWz4KM+K?4 z>f$1TOFf+43;p9 z>o|mE%;7eMxQ{+YIEd#M;H7(CL+x{oTHoxwkL;F#Cbn=4A5n$gPz63v3%fXs-_BoD zA%CE^KEM(F7ch+rIEBl&L^DOy{5?*odR5F?WOl|t9bDiv){&px@le4B)Pg6}L0+A0 zR41Rv-qyi9c5xDaPz~fbjrN~M&0j$sbQLqyw>1VTu<6`#6LwK2K0V?d9T~j zhFrvdsG#;zsK_{3Aa$et(5>`iW0aA;y*gLu=@!(vVun;V3U!-AsZyz) V93IC9UitpTYp3FdzY~Y)=RfapE)D\n" "Language-Team: \n" @@ -22,8 +22,8 @@ msgid "Transaction" msgstr "Transaction" #: .\transaction\models.py:19 .\transaction\models.py:89 -#: .\transaction\templates\transaction\invoice_table.html:9 -#: .\transaction\templates\transaction\transaction_table.html:28 +#: .\transaction\templates\transaction\invoice_table.html:10 +#: .\transaction\templates\transaction\transaction_table.html:29 msgid "Name" msgstr "Nom" @@ -32,12 +32,12 @@ msgid "Description" msgstr "Description" #: .\transaction\models.py:23 -#: .\transaction\templates\transaction\transaction_table.html:29 +#: .\transaction\templates\transaction\transaction_table.html:30 msgid "Value" msgstr "Valeur" #: .\transaction\models.py:25 -#: .\transaction\templates\transaction\transaction_table.html:27 +#: .\transaction\templates\transaction\transaction_table.html:28 msgid "Date" msgstr "Date" @@ -46,7 +46,7 @@ msgid "Real date" msgstr "Date réelle" #: .\transaction\models.py:28 -#: .\transaction\templates\transaction\transaction_table.html:30 +#: .\transaction\templates\transaction\transaction_table.html:31 msgid "Trader" msgstr "Commerçant" @@ -55,7 +55,7 @@ msgid "Payment" msgstr "Paiement" #: .\transaction\models.py:38 -#: .\transaction\templates\transaction\transaction_table.html:32 +#: .\transaction\templates\transaction\transaction_table.html:33 msgid "Category" msgstr "Catégorie" @@ -64,12 +64,13 @@ msgid "Statement" msgstr "Relevé" #: .\transaction\models.py:48 -#: .\transaction\templates\transaction\transaction_table.html:35 +#: .\transaction\templates\transaction\transaction_table.html:36 msgid "Account" msgstr "Compte" #: .\transaction\models.py:83 -#: .\transaction\templates\transaction\transaction_archive_month.html:11 +#: .\transaction\templates\transaction\transaction_archive_month.html:24 +#: .\transaction\templates\transaction\transaction_archive_year.html:23 #: .\transaction\templates\transaction\transaction_list.html:4 #: .\transaction\templates\transaction\transaction_list.html:7 msgid "Transactions" @@ -80,18 +81,18 @@ msgid "Invoice" msgstr "Facture" #: .\transaction\models.py:94 -#: .\transaction\templates\transaction\invoice_table.html:10 -#: .\transaction\templates\transaction\invoice_table.html:20 +#: .\transaction\templates\transaction\invoice_table.html:11 +#: .\transaction\templates\transaction\invoice_table.html:22 msgid "File" msgstr "Fichier" #: .\transaction\models.py:123 -#: .\transaction\templates\transaction\transaction_form.html:19 +#: .\transaction\templates\transaction\transaction_form.html:20 msgid "Invoices" msgstr "Factures" #: .\transaction\templates\transaction\invoice_form.html:4 -#: .\transaction\templates\transaction\invoice_table.html:35 +#: .\transaction\templates\transaction\invoice_table.html:37 msgid "Create invoice" msgstr "Créer une facture" @@ -99,19 +100,28 @@ msgstr "Créer une facture" msgid "New invoice" msgstr "Nouvelle facture" -#: .\transaction\templates\transaction\invoice_table.html:11 -#: .\transaction\templates\transaction\invoice_table.html:23 +#: .\transaction\templates\transaction\invoice_table.html:12 +#: .\transaction\templates\transaction\invoice_table.html:25 msgid "Delete" msgstr "Supprimer" -#: .\transaction\templates\transaction\invoice_table.html:28 +#: .\transaction\templates\transaction\invoice_table.html:30 msgid "No invoice" msgstr "Aucune facture" -#: .\transaction\templates\transaction\transaction_archive_month.html:14 +#: .\transaction\templates\transaction\transaction_archive_month.html:12 +msgid "Back" +msgstr "Retour" + +#: .\transaction\templates\transaction\transaction_archive_month.html:19 +#: .\transaction\templates\transaction\transaction_archive_year.html:18 msgid "Categories" msgstr "Catégories" +#: .\transaction\templates\transaction\transaction_archive_year.html:12 +msgid "History" +msgstr "Historique" + #: .\transaction\templates\transaction\transaction_form.html:5 #: .\transaction\templates\transaction\transaction_table.html:5 msgid "Create transaction" @@ -121,10 +131,10 @@ msgstr "Créer une transaction" msgid "New transaction" msgstr "Nouvelle transaction" -#: .\transaction\templates\transaction\transaction_table.html:71 +#: .\transaction\templates\transaction\transaction_table.html:75 msgid "No transaction" msgstr "Aucune transaction" -#: .\transaction\templates\transaction\transaction_table.html:80 +#: .\transaction\templates\transaction\transaction_table.html:84 msgid "View all transactions" msgstr "Voir toutes les transactions" diff --git a/nummi/transaction/templates/transaction/transaction_archive_month.html b/nummi/transaction/templates/transaction/transaction_archive_month.html index e6a2600..5b85799 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_month.html +++ b/nummi/transaction/templates/transaction/transaction_archive_month.html @@ -5,6 +5,17 @@ {% css "main/css/plot.css" %} {% endblock %} {% block h2 %}{{ month|date:"F Y"|capfirst }}{% endblock %} +{% block backlinks %} + {{ block.super }} + {% if account or category %} +

+ + {% translate "Back" %}{{ "arrow-go-back"|remix }} + +

+ {% endif %} +{% endblock %} {% block table %} {% if not category %}
diff --git a/nummi/transaction/templates/transaction/transaction_archive_year.html b/nummi/transaction/templates/transaction/transaction_archive_year.html index ea5b395..4b979d8 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_year.html +++ b/nummi/transaction/templates/transaction/transaction_archive_year.html @@ -6,6 +6,14 @@ {% endblock %} {% block name %}{{ year|date:"Y" }}{% endblock %} {% block h2 %}{{ year|date:"Y" }}{% endblock %} +{% block backlinks %} + {{ block.super }} + {% if account or category %} +

+ {% translate "Back" %}{{ "arrow-go-back"|remix }} +

+ {% endif %} +{% endblock %} {% block table %} {% if history %}
From 65d97f523c20f1b619362ada679648792b40e389 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 16:58:24 +0100 Subject: [PATCH 083/213] Add title attribute to calendar plot for accessibility --- nummi/history/templates/history/plot.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index fdc756d..8501506 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -60,7 +60,8 @@ {% endif %} {% if m %}
+ style="opacity: {% calendar_opacity m.sum history.max.sum %}" + title="{{ m.sum|pmrvalue }}"> {% else %} {% endif %} From e44e3a51f0fec244caa37977a1bc0e68bcd7f98c Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 2 Jan 2024 17:03:55 +0100 Subject: [PATCH 084/213] Fix contrast issues with table icons --- nummi/history/templatetags/history_extras.py | 4 ++-- nummi/statement/templates/statement/statement_table.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py index 48a8aaf..56b01c4 100644 --- a/nummi/history/templatetags/history_extras.py +++ b/nummi/history/templatetags/history_extras.py @@ -30,9 +30,9 @@ def empty_calendar_cells_end(n): @register.simple_tag def up_down_icon(val): if val > 0: - return remix("arrow-up-s", "green") + return remix("arrow-up-s") elif val < 0: - return remix("arrow-down-s", "red") + return remix("arrow-down-s") @register.simple_tag diff --git a/nummi/statement/templates/statement/statement_table.html b/nummi/statement/templates/statement/statement_table.html index 57b4b8c..322653a 100644 --- a/nummi/statement/templates/statement/statement_table.html +++ b/nummi/statement/templates/statement/statement_table.html @@ -33,9 +33,9 @@ {% for snap in statements %} {% if snap.sum == snap.diff %} - + {% else %} - + {% endif %} + {% if new_statement_url %} + + + + {% endif %} @@ -23,13 +30,6 @@ - {% if new_statement_url %} - - - - {% endif %} {% for snap in statements %} diff --git a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po index 3384c25..efd15fd 100644 --- a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-02 15:52+0100\n" +"POT-Creation-Date: 2024-01-03 14:32+0100\n" "PO-Revision-Date: 2023-04-23 08:03+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -23,7 +23,7 @@ msgstr "Transaction" #: .\transaction\models.py:19 .\transaction\models.py:89 #: .\transaction\templates\transaction\invoice_table.html:10 -#: .\transaction\templates\transaction\transaction_table.html:29 +#: .\transaction\templates\transaction\transaction_table.html:24 msgid "Name" msgstr "Nom" @@ -32,12 +32,12 @@ msgid "Description" msgstr "Description" #: .\transaction\models.py:23 -#: .\transaction\templates\transaction\transaction_table.html:30 +#: .\transaction\templates\transaction\transaction_table.html:25 msgid "Value" msgstr "Valeur" #: .\transaction\models.py:25 -#: .\transaction\templates\transaction\transaction_table.html:28 +#: .\transaction\templates\transaction\transaction_table.html:23 msgid "Date" msgstr "Date" @@ -46,7 +46,7 @@ msgid "Real date" msgstr "Date réelle" #: .\transaction\models.py:28 -#: .\transaction\templates\transaction\transaction_table.html:31 +#: .\transaction\templates\transaction\transaction_table.html:26 msgid "Trader" msgstr "Commerçant" @@ -55,7 +55,7 @@ msgid "Payment" msgstr "Paiement" #: .\transaction\models.py:38 -#: .\transaction\templates\transaction\transaction_table.html:33 +#: .\transaction\templates\transaction\transaction_table.html:28 msgid "Category" msgstr "Catégorie" @@ -64,13 +64,13 @@ msgid "Statement" msgstr "Relevé" #: .\transaction\models.py:48 -#: .\transaction\templates\transaction\transaction_table.html:36 +#: .\transaction\templates\transaction\transaction_table.html:31 msgid "Account" msgstr "Compte" #: .\transaction\models.py:83 -#: .\transaction\templates\transaction\transaction_archive_month.html:24 -#: .\transaction\templates\transaction\transaction_archive_year.html:23 +#: .\transaction\templates\transaction\transaction_archive_month.html:27 +#: .\transaction\templates\transaction\transaction_archive_year.html:31 #: .\transaction\templates\transaction\transaction_list.html:4 #: .\transaction\templates\transaction\transaction_list.html:7 msgid "Transactions" @@ -109,21 +109,22 @@ msgstr "Supprimer" msgid "No invoice" msgstr "Aucune facture" -#: .\transaction\templates\transaction\transaction_archive_month.html:12 +#: .\transaction\templates\transaction\transaction_archive_month.html:14 +#: .\transaction\templates\transaction\transaction_archive_year.html:13 msgid "Back" msgstr "Retour" -#: .\transaction\templates\transaction\transaction_archive_month.html:19 -#: .\transaction\templates\transaction\transaction_archive_year.html:18 +#: .\transaction\templates\transaction\transaction_archive_month.html:22 +#: .\transaction\templates\transaction\transaction_archive_year.html:26 msgid "Categories" msgstr "Catégories" -#: .\transaction\templates\transaction\transaction_archive_year.html:12 +#: .\transaction\templates\transaction\transaction_archive_year.html:20 msgid "History" msgstr "Historique" #: .\transaction\templates\transaction\transaction_form.html:5 -#: .\transaction\templates\transaction\transaction_table.html:5 +#: .\transaction\templates\transaction\transaction_table.html:37 msgid "Create transaction" msgstr "Créer une transaction" @@ -131,10 +132,10 @@ msgstr "Créer une transaction" msgid "New transaction" msgstr "Nouvelle transaction" -#: .\transaction\templates\transaction\transaction_table.html:75 +#: .\transaction\templates\transaction\transaction_table.html:77 msgid "No transaction" msgstr "Aucune transaction" -#: .\transaction\templates\transaction\transaction_table.html:84 +#: .\transaction\templates\transaction\transaction_table.html:86 msgid "View all transactions" msgstr "Voir toutes les transactions" diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index ff31a73..a9a0ddf 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -18,6 +18,13 @@ {% endif %} + {% if new_transaction_url %} + + + + {% endif %} @@ -31,13 +38,6 @@ {% endif %} - {% if new_transaction_url %} - - - - {% endif %} {% for trans in transactions %} From 05b74181620effe48f556403a83e431ca96e7333 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 14:51:40 +0100 Subject: [PATCH 087/213] Reshape home page --- nummi/main/static/main/css/main.css | 22 ++++++++++++++++++++-- nummi/main/templates/main/index.html | 16 ++-------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 6952422..6bd5292 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -94,9 +94,27 @@ main { grid-column: 2; grid-row: 1; overflow-x: hidden; + + display: grid; + grid-template-columns: max-content 1fr; + grid-gap: var(--gap); + h2.new { opacity: 0.8; } + + & > * { + grid-column: 1 / -1; + } + + & > section { + &.accounts { + grid-column: 1; + } + &.categories { + grid-column: 2; + } + } } nav { grid-column: 1; @@ -139,7 +157,7 @@ nav { } } :is(nav, main) > :first-child, -main > section:first-child > :first-child { +main > section > :first-child { margin-top: 0; } footer { @@ -211,7 +229,7 @@ h1, h2, h3 { font-weight: 300; - margin-top: 1em; + margin-top: var(--gap); margin-bottom: 0.5em; line-height: 1cap; } diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index d3f1add..53a6632 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -8,7 +8,7 @@ {% css "main/css/plot.css" %} {% endblock %} {% block body %} -
+

{% translate "Accounts" %}

{% up_down_icon date.sum %}{% month_url date.month account=account category=category %}{% month_url date.month %} {{ date.sum_m|pmrvalue }} {% plot_bar date.sum date.sum_m history.max.pm %} {% plot_bar date.sum date.sum_p history.max.pm %}
{% year_url y account=account category=category %}{% year_url y %} - {{ snap.date|date:"Y-m-d" }} + + + {{ snap.account.icon|remix }} {% for invoice in trans.invoices %}{{ "attachment"|remix }}{% endfor %} {{ trans.date|date:"Y-m-d" }} + + {{ trans.name }}
{{ "check"|remix }}{{ "check"|remix }}{{ "close"|remix }}{{ "close"|remix }} {% if snap.file %}{{ "attachment"|remix }}{% endif %} From 9927cbbab415e713766e461f22c6ed51dec2cf98 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 14:25:25 +0100 Subject: [PATCH 085/213] Move new and more links to tables --- nummi/main/static/main/css/table.css | 12 +++++--- .../templates/statement/statement_table.html | 26 ++++++++++------- .../transaction/transaction_table.html | 28 +++++++++++-------- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index 0092937..155a75d 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -5,9 +5,6 @@ form { table { border-collapse: collapse; - &.more tbody:last-child tr:last-child { - border-bottom: 1px dashed var(--gray); - } &.full-width { width: 100%; @@ -18,7 +15,7 @@ table { col.icon { width: 1ch; } - thead { + thead tr:not(.new) { background: var(--bg-01); } tr { @@ -29,6 +26,13 @@ table { tbody &:where(:nth-of-type(even)) { background: #eeeeff; } + tfoot &.more, + thead &.new { + text-align: center; + } + tfoot &.more { + border-style: dashed; + } } td, th { diff --git a/nummi/statement/templates/statement/statement_table.html b/nummi/statement/templates/statement/statement_table.html index 322653a..34c87a6 100644 --- a/nummi/statement/templates/statement/statement_table.html +++ b/nummi/statement/templates/statement/statement_table.html @@ -1,10 +1,5 @@ {% load main_extras %} {% load i18n %} -{% if new_statement_url %} -

- {% translate "Create statement" %} -

-{% endif %}
@@ -28,6 +23,13 @@ + {% if new_statement_url %} + + + + {% endif %} {% for snap in statements %} @@ -61,10 +63,14 @@ {% endfor %} + {% if statements_url %} + + + + + + {% endif %}
{% translate "Difference" %} {% translate "Transactions" %}
+ {% translate "Create statement" %} +
+ {% translate "View all statements" %} +
-{% if statements_url %} -

- {% translate "View all statements" %} -

-{% endif %} diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index fb89dbf..ff31a73 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -1,12 +1,7 @@ {% load main_extras %} {% load i18n %} -{% if new_transaction_url %} -

- {% translate "Create transaction" %} -

-{% endif %}
- +
@@ -36,6 +31,13 @@ {% endif %} + {% if new_transaction_url %} + + + + {% endif %} {% for trans in transactions %} @@ -77,10 +79,14 @@ {% endfor %} + {% if transactions_url %} + + + + + + {% endif %}
{% translate "Account" %}
+ {% translate "Create transaction" %} +
+ {% translate "View all transactions" %} +
-{% if transactions_url %} -

- {% translate "View all transactions" %} -

-{% endif %} From d48818e4552aa6e4e194d6d06a368d63c398972b Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 14:40:48 +0100 Subject: [PATCH 086/213] Create table for accounts --- nummi/main/locale/fr_FR/LC_MESSAGES/django.mo | Bin 1751 -> 1828 bytes nummi/main/locale/fr_FR/LC_MESSAGES/django.po | 20 +++++++--- nummi/main/static/main/css/table.css | 6 +-- nummi/main/templates/main/index.html | 37 ++++++++++++++---- .../locale/fr_FR/LC_MESSAGES/django.po | 18 ++++----- .../templates/statement/statement_table.html | 14 +++---- .../locale/fr_FR/LC_MESSAGES/django.po | 33 ++++++++-------- .../transaction/transaction_table.html | 14 +++---- 8 files changed, 86 insertions(+), 56 deletions(-) diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo index 7f2a8f069af009197b2d2fc8c0ebda76e0fe89e9..c963419eca93ed0d64d1b1c6058b7de5609b7c13 100644 GIT binary patch delta 722 zcmYk)y-Px26vy$$n^(=$%Iw8nY_l37+G=RXp%;iC0;d+a2@RqSxdkraKOhZF6%-L| z88rnF4MDUOZH+-R)X>mi)c0qX=)mL0dwe|SdAX0_{Yd#K>fJI#g3-?id5jssIx2Q8 zWBj;>0X)JfJaO~y=;QelgZS;{gH6BrC`QP~u@#504JR;aOxeuyMFm#Siw>&cn)_UI ze=oWD4NUU;CaU2vw%{4sc!jESgQ|OnF}z33f58xbpqKu}!|WasJ{)4#gQ!2wQcVk4 z#1y7c4Yu9<4yy4XHe(I-zYEk3udx#!upM8q3%^kFV@&qb-z4~=l_izHanuSYQAaj| zW0-dH6;#10>Szy83pqvAxx`+)MP1o5s@@xFULE@|K(n&0nR{py)F~)5Sp~St#sWC0 zM(7>U%C#%S07DJbR7bAR4i(x+oWW)r(ZQ##f!_aP^zT7C(W=4>y@)!(ZiZHDrX8nH j%CA?8)|@|;$z}3Rwsvl%t*Xynu$K$D)og9au6TX`YfCye delta 662 zcmYk)y)Q#y6vy$?t5p~6rQYc#UN#nkM28Cg03i`;69x&DdPxj!B9U}4mBB(H78A)e zNDN{jv9U-KVKEr|0hJhhf9)Nd6+JQ{9gbfdV7x{6A@Yt{ z1FmBRcd#CBuo3Stj!)t97ffd*D!?g!C8YYZ|&nIw@ z_fx0|SFj1UFot_bAuFO9JHU24MCD&#GhUhYpI4BQs{rB#VE9EYS6N|+}h^qM!~YBz{vy^XWl8z#ioPP*nZ>> DdYClT diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po index 378d5ba..32068a8 100644 --- a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-02 15:52+0100\n" +"POT-Creation-Date: 2024-01-03 14:32+0100\n" "PO-Revision-Date: 2023-04-23 08:03+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -29,11 +29,11 @@ msgstr "Aller au contenu principal" msgid "Home" msgstr "Accueil" -#: .\main\templates\main\base.html:39 .\main\templates\main\index.html:43 +#: .\main\templates\main\base.html:39 .\main\templates\main\index.html:60 msgid "Statements" msgstr "Relevés" -#: .\main\templates\main\base.html:45 .\main\templates\main\index.html:23 +#: .\main\templates\main\base.html:45 .\main\templates\main\index.html:40 msgid "Transactions" msgstr "Transactions" @@ -113,15 +113,23 @@ msgstr "Comptes" msgid "No account" msgstr "Aucun compte" -#: .\main\templates\main\index.html:29 +#: .\main\templates\main\index.html:23 +msgid "Account" +msgstr "Compte" + +#: .\main\templates\main\index.html:24 +msgid "Balance" +msgstr "Solde" + +#: .\main\templates\main\index.html:46 msgid "Categories" msgstr "Catégories" -#: .\main\templates\main\index.html:35 +#: .\main\templates\main\index.html:52 msgid "No category" msgstr "Aucune catégorie" -#: .\main\templates\main\index.html:49 +#: .\main\templates\main\index.html:66 msgid "History" msgstr "Historique" diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index 155a75d..3e38ad6 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -26,11 +26,9 @@ table { tbody &:where(:nth-of-type(even)) { background: #eeeeff; } - tfoot &.more, - thead &.new { + &.more, + &.new { text-align: center; - } - tfoot &.more { border-style: dashed; } } diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 3f56a84..d3f1add 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -10,13 +10,36 @@ {% block body %}

{% translate "Accounts" %}

-

- {% for acc in accounts %} - {{ acc.icon|remix }}{{ acc }} - {% empty %} - {% translate "No account" %} - {% endfor %} -

+ + + + + + + + + {% for acc in accounts %} + + + + + + {% empty %} + + + + {% endfor %} + + + + + + +
{% translate "Account" %}{% translate "Balance" %}
{{ acc.icon|remix }} + {{ acc }} + {{ acc.statement_set.first.value|value }}
{% translate "No account" %}
+ {% translate "Create account" %} +
{% if transactions %}
diff --git a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po index 69017a9..cd3180d 100644 --- a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-02 15:52+0100\n" +"POT-Creation-Date: 2024-01-03 14:32+0100\n" "PO-Revision-Date: 2023-04-22 15:22+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -38,7 +38,7 @@ msgid "Start value" msgstr "Valeur initiale" #: .\statement\models.py:29 -#: .\statement\templates\statement\statement_table.html:28 +#: .\statement\templates\statement\statement_table.html:23 msgid "Difference" msgstr "Différence" @@ -66,7 +66,7 @@ msgid "Statements" msgstr "Relevés" #: .\statement\templates\statement\statement_form.html:4 -#: .\statement\templates\statement\statement_table.html:5 +#: .\statement\templates\statement\statement_table.html:29 msgid "Create statement" msgstr "Créer un relevé" @@ -79,27 +79,27 @@ msgid "Categories" msgstr "Catégories" #: .\statement\templates\statement\statement_form.html:27 -#: .\statement\templates\statement\statement_table.html:29 +#: .\statement\templates\statement\statement_table.html:24 msgid "Transactions" msgstr "Transactions" -#: .\statement\templates\statement\statement_table.html:23 +#: .\statement\templates\statement\statement_table.html:18 msgid "Date" msgstr "Date" -#: .\statement\templates\statement\statement_table.html:25 +#: .\statement\templates\statement\statement_table.html:20 msgid "Account" msgstr "Compte" -#: .\statement\templates\statement\statement_table.html:27 +#: .\statement\templates\statement\statement_table.html:22 msgid "Value" msgstr "Valeur" -#: .\statement\templates\statement\statement_table.html:60 +#: .\statement\templates\statement\statement_table.html:62 msgid "No statement" msgstr "Aucun relevé" -#: .\statement\templates\statement\statement_table.html:68 +#: .\statement\templates\statement\statement_table.html:70 msgid "View all statements" msgstr "Voir tous les relevés" diff --git a/nummi/statement/templates/statement/statement_table.html b/nummi/statement/templates/statement/statement_table.html index 34c87a6..514dc16 100644 --- a/nummi/statement/templates/statement/statement_table.html +++ b/nummi/statement/templates/statement/statement_table.html @@ -12,6 +12,13 @@
+ {% translate "Create statement" %} +
{{ "check"|remix }} {{ "attachment"|remix }}{% translate "Difference" %} {% translate "Transactions" %}
- {% translate "Create statement" %} -
+ {% translate "Create transaction" %} +
{{ "attachment"|remix }} {% translate "Date" %}{% translate "Account" %}
- {% translate "Create transaction" %} -
@@ -41,14 +41,8 @@
- {% if transactions %} -
-

{% translate "Transactions" %}

- {% include "transaction/transaction_table.html" %} -
- {% endif %} {% if categories %} -
+

{% translate "Categories" %}

{% spaceless %}

@@ -61,12 +55,6 @@ {% endspaceless %}

{% endif %} - {% if statements %} -
-

{% translate "Statements" %}

- {% include "statement/statement_table.html" %} -
- {% endif %} {% if history %}

{% translate "History" %}

From 0f1aba45ea03bd97ac2768ccc2243c24a183786a Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 14:54:24 +0100 Subject: [PATCH 088/213] Add class value to balance in account table --- nummi/main/templates/main/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 53a6632..0fe5318 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -24,7 +24,7 @@ {{ acc }} - {{ acc.statement_set.first.value|value }} + {{ acc.statement_set.first.value|value }} {% empty %} From 6d14602dd26cf2d1968bed1f0c9bf7adbccdaa51 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 14:59:08 +0100 Subject: [PATCH 089/213] Fix homepage on small screens --- nummi/main/static/main/css/main.css | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 6bd5292..e5b4b07 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -107,12 +107,14 @@ main { grid-column: 1 / -1; } - & > section { - &.accounts { - grid-column: 1; - } - &.categories { - grid-column: 2; + @media (width > 720px) { + & > section { + &.accounts { + grid-column: 1; + } + &.categories { + grid-column: 2; + } } } } From b478286f47f82dfa55a01be7edd5cfeeb034f4da Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 15:13:54 +0100 Subject: [PATCH 090/213] Fix page layout --- nummi/main/static/main/css/main.css | 30 ++++------ nummi/main/templates/main/index.html | 86 ++++++++++++++-------------- nummi/main/templates/main/list.html | 34 +++++------ 3 files changed, 71 insertions(+), 79 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index e5b4b07..d094d26 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -94,27 +94,21 @@ main { grid-column: 2; grid-row: 1; overflow-x: hidden; - - display: grid; - grid-template-columns: max-content 1fr; - grid-gap: var(--gap); - h2.new { opacity: 0.8; } - & > * { - grid-column: 1 / -1; - } + .split { + display: grid; + column-gap: var(--gap); + row-gap: var(--gap); + grid-template-columns: 1fr; + @media (width > 720px) { + grid-template-columns: max-content 1fr; + } - @media (width > 720px) { - & > section { - &.accounts { - grid-column: 1; - } - &.categories { - grid-column: 2; - } + & > section > :first-child { + margin-top: 0; } } } @@ -159,7 +153,7 @@ nav { } } :is(nav, main) > :first-child, -main > section > :first-child { +main > section:first-child > :first-child { margin-top: 0; } footer { @@ -231,7 +225,7 @@ h1, h2, h3 { font-weight: 300; - margin-top: var(--gap); + margin-top: 1em; margin-bottom: 0.5em; line-height: 1cap; } diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 0fe5318..f88b5b0 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -8,53 +8,55 @@ {% css "main/css/plot.css" %} {% endblock %} {% block body %} -
-

{% translate "Accounts" %}

- - - - - - - - - {% for acc in accounts %} +
+
+

{% translate "Accounts" %}

+
{% translate "Account" %}{% translate "Balance" %}
+ - - - + + - {% empty %} - - - - {% endfor %} - - - - - - -
{{ acc.icon|remix }} - {{ acc }} - {{ acc.statement_set.first.value|value }}{% translate "Account" %}{% translate "Balance" %}
{% translate "No account" %}
- {% translate "Create account" %} -
-
- {% if categories %} -
-

{% translate "Categories" %}

- {% spaceless %} -

- {% for cat in categories %} - {{ cat.icon|remix }}{{ cat }} + + + {% for acc in accounts %} + + {{ acc.icon|remix }} + + {{ acc }} + + {{ acc.statement_set.first.value|value }} + {% empty %} - {% translate "No category" %} + + {% translate "No account" %} + {% endfor %} -

- {% endspaceless %} + + + + + {% translate "Create account" %} + + + +
- {% endif %} + {% if categories %} +
+

{% translate "Categories" %}

+ {% spaceless %} +

+ {% for cat in categories %} + {{ cat.icon|remix }}{{ cat }} + {% empty %} + {% translate "No category" %} + {% endfor %} +

+ {% endspaceless %} +
+ {% endif %} + {% if history %}

{% translate "History" %}

diff --git a/nummi/main/templates/main/list.html b/nummi/main/templates/main/list.html index 57adec0..ee3050e 100644 --- a/nummi/main/templates/main/list.html +++ b/nummi/main/templates/main/list.html @@ -19,25 +19,21 @@

{% block h2 %}{% endblock %}

- + {% if account %} +

+ {{ account.icon|remix }}{{ account }} +

+ {% endif %} + {% if category %} +

+ {{ category.icon|remix }}{{ category }} +

+ {% endif %} + {% if search %} +

+ {% translate "Search" %} +

+ {% endif %} {% include "main/pagination.html" %} {% block table %}{% endblock %} {% include "main/pagination.html" %} From b3c9642adce2c528d69dbd2b316c2b19c60166d7 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 15:20:45 +0100 Subject: [PATCH 091/213] Update year history (remove year in plot lines) --- nummi/history/templates/history/plot.html | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 8501506..680686d 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -25,7 +25,13 @@ {% if date.sum_m or date.sum_p %} {% up_down_icon date.sum %} - {% month_url date.month %} + + {% if year %} + {% month_url date.month fmt="F" %} + {% else %} + {% month_url date.month %} + {% endif %} + {{ date.sum_m|pmrvalue }} {% plot_bar date.sum date.sum_m history.max.pm %} {% plot_bar date.sum date.sum_p history.max.pm %} @@ -45,7 +51,9 @@ - + {% if not year %} + + {% endif %} {% calendar_head %} @@ -53,7 +61,9 @@ {% regroup history.data by month.year as years_list %} {% for y, year in years_list reversed %} - + {% if not year %} + + {% endif %} {% for m in year %} {% if forloop.parentloop.last and forloop.first %} {% empty_calendar_cells_start m.month.month %} From cc551c536cc4f158eb299408361849877baccc2d Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 15:35:06 +0100 Subject: [PATCH 092/213] Change date format in transaction table on month and year page --- .../templates/transaction/transaction_table.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index a9a0ddf..4ae44a0 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -46,7 +46,15 @@ {% for invoice in trans.invoices %}{{ "attachment"|remix }}{% endfor %} {% regroup history.data by month.year as years_list %} - {% for y, year in years_list reversed %} + {% for y, y_data in years_list reversed %} {% if not year %} {% endif %} - {% for m in year %} + {% for m in y_data %} {% if forloop.parentloop.last and forloop.first %} {% empty_calendar_cells_start m.month.month %} {% endif %} From e4169bd1c39be99871984f2b7ef59c37fa41bdfa Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 15:52:36 +0100 Subject: [PATCH 094/213] Split columns for income and expenses --- .../locale/fr_FR/LC_MESSAGES/django.po | 4 +-- nummi/main/locale/fr_FR/LC_MESSAGES/django.po | 28 +++++++++--------- .../locale/fr_FR/LC_MESSAGES/django.po | 14 ++++----- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 1494 -> 1577 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 27 ++++++++++------- .../transaction/transaction_table.html | 17 ++++++----- .../templatetags/transaction_extras.py | 10 +++++++ 7 files changed, 59 insertions(+), 41 deletions(-) diff --git a/nummi/history/locale/fr_FR/LC_MESSAGES/django.po b/nummi/history/locale/fr_FR/LC_MESSAGES/django.po index 50fde9f..c0e51e2 100644 --- a/nummi/history/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/history/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-02 15:52+0100\n" +"POT-Creation-Date: 2024-01-03 15:51+0100\n" "PO-Revision-Date: 2023-04-22 15:18+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -29,6 +29,6 @@ msgstr "Dépenses" msgid "Income" msgstr "Revenus" -#: .\history\templates\history\plot.html:48 +#: .\history\templates\history\plot.html:55 msgid "Year" msgstr "Année" diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po index 32068a8..1404f9b 100644 --- a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-03 14:32+0100\n" +"POT-Creation-Date: 2024-01-03 15:51+0100\n" "PO-Revision-Date: 2023-04-23 08:03+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -29,15 +29,15 @@ msgstr "Aller au contenu principal" msgid "Home" msgstr "Accueil" -#: .\main\templates\main\base.html:39 .\main\templates\main\index.html:60 +#: .\main\templates\main\base.html:39 msgid "Statements" msgstr "Relevés" -#: .\main\templates\main\base.html:45 .\main\templates\main\index.html:40 +#: .\main\templates\main\base.html:45 msgid "Transactions" msgstr "Transactions" -#: .\main\templates\main\base.html:51 +#: .\main\templates\main\base.html:51 .\main\templates\main\index.html:39 msgid "Create account" msgstr "Créer un compte" @@ -54,7 +54,7 @@ msgid "Create transaction" msgstr "Créer une transaction" #: .\main\templates\main\base.html:71 .\main\templates\main\list.html:10 -#: .\main\templates\main\list.html:36 +#: .\main\templates\main\list.html:34 msgid "Search" msgstr "Rechercher" @@ -105,31 +105,31 @@ msgstr "Créer" msgid "Save" msgstr "Enregistrer" -#: .\main\templates\main\index.html:12 +#: .\main\templates\main\index.html:13 msgid "Accounts" msgstr "Comptes" #: .\main\templates\main\index.html:17 -msgid "No account" -msgstr "Aucun compte" - -#: .\main\templates\main\index.html:23 msgid "Account" msgstr "Compte" -#: .\main\templates\main\index.html:24 +#: .\main\templates\main\index.html:18 msgid "Balance" msgstr "Solde" -#: .\main\templates\main\index.html:46 +#: .\main\templates\main\index.html:32 +msgid "No account" +msgstr "Aucun compte" + +#: .\main\templates\main\index.html:47 msgid "Categories" msgstr "Catégories" -#: .\main\templates\main\index.html:52 +#: .\main\templates\main\index.html:53 msgid "No category" msgstr "Aucune catégorie" -#: .\main\templates\main\index.html:66 +#: .\main\templates\main\index.html:62 msgid "History" msgstr "Historique" diff --git a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po index cd3180d..f969e8b 100644 --- a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-03 14:32+0100\n" +"POT-Creation-Date: 2024-01-03 15:51+0100\n" "PO-Revision-Date: 2023-04-22 15:22+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -38,7 +38,7 @@ msgid "Start value" msgstr "Valeur initiale" #: .\statement\models.py:29 -#: .\statement\templates\statement\statement_table.html:23 +#: .\statement\templates\statement\statement_table.html:30 msgid "Difference" msgstr "Différence" @@ -66,7 +66,7 @@ msgid "Statements" msgstr "Relevés" #: .\statement\templates\statement\statement_form.html:4 -#: .\statement\templates\statement\statement_table.html:29 +#: .\statement\templates\statement\statement_table.html:18 msgid "Create statement" msgstr "Créer un relevé" @@ -79,19 +79,19 @@ msgid "Categories" msgstr "Catégories" #: .\statement\templates\statement\statement_form.html:27 -#: .\statement\templates\statement\statement_table.html:24 +#: .\statement\templates\statement\statement_table.html:31 msgid "Transactions" msgstr "Transactions" -#: .\statement\templates\statement\statement_table.html:18 +#: .\statement\templates\statement\statement_table.html:25 msgid "Date" msgstr "Date" -#: .\statement\templates\statement\statement_table.html:20 +#: .\statement\templates\statement\statement_table.html:27 msgid "Account" msgstr "Compte" -#: .\statement\templates\statement\statement_table.html:22 +#: .\statement\templates\statement\statement_table.html:29 msgid "Value" msgstr "Valeur" diff --git a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.mo index 6d872a83dba4ee847d3dc60f6792146778c8c726..cf6c6811b2a425ceddb1e39654b793780693ed22 100644 GIT binary patch delta 739 zcmYk)y)Q#i7{~GBYQ42ey}wi}L>i;PV6Y%Mk{BdRHzzcq)!ve_bg@~8h*-qhK_vVI zh(uyVNJN@go0ufh$@f<`;z>?F=id9A^PK12K8K3o!h2ib$PfdJ7$Z<)OdQLo*msPn z#{&%D2{z#=HeeAWc!_Ozjmmq(I()?tmQeX+|M?fPZ^2ZUDAB3?E!2ogjG{K`Lv1jK zEjWrgzyzxB4C;Uj*oe!%E2w=lsP%aa<1PmA06VE~j+uYDmyoe8zg7PjIJcHkbW!!uOj3)BWT zs7@YG1zu2vOTK0Q`8TSOAV2!FVboVuZj_-z75ezm<_f+IR`s71}`m5fxVS zFmz}gP>0o<_#f1+h8k-3=Q_MXpHXj&h*Uf1XV%Q+P q&TgAT%1y7^t9xhM8J@Z={-wC9Nt^Yvl9^3w=B;aUIqMxpgLgmOX-8!M delta 655 zcmX}py)Q#i7{~GB_LWv~sh46BxwA?C0BI}+lZAxTP22>HBGIWy6NAAZO$Uh$Lnp#S zECz#w!D2A5Sj5O?;QMP&o%Fe%dvEV^p68rXPd+EguWqe^7;@ zq2>f>Z0C8@>Y)lwpz^br#3_v6ET(Y|Jr=iyQByXiM!QNpLM0xf3Z9`>bdCM^i2Teu z7Zv_MegB18(Jv}5Mm0UVsD)*aT4oHp(ZfE>Vv71^h8q={M%Gw;tO6 zPf?9uppNbeb!s|F<@FG1l#TlzYNXRXX*U;oxeO61&>91+8`Ke~Yc-^youE!*D^;9D yH&(62H8O-&H%PeEJtv>c1*^W94mP(6#nNRwH0ijxAiom$Mf)\n" "Language-Team: \n" @@ -23,7 +23,7 @@ msgstr "Transaction" #: .\transaction\models.py:19 .\transaction\models.py:89 #: .\transaction\templates\transaction\invoice_table.html:10 -#: .\transaction\templates\transaction\transaction_table.html:24 +#: .\transaction\templates\transaction\transaction_table.html:32 msgid "Name" msgstr "Nom" @@ -32,12 +32,11 @@ msgid "Description" msgstr "Description" #: .\transaction\models.py:23 -#: .\transaction\templates\transaction\transaction_table.html:25 msgid "Value" msgstr "Valeur" #: .\transaction\models.py:25 -#: .\transaction\templates\transaction\transaction_table.html:23 +#: .\transaction\templates\transaction\transaction_table.html:31 msgid "Date" msgstr "Date" @@ -46,7 +45,7 @@ msgid "Real date" msgstr "Date réelle" #: .\transaction\models.py:28 -#: .\transaction\templates\transaction\transaction_table.html:26 +#: .\transaction\templates\transaction\transaction_table.html:35 msgid "Trader" msgstr "Commerçant" @@ -55,7 +54,7 @@ msgid "Payment" msgstr "Paiement" #: .\transaction\models.py:38 -#: .\transaction\templates\transaction\transaction_table.html:28 +#: .\transaction\templates\transaction\transaction_table.html:37 msgid "Category" msgstr "Catégorie" @@ -64,7 +63,7 @@ msgid "Statement" msgstr "Relevé" #: .\transaction\models.py:48 -#: .\transaction\templates\transaction\transaction_table.html:31 +#: .\transaction\templates\transaction\transaction_table.html:40 msgid "Account" msgstr "Compte" @@ -124,7 +123,7 @@ msgid "History" msgstr "Historique" #: .\transaction\templates\transaction\transaction_form.html:5 -#: .\transaction\templates\transaction\transaction_table.html:37 +#: .\transaction\templates\transaction\transaction_table.html:25 msgid "Create transaction" msgstr "Créer une transaction" @@ -132,10 +131,18 @@ msgstr "Créer une transaction" msgid "New transaction" msgstr "Nouvelle transaction" -#: .\transaction\templates\transaction\transaction_table.html:77 +#: .\transaction\templates\transaction\transaction_table.html:33 +msgid "Expenses" +msgstr "Dépenses" + +#: .\transaction\templates\transaction\transaction_table.html:34 +msgid "Income" +msgstr "Recettes" + +#: .\transaction\templates\transaction\transaction_table.html:87 msgid "No transaction" msgstr "Aucune transaction" -#: .\transaction\templates\transaction\transaction_table.html:86 +#: .\transaction\templates\transaction\transaction_table.html:95 msgid "View all transactions" msgstr "Voir toutes les transactions" diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index 4ae44a0..1654e6f 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -1,4 +1,4 @@ -{% load main_extras %} +{% load main_extras transaction_extras %} {% load i18n %}
{% translate "Year" %}{% translate "Year" %}
{% year_url y %}{% year_url y %} - + {{ trans.name }} From e2f7a1dcc36553be75147c86b128575d0d15f9aa Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 15:37:48 +0100 Subject: [PATCH 093/213] Fix history calendar --- nummi/history/templates/history/plot.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 680686d..9d79dc8 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -59,12 +59,12 @@
{% year_url y %}
@@ -7,6 +7,7 @@ + {% if not category %} @@ -20,7 +21,7 @@ {% if new_transaction_url %} - @@ -29,7 +30,8 @@ - + + {% if not category %} @@ -59,7 +61,9 @@ + {% if trans.value >= 0 %}{% endif %} + {% if trans.value < 0 %}{% endif %} {% if not category %} {% if trans.category %} @@ -80,17 +84,14 @@ {% empty %} - + {% endfor %} {% if transactions_url %} - diff --git a/nummi/transaction/templatetags/transaction_extras.py b/nummi/transaction/templatetags/transaction_extras.py index 30cba01..313fb15 100644 --- a/nummi/transaction/templatetags/transaction_extras.py +++ b/nummi/transaction/templatetags/transaction_extras.py @@ -34,3 +34,13 @@ def year_url(context, year, cls=""): f"""""" f"""""" ) + + +@register.simple_tag(takes_context=True) +def tr_colspan(context): + ncol = 10 + if context.get("category"): + ncol -= 2 + if context.get("account"): + ncol -= 2 + return ncol From ef90d5280709972c1786b60d99f8ffdd57be0928 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 16:07:10 +0100 Subject: [PATCH 095/213] Fix history regarding category__budget --- nummi/account/views.py | 2 +- nummi/transaction/views.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/nummi/account/views.py b/nummi/account/views.py index 446ac30..691bc78 100644 --- a/nummi/account/views.py +++ b/nummi/account/views.py @@ -41,7 +41,7 @@ class AccountUpdateView(NummiUpdateView): "new_statement", kwargs={"account": account.pk} ), "statements": _statements[:8], - "history": history(account.transaction_set), + "history": history(account.transaction_set.exclude(category__budget=False)), } diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 2421c12..ad917e2 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -153,8 +153,8 @@ class TransactionYearView(UserMixin, TransactionACMixin, YearArchiveView): def get_context_data(self, **kwargs): context_data = super().get_context_data(**kwargs) - return context_data | { - "history": history( - context_data["transactions"].exclude(category__budget=False) - ), - } + h_data = context_data["transactions"] + if "account" not in self.kwargs and "category" not in self.kwargs: + h_data = h_data.exclude(category__budget=False) + + return context_data | {"history": history(h_data)} From bf1d15574d1d81fee75325661adbcc49b4d3f6f2 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 16:14:54 +0100 Subject: [PATCH 096/213] Fix previous commit --- nummi/account/views.py | 2 +- nummi/transaction/views.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nummi/account/views.py b/nummi/account/views.py index 691bc78..446ac30 100644 --- a/nummi/account/views.py +++ b/nummi/account/views.py @@ -41,7 +41,7 @@ class AccountUpdateView(NummiUpdateView): "new_statement", kwargs={"account": account.pk} ), "statements": _statements[:8], - "history": history(account.transaction_set.exclude(category__budget=False)), + "history": history(account.transaction_set), } diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index ad917e2..6b1f56e 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -153,8 +153,8 @@ class TransactionYearView(UserMixin, TransactionACMixin, YearArchiveView): def get_context_data(self, **kwargs): context_data = super().get_context_data(**kwargs) - h_data = context_data["transactions"] - if "account" not in self.kwargs and "category" not in self.kwargs: + h_data = context_data.get("transactions") + if not (context_data.get("account") or context_data.get("category")): h_data = h_data.exclude(category__budget=False) return context_data | {"history": history(h_data)} From 08b234a0700b66f7ab1f422b03e1bab0a1d0f722 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 18:29:14 +0100 Subject: [PATCH 097/213] Add colors back to history --- nummi/history/templatetags/history_extras.py | 6 ++++-- nummi/main/static/main/css/main.css | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py index 56b01c4..5289f5d 100644 --- a/nummi/history/templatetags/history_extras.py +++ b/nummi/history/templatetags/history_extras.py @@ -30,9 +30,11 @@ def empty_calendar_cells_end(n): @register.simple_tag def up_down_icon(val): if val > 0: - return remix("arrow-up-s") + return remix("arrow-up-s", "green w") elif val < 0: - return remix("arrow-down-s") + return remix("arrow-down-s", "red w") + + return "" @register.simple_tag diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index d094d26..f950aef 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -219,6 +219,21 @@ footer { } [class^="ri-"] { font-weight: normal; + + &.green, + &.red { + color: white; + &.green { + background: var(--green); + } + &.red { + background: var(--red); + } + border-radius: var(--radius); + height: 1.5rem; + width: 1.5rem; + line-height: 1.5rem; + } } h1, From 954ee9ce1714404039b9d03b47af1750957c4a16 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 18:35:31 +0100 Subject: [PATCH 098/213] Update big links styling --- nummi/main/static/main/css/main.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index f950aef..3094450 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -69,6 +69,13 @@ a { &.big-link { margin-right: 1em; + padding: 0 0.5em; + + color: white; + background: var(--green); + border-radius: var(--radius); + height: 1.5rem; + line-height: 1.5rem; [class^="ri-"] { margin-right: 0.5em; From 8db2720f7510c5a420b9376cda7e6210e79b088c Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 18:49:24 +0100 Subject: [PATCH 099/213] Remove create links from navbar; Add a link to create categories in the category list on the homepage --- nummi/main/static/main/css/main.css | 4 ++++ nummi/main/templates/main/base.html | 20 -------------------- nummi/main/templates/main/index.html | 25 +++++++++++-------------- 3 files changed, 15 insertions(+), 34 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 3094450..b05218a 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -80,6 +80,10 @@ a { [class^="ri-"] { margin-right: 0.5em; } + &.add { + color: var(--text-link); + background: var(--bg-01); + } } } diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html index e725fcc..a07113a 100644 --- a/nummi/main/templates/main/base.html +++ b/nummi/main/templates/main/base.html @@ -45,26 +45,6 @@ {% translate "Transactions" %} -
  • - {% translate "Create account" %} -
  • -
  • - {% translate "Create statement" %} -
  • -
  • - {% translate "Create category" %} -
  • -
  • - {% translate "Create transaction" %} -
  • + {% translate "Create transaction" %}
    {{ "attachment"|remix }} {% translate "Date" %} {% translate "Name" %}{% translate "Value" %}{% translate "Expenses" %}{% translate "Income" %} {% translate "Trader" %}{% translate "Category" %} {{ trans.name }} {{ trans.value|pmvalue }}{{ trans.trader|default_if_none:"" }}
    - {% translate "No transaction" %} - {% translate "No transaction" %}
    + {% translate "View all transactions" %}
    - {% if categories %} -
    -

    {% translate "Categories" %}

    - {% spaceless %} -

    - {% for cat in categories %} - {{ cat.icon|remix }}{{ cat }} - {% empty %} - {% translate "No category" %} - {% endfor %} -

    - {% endspaceless %} -
    - {% endif %} +
    +

    {% translate "Categories" %}

    + {% spaceless %} +

    + {% for cat in categories %} + {{ cat.icon|remix }}{{ cat }} + {% endfor %} + {{ "add"|remix }}{% translate "Create category" %} +

    + {% endspaceless %} +
    {% if history %}
    From b0716a65b72838e8d7f56318727a4af93a68364b Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 3 Jan 2024 19:02:08 +0100 Subject: [PATCH 100/213] Add icons on calendar plot --- nummi/history/templates/history/plot.html | 4 ++-- nummi/history/templatetags/history_extras.py | 2 +- nummi/main/static/main/css/plot.css | 16 ++++++++++------ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 9d79dc8..b96e510 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -70,8 +70,8 @@ {% endif %} {% if m %} + style="background-color: color-mix(in hsl, currentcolor {% calendar_opacity m.sum history.max.sum %}, white)" + title="{{ m.sum|pmrvalue }}">{% up_down_icon m.sum %} {% else %} {% endif %} diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py index 5289f5d..0b02d24 100644 --- a/nummi/history/templatetags/history_extras.py +++ b/nummi/history/templatetags/history_extras.py @@ -9,7 +9,7 @@ register = template.Library() @register.simple_tag def calendar_opacity(v, vmax): - return f"{math.sin(math.fabs(v/vmax)*math.pi/2):.3f}" + return f"{math.sin(math.fabs(v/vmax)*math.pi/2):.0%}" @register.simple_tag diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index dcf1771..3f7cf6b 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -89,12 +89,6 @@ table.full-width col.bar { margin-top: var(--gap); font-feature-settings: var(--num); - .p { - background: var(--green); - } - .m { - background: var(--red); - } table { tbody tr { background: initial; @@ -104,6 +98,16 @@ table.full-width col.bar { &:not(:first-child) { border-top: none; } + + td { + text-align: center; + &.p { + color: var(--green); + } + &.m { + color: var(--red); + } + } } } } From 6bd83feafed8da6ce574684470dccd2a5d8ef5b7 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 4 Jan 2024 15:38:53 +0100 Subject: [PATCH 101/213] Update up-down icons --- nummi/history/templates/history/plot.html | 2 +- nummi/history/templatetags/history_extras.py | 6 +++--- nummi/main/static/main/css/main.css | 9 +++++++-- nummi/main/static/main/css/plot.css | 9 +++++++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index b96e510..6ef6804 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -70,7 +70,7 @@ {% endif %} {% if m %} {% up_down_icon m.sum %} {% else %} diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py index 0b02d24..eaefea3 100644 --- a/nummi/history/templatetags/history_extras.py +++ b/nummi/history/templatetags/history_extras.py @@ -30,11 +30,11 @@ def empty_calendar_cells_end(n): @register.simple_tag def up_down_icon(val): if val > 0: - return remix("arrow-up-s", "green w") + return remix("arrow-up-s", "green") elif val < 0: - return remix("arrow-down-s", "red w") + return remix("arrow-down-s", "red") - return "" + return remix("equal", "white") @register.simple_tag diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index b05218a..35dd9d1 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -232,14 +232,19 @@ footer { font-weight: normal; &.green, - &.red { - color: white; + &.red, + &.white { + color: var(--bg); &.green { background: var(--green); } &.red { background: var(--red); } + &.white { + background: var(--bg-01); + color: var(--text); + } border-radius: var(--radius); height: 1.5rem; width: 1.5rem; diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index 3f7cf6b..9a2bc7a 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -101,11 +101,16 @@ table.full-width col.bar { td { text-align: center; + background-color: color-mix( + in hsl, + var(--td-bg, var(--bg)) var(--opacity), + var(--bg) + ); &.p { - color: var(--green); + --td-bg: var(--green); } &.m { - color: var(--red); + --td-bg: var(--red); } } } From 218a6aca6f340fe4baf24486a0f7b0d7bf81b6f7 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 4 Jan 2024 16:05:38 +0100 Subject: [PATCH 102/213] Separate detail and edit view for account --- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 762 -> 810 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 30 +++++---- .../templates/account/account_detail.html | 30 +++++++++ .../templates/account/account_form.html | 18 ------ nummi/account/urls.py | 3 +- nummi/account/views.py | 37 +++++++++++- nummi/main/locale/fr_FR/LC_MESSAGES/django.mo | Bin 1828 -> 1687 bytes nummi/main/locale/fr_FR/LC_MESSAGES/django.po | 57 +++++++++--------- nummi/main/static/main/css/form.css | 1 + nummi/main/static/main/css/main.css | 14 +++-- nummi/main/templates/main/index.html | 8 ++- nummi/main/views.py | 5 ++ 12 files changed, 135 insertions(+), 68 deletions(-) create mode 100644 nummi/account/templates/account/account_detail.html diff --git a/nummi/account/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/account/locale/fr_FR/LC_MESSAGES/django.mo index 1829874bb523006c772335f1cf9474c1f6b15411..d0a97cf8b790f1183168d8f4c957f9c7d6f0f41f 100644 GIT binary patch delta 336 zcmXYrF-yZh7>4g+lBP|SHgvRjPEv5{;^N}ap@XYqpN_F5ljNk;Gz^SX>KSKKw&(gd!OKXeQ=Z`D>rjy$u&F}N< Q#XM%l7Eh}(tG~VLKNxZ#NdN!< delta 289 zcmXxfEfWDz6vpv$*g?5;EO z%x~_Ud(S=h7<~Qs+48nV)kue|Nknc$6*{vLMp(u+Hn5lP4|7N8u|LV3qI%A-iVLjc z68mID0<+k5h3tVnh8#HL>oe-&1vzL}EaDwCzymeV3)T3I^h`_VDntXYotB2vNB*U| WzBRL@9#REK*9}f{w{gj*F#Z8PtQB+s diff --git a/nummi/account/locale/fr_FR/LC_MESSAGES/django.po b/nummi/account/locale/fr_FR/LC_MESSAGES/django.po index e2b3dd5..e0baa15 100644 --- a/nummi/account/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/account/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-02 15:52+0100\n" +"POT-Creation-Date: 2024-01-04 16:04+0100\n" "PO-Revision-Date: 2023-04-22 15:17+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -37,6 +37,22 @@ msgstr "Défaut" msgid "Accounts" msgstr "Comptes" +#: .\account\templates\account\account_detail.html:15 +msgid "Edit account" +msgstr "Modifier le compte" + +#: .\account\templates\account\account_detail.html:17 +msgid "Statements" +msgstr "Relevés" + +#: .\account\templates\account\account_detail.html:21 +msgid "Transactions" +msgstr "Transactions" + +#: .\account\templates\account\account_detail.html:26 +msgid "History" +msgstr "Historique" + #: .\account\templates\account\account_form.html:5 msgid "Create account" msgstr "Créer un compte" @@ -44,15 +60,3 @@ msgstr "Créer un compte" #: .\account\templates\account\account_form.html:8 msgid "New account" msgstr "Nouveau compte" - -#: .\account\templates\account\account_form.html:14 -msgid "Statements" -msgstr "Relevés" - -#: .\account\templates\account\account_form.html:18 -msgid "Transactions" -msgstr "Transactions" - -#: .\account\templates\account\account_form.html:23 -msgid "History" -msgstr "Historique" diff --git a/nummi/account/templates/account/account_detail.html b/nummi/account/templates/account/account_detail.html new file mode 100644 index 0000000..419669e --- /dev/null +++ b/nummi/account/templates/account/account_detail.html @@ -0,0 +1,30 @@ +{% extends "main/base.html" %} +{% load main_extras %} +{% load i18n %} +{% block title %}{{ object }} – {{ block.super }}{% endblock %} +{% block link %} + {{ block.super }} + {% css "main/css/form.css" %} + {% css "main/css/table.css" %} + {% css "main/css/plot.css" %} +{% endblock %} +{% block body %} +

    {{ object.icon|remix }}{{ object }}

    +

    + {% translate "Edit account" %} +

    +
    +

    {% translate "Statements" %}

    + {% include "statement/statement_table.html" %} +
    +
    +

    {% translate "Transactions" %}

    + {% include "transaction/transaction_table.html" %} +
    + {% if history %} +
    +

    {% translate "History" %}

    + {% include "history/plot.html" %} +
    + {% endif %} +{% endblock %} diff --git a/nummi/account/templates/account/account_form.html b/nummi/account/templates/account/account_form.html index eaba124..b24800e 100644 --- a/nummi/account/templates/account/account_form.html +++ b/nummi/account/templates/account/account_form.html @@ -8,21 +8,3 @@ {% translate "New account" %} {% endblock %} {% block h2 %}{{ form.instance.icon|remix }}{{ form.instance }}{% endblock %} -{% block tables %} - {% if not form.instance|adding %} -
    -

    {% translate "Statements" %}

    - {% include "statement/statement_table.html" %} -
    -
    -

    {% translate "Transactions" %}

    - {% include "transaction/transaction_table.html" %} -
    - {% if history %} -
    -

    {% translate "History" %}

    - {% include "history/plot.html" %} -
    - {% endif %} - {% endif %} -{% endblock %} diff --git a/nummi/account/urls.py b/nummi/account/urls.py index d9b8c14..f6b4f2b 100644 --- a/nummi/account/urls.py +++ b/nummi/account/urls.py @@ -6,7 +6,8 @@ from . import views urlpatterns = [ path("new", views.AccountCreateView.as_view(), name="new_account"), - path("", views.AccountUpdateView.as_view(), name="account"), + path("", views.AccountDetailView.as_view(), name="account"), + path("/edit", views.AccountUpdateView.as_view(), name="edit_account"), path( "/transactions", views.AccountTListView.as_view(), diff --git a/nummi/account/views.py b/nummi/account/views.py index 446ac30..a07bd8b 100644 --- a/nummi/account/views.py +++ b/nummi/account/views.py @@ -1,7 +1,12 @@ from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy from history.utils import history -from main.views import NummiCreateView, NummiDeleteView, NummiUpdateView +from main.views import ( + NummiCreateView, + NummiDeleteView, + NummiDetailView, + NummiUpdateView, +) from statement.views import StatementListView from transaction.views import TransactionListView @@ -50,6 +55,36 @@ class AccountDeleteView(NummiDeleteView): pk_url_kwarg = "account" +class AccountDetailView(NummiDetailView): + model = Account + pk_url_kwarg = "account" + + def get_context_data(self, **kwargs): + _max = 8 + data = super().get_context_data(**kwargs) + account = data.get("object") + + _transactions = account.transaction_set.all() + if _transactions.count() > _max: + data["transactions_url"] = reverse_lazy( + "account_transactions", args=(account.pk,) + ) + _statements = account.statement_set.all() + if _statements.count() > _max: + data["statements_url"] = reverse_lazy( + "account_statements", args=(account.pk,) + ) + + return data | { + "transactions": _transactions[:8], + "new_statement_url": reverse_lazy( + "new_statement", kwargs={"account": account.pk} + ), + "statements": _statements[:8], + "history": history(account.transaction_set), + } + + class AccountMixin: def get_queryset(self): self.account = get_object_or_404( diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo index c963419eca93ed0d64d1b1c6058b7de5609b7c13..258a1ed85a97ab8bc46848e7e6b7e75135ee0dd7 100644 GIT binary patch delta 694 zcmYk)J1j$C7{>9pEp@58x)h5+8-p0cNJ7|{7)VULkdvU*RH6(gu@gxn!s@bglo&fwyHxT`dt3t0QnN&LF9sFHMoJbSi~{h zb@ewGrhJd}_~`1NT>Tq1QU8w3_~q(rLuOTGzBT{7SQNET%$5656USZs5XLEwq83`h zYFt4kvNcryJVvpI>bH*#c#P_If!$cfM8G$@<3$5MXw?QjaT32#3ykwn{S-!U2J3JE zH7Urjh&#zpQ1KYcI7Kdt{b&*0yV)1_TV^b zfkjmRB&uH)dvOQ#6*Z=vRA@fFK&4$}pFY+_YM??_q{$UJ4VP0noldN4i;&!GOL+F#-`I=p_B~GU*3iWgDrEL Yxm?~`%j9h~oA#EyQg3*xbRPD90g5L*WB>pF delta 821 zcmYk)ziU%b7{>9_Bu&$%X=_?rqc&bTRGY=R)uDq{6qhVYCYKOSHDGSS?Y*K<2!i+z zT#AT8Td+uQv!$C*jDsLbtf3m-bI&dJd*t%#IM44-Pz_&W7WZ)w-=XS!K-K+(Q}`J*|2vN2PfXF@3^4l? zi8P*P*XK}wyg@ZBq>NXwf@<*G8#RB5$wTxv zMZRcd^Ge_))Cw=7j_f*K#EQ#5MHP%uN4tYs$R4WB0iMQ>s4M%1s&|N**TXZIp;=qk z%suoA>J${3tO8tRe*v6SKlF}h<=T~EmZ1h}sv}ouhYD?^z+kienB-H}K=0!*_y0jV z(W-I`y@)!(8Adj4BwmzO0$UBOw-)l*uzqM\n" "Language-Team: \n" @@ -37,37 +37,21 @@ msgstr "Relevés" msgid "Transactions" msgstr "Transactions" -#: .\main\templates\main\base.html:51 .\main\templates\main\index.html:39 -msgid "Create account" -msgstr "Créer un compte" - -#: .\main\templates\main\base.html:56 -msgid "Create statement" -msgstr "Créer un relevé" - -#: .\main\templates\main\base.html:61 -msgid "Create category" -msgstr "Créer une catégorie" - -#: .\main\templates\main\base.html:66 -msgid "Create transaction" -msgstr "Créer une transaction" - -#: .\main\templates\main\base.html:71 .\main\templates\main\list.html:10 +#: .\main\templates\main\base.html:51 .\main\templates\main\list.html:10 #: .\main\templates\main\list.html:34 msgid "Search" msgstr "Rechercher" -#: .\main\templates\main\base.html:74 +#: .\main\templates\main\base.html:54 msgid "Log out" msgstr "Se déconnecter" -#: .\main\templates\main\base.html:79 .\main\templates\main\form\login.html:6 +#: .\main\templates\main\base.html:59 .\main\templates\main\form\login.html:6 #: .\main\templates\main\login.html:11 msgid "Log in" msgstr "Se connecter" -#: .\main\templates\main\base.html:85 +#: .\main\templates\main\base.html:65 #, python-format msgid "Logged in as %(user)s" msgstr "Connecté en tant que %(user)s" @@ -117,22 +101,39 @@ msgstr "Compte" msgid "Balance" msgstr "Solde" -#: .\main\templates\main\index.html:32 +#: .\main\templates\main\index.html:19 .\main\templates\main\index.html:30 +msgid "Edit" +msgstr "Modifier" + +#: .\main\templates\main\index.html:34 msgid "No account" msgstr "Aucun compte" -#: .\main\templates\main\index.html:47 +#: .\main\templates\main\index.html:41 +msgid "Create account" +msgstr "Créer un compte" + +#: .\main\templates\main\index.html:48 msgid "Categories" msgstr "Catégories" -#: .\main\templates\main\index.html:53 -msgid "No category" -msgstr "Aucune catégorie" +#: .\main\templates\main\index.html:54 +msgid "Create category" +msgstr "Créer une catégorie" -#: .\main\templates\main\index.html:62 +#: .\main\templates\main\index.html:61 msgid "History" msgstr "Historique" -#: .\main\views.py:68 +#: .\main\views.py:69 msgid "was created successfully" msgstr "a été créé avec succès" + +#~ msgid "Create statement" +#~ msgstr "Créer un relevé" + +#~ msgid "Create transaction" +#~ msgstr "Créer une transaction" + +#~ msgid "No category" +#~ msgstr "Aucune catégorie" diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 1ee72a6..7dc2378 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -9,6 +9,7 @@ form { > table > tbody > tr > th { background: var(--bg-01); background-clip: padding-box; + border-right: 1px solid var(--gray); } tbody :is(input, select, textarea) { font: inherit; diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 35dd9d1..e81f77a 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -234,21 +234,25 @@ footer { &.green, &.red, &.white { - color: var(--bg); &.green { background: var(--green); + color: var(--bg); } &.red { background: var(--red); + color: var(--bg); } &.white { background: var(--bg-01); - color: var(--text); } border-radius: var(--radius); - height: 1.5rem; - width: 1.5rem; - line-height: 1.5rem; + height: 1.5em; + width: 1.5em; + line-height: 1.5em; + } + + h2 & { + margin-right: 0.5em; } } diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 6a42983..b637297 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -16,6 +16,7 @@ {% translate "Account" %} {% translate "Balance" %} + {% translate "Edit" %} @@ -26,16 +27,19 @@ {{ acc }} {{ acc.statement_set.first.value|value }} + + {% translate "Edit" %} + {% empty %} - {% translate "No account" %} + {% translate "No account" %} {% endfor %} - + {% translate "Create account" %} diff --git a/nummi/main/views.py b/nummi/main/views.py index e1d52a3..a6361ab 100644 --- a/nummi/main/views.py +++ b/nummi/main/views.py @@ -9,6 +9,7 @@ from django.utils.translation import gettext as _ from django.views.generic import ( CreateView, DeleteView, + DetailView, ListView, TemplateView, UpdateView, @@ -76,6 +77,10 @@ class NummiUpdateView(UserMixin, UpdateView): pass +class NummiDetailView(UserMixin, DetailView): + pass + + class NummiDeleteView(UserMixin, DeleteView): template_name = "main/confirm_delete.html" success_url = reverse_lazy("index") From 9d50dc715449120cfa7a69a9c7833c96a8011977 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 4 Jan 2024 16:51:48 +0100 Subject: [PATCH 103/213] Separate detail and edit view for category, update statement page --- .../locale/fr_FR/LC_MESSAGES/django.po | 10 ++-- .../templates/account/account_detail.html | 1 - nummi/account/views.py | 25 --------- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 899 -> 968 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 22 ++++---- .../templates/category/category_detail.html | 24 +++++++++ .../templates/category/category_form.html | 12 ----- .../templates/category/category_plot.html | 48 +++++++++++++----- nummi/category/templatetags/category.py | 18 +++++-- nummi/category/urls.py | 3 +- nummi/category/views.py | 14 ++++- nummi/main/locale/fr_FR/LC_MESSAGES/django.po | 14 ++--- nummi/main/static/main/css/plot.css | 2 +- nummi/main/templatetags/main_extras.py | 14 ++--- .../templates/statement/statement_form.html | 9 ++-- 15 files changed, 120 insertions(+), 96 deletions(-) create mode 100644 nummi/category/templates/category/category_detail.html diff --git a/nummi/account/locale/fr_FR/LC_MESSAGES/django.po b/nummi/account/locale/fr_FR/LC_MESSAGES/django.po index e0baa15..14f7e1a 100644 --- a/nummi/account/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/account/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-04 16:04+0100\n" +"POT-Creation-Date: 2024-01-04 16:18+0100\n" "PO-Revision-Date: 2023-04-22 15:17+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -37,19 +37,19 @@ msgstr "Défaut" msgid "Accounts" msgstr "Comptes" -#: .\account\templates\account\account_detail.html:15 +#: .\account\templates\account\account_detail.html:13 msgid "Edit account" msgstr "Modifier le compte" -#: .\account\templates\account\account_detail.html:17 +#: .\account\templates\account\account_detail.html:16 msgid "Statements" msgstr "Relevés" -#: .\account\templates\account\account_detail.html:21 +#: .\account\templates\account\account_detail.html:20 msgid "Transactions" msgstr "Transactions" -#: .\account\templates\account\account_detail.html:26 +#: .\account\templates\account\account_detail.html:25 msgid "History" msgstr "Historique" diff --git a/nummi/account/templates/account/account_detail.html b/nummi/account/templates/account/account_detail.html index 419669e..92c3c7f 100644 --- a/nummi/account/templates/account/account_detail.html +++ b/nummi/account/templates/account/account_detail.html @@ -4,7 +4,6 @@ {% block title %}{{ object }} – {{ block.super }}{% endblock %} {% block link %} {{ block.super }} - {% css "main/css/form.css" %} {% css "main/css/table.css" %} {% css "main/css/plot.css" %} {% endblock %} diff --git a/nummi/account/views.py b/nummi/account/views.py index a07bd8b..902db10 100644 --- a/nummi/account/views.py +++ b/nummi/account/views.py @@ -24,31 +24,6 @@ class AccountUpdateView(NummiUpdateView): form_class = AccountForm pk_url_kwarg = "account" - def get_context_data(self, **kwargs): - _max = 8 - data = super().get_context_data(**kwargs) - account = data["form"].instance - - _transactions = account.transaction_set.all() - if _transactions.count() > _max: - data["transactions_url"] = reverse_lazy( - "account_transactions", args=(account.pk,) - ) - _statements = account.statement_set.all() - if _statements.count() > _max: - data["statements_url"] = reverse_lazy( - "account_statements", args=(account.pk,) - ) - - return data | { - "transactions": _transactions[:8], - "new_statement_url": reverse_lazy( - "new_statement", kwargs={"account": account.pk} - ), - "statements": _statements[:8], - "history": history(account.transaction_set), - } - class AccountDeleteView(NummiDeleteView): model = Account diff --git a/nummi/category/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/category/locale/fr_FR/LC_MESSAGES/django.mo index 32338f9c0ed8d8e5f6168003298a21f3684d5ae9..53d58b5e6341c6055989605e6b469824c309374e 100644 GIT binary patch delta 417 zcmYk&u};EJ6vpvW3KRt~!GI<@7#BBpSD6V<;LxO{Tw^T3Ix&!_lY zxyLP>=I>`1u%2TP7pVHzeEp6!)*o0m8`~F?5-)!855IU!{*fx&_syz!glgafn|O*X z?BWLY^6vvw-3ZmlE%Mj{!wx=T17}!be|u)4j^2+5Ux*uPU86jJ?1M+;TE-S z7taq^V17o`iZE@qwrl+2jt%lbYT-L!=Hmxd*pg;d@G*yV)bl3l`!=e94suzSn+_6U zfFq=!%~6dk(OHiXp^mi4zYwZ`LJM>ndiV!xtQe0~OdIKM_{XVh-6D5!$60dx0~w\n" "Language-Team: \n" @@ -38,6 +38,18 @@ msgstr "Budget" msgid "Categories" msgstr "Catégories" +#: .\category\templates\category\category_detail.html:12 +msgid "Edit category" +msgstr "Modifier la catégorie" + +#: .\category\templates\category\category_detail.html:15 +msgid "Transactions" +msgstr "Transactions" + +#: .\category\templates\category\category_detail.html:20 +msgid "History" +msgstr "Historique" + #: .\category\templates\category\category_form.html:5 msgid "Create category" msgstr "Créer une catégorie" @@ -46,14 +58,6 @@ msgstr "Créer une catégorie" msgid "New category" msgstr "Nouvelle catégorie" -#: .\category\templates\category\category_form.html:13 -msgid "Transactions" -msgstr "Transactions" - -#: .\category\templates\category\category_form.html:18 -msgid "History" -msgstr "Historique" - #: .\category\templates\category\category_plot.html:15 msgid "Expenses" msgstr "Dépenses" diff --git a/nummi/category/templates/category/category_detail.html b/nummi/category/templates/category/category_detail.html new file mode 100644 index 0000000..b0ea18f --- /dev/null +++ b/nummi/category/templates/category/category_detail.html @@ -0,0 +1,24 @@ +{% extends "main/base.html" %} +{% load main_extras i18n %} +{% block title %}{{ object }} – {{ block.super }}{% endblock %} +{% block link %} + {{ block.super }} + {% css "main/css/table.css" %} + {% css "main/css/plot.css" %} +{% endblock %} +{% block body %} +

    {{ object.icon|remix }}{{ object }}

    +

    + {% translate "Edit category" %} +

    +
    +

    {% translate "Transactions" %}

    + {% include "transaction/transaction_table.html" %} +
    + {% if history %} +
    +

    {% translate "History" %}

    + {% include "history/plot.html" %} +
    + {% endif %} +{% endblock %} diff --git a/nummi/category/templates/category/category_form.html b/nummi/category/templates/category/category_form.html index f4aaa6d..7e2748e 100644 --- a/nummi/category/templates/category/category_form.html +++ b/nummi/category/templates/category/category_form.html @@ -8,15 +8,3 @@ {% translate "New category" %} {% endblock %} {% block h2 %}{{ form.instance.icon|remix }}{{ form.instance }}{% endblock %} -{% block tables %} -
    -

    {% translate "Transactions" %}

    - {% include "transaction/transaction_table.html" %} -
    - {% if history %} -
    -

    {% translate "History" %}

    - {% include "history/plot.html" %} -
    - {% endif %} -{% endblock %} diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index 63577af..c152c10 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -1,4 +1,4 @@ -{% load main_extras %} +{% load main_extras category %} {% load i18n %}
    @@ -34,14 +34,14 @@ - + @@ -51,11 +51,11 @@ {% endif %} {% if cat.sum > 0 %}
    - {{ cat.sum|pmrvalue }} + {{ cat.sum|pmvalue }}
    {% endif %} - + {% empty %} @@ -64,16 +64,16 @@ {% endfor %} {% endspaceless %} - {% if categories %} - + + {% if categories %} - + @@ -81,13 +81,35 @@
    {% if total > 0 %}
    - {{ total|pmrvalue }} + {{ total|pmvalue }}
    {% endif %} - + - - {% endif %} + {% endif %} + {% if statement %} + + + + + + + + + {% endif %} +
    {% if cat.category %}{{ cat.category__icon|remix }}{% endif %} {{ cat.sum_m|pmrvalue }}{{ cat.sum_m|pmvalue }} {% if cat.sum_m %}
    {% endif %} {% if cat.sum < 0 %}
    - {{ cat.sum|pmrvalue }} + {{ cat.sum|pmvalue }}
    {% endif %}
    {{ cat.sum_p|pmrvalue }}{{ cat.sum_p|pmvalue }}
    {% translate "Total" %}{{ total_m|pmrvalue }}{{ total_m|pmvalue }}
    {% if total < 0 %}
    - {{ total|pmrvalue }} + {{ total|pmvalue }}
    {% endif %}
    {{ total_p|pmrvalue }}{{ total_p|pmvalue }}
    {% translate "Expected total" %}{{ total|check:statement.diff }} + {% if statement.diff < 0 %} +
    + {{ statement.diff|pmvalue }} +
    + {% endif %} +
    + {% if statement.diff >= 0 %} +
    + {{ statement.diff|pmvalue }} +
    + {% endif %} +
    diff --git a/nummi/category/templatetags/category.py b/nummi/category/templatetags/category.py index 5f76341..aaf3bf9 100644 --- a/nummi/category/templatetags/category.py +++ b/nummi/category/templatetags/category.py @@ -1,15 +1,17 @@ from django import template from django.db import models from django.db.models.functions import Greatest +from main.templatetags.main_extras import remix register = template.Library() @register.inclusion_tag("category/category_plot.html") -def category_plot(transactions, **kwargs): +def category_plot(transactions, budget=True, **kwargs): + if budget: + transactions = transactions.exclude(category__budget=False) categories = ( - transactions.exclude(category__budget=False) - .values("category", "category__name", "category__icon") + transactions.values("category", "category__name", "category__icon") .annotate( sum=models.Sum("value"), sum_m=models.Sum("value", filter=models.Q(value__lt=0)), @@ -29,3 +31,13 @@ def category_plot(transactions, **kwargs): total=models.Sum("sum"), ) ) + + +@register.filter +def check(s, diff): + if s is None: + s = 0 + if s == diff: + return remix("check", "green") + else: + return remix("close", "red") diff --git a/nummi/category/urls.py b/nummi/category/urls.py index 64b8ae9..9936065 100644 --- a/nummi/category/urls.py +++ b/nummi/category/urls.py @@ -5,7 +5,8 @@ from . import views urlpatterns = [ path("new", views.CategoryCreateView.as_view(), name="new_category"), - path("", views.CategoryUpdateView.as_view(), name="category"), + path("", views.CategoryDetailView.as_view(), name="category"), + path("/edit", views.CategoryUpdateView.as_view(), name="edit_category"), path( "/transactions", views.CategoryTListView.as_view(), diff --git a/nummi/category/views.py b/nummi/category/views.py index 36fe0d0..f01d908 100644 --- a/nummi/category/views.py +++ b/nummi/category/views.py @@ -1,7 +1,12 @@ from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy from history.utils import history -from main.views import NummiCreateView, NummiDeleteView, NummiUpdateView +from main.views import ( + NummiCreateView, + NummiDeleteView, + NummiDetailView, + NummiUpdateView, +) from transaction.views import TransactionListView from .forms import CategoryForm @@ -18,10 +23,15 @@ class CategoryUpdateView(NummiUpdateView): form_class = CategoryForm pk_url_kwarg = "category" + +class CategoryDetailView(NummiDetailView): + model = Category + pk_url_kwarg = "category" + def get_context_data(self, **kwargs): _max = 8 data = super().get_context_data(**kwargs) - category = data["form"].instance + category = data["object"] data["transactions"] = category.transaction_set.all()[:_max] if len(data["transactions"]) == _max: diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po index fbf05c3..4ff140a 100644 --- a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-04 16:04+0100\n" +"POT-Creation-Date: 2024-01-04 16:18+0100\n" "PO-Revision-Date: 2023-04-23 08:03+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -101,27 +101,27 @@ msgstr "Compte" msgid "Balance" msgstr "Solde" -#: .\main\templates\main\index.html:19 .\main\templates\main\index.html:30 +#: .\main\templates\main\index.html:19 .\main\templates\main\index.html:31 msgid "Edit" msgstr "Modifier" -#: .\main\templates\main\index.html:34 +#: .\main\templates\main\index.html:36 msgid "No account" msgstr "Aucun compte" -#: .\main\templates\main\index.html:41 +#: .\main\templates\main\index.html:43 msgid "Create account" msgstr "Créer un compte" -#: .\main\templates\main\index.html:48 +#: .\main\templates\main\index.html:50 msgid "Categories" msgstr "Catégories" -#: .\main\templates\main\index.html:54 +#: .\main\templates\main\index.html:56 msgid "Create category" msgstr "Créer une catégorie" -#: .\main\templates\main\index.html:61 +#: .\main\templates\main\index.html:63 msgid "History" msgstr "Historique" diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index 9a2bc7a..4a9eb36 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -8,9 +8,9 @@ table.full-width col.bar { td.bar { position: relative; padding: 0; + overflow: hidden; @media (width < 720px) { width: 0; - overflow: hidden; } div { diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index a85d8db..fd29a10 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -8,16 +8,16 @@ register = template.Library() @register.filter def value(val, pm=False, r=2): - if not val: + if val is None: return "" _prefix = "" _suffix = " €" - _val = formats.number_format(round(val, r), r, use_l10n=True, force_grouping=True) + _val = formats.number_format(val, decimal_pos=r, use_l10n=True, force_grouping=True) if val > 0: if pm: _prefix += "+ " - else: + elif val < 0: _val = _val[1:] _prefix += "− " @@ -39,14 +39,6 @@ def remix(icon, cls=""): return mark_safe(f"""""") -@register.filter -def check(sum, diff): - if sum == diff: - return remix("check", "green") - else: - return remix("close", "red") - - @register.filter def extension(file): return file.name.split(".")[-1].upper() diff --git a/nummi/statement/templates/statement/statement_form.html b/nummi/statement/templates/statement/statement_form.html index b09e993..f5e04c8 100644 --- a/nummi/statement/templates/statement/statement_form.html +++ b/nummi/statement/templates/statement/statement_form.html @@ -6,10 +6,7 @@ {% block h2_new %} {% translate "New statement" %} {% endblock %} -{% block h2 %} - {{ form.instance.sum|check:form.instance.diff }} - {{ form.instance }} -{% endblock %} +{% block h2 %}{{ form.instance }}{% endblock %} {% block pre %} {% if account %}

    @@ -21,10 +18,10 @@ {% if not form.instance|adding %}

    {% translate "Categories" %}

    - {% category_plot transactions %} + {% category_plot transactions budget=False statement=object %}
    -

    {% translate "Transactions" %} ({{ form.instance.sum|pmvalue }} / {{ form.instance.diff|pmvalue }})

    +

    {% translate "Transactions" %}

    {% include "transaction/transaction_table.html" %}
    {% endif %} From ca7cd790b51045ab9743d00dc39f998794cd0ddc Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 4 Jan 2024 16:58:47 +0100 Subject: [PATCH 104/213] Update check icons in statement table --- .../category/templates/category/category_plot.html | 2 +- nummi/category/templatetags/category.py | 11 ----------- .../templates/statement/statement_form.html | 2 +- .../templates/statement/statement_table.html | 9 ++------- nummi/statement/templatetags/statement_extras.py | 14 ++++++++++++++ 5 files changed, 18 insertions(+), 20 deletions(-) create mode 100644 nummi/statement/templatetags/statement_extras.py diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index c152c10..2b76bc5 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -1,4 +1,4 @@ -{% load main_extras category %} +{% load main_extras statement_extras %} {% load i18n %}
    diff --git a/nummi/category/templatetags/category.py b/nummi/category/templatetags/category.py index aaf3bf9..b085bf2 100644 --- a/nummi/category/templatetags/category.py +++ b/nummi/category/templatetags/category.py @@ -1,7 +1,6 @@ from django import template from django.db import models from django.db.models.functions import Greatest -from main.templatetags.main_extras import remix register = template.Library() @@ -31,13 +30,3 @@ def category_plot(transactions, budget=True, **kwargs): total=models.Sum("sum"), ) ) - - -@register.filter -def check(s, diff): - if s is None: - s = 0 - if s == diff: - return remix("check", "green") - else: - return remix("close", "red") diff --git a/nummi/statement/templates/statement/statement_form.html b/nummi/statement/templates/statement/statement_form.html index f5e04c8..cfe210b 100644 --- a/nummi/statement/templates/statement/statement_form.html +++ b/nummi/statement/templates/statement/statement_form.html @@ -1,5 +1,5 @@ {% extends "main/form/base.html" %} -{% load i18n main_extras category %} +{% load i18n main_extras statement_extras category %} {% block title_new %} {% translate "Create statement" %} {% endblock %} diff --git a/nummi/statement/templates/statement/statement_table.html b/nummi/statement/templates/statement/statement_table.html index 514dc16..32a83f3 100644 --- a/nummi/statement/templates/statement/statement_table.html +++ b/nummi/statement/templates/statement/statement_table.html @@ -1,5 +1,4 @@ -{% load main_extras %} -{% load i18n %} +{% load i18n main_extras statement_extras %}
    @@ -34,11 +33,7 @@ {% for snap in statements %} - {% if snap.sum == snap.diff %} - - {% else %} - - {% endif %} + diff --git a/nummi/statement/templatetags/statement_extras.py b/nummi/statement/templatetags/statement_extras.py new file mode 100644 index 0000000..a8631d1 --- /dev/null +++ b/nummi/statement/templatetags/statement_extras.py @@ -0,0 +1,14 @@ +from django import template +from main.templatetags.main_extras import remix + +register = template.Library() + + +@register.filter +def check(s, diff): + if s is None: + s = 0 + if s == diff: + return remix("check", "green") + else: + return remix("close", "red") From e41b9898624a14c6172e6a5544ae62f9edc9e0fe Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 4 Jan 2024 17:04:37 +0100 Subject: [PATCH 105/213] Add creation links to statement and transaction list pages --- nummi/statement/templates/statement/statement_list.html | 1 + nummi/transaction/templates/transaction/transaction_list.html | 1 + 2 files changed, 2 insertions(+) diff --git a/nummi/statement/templates/statement/statement_list.html b/nummi/statement/templates/statement/statement_list.html index 73bc595..cd19d8b 100644 --- a/nummi/statement/templates/statement/statement_list.html +++ b/nummi/statement/templates/statement/statement_list.html @@ -7,5 +7,6 @@ {% translate "Statements" %} {% endblock %} {% block table %} + {% url "new_statement" as new_statement_url %} {% include "statement/statement_table.html" %} {% endblock %} diff --git a/nummi/transaction/templates/transaction/transaction_list.html b/nummi/transaction/templates/transaction/transaction_list.html index a7e8dea..c75751c 100644 --- a/nummi/transaction/templates/transaction/transaction_list.html +++ b/nummi/transaction/templates/transaction/transaction_list.html @@ -7,5 +7,6 @@ {% translate "Transactions" %} {% endblock %} {% block table %} + {% url "new_transaction" as new_transaction_url %} {% include "transaction/transaction_table.html" %} {% endblock %} From 67e71b717b16527dc4add88f0edd53fed9d0642f Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 4 Jan 2024 17:16:13 +0100 Subject: [PATCH 106/213] Fix back link --- nummi/main/static/main/css/main.css | 2 +- nummi/main/templates/main/list.html | 34 +++++++++++-------- .../transaction_archive_month.html | 6 ++-- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index e81f77a..2a236d0 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -311,7 +311,7 @@ ul.messages { grid-column: 2; text-align: right; - .big-link { + a { margin-right: 0; margin-left: 1em; [class^="ri-"] { diff --git a/nummi/main/templates/main/list.html b/nummi/main/templates/main/list.html index ee3050e..ddde7ec 100644 --- a/nummi/main/templates/main/list.html +++ b/nummi/main/templates/main/list.html @@ -19,20 +19,26 @@

    {% block h2 %}{% endblock %}

    - {% if account %} -

    - {{ account.icon|remix }}{{ account }} -

    - {% endif %} - {% if category %} -

    - {{ category.icon|remix }}{{ category }} -

    - {% endif %} - {% if search %} -

    - {% translate "Search" %} -

    + {% if account or category or search %} + {% endif %} {% include "main/pagination.html" %} {% block table %}{% endblock %} diff --git a/nummi/transaction/templates/transaction/transaction_archive_month.html b/nummi/transaction/templates/transaction/transaction_archive_month.html index 5b85799..7d9691d 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_month.html +++ b/nummi/transaction/templates/transaction/transaction_archive_month.html @@ -4,15 +4,13 @@ {{ block.super }} {% css "main/css/plot.css" %} {% endblock %} +{% block name %}{{ month|date:"F Y"|capfirst }}{% endblock %} {% block h2 %}{{ month|date:"F Y"|capfirst }}{% endblock %} {% block backlinks %} {{ block.super }} {% if account or category %}

    - - {% translate "Back" %}{{ "arrow-go-back"|remix }} - + {% translate "Back" %}{{ "arrow-go-back"|remix }}

    {% endif %} {% endblock %} From 63258147ee108736b429b831f706a83b95b941e4 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 4 Jan 2024 18:33:56 +0100 Subject: [PATCH 107/213] Add icons to navbar --- nummi/main/static/main/css/main.css | 22 +++++++++++++++++----- nummi/main/templates/main/base.html | 22 ++++++++++++++++------ 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 2a236d0..d532a1c 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -1,4 +1,5 @@ @import "https://rsms.me/inter/inter.css"; +@import "https://cdn.jsdelivr.net/npm/remixicon@4.0.0/fonts/remixicon.css"; *, *::before, @@ -152,13 +153,22 @@ nav { font-weight: 500; } } - display: block; + display: grid; + grid-template-columns: 1fr max-content; + align-items: baseline; + + [class^="ri-"] { + height: 1.5em; + width: 1.5em; + line-height: 1.5em; + border-radius: var(--radius); + } + &.cur { font-weight: 550; - &::after { - content: "◎"; - position: absolute; - right: 0; + [class^="ri-"] { + background: var(--text-link); + color: var(--bg); } } } @@ -229,6 +239,8 @@ footer { } } [class^="ri-"] { + display: inline-block; + text-align: center; font-weight: normal; &.green, diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html index a07113a..1ac1bb0 100644 --- a/nummi/main/templates/main/base.html +++ b/nummi/main/templates/main/base.html @@ -12,7 +12,6 @@ {% block link %} {% css "main/css/main.css" %} - {% css "main/remixicon/remixicon.css" %} {% endblock %} @@ -31,27 +30,38 @@
  • {% translate "Home" %} + accesskey="h"> + {% translate "Home" %} + {{ "home"|remix }} +
  • - {% translate "Statements" %} + {% translate "Statements" %} + {{ "file"|remix }}
  • - {% translate "Transactions" %} + {% translate "Transactions" %} + {{ "receipt"|remix }}
  • {% translate "Search" %} + accesskey="r"> + {% translate "Search" %} + {{ "search"|remix }} +
  • - {% translate "Log out" %} + + {% translate "Log out" %} + {{ "close-circle"|remix }} +
  • {% else %}
  • From 7369b36ab112c00726969e886ff885b9341187cc Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 4 Jan 2024 18:45:17 +0100 Subject: [PATCH 108/213] Move connected as item in navbar --- nummi/main/templates/main/base.html | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html index 1ac1bb0..1b01ac0 100644 --- a/nummi/main/templates/main/base.html +++ b/nummi/main/templates/main/base.html @@ -57,6 +57,9 @@ {{ "search"|remix }}
  • +
  • + {% blocktranslate %}Logged in as {{ user }}{% endblocktranslate %} +
  • {% translate "Log out" %} @@ -70,11 +73,6 @@
  • {% endif %} - {% if user.is_authenticated %} -

    - {% blocktranslate %}Logged in as {{ user }}{% endblocktranslate %} -

    - {% endif %} {% endspaceless %} {% endblock %} From a6e84fbc1381ae01e8119c653c11f472e4ae98d1 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 4 Jan 2024 18:45:42 +0100 Subject: [PATCH 109/213] Fix back link styling on year page --- .../templates/transaction/transaction_archive_year.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/transaction/templates/transaction/transaction_archive_year.html b/nummi/transaction/templates/transaction/transaction_archive_year.html index 4b979d8..f8afb5e 100644 --- a/nummi/transaction/templates/transaction/transaction_archive_year.html +++ b/nummi/transaction/templates/transaction/transaction_archive_year.html @@ -10,7 +10,7 @@ {{ block.super }} {% if account or category %}

    - {% translate "Back" %}{{ "arrow-go-back"|remix }} + {% translate "Back" %}{{ "arrow-go-back"|remix }}

    {% endif %} {% endblock %} From 0ff191e0a4eb0e2f307f32a0ed762baed874aad1 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 5 Jan 2024 08:56:16 +0100 Subject: [PATCH 110/213] Fix account table display on small devices --- nummi/main/static/main/css/main.css | 2 +- nummi/main/static/main/css/table.css | 1 + nummi/main/templates/main/index.html | 64 ++++++++++++++-------------- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index d532a1c..f562459 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -114,7 +114,7 @@ main { display: grid; column-gap: var(--gap); row-gap: var(--gap); - grid-template-columns: 1fr; + grid-template-columns: 100%; @media (width > 720px) { grid-template-columns: max-content 1fr; } diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index 3e38ad6..c2c9fec 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -1,6 +1,7 @@ .table, form { overflow-x: auto; + width: 100%; } table { border-collapse: collapse; diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index b637297..c5b457b 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -11,40 +11,42 @@

    {% translate "Accounts" %}

    -
    {{ "check"|remix }}{{ "close"|remix }}{{ snap.sum|check:snap.diff }} {% if snap.file %}{{ "attachment"|remix }}{% endif %}
    - - - - - - - - - {% for acc in accounts %} +
    +
    {% translate "Account" %}{% translate "Balance" %}{% translate "Edit" %}
    + - - - - + + + + + + {% for acc in accounts %} + + + + + + + {% empty %} + + + + {% endfor %} + + + + - {% empty %} - - - - {% endfor %} - - - - - - -
    {{ acc.icon|remix }} - {{ acc }} - {{ acc.statement_set.first.value|value }} - {% translate "Edit" %} + {% translate "Account" %}{% translate "Balance" %}{% translate "Edit" %}
    {{ acc.icon|remix }} + {{ acc }} + {{ acc.statement_set.first.value|value }} + {% translate "Edit" %} +
    {% translate "No account" %}
    + {% translate "Create account" %}
    {% translate "No account" %}
    - {% translate "Create account" %} -
    + + +

    {% translate "Categories" %}

    From ad020e476b523e153e1494444bb475d9c1a61841 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 5 Jan 2024 09:00:08 +0100 Subject: [PATCH 111/213] Add icon to log in link in navbar --- nummi/main/templates/main/base.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html index 1b01ac0..2a497f9 100644 --- a/nummi/main/templates/main/base.html +++ b/nummi/main/templates/main/base.html @@ -69,7 +69,10 @@ {% else %}
  • {% translate "Log in" %} + href="{% url "login" %}"> + {% translate "Log in" %} + {{ "user"|remix }} +
  • {% endif %} From ee3ec2152767113b81049ff2dbea88b8739a2a83 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 5 Jan 2024 09:11:38 +0100 Subject: [PATCH 112/213] Update styling on invoice table --- nummi/transaction/templates/transaction/invoice_table.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/transaction/templates/transaction/invoice_table.html b/nummi/transaction/templates/transaction/invoice_table.html index 444509c..ac9e154 100644 --- a/nummi/transaction/templates/transaction/invoice_table.html +++ b/nummi/transaction/templates/transaction/invoice_table.html @@ -32,7 +32,7 @@ {% endfor %} - + {% translate "Create invoice" %} From e93f6f5d2baec805378bb1b066e0b86cdd902b9e Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 23 Mar 2024 10:52:28 +0100 Subject: [PATCH 113/213] Fix empty accounts producing error 500 --- nummi/main/templates/main/index.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index c5b457b..1c278b0 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -27,7 +27,9 @@ {{ acc }} - {{ acc.statement_set.first.value|value }} + + {% if acc.statement_set.first %}{{ acc.statement_set.first.value|value }}{% endif %} + {% translate "Edit" %} From 18a58783c8c0fbaf4a17eb60110eca70e712b0b1 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 23 Mar 2024 10:56:22 +0100 Subject: [PATCH 114/213] Fix form table header background (fix #15) --- nummi/main/static/main/css/form.css | 1 - 1 file changed, 1 deletion(-) diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 7dc2378..470220a 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -8,7 +8,6 @@ form ul.errorlist { form { > table > tbody > tr > th { background: var(--bg-01); - background-clip: padding-box; border-right: 1px solid var(--gray); } tbody :is(input, select, textarea) { From 50ae922a9992d59602695e8569ffcf42c56f2e97 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 23 Mar 2024 11:51:37 +0100 Subject: [PATCH 115/213] Add total line in account list on index page --- nummi/main/static/main/css/plot.css | 4 ---- nummi/main/static/main/css/table.css | 3 +++ nummi/main/templates/main/index.html | 6 ++++++ nummi/main/templatetags/main_extras.py | 7 +++++++ nummi/main/views.py | 3 ++- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index 4a9eb36..3ec218b 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -77,10 +77,6 @@ table.full-width col.bar { background: #eeeeff; } } - - tfoot { - background: var(--bg-01); - } } .calendar { diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index c2c9fec..e93c777 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -45,6 +45,9 @@ table { font-weight: 300; } } + tfoot tr:not(.new) { + background: var(--bg-01); + } } .date, diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 1c278b0..19a5b54 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -41,6 +41,12 @@ {% endfor %} + + {{ "functions"|remix }} + {% translate "Total" %} + {{ accounts|balance|value }} + + {% translate "Create account" %} diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index fd29a10..8234b3f 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -59,3 +59,10 @@ def css(href): return mark_safe( f"""""" ) + + +@register.filter +def balance(accounts): + return sum( + statement.value for acc in accounts if (statement := acc.statement_set.first()) + ) diff --git a/nummi/main/views.py b/nummi/main/views.py index a6361ab..72e6840 100644 --- a/nummi/main/views.py +++ b/nummi/main/views.py @@ -26,9 +26,10 @@ class IndexView(LoginRequiredMixin, TemplateView): _max = 8 _transactions = Transaction.objects.filter(user=self.request.user) _statements = Statement.objects.filter(user=self.request.user) + _accounts = Account.objects.filter(user=self.request.user) res = { - "accounts": Account.objects.filter(user=self.request.user), + "accounts": _accounts, "transactions": _transactions[:_max], "categories": Category.objects.filter(user=self.request.user), "statements": _statements[:_max], From cf25fd1826e2028f1a3ac67abd7e158b47313c59 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sun, 29 Dec 2024 10:38:25 +0100 Subject: [PATCH 116/213] Enable archiving accounts --- nummi/account/forms.py | 1 + .../account/migrations/0003_account_archived.py | 17 +++++++++++++++++ nummi/account/models.py | 1 + nummi/main/static/main/css/table.css | 3 +++ nummi/main/static/main/js/index.js | 8 ++++++++ nummi/main/templates/main/index.html | 8 +++++++- nummi/main/templatetags/main_extras.py | 5 +++++ 7 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 nummi/account/migrations/0003_account_archived.py create mode 100644 nummi/main/static/main/js/index.js diff --git a/nummi/account/forms.py b/nummi/account/forms.py index 3225ab0..4b66f90 100644 --- a/nummi/account/forms.py +++ b/nummi/account/forms.py @@ -10,4 +10,5 @@ class AccountForm(NummiForm): "name", "icon", "default", + "archived", ] diff --git a/nummi/account/migrations/0003_account_archived.py b/nummi/account/migrations/0003_account_archived.py new file mode 100644 index 0000000..564297f --- /dev/null +++ b/nummi/account/migrations/0003_account_archived.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2 on 2024-12-29 09:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("account", "0002_alter_account_table"), + ] + + operations = [ + migrations.AddField( + model_name="account", + name="archived", + field=models.BooleanField(default=False, verbose_name="Archived"), + ), + ] diff --git a/nummi/account/models.py b/nummi/account/models.py index 4709ef5..5321ad5 100644 --- a/nummi/account/models.py +++ b/nummi/account/models.py @@ -15,6 +15,7 @@ class Account(UserModel): verbose_name=_("Icon"), ) default = models.BooleanField(default=False, verbose_name=_("Default")) + archived = models.BooleanField(default=False, verbose_name=_("Archived")) def save(self, *args, **kwargs): if self.default: diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index e93c777..478dd33 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -33,6 +33,9 @@ table { border-style: dashed; } } + &:not(.show-archive) tr.archived { + display: none; + } td, th { padding: 0 var(--gap); diff --git a/nummi/main/static/main/js/index.js b/nummi/main/static/main/js/index.js new file mode 100644 index 0000000..d506bf1 --- /dev/null +++ b/nummi/main/static/main/js/index.js @@ -0,0 +1,8 @@ +for (let table of document.querySelectorAll("table")) { + let btn = table.querySelector("button.show-archive"); + if (btn) { + btn.addEventListener("click", (event) => { + table.classList.toggle("show-archive"); + }); + } +} diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 19a5b54..5a55b85 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -6,6 +6,7 @@ {{ block.super }} {% css "main/css/table.css" %} {% css "main/css/plot.css" %} + {% js "main/js/index.js" %} {% endblock %} {% block body %}
    @@ -22,7 +23,7 @@ {% for acc in accounts %} - + {{ acc.icon|remix }} {{ acc }} @@ -52,6 +53,11 @@ {% translate "Create account" %} + + + + +
    diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index 8234b3f..15cc7d0 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -61,6 +61,11 @@ def css(href): ) +@register.simple_tag +def js(href): + return mark_safe(f"""""") + + @register.filter def balance(accounts): return sum( From 93c4b43fa39f0875de95c3b9e3a705d832b9b86b Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Mon, 30 Dec 2024 16:11:43 +0100 Subject: [PATCH 117/213] Improve account list Closes #19 --- nummi/main/static/main/css/main.css | 22 +++++++++- nummi/main/static/main/css/table.css | 3 -- nummi/main/static/main/js/index.js | 16 ++++--- nummi/main/templates/main/index.html | 64 +++++++--------------------- 4 files changed, 46 insertions(+), 59 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index f562459..602f2de 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -116,7 +116,7 @@ main { row-gap: var(--gap); grid-template-columns: 100%; @media (width > 720px) { - grid-template-columns: max-content 1fr; + grid-template-columns: minmax(20rem, max-content) 1fr; } & > section > :first-child { @@ -334,3 +334,23 @@ ul.messages { } } } + +.accounts { + display: grid; + grid-row-gap: 0.5rem; + + dl { + margin: 0; + .account { + padding: 0.5rem; + margin-bottom: 0.5rem; + border: 1px solid var(--gray); + + display: grid; + grid-template-columns: 1fr min-content; + } + &:not(.show-archive) .account.archived { + display: none; + } + } +} diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index 478dd33..e93c777 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -33,9 +33,6 @@ table { border-style: dashed; } } - &:not(.show-archive) tr.archived { - display: none; - } td, th { padding: 0 var(--gap); diff --git a/nummi/main/static/main/js/index.js b/nummi/main/static/main/js/index.js index d506bf1..88438b2 100644 --- a/nummi/main/static/main/js/index.js +++ b/nummi/main/static/main/js/index.js @@ -1,8 +1,10 @@ -for (let table of document.querySelectorAll("table")) { - let btn = table.querySelector("button.show-archive"); - if (btn) { - btn.addEventListener("click", (event) => { - table.classList.toggle("show-archive"); - }); - } +let accounts = document.querySelector(".accounts"); +let toggle = accounts.querySelector("input#show-archived-accounts"); +let dl = accounts.querySelector("dl"); + +dl.classList.toggle("show-archive", toggle.checked); +if (toggle) { + toggle.addEventListener("change", (event) => { + dl.classList.toggle("show-archive", toggle.checked); + }); } diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 5a55b85..01006f1 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -12,55 +12,23 @@

    {% translate "Accounts" %}

    -
    - - - - - - - - - - {% for acc in accounts %} - - - - - - - {% empty %} - - - - {% endfor %} - - - - - - - - - - - - - - - -
    {% translate "Account" %}{% translate "Balance" %}{% translate "Edit" %}
    {{ acc.icon|remix }} - {{ acc }} - - {% if acc.statement_set.first %}{{ acc.statement_set.first.value|value }}{% endif %} - - {% translate "Edit" %} -
    {% translate "No account" %}
    {{ "functions"|remix }}{% translate "Total" %}{{ accounts|balance|value }}
    - {% translate "Create account" %} -
    - -
    +
    + {% for acc in accounts %} + + {% endfor %} +
    +
    + +
    + {% translate "Create account" %}

    {% translate "Categories" %}

    From 46ea394422e086e589843de3eb00430d88cf05a7 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Mon, 30 Dec 2024 16:35:03 +0100 Subject: [PATCH 118/213] Allow orphan transactions Closes #18 --- nummi/main/templates/main/confirm_delete.html | 1 + nummi/statement/forms.py | 4 +- .../templates/statement/confirm_delete.html | 5 +++ nummi/statement/views.py | 1 + ...0003_alter_transaction_account_and_more.py | 38 +++++++++++++++++++ nummi/transaction/models.py | 12 ++++-- 6 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 nummi/statement/templates/statement/confirm_delete.html create mode 100644 nummi/transaction/migrations/0003_alter_transaction_account_and_more.py diff --git a/nummi/main/templates/main/confirm_delete.html b/nummi/main/templates/main/confirm_delete.html index 19dd77b..db59293 100644 --- a/nummi/main/templates/main/confirm_delete.html +++ b/nummi/main/templates/main/confirm_delete.html @@ -14,6 +14,7 @@

    {% blocktranslate %}Are you sure you want do delete {{ object }} ?{% endblocktranslate %}

    + {% block additionalinfo %}{% endblock %} {{ form }}
    {% translate "Cancel" %} diff --git a/nummi/statement/forms.py b/nummi/statement/forms.py index 328d921..8467680 100644 --- a/nummi/statement/forms.py +++ b/nummi/statement/forms.py @@ -23,7 +23,9 @@ class StatementForm(NummiForm): self.fields["transactions"] = forms.MultipleChoiceField( choices=( ((_transaction.id), _transaction) - for _transaction in Transaction.objects.filter(user=_user) + for _transaction in Transaction.objects.filter( + user=_user, statement=None + ) ), label=_("Add transactions"), required=False, diff --git a/nummi/statement/templates/statement/confirm_delete.html b/nummi/statement/templates/statement/confirm_delete.html new file mode 100644 index 0000000..ebdaf4b --- /dev/null +++ b/nummi/statement/templates/statement/confirm_delete.html @@ -0,0 +1,5 @@ +{% extends "main/confirm_delete.html" %} +{% load i18n %} +{% block additionalinfo %} +

    {% blocktranslate %}This will delete all transactions in this statement.{% endblocktranslate %}

    +{% endblock %} diff --git a/nummi/statement/views.py b/nummi/statement/views.py index 435cb85..4d393d2 100644 --- a/nummi/statement/views.py +++ b/nummi/statement/views.py @@ -52,6 +52,7 @@ class StatementUpdateView(NummiUpdateView): class StatementDeleteView(NummiDeleteView): + template_name = "statement/confirm_delete.html" model = Statement pk_url_kwarg = "statement" diff --git a/nummi/transaction/migrations/0003_alter_transaction_account_and_more.py b/nummi/transaction/migrations/0003_alter_transaction_account_and_more.py new file mode 100644 index 0000000..6346f5a --- /dev/null +++ b/nummi/transaction/migrations/0003_alter_transaction_account_and_more.py @@ -0,0 +1,38 @@ +# Generated by Django 4.2 on 2024-12-30 15:29 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("statement", "0002_alter_statement_table"), + ("account", "0003_account_archived"), + ("transaction", "0002_alter_invoice_table_alter_transaction_table"), + ] + + operations = [ + migrations.AlterField( + model_name="transaction", + name="account", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="account.account", + verbose_name="Account", + ), + ), + migrations.AlterField( + model_name="transaction", + name="statement", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="statement.statement", + verbose_name="Statement", + ), + ), + ] diff --git a/nummi/transaction/models.py b/nummi/transaction/models.py index 46cdd20..f831f22 100644 --- a/nummi/transaction/models.py +++ b/nummi/transaction/models.py @@ -40,11 +40,15 @@ class Transaction(UserModel): statement = models.ForeignKey( Statement, on_delete=models.CASCADE, + blank=True, + null=True, verbose_name=_("Statement"), ) account = models.ForeignKey( Account, on_delete=models.CASCADE, + blank=True, + null=True, verbose_name=_("Account"), editable=False, ) @@ -54,11 +58,13 @@ class Transaction(UserModel): prev_self = Transaction.objects.get(pk=self.pk) else: prev_self = None - self.account = self.statement.account + if self.statement: + self.account = self.statement.account super().save(*args, **kwargs) - if prev_self is not None: + if prev_self is not None and prev_self.statement: prev_self.statement.update_sum() - self.statement.update_sum() + if self.statement: + self.statement.update_sum() def __str__(self): return f"{self.name}" From a3e598acb6c97952c15e8afffccb581a1847d999 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Mon, 30 Dec 2024 16:57:00 +0100 Subject: [PATCH 119/213] Improve history view with outliers --- nummi/history/templates/history/plot.html | 74 ++++++++++---------- nummi/history/templatetags/history_extras.py | 2 +- nummi/history/utils.py | 8 +-- nummi/main/static/main/css/plot.css | 2 +- 4 files changed, 43 insertions(+), 43 deletions(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index 6ef6804..bd7c2e6 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -2,6 +2,43 @@ {% load history_extras %} {% load transaction_extras %} {% load i18n %} +
    + + + + {% if not year %} + + {% endif %} + {% calendar_head %} + + + + {% regroup history.data by month.year as years_list %} + {% for y, y_data in years_list reversed %} + + {% if not year %} + + {% endif %} + {% for m in y_data %} + {% if forloop.parentloop.last and forloop.first %} + {% empty_calendar_cells_start m.month.month %} + {% endif %} + {% if m %} + + {% else %} + + {% endif %} + {% if forloop.parentloop.first and forloop.last %} + {% empty_calendar_cells_end m.month.month %} + {% endif %} + {% endfor %} + + {% endfor %} + +
    {% translate "Year" %}
    {% year_url y %}{% up_down_icon m.sum %}
    +
    @@ -47,40 +84,3 @@
    -
    - - - - {% if not year %} - - {% endif %} - {% calendar_head %} - - - - {% regroup history.data by month.year as years_list %} - {% for y, y_data in years_list reversed %} - - {% if not year %} - - {% endif %} - {% for m in y_data %} - {% if forloop.parentloop.last and forloop.first %} - {% empty_calendar_cells_start m.month.month %} - {% endif %} - {% if m %} - - {% else %} - - {% endif %} - {% if forloop.parentloop.first and forloop.last %} - {% empty_calendar_cells_end m.month.month %} - {% endif %} - {% endfor %} - - {% endfor %} - -
    {% translate "Year" %}
    {% year_url y %}{% up_down_icon m.sum %}
    -
    diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py index eaefea3..7a83898 100644 --- a/nummi/history/templatetags/history_extras.py +++ b/nummi/history/templatetags/history_extras.py @@ -9,7 +9,7 @@ register = template.Library() @register.simple_tag def calendar_opacity(v, vmax): - return f"{math.sin(math.fabs(v/vmax)*math.pi/2):.0%}" + return f"{math.sin(min(1, math.fabs(v/vmax))*math.pi/2):.0%}" @register.simple_tag diff --git a/nummi/history/utils.py b/nummi/history/utils.py index 320c10a..3606959 100644 --- a/nummi/history/utils.py +++ b/nummi/history/utils.py @@ -1,6 +1,6 @@ import datetime -from django.db.models import Max, Min, Q, Sum +from django.db.models import Avg, Q, StdDev, Sum from django.db.models.functions import Abs, TruncMonth @@ -38,10 +38,10 @@ def history(transaction_set): "max": { "pm": max( _history.aggregate( - max=Max("sum_p", default=0), - min=-Min("sum_m", default=0), + max=Avg("sum_p", default=0) + StdDev("sum_p", default=0), + min=Avg("sum_m", default=0) - StdDev("sum_m", default=0), ).values(), ), - "sum": _history.aggregate(max=Max(Abs("sum")))["max"], + "sum": _history.aggregate(max=Avg(Abs("sum")) + StdDev(Abs("sum")))["max"], }, } diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index 3ec218b..ecc1fdc 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -82,7 +82,7 @@ table.full-width col.bar { .calendar { overflow-x: auto; - margin-top: var(--gap); + margin-bottom: var(--gap); font-feature-settings: var(--num); table { From 28ac9c8ef7e616dec285689ae917e50bf0a09625 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Mon, 30 Dec 2024 17:29:42 +0100 Subject: [PATCH 120/213] Improve calendar table --- nummi/history/templates/history/plot.html | 8 +++++--- nummi/history/templatetags/history_extras.py | 5 +++++ nummi/main/static/main/css/plot.css | 10 +++++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/nummi/history/templates/history/plot.html b/nummi/history/templates/history/plot.html index bd7c2e6..ecf24ed 100644 --- a/nummi/history/templates/history/plot.html +++ b/nummi/history/templates/history/plot.html @@ -3,13 +3,14 @@ {% load transaction_extras %} {% load i18n %}
    - +
    {% if not year %} {% endif %} {% calendar_head %} + @@ -24,16 +25,17 @@ {% empty_calendar_cells_start m.month.month %} {% endif %} {% if m %} - {% else %} - + {% endif %} {% if forloop.parentloop.first and forloop.last %} {% empty_calendar_cells_end m.month.month %} {% endif %} {% endfor %} + {% endfor %} diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py index 7a83898..8ad71bf 100644 --- a/nummi/history/templatetags/history_extras.py +++ b/nummi/history/templatetags/history_extras.py @@ -60,3 +60,8 @@ def calendar_head(): th = (f"""""" for month in months) return mark_safe("".join(th)) + + +@register.filter +def sum_year(y_data): + return sum(y["sum"] for y in y_data) diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index ecc1fdc..c1f0756 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -95,13 +95,16 @@ table.full-width col.bar { border-top: none; } - td { + td.month { text-align: center; background-color: color-mix( in hsl, var(--td-bg, var(--bg)) var(--opacity), var(--bg) ); + padding: 0; + width: 4rem; + height: 4rem; &.p { --td-bg: var(--green); } @@ -109,6 +112,11 @@ table.full-width col.bar { --td-bg: var(--red); } } + td.total { + text-align: right; + font-weight: 650; + font-feature-settings: var(--num); + } } } } From 5d6bd9ea2b36dda56fa991464dd1d6c351b36c03 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Mon, 30 Dec 2024 17:56:55 +0100 Subject: [PATCH 121/213] Improve history view using tenth centile times 125% for min max --- nummi/history/utils.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/nummi/history/utils.py b/nummi/history/utils.py index 3606959..c61fc88 100644 --- a/nummi/history/utils.py +++ b/nummi/history/utils.py @@ -1,6 +1,6 @@ import datetime -from django.db.models import Avg, Q, StdDev, Sum +from django.db.models import Q, Sum from django.db.models.functions import Abs, TruncMonth @@ -36,12 +36,16 @@ def history(transaction_set): return { "data": _data, "max": { - "pm": max( - _history.aggregate( - max=Avg("sum_p", default=0) + StdDev("sum_p", default=0), - min=Avg("sum_m", default=0) - StdDev("sum_m", default=0), - ).values(), - ), - "sum": _history.aggregate(max=Avg(Abs("sum")) + StdDev(Abs("sum")))["max"], + "pm": 125 + * max( + _history.order_by("-sum_p")[len(_history) // 10]["sum_p"], + _history.order_by("-sum_m")[len(_history) // 10]["sum_m"], + ) + / 100, + "sum": 125 + * _history.annotate(abs_sum=Abs("sum")).order_by("-abs_sum")[ + len(_history) // 10 + ]["abs_sum"] + / 100, }, } From 886e6826504f2709d1fd1bc4815b23e95c29ce09 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Mon, 30 Dec 2024 18:14:10 +0100 Subject: [PATCH 122/213] Fix history plot on mobile --- nummi/main/static/main/css/plot.css | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/nummi/main/static/main/css/plot.css b/nummi/main/static/main/css/plot.css index c1f0756..43a7880 100644 --- a/nummi/main/static/main/css/plot.css +++ b/nummi/main/static/main/css/plot.css @@ -5,13 +5,14 @@ table.full-width col.bar { .plot { overflow-x: auto; + table { + min-width: 40rem; + } + td.bar { position: relative; padding: 0; overflow: hidden; - @media (width < 720px) { - width: 0; - } div { position: absolute; From 7109142b4ef38d954ca01fecf16ad81e7174cc3e Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Mon, 30 Dec 2024 19:20:53 +0100 Subject: [PATCH 123/213] Fix bug in history --- nummi/history/templatetags/history_extras.py | 27 ++++++++++++-------- nummi/history/utils.py | 25 ++++++++++-------- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py index 8ad71bf..53b7b82 100644 --- a/nummi/history/templatetags/history_extras.py +++ b/nummi/history/templatetags/history_extras.py @@ -9,6 +9,8 @@ register = template.Library() @register.simple_tag def calendar_opacity(v, vmax): + if v is None: + return "0%" return f"{math.sin(min(1, math.fabs(v/vmax))*math.pi/2):.0%}" @@ -29,6 +31,8 @@ def empty_calendar_cells_end(n): @register.simple_tag def up_down_icon(val): + if val is None: + return "" if val > 0: return remix("arrow-up-s", "green") elif val < 0: @@ -41,15 +45,18 @@ def up_down_icon(val): def plot_bar(s, sum_pm, s_max): _res = "" - if sum_pm: - _w = abs(sum_pm / s_max) - _res += f"""
    """ - if sum_pm is not None and s * sum_pm > 0: - _w = abs(s / s_max) - _res += ( - f"""
    """ - f"""{pmrvalue(s)}
    """ - ) + if s_max: + if sum_pm: + _w = abs(sum_pm / s_max) + _res += f"""
    """ + if sum_pm is not None and s * sum_pm > 0: + _w = abs(s / s_max) + _res += ( + f"""
    """ + f"""{pmrvalue(s)}
    """ + ) + else: + _res += "
    " return mark_safe(_res) @@ -64,4 +71,4 @@ def calendar_head(): @register.filter def sum_year(y_data): - return sum(y["sum"] for y in y_data) + return sum(y["sum"] or 0 for y in y_data) diff --git a/nummi/history/utils.py b/nummi/history/utils.py index c61fc88..1238469 100644 --- a/nummi/history/utils.py +++ b/nummi/history/utils.py @@ -1,7 +1,7 @@ import datetime from django.db.models import Q, Sum -from django.db.models.functions import Abs, TruncMonth +from django.db.models.functions import Abs, Greatest, TruncMonth def history(transaction_set): @@ -14,15 +14,19 @@ def history(transaction_set): _first_month = _transaction_month.last()["month"] _last_month = _transaction_month.first()["month"] - _history = _transaction_month.annotate( - sum_p=Sum("value", filter=Q(value__gt=0)), - sum_m=Sum("value", filter=Q(value__lt=0)), - sum=Sum("value"), - ).order_by("-month") + _history = ( + _transaction_month.annotate( + sum_p=Sum("value", filter=Q(value__gt=0), default=0), + sum_m=Sum("value", filter=Q(value__lt=0), default=0), + sum=Sum("value"), + ) + .annotate(max_sum=Greatest("sum_p", Abs("sum_m"))) + .order_by("-month") + ) _data = [ _history.filter(month=datetime.date(y, m + 1, 1)).first() - or {"month": datetime.date(y, m + 1, 1), "sum": 0} + or {"month": datetime.date(y, m + 1, 1), "sum": None} for y in range( _first_month.year, _last_month.year + 1, @@ -37,10 +41,9 @@ def history(transaction_set): "data": _data, "max": { "pm": 125 - * max( - _history.order_by("-sum_p")[len(_history) // 10]["sum_p"], - _history.order_by("-sum_m")[len(_history) // 10]["sum_m"], - ) + * _history.order_by("-max_sum")[len(_history.exclude(max_sum=0)) // 10][ + "max_sum" + ] / 100, "sum": 125 * _history.annotate(abs_sum=Abs("sum")).order_by("-abs_sum")[ From 63f1cf4e4d2c655d6d49fbc81893f62769104c43 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 31 Dec 2024 15:03:01 +0100 Subject: [PATCH 124/213] Update statement display (cards instead of table) --- .../templates/account/account_detail.html | 4 - nummi/account/views.py | 10 +- nummi/main/static/main/css/main.css | 48 +++++++++ nummi/main/static/main/css/table.css | 22 ++--- nummi/main/templates/main/list.html | 1 + nummi/main/templatetags/main_extras.py | 9 +- .../templates/statement/statement_table.html | 98 ++++++------------- 7 files changed, 99 insertions(+), 93 deletions(-) diff --git a/nummi/account/templates/account/account_detail.html b/nummi/account/templates/account/account_detail.html index 92c3c7f..ce317ba 100644 --- a/nummi/account/templates/account/account_detail.html +++ b/nummi/account/templates/account/account_detail.html @@ -16,10 +16,6 @@

    {% translate "Statements" %}

    {% include "statement/statement_table.html" %} -
    -

    {% translate "Transactions" %}

    - {% include "transaction/transaction_table.html" %} -
    {% if history %}

    {% translate "History" %}

    diff --git a/nummi/account/views.py b/nummi/account/views.py index 902db10..103832b 100644 --- a/nummi/account/views.py +++ b/nummi/account/views.py @@ -35,15 +35,10 @@ class AccountDetailView(NummiDetailView): pk_url_kwarg = "account" def get_context_data(self, **kwargs): - _max = 8 + _max = 6 data = super().get_context_data(**kwargs) account = data.get("object") - _transactions = account.transaction_set.all() - if _transactions.count() > _max: - data["transactions_url"] = reverse_lazy( - "account_transactions", args=(account.pk,) - ) _statements = account.statement_set.all() if _statements.count() > _max: data["statements_url"] = reverse_lazy( @@ -51,11 +46,10 @@ class AccountDetailView(NummiDetailView): ) return data | { - "transactions": _transactions[:8], "new_statement_url": reverse_lazy( "new_statement", kwargs={"account": account.pk} ), - "statements": _statements[:8], + "statements": _statements[:_max], "history": history(account.transaction_set), } diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 602f2de..2eee924 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -103,6 +103,7 @@ footer { padding: 2rem; } main { + position: relative; grid-column: 2; grid-row: 1; overflow-x: hidden; @@ -354,3 +355,50 @@ ul.messages { } } } + +ul.statements { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); + grid-auto-rows: 1fr; + grid-gap: var(--gap); + list-style: none; + padding: 0; + + li { + display: grid; + grid-row-gap: var(--gap); + padding: var(--gap); + border: var(--gray) 1px solid; + text-align: right; + + > * { + display: grid; + align-items: center; + + &.date :first-child { + font-size: 2rem; + } + &.value :first-child { + font-weight: 650; + } + &.icon { + span { + margin: auto; + } + } + &.account a { + overflow: hidden; + text-overflow: "."; + white-space: nowrap; + } + a span::after { + content: "\a0"; + } + } + + &.new, + &.more { + border-style: dashed; + } + } +} diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index e93c777..f663bad 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -48,20 +48,20 @@ table { tfoot tr:not(.new) { background: var(--bg-01); } + .l { + text-align: left; + } + .r, + .value { + text-align: right; + } + .c, + .date { + text-align: center; + } } .date, .value { font-feature-settings: var(--num); } -.l { - text-align: left; -} -.r, -.value { - text-align: right; -} -.c, -.date { - text-align: center; -} diff --git a/nummi/main/templates/main/list.html b/nummi/main/templates/main/list.html index ddde7ec..7f40df7 100644 --- a/nummi/main/templates/main/list.html +++ b/nummi/main/templates/main/list.html @@ -43,4 +43,5 @@ {% include "main/pagination.html" %} {% block table %}{% endblock %} {% include "main/pagination.html" %} + {% block body_more %}{% endblock %} {% endblock %} diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index 15cc7d0..e4494e8 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -35,8 +35,13 @@ def pmrvalue(val): @register.filter -def remix(icon, cls=""): - return mark_safe(f"""""") +def remix(icon, *args): + return remixnl(f"{icon}-line", *args) + + +@register.filter +def remixnl(icon, cls=""): + return mark_safe(f"""""") @register.filter diff --git a/nummi/statement/templates/statement/statement_table.html b/nummi/statement/templates/statement/statement_table.html index 32a83f3..9c2de04 100644 --- a/nummi/statement/templates/statement/statement_table.html +++ b/nummi/statement/templates/statement/statement_table.html @@ -1,71 +1,33 @@ {% load i18n main_extras statement_extras %} -
    -
    {% translate "Year" %}{% translate "Total" %}
    {% up_down_icon m.sum %}{{ y_data|sum_year|pmrvalue }}
    {month:02d}
    - - - - {% if not account %} - - - {% endif %} - - - - {% if new_statement_url %} - - - - {% endif %} - - - - - {% if not account %} - - {% endif %} - - - - - - - {% for snap in statements %} - - - - - {% if not account %} - - - {% endif %} - - - - - {% empty %} - - - - {% endfor %} - - {% if statements_url %} - - - - - +
    +
    - {% translate "Create statement" %} -
    {{ "check"|remix }}{{ "attachment"|remix }}{% translate "Date" %}{% translate "Account" %}{% translate "Value" %}{% translate "Difference" %}{% translate "Transactions" %}
    {{ snap.sum|check:snap.diff }} - {% if snap.file %}{{ "attachment"|remix }}{% endif %} - - - - - {{ snap.account.icon|remix }} - {{ snap.account }} - {{ snap.value|value }}{{ snap.diff|pmvalue }}{{ snap.sum|pmvalue }}
    {% translate "No statement" %}
    - {% translate "View all statements" %} -
    + {% for sta in statements %} +
  • + {{ sta.date|date:"d" }} + {{ sta.date|date:"F y" }} + {{ sta.value|value }} + {{ sta.diff|pmvalue }} + {% if not account %} + + {% endif %} + {{ sta.sum|check:sta.diff }} +
  • + {% endfor %} + {% if statements_url %} +
  • + + {{ "gallery-view"|remixnl }}{% translate "View all statements" %} + +
  • + {% endif %} +
    From c754e869fcbcebdf9b7cf70d0532f266e637af1c Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 31 Dec 2024 15:14:42 +0100 Subject: [PATCH 125/213] Include icons in links --- .../templates/category/category_plot.html | 16 +++++--------- nummi/main/static/main/css/main.css | 12 +++++----- .../transaction/transaction_table.html | 22 ++++++------------- .../templatetags/transaction_extras.py | 6 ++--- 4 files changed, 22 insertions(+), 34 deletions(-) diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index 2b76bc5..3381976 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -4,14 +4,13 @@ - - + @@ -23,17 +22,14 @@ - {% empty %} - + {% endfor %} {% endspaceless %} @@ -67,7 +63,7 @@ {% if categories %} - + - {% if not category %} - - - {% endif %} - {% if not account %} - - - {% endif %} + {% if not category %}{% endif %} + {% if not account %}{% endif %} {% if new_transaction_url %} @@ -34,10 +28,10 @@ {% if not category %} - + {% endif %} {% if not account %} - + {% endif %} @@ -67,18 +61,16 @@ {% if not category %} {% if trans.category %} - {% else %} - + {% endif %} {% endif %} {% if not account %} - {% endif %} diff --git a/nummi/transaction/templatetags/transaction_extras.py b/nummi/transaction/templatetags/transaction_extras.py index 313fb15..00f17d4 100644 --- a/nummi/transaction/templatetags/transaction_extras.py +++ b/nummi/transaction/templatetags/transaction_extras.py @@ -38,9 +38,9 @@ def year_url(context, year, cls=""): @register.simple_tag(takes_context=True) def tr_colspan(context): - ncol = 10 + ncol = 8 if context.get("category"): - ncol -= 2 + ncol -= 1 if context.get("account"): - ncol -= 2 + ncol -= 1 return ncol From 412cf94f936438c9a0368f68649456d70dd6c81f Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 31 Dec 2024 15:31:07 +0100 Subject: [PATCH 126/213] Add last statements to home page --- nummi/main/static/main/css/main.css | 1 + nummi/main/templates/main/index.html | 24 ++++++++++++++---------- nummi/main/views.py | 13 ++++++++----- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index f06189f..33a6c0c 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -336,6 +336,7 @@ ul.messages { .accounts { display: grid; grid-row-gap: 0.5rem; + grid-auto-rows: min-content; dl { margin: 0; diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 01006f1..484c51a 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -30,18 +30,22 @@ {% translate "Create account" %} -
    -

    {% translate "Categories" %}

    - {% spaceless %} -

    - {% for cat in categories %} - {{ cat.icon|remix }}{{ cat }} - {% endfor %} - {{ "add"|remix }}{% translate "Create category" %} -

    - {% endspaceless %} +
    +

    {% translate "Statements" %}

    + {% include "statement/statement_table.html" %}
    +
    +

    {% translate "Categories" %}

    + {% spaceless %} +

    + {% for cat in categories %} + {{ cat.icon|remix }}{{ cat }} + {% endfor %} + {{ "add"|remix }}{% translate "Create category" %} +

    + {% endspaceless %} +
    {% if history %}

    {% translate "History" %}

    diff --git a/nummi/main/views.py b/nummi/main/views.py index 72e6840..2786ed9 100644 --- a/nummi/main/views.py +++ b/nummi/main/views.py @@ -25,20 +25,23 @@ class IndexView(LoginRequiredMixin, TemplateView): def get_context_data(self, **kwargs): _max = 8 _transactions = Transaction.objects.filter(user=self.request.user) - _statements = Statement.objects.filter(user=self.request.user) _accounts = Account.objects.filter(user=self.request.user) + _statements = ( + Statement.objects.filter(user=self.request.user) + .exclude(account__archived=True) + .order_by("account__id", "-date") + .distinct("account__id") + ) res = { "accounts": _accounts, - "transactions": _transactions[:_max], "categories": Category.objects.filter(user=self.request.user), - "statements": _statements[:_max], + "statements": _statements, "history": history(_transactions.exclude(category__budget=False)), } if _transactions.count() > _max: res["transactions_url"] = reverse_lazy("transactions") - if _statements.count() > _max: - res["statements_url"] = reverse_lazy("statements") + res["statements_url"] = reverse_lazy("statements") return super().get_context_data(**kwargs) | res From cb08cb3d460d3754d620dab3eb2ae013af1a1ed4 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 31 Dec 2024 15:41:02 +0100 Subject: [PATCH 127/213] Improve account list --- nummi/main/static/main/css/main.css | 7 +++++++ nummi/main/templates/main/index.html | 20 ++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 33a6c0c..56f6e2a 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -347,6 +347,13 @@ ul.messages { display: grid; grid-template-columns: 1fr min-content; + &.new, + &.more { + border-style: dashed; + } + &.more label span::after { + content: "\2002"; + } } &:not(.show-archive) .account.archived { display: none; diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 484c51a..011e2ef 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -16,19 +16,27 @@ {% for acc in accounts %} {% endfor %} + + -
    - - -
    - {% translate "Create account" %}

    {% translate "Statements" %}

    From 86a354f353c8eec6dcf6ca0ac593315ae3288d8a Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 31 Dec 2024 15:44:33 +0100 Subject: [PATCH 128/213] Fix category plot on statement page --- nummi/category/templates/category/category_plot.html | 3 +-- nummi/main/static/main/css/main.css | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index 3381976..3c95171 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -19,7 +19,7 @@ {% spaceless %} {% for cat in categories %}
    - - {% endif %} - {% if statement %} + {% if statement and statement.diff != statement.sum %} From 7d4dbdc0df2ed634405ec7fdf10226a64a8d1d72 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 31 Dec 2024 16:47:36 +0100 Subject: [PATCH 132/213] Create statement detail view separate from edit view --- nummi/main/static/main/js/base.js | 21 ++++++++++++++ nummi/main/templates/main/base.html | 1 + nummi/statement/models.py | 5 +--- .../templates/statement/statement_detail.html | 29 +++++++++++++++++++ .../templates/statement/statement_form.html | 17 ++--------- nummi/statement/urls.py | 5 +++- nummi/statement/views.py | 26 ++++++++++++++++- 7 files changed, 83 insertions(+), 21 deletions(-) create mode 100644 nummi/main/static/main/js/base.js create mode 100644 nummi/statement/templates/statement/statement_detail.html diff --git a/nummi/main/static/main/js/base.js b/nummi/main/static/main/js/base.js new file mode 100644 index 0000000..6080811 --- /dev/null +++ b/nummi/main/static/main/js/base.js @@ -0,0 +1,21 @@ +const beforeUnloadHandler = (event) => { + event.preventDefault(); +}; + +const forms = document.querySelectorAll("form"); + +for (let form of forms) { + let inputs = form.querySelectorAll("input"); + for (input of inputs) { + input.addEventListener("input", (event) => { + window.addEventListener("beforeunload", beforeUnloadHandler); + }); + } + + form.addEventListener("submit", (event) => { + window.removeEventListener("beforeunload", beforeUnloadHandler); + }); + form.addEventListener("reset", (event) => { + window.removeEventListener("beforeunload", beforeUnloadHandler); + }); +} diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html index bba9037..0a68817 100644 --- a/nummi/main/templates/main/base.html +++ b/nummi/main/templates/main/base.html @@ -12,6 +12,7 @@ {% block link %} {% css "main/css/main.css" %} + {% js "main/js/base.js" %} {% endblock %} diff --git a/nummi/statement/models.py b/nummi/statement/models.py index 865abdd..c5e0337 100644 --- a/nummi/statement/models.py +++ b/nummi/statement/models.py @@ -46,10 +46,7 @@ class Statement(AccountModel): ) def __str__(self): - desc = _("%(date)s statement") % {"date": self.date} - if hasattr(self, "account"): - return f"{desc} – {self.account}" - return desc + return _("%(date)s statement") % {"date": self.date} def save(self, *args, **kwargs): if Statement.objects.filter(id=self.id).exists(): diff --git a/nummi/statement/templates/statement/statement_detail.html b/nummi/statement/templates/statement/statement_detail.html new file mode 100644 index 0000000..188b57e --- /dev/null +++ b/nummi/statement/templates/statement/statement_detail.html @@ -0,0 +1,29 @@ +{% extends "main/base.html" %} +{% load i18n main_extras statement_extras category %} +{% block title %} + {{ statement }} + – Nummi +{% endblock %} +{% block link %} + {{ block.super }} + {% css "main/css/form.css" %} + {% css "main/css/table.css" %} + {% css "main/css/plot.css" %} +{% endblock %} +{% block body %} +

    {{ statement }}

    +

    + {{ account.icon|remix }}{{ account }} +

    +

    + {{ "file-edit"|remix }}{% translate "Edit statement" %} +

    +
    +

    {% translate "Transactions" %}

    + {% include "transaction/transaction_table.html" %} +
    +
    +

    {% translate "Categories" %}

    + {% category_plot transactions budget=False statement=object %} +
    +{% endblock %} diff --git a/nummi/statement/templates/statement/statement_form.html b/nummi/statement/templates/statement/statement_form.html index cfe210b..46c5eb0 100644 --- a/nummi/statement/templates/statement/statement_form.html +++ b/nummi/statement/templates/statement/statement_form.html @@ -6,23 +6,10 @@ {% block h2_new %} {% translate "New statement" %} {% endblock %} -{% block h2 %}{{ form.instance }}{% endblock %} {% block pre %} - {% if account %} + {% if not instance|adding %}

    - {{ account.icon|remix }}{{ account }} + {{ "arrow-go-back"|remix }}{% translate "Back" %}

    {% endif %} {% endblock %} -{% block tables %} - {% if not form.instance|adding %} -
    -

    {% translate "Categories" %}

    - {% category_plot transactions budget=False statement=object %} -
    -
    -

    {% translate "Transactions" %}

    - {% include "transaction/transaction_table.html" %} -
    - {% endif %} -{% endblock %} diff --git a/nummi/statement/urls.py b/nummi/statement/urls.py index d9e1e3b..d455c1f 100644 --- a/nummi/statement/urls.py +++ b/nummi/statement/urls.py @@ -6,7 +6,10 @@ from . import views urlpatterns = [ path("list", views.StatementListView.as_view(), name="statements"), path("new", views.StatementCreateView.as_view(), name="new_statement"), - path("", views.StatementUpdateView.as_view(), name="statement"), + path("", views.StatementDetailView.as_view(), name="statement"), + path( + "/edit", views.StatementUpdateView.as_view(), name="edit_statement" + ), path( "/transaction/list", views.StatementTListView.as_view(), diff --git a/nummi/statement/views.py b/nummi/statement/views.py index 4d393d2..426436a 100644 --- a/nummi/statement/views.py +++ b/nummi/statement/views.py @@ -1,7 +1,13 @@ from account.models import Account from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy -from main.views import NummiCreateView, NummiDeleteView, NummiListView, NummiUpdateView +from main.views import ( + NummiCreateView, + NummiDeleteView, + NummiDetailView, + NummiListView, + NummiUpdateView, +) from transaction.views import TransactionListView from .forms import StatementForm @@ -57,6 +63,24 @@ class StatementDeleteView(NummiDeleteView): pk_url_kwarg = "statement" +class StatementDetailView(NummiDetailView): + model = Statement + pk_url_kwarg = "statement" + context_object_name = "statement" + + def get_context_data(self, **kwargs): + data = super().get_context_data(**kwargs) + statement = data.get("statement") + + return data | { + "account": statement.account, + "new_transaction_url": reverse_lazy( + "new_transaction", kwargs={"statement": statement.pk} + ), + "transactions": statement.transaction_set.all(), + } + + class StatementListView(NummiListView): model = Statement context_object_name = "statements" From 94d1907f9aa7248153969b16d3d966f9a6e3e9ac Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 31 Dec 2024 17:04:34 +0100 Subject: [PATCH 133/213] Add statement summary to details page --- nummi/main/static/main/css/main.css | 31 +++++++++++++++++++ .../templates/statement/statement_detail.html | 16 ++++++++++ 2 files changed, 47 insertions(+) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 2819819..e5e3de7 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -426,3 +426,34 @@ a, content: "\2002"; } } + +.statement-details { + display: grid; + grid-template-columns: repeat(4, min-content); + grid-gap: var(--gap); + align-items: center; + + > span:nth-child(2) { + display: grid; + grid-auto-rows: min-content; + > span[class^="ri-"] { + font-size: 2rem; + } + > span.value { + text-align: right; + } + } + > span:first-child, + > span:nth-child(3) { + display: grid; + border: var(--gray) 1px solid; + padding: 0.75rem; + + > .date { + text-align: right; + } + > .value { + font-size: 2rem; + } + } +} diff --git a/nummi/statement/templates/statement/statement_detail.html b/nummi/statement/templates/statement/statement_detail.html index 188b57e..bc27ade 100644 --- a/nummi/statement/templates/statement/statement_detail.html +++ b/nummi/statement/templates/statement/statement_detail.html @@ -18,6 +18,22 @@

    {{ "file-edit"|remix }}{% translate "Edit statement" %}

    +
    + + {{ statement.start_date|date:"Y-m-d" }} + {{ statement.start_value|value }} + + + {{ statement.sum|pmvalue }} + {{ "arrow-right"|remix }} + {% if statement.diff != statement.sum %}{{ statement.diff|pmvalue }}{% endif %} + + + {{ statement.date|date:"Y-m-d" }} + {{ statement.value|value }} + + {{ statement.sum|check:statement.diff }} +

    {% translate "Transactions" %}

    {% include "transaction/transaction_table.html" %} From fe59869a1da11f8ec5f3edbf233f170d975f416f Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 31 Dec 2024 17:13:33 +0100 Subject: [PATCH 134/213] Fix show archived button --- nummi/main/static/main/css/main.css | 9 +++++++-- nummi/main/templates/main/index.html | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index e5e3de7..4fb461d 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -355,6 +355,10 @@ ul.messages { dl { margin: 0; + dt, + dd { + margin: 0; + } .account { padding: 0.5rem; margin-bottom: 0.5rem; @@ -366,8 +370,8 @@ ul.messages { &.more { border-style: dashed; } - &.more label span::after { - content: "\2002"; + &.more label { + display: block; } } &:not(.show-archive) .account.archived { @@ -428,6 +432,7 @@ a, } .statement-details { + overflow-x: auto; display: grid; grid-template-columns: repeat(4, min-content); grid-gap: var(--gap); diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 011e2ef..550f843 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -25,7 +25,7 @@ {% endfor %}
    - - - + + {% for invoice in transaction.invoices %} - {% empty %} - + {% endfor %} - + diff --git a/nummi/transaction/templates/transaction/transaction_detail.html b/nummi/transaction/templates/transaction/transaction_detail.html new file mode 100644 index 0000000..bc5954e --- /dev/null +++ b/nummi/transaction/templates/transaction/transaction_detail.html @@ -0,0 +1,42 @@ +{% extends "main/form/base.html" %} +{% load i18n %} +{% load main_extras %} +{% block title %} + {{ transaction }} + – Nummi +{% endblock %} +{% block link %} + {{ block.super }} + {% css "main/css/form.css" %} + {% css "main/css/table.css" %} + {% css "main/css/plot.css" %} +{% endblock %} +{% block body %} +

    {{ transaction }}

    +
    + +

    + {{ "edit"|remix }}{% translate "Edit transaction" %} +

    + {% if transaction.description %}

    {{ transaction.description|linebreaksbr }}

    {% endif %} +
    +
    +

    {% translate "Invoices" %}

    + {% include "transaction/invoice_table.html" %} +
    +{% endblock %} diff --git a/nummi/transaction/templates/transaction/transaction_form.html b/nummi/transaction/templates/transaction/transaction_form.html index 5b40a0e..0b215bb 100644 --- a/nummi/transaction/templates/transaction/transaction_form.html +++ b/nummi/transaction/templates/transaction/transaction_form.html @@ -13,12 +13,9 @@ {{ statement }}

    {% endif %} -{% endblock %} -{% block tables %} - {% if not form.instance|adding %} -
    -

    {% translate "Invoices" %}

    - {% include "transaction/invoice_table.html" %} -
    + {% if not instance|adding %} +

    + {{ "arrow-go-back"|remix }}{% translate "Back" %} +

    {% endif %} {% endblock %} diff --git a/nummi/transaction/urls.py b/nummi/transaction/urls.py index 7c62eb8..c39aef6 100644 --- a/nummi/transaction/urls.py +++ b/nummi/transaction/urls.py @@ -15,7 +15,12 @@ urlpatterns = [ name="transaction_month", ), path("new", views.TransactionCreateView.as_view(), name="new_transaction"), - path("", views.TransactionUpdateView.as_view(), name="transaction"), + path("", views.TransactionDetailView.as_view(), name="transaction"), + path( + "/edit", + views.TransactionUpdateView.as_view(), + name="edit_transaction", + ), path( "/delete", views.TransactionDeleteView.as_view(), diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 6b1f56e..189b9ba 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -7,6 +7,7 @@ from history.utils import history from main.views import ( NummiCreateView, NummiDeleteView, + NummiDetailView, NummiListView, NummiUpdateView, UserMixin, @@ -61,6 +62,22 @@ class TransactionUpdateView(NummiUpdateView): pk_url_kwarg = "transaction" +class TransactionDetailView(NummiDetailView): + model = Transaction + pk_url_kwarg = "transaction" + context_object_name = "transaction" + + def get_context_data(self, **kwargs): + data = super().get_context_data(**kwargs) + transaction = data.get("transaction") + + return data | { + "account": transaction.statement.account, + "statement": transaction.statement, + "category": transaction.category, + } + + class InvoiceUpdateView(NummiUpdateView): model = Invoice form_class = InvoiceForm From 275a1f6bc7efdc4f3f9eee7d45bcaf6117d06eaa Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 1 Jan 2025 08:20:16 +0100 Subject: [PATCH 138/213] Fix transaction details on mobile --- nummi/main/static/main/css/main.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 6903443..f01600e 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -467,7 +467,7 @@ ul.statements { .transaction-details { display: grid; - grid-auto-columns: minmax(32rem, max-content); + grid-auto-columns: minmax(1fr, max-content); grid-auto-rows: min-content; max-width: 32rem; From c8b58a18ac5258d297e303bc69e1ed7bbe8e89c1 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 1 Jan 2025 08:38:04 +0100 Subject: [PATCH 139/213] Improve invoice list --- nummi/main/static/main/css/main.css | 24 +++++---- .../templates/statement/statement_table.html | 2 +- .../templates/transaction/invoice_table.html | 49 ++++++------------- .../transaction/transaction_table.html | 2 +- 4 files changed, 32 insertions(+), 45 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index f01600e..da8502b 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -261,7 +261,7 @@ footer { line-height: 1.5em; } - a &, + a:not(.i) &, .wi &, h2 & { &:first-child::after { @@ -384,7 +384,8 @@ ul.messages { } } -ul.statements { +ul.statements, +ul.invoices { display: grid; grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr)); grid-auto-rows: 1fr; @@ -395,10 +396,20 @@ ul.statements { li { display: grid; grid-row-gap: var(--gap); - padding: 0.75rem; + padding: var(--gap); border: var(--gray) 1px solid; text-align: right; + align-items: center; + &.new, + &.more { + border-style: dashed; + } + } +} + +ul.statements { + li { > * { display: grid; align-items: center; @@ -420,11 +431,6 @@ ul.statements { white-space: nowrap; } } - - &.new, - &.more { - border-style: dashed; - } } } @@ -449,7 +455,7 @@ ul.statements { > span:nth-child(3) { display: grid; border: var(--gray) 1px solid; - padding: 0.75rem; + padding: var(--gap); > .date { text-align: right; diff --git a/nummi/statement/templates/statement/statement_table.html b/nummi/statement/templates/statement/statement_table.html index 9c2de04..35340a8 100644 --- a/nummi/statement/templates/statement/statement_table.html +++ b/nummi/statement/templates/statement/statement_table.html @@ -11,7 +11,7 @@ {% for sta in statements %}
  • {{ sta.date|date:"d" }} - {{ sta.date|date:"F y" }} + {{ sta.date|date:"M y" }} {{ sta.value|value }} {{ sta.diff|pmvalue }} {% if not account %} diff --git a/nummi/transaction/templates/transaction/invoice_table.html b/nummi/transaction/templates/transaction/invoice_table.html index 9b32285..9ac6bf4 100644 --- a/nummi/transaction/templates/transaction/invoice_table.html +++ b/nummi/transaction/templates/transaction/invoice_table.html @@ -1,38 +1,19 @@ {% load main_extras %} {% load i18n %}
    -
  • {% translate "Category" %}{% translate "Category" %} {% translate "Expenses" %} {% translate "Income" %}
    {% if cat.category %} {% if month %} - {{ cat.category__name }} + {{ cat.category__icon|remix }}{{ cat.category__name }} {% elif year %} - {{ cat.category__name }} + {{ cat.category__icon|remix }}{{ cat.category__name }} {% else %} - {{ cat.category__name }} + {{ cat.category__icon|remix }}{{ cat.category__name }} {% endif %} {% endif %} - {% if cat.category %}{{ cat.category__icon|remix }}{% endif %} - {{ cat.sum_m|pmvalue }} {% if cat.sum_m %} @@ -59,7 +55,7 @@
    {% translate "No transaction" %}{% translate "No transaction" %}
    {% translate "Total" %}{% translate "Total" %} {{ total_m|pmvalue }}
    diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 2eee924..f06189f 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -78,9 +78,6 @@ a { height: 1.5rem; line-height: 1.5rem; - [class^="ri-"] { - margin-right: 0.5em; - } &.add { color: var(--text-link); background: var(--bg-01); @@ -391,9 +388,6 @@ ul.statements { text-overflow: "."; white-space: nowrap; } - a span::after { - content: "\a0"; - } } &.new, @@ -402,3 +396,9 @@ ul.statements { } } } + +a { + & > span[class^="ri-"]:first-child::after { + content: "\2002"; + } +} diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index 1654e6f..87315bc 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -9,14 +9,8 @@
    {% translate "Income" %} {% translate "Trader" %}{% translate "Category" %}{% translate "Category" %}{% translate "Account" %}{% translate "Account" %}
    {{ trans.trader|default_if_none:"" }}{{ trans.category.icon|remix }} - {{ trans.category }} + {{ trans.category.icon|remix }}{{ trans.category }} {{ trans.account.icon|remix }} - {{ trans.account }} + {{ trans.account.icon|remix }}{{ trans.account }}
    + {% if cat.category %} {% if month %} {{ cat.category__icon|remix }}{{ cat.category__name }} @@ -88,7 +88,6 @@
    {% translate "Expected total" %} {{ total|check:statement.diff }} {% if statement.diff < 0 %}
    diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 56f6e2a..6202e13 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -405,7 +405,8 @@ ul.statements { } } -a { +a, +.wi { & > span[class^="ri-"]:first-child::after { content: "\2002"; } From b20ef58e1867c846dfe68640e15c54e1609f3f4f Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 31 Dec 2024 15:58:06 +0100 Subject: [PATCH 129/213] Reduce statement size to allow for better mobile experience --- nummi/main/static/main/css/main.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 6202e13..2cdf690 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -363,7 +363,7 @@ ul.messages { ul.statements { display: grid; - grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr)); grid-auto-rows: 1fr; grid-gap: var(--gap); list-style: none; @@ -372,7 +372,7 @@ ul.statements { li { display: grid; grid-row-gap: var(--gap); - padding: var(--gap); + padding: 0.75rem; border: var(--gray) 1px solid; text-align: right; From f9e489218d6e2a96ef0cf160dfcfe441f4d59786 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 31 Dec 2024 16:14:24 +0100 Subject: [PATCH 130/213] Add icons to messages --- nummi/main/static/main/css/main.css | 23 +++++++++++++++++++---- nummi/main/templates/main/base.html | 4 +++- nummi/main/templatetags/main_extras.py | 13 +++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 2cdf690..2819819 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -291,21 +291,36 @@ ul.messages { font-weight: 550; list-style-type: none; margin: 0; + margin-bottom: var(--gap); background: var(--bg-01); padding: 0; li { + --message-color: var(--text); padding: calc(var(--gap) / 2) var(--gap); - border-left: var(--border) solid var(--gray); + border-left: var(--message-color) solid var(--border); + [class^="ri-"] { + height: 1.5em; + width: 1.5em; + line-height: 1.5em; + border-radius: var(--radius); + background: var(--message-color); + color: var(--bg); + margin-right: 0.5rem; + } + + &.msg-level-20 { + --message-color: var(--green); + } &.msg-level-25 { - border-left-color: var(--green-1); + --message-color: var(--green-1); } &.msg-level-30 { - border-left-color: var(--red-1); + --message-color: var(--red-1); } &.msg-level-40 { - border-left-color: var(--red); + --message-color: var(--red); } } } diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html index 2a497f9..bba9037 100644 --- a/nummi/main/templates/main/base.html +++ b/nummi/main/templates/main/base.html @@ -82,7 +82,9 @@
    {% if messages %}
      - {% for message in messages %}
    • {{ message }}
    • {% endfor %} + {% for message in messages %} +
    • {{ message.level|messageicon }}{{ message }}
    • + {% endfor %}
    {% endif %} {% block body %}{% endblock %} diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index e4494e8..0a9abcc 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -44,6 +44,19 @@ def remixnl(icon, cls=""): return mark_safe(f"""""") +@register.filter +def messageicon(level): + ico = { + 10: "bug", + 20: "information", + 25: "check", + 30: "alert", + 40: "error-warning", + } + + return remix(ico.get(level, "question")) + + @register.filter def extension(file): return file.name.split(".")[-1].upper() From fd140a931415c93e45700f1895f63561bb8a9a34 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Tue, 31 Dec 2024 16:19:37 +0100 Subject: [PATCH 131/213] Hide expected total when it is correct --- nummi/category/templates/category/category_plot.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index 3c95171..d60a0f3 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -84,7 +84,7 @@
    {{ total_p|pmvalue }}
    {% translate "Expected total" %} {{ total|check:statement.diff }}
    {% translate "Name" %}{% translate "File" %}{% translate "Delete" %}{% translate "Invoice" %}{{ "file-edit"|remix }}
    - {{ invoice.name }} + {{ invoice.name }} [{{ invoice.file|extension }}] - {% translate "File" %} [{{ invoice.file|extension }}] - - {% translate "Delete" %} + {{ "file-edit"|remix }}
    {% translate "No invoice" %}{% translate "No invoice" %}
    {% translate "Create invoice" %}
    - - - - - - - - - - - {% for invoice in transaction.invoices %} - - - - - {% empty %} - - - - {% endfor %} - - - - - - -
    {% translate "Invoice" %}{{ "file-edit"|remix }}
    - {{ invoice.name }} [{{ invoice.file|extension }}] - - {{ "file-edit"|remix }} -
    {% translate "No invoice" %}
    - {% translate "Create invoice" %} -
    +
    diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index 87315bc..ab25a82 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -39,7 +39,7 @@ {% for trans in transactions %} - {% for invoice in trans.invoices %}{{ "attachment"|remix }}{% endfor %} + {% for invoice in trans.invoices %}{{ "attachment"|remix }}{% endfor %}
    {% endif %} -{% endblock %} +{% endblock body %} From 2991786444f1b57ba1a2d3a2c043d56a23692785 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 1 Jan 2025 19:01:35 +0100 Subject: [PATCH 153/213] Improve statement form --- .prettierrc.toml | 2 +- nummi/main/static/main/css/form.css | 7 +++++-- nummi/main/static/main/css/main.css | 5 +++++ nummi/main/static/main/css/table.css | 5 ----- nummi/statement/forms.py | 10 ++++++++++ 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/.prettierrc.toml b/.prettierrc.toml index 49b487b..eeb77a3 100644 --- a/.prettierrc.toml +++ b/.prettierrc.toml @@ -1 +1 @@ -end_of_line = "auto" +endOfLine = "auto" diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 3b83905..440f13d 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -54,9 +54,12 @@ form { background: none; z-index: 1; - &.value { - font-size: 1.5rem; + &[name*="value"] { text-align: right; + font-feature-settings: var(--num); + } + &[name*="date"] { + font-feature-settings: var(--num); } &:focus { diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 4ac95d7..dd87b3d 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -495,3 +495,8 @@ ul.statements { border-style: dashed; } } + +.date, +.value { + font-feature-settings: var(--num); +} diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index f663bad..c6284ec 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -60,8 +60,3 @@ table { text-align: center; } } - -.date, -.value { - font-feature-settings: var(--num); -} diff --git a/nummi/statement/forms.py b/nummi/statement/forms.py index 8467680..e7afbb3 100644 --- a/nummi/statement/forms.py +++ b/nummi/statement/forms.py @@ -15,6 +15,15 @@ class StatementForm(NummiForm): "file": NummiFileInput, } + meta_fieldsets = [ + [ + ["account"], + ["start_date", "start_value"], + ["date", "value"], + ["file"], + ], + ] + def __init__(self, *args, **kwargs): _user = kwargs.get("user") _disable_account = kwargs.pop("disable_account", False) @@ -30,6 +39,7 @@ class StatementForm(NummiForm): label=_("Add transactions"), required=False, ) + if _disable_account: self.fields["account"].disabled = True From 79f87779dd416859e8e50e40a19595ddf7077f77 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Wed, 1 Jan 2025 19:05:34 +0100 Subject: [PATCH 154/213] Fix display on index page --- nummi/main/static/main/css/main.css | 1 - 1 file changed, 1 deletion(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index dd87b3d..85fad38 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -338,7 +338,6 @@ ul.messages { .accounts { display: grid; - grid-row-gap: 0.5rem; grid-auto-rows: min-content; dl { From 8575f43475398744be2f104d6865e1ed38436081 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 09:37:47 +0100 Subject: [PATCH 155/213] Fix transaction table with no account --- .../templates/transaction/transaction_table.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index 9364ec1..396c511 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -62,17 +62,17 @@ {% if trans.value < 0 %}{% endif %} {{ trans.trader|default_if_none:"" }} {% if not category %} - {% if trans.category %} - + + {% if trans.category %} {{ trans.category.icon|remix }}{{ trans.category }} - - {% else %} - - {% endif %} + {% endif %} + {% endif %} {% if not account %} - {{ trans.account.icon|remix }}{{ trans.account }} + {% if trans.account %} + {{ trans.account.icon|remix }}{{ trans.account|default_if_none:"" }} + {% endif %} {% endif %} From 57d5330d75619b664236dfaffbe72f095dbeed9b Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 10:07:01 +0100 Subject: [PATCH 156/213] Create account list view --- .../templates/account/account_list.html | 17 ++++++++ .../templates/account/account_table.html | 41 ++++++++++++++++++ nummi/account/templatetags/__init__.py | 0 nummi/account/templatetags/account_extras.py | 10 +++++ nummi/account/urls.py | 1 + nummi/account/views.py | 6 +++ nummi/main/static/main/css/main.css | 42 +++++++++---------- nummi/main/static/main/js/index.js | 7 ++-- nummi/main/templates/main/index.html | 36 +++------------- nummi/main/views.py | 2 +- nummi/statement/views.py | 1 + nummi/transaction/views.py | 1 + 12 files changed, 105 insertions(+), 59 deletions(-) create mode 100644 nummi/account/templates/account/account_list.html create mode 100644 nummi/account/templates/account/account_table.html create mode 100644 nummi/account/templatetags/__init__.py create mode 100644 nummi/account/templatetags/account_extras.py diff --git a/nummi/account/templates/account/account_list.html b/nummi/account/templates/account/account_list.html new file mode 100644 index 0000000..9193e05 --- /dev/null +++ b/nummi/account/templates/account/account_list.html @@ -0,0 +1,17 @@ +{% extends "main/list.html" %} +{% load i18n main_extras account_extras %} +{% block link %} + {{ block.super }} + {% css "main/css/table.css" %} + {% css "main/css/plot.css" %} + {% js "main/js/index.js" %} +{% endblock link %} +{% block name %} + {% translate "Account" %} +{% endblock name %} +{% block h2 %} + {% translate "Accounts" %} +{% endblock h2 %} +{% block table %} +
    {% account_table accounts %}
    +{% endblock table %} diff --git a/nummi/account/templates/account/account_table.html b/nummi/account/templates/account/account_table.html new file mode 100644 index 0000000..25655b7 --- /dev/null +++ b/nummi/account/templates/account/account_table.html @@ -0,0 +1,41 @@ +{% load i18n main_extras %} +
    + {% for acc in accounts %} + + {% endfor %} + {% if index %} + + {% else %} + + + {% endif %} +
    diff --git a/nummi/account/templatetags/__init__.py b/nummi/account/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nummi/account/templatetags/account_extras.py b/nummi/account/templatetags/account_extras.py new file mode 100644 index 0000000..5e6c478 --- /dev/null +++ b/nummi/account/templatetags/account_extras.py @@ -0,0 +1,10 @@ +from django import template + +register = template.Library() + + +@register.inclusion_tag("account/account_table.html") +def account_table(accounts, **kwargs): + return kwargs | { + "accounts": accounts, + } diff --git a/nummi/account/urls.py b/nummi/account/urls.py index f6b4f2b..93713af 100644 --- a/nummi/account/urls.py +++ b/nummi/account/urls.py @@ -5,6 +5,7 @@ from transaction.views import TransactionMonthView, TransactionYearView from . import views urlpatterns = [ + path("list", views.AccountListView.as_view(), name="accounts"), path("new", views.AccountCreateView.as_view(), name="new_account"), path("", views.AccountDetailView.as_view(), name="account"), path("/edit", views.AccountUpdateView.as_view(), name="edit_account"), diff --git a/nummi/account/views.py b/nummi/account/views.py index 103832b..c3cbc36 100644 --- a/nummi/account/views.py +++ b/nummi/account/views.py @@ -5,6 +5,7 @@ from main.views import ( NummiCreateView, NummiDeleteView, NummiDetailView, + NummiListView, NummiUpdateView, ) from statement.views import StatementListView @@ -66,6 +67,11 @@ class AccountMixin: return super().get_context_data(**kwargs) | {"account": self.account} +class AccountListView(NummiListView): + model = Account + context_object_name = "accounts" + + class AccountTListView(AccountMixin, TransactionListView): pass diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 85fad38..b1b383d 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -336,35 +336,31 @@ ul.messages { } } -.accounts { - display: grid; - grid-auto-rows: min-content; +dl.accounts { + margin: 0; - dl { + dt, + dd { margin: 0; - dt, - dd { - margin: 0; - } - .account { - padding: 0.5rem; - margin-bottom: 0.5rem; - border: 1px solid var(--gray); + } + .account { + padding: 0.5rem; + margin-bottom: 0.5rem; + border: 1px solid var(--gray); - display: grid; - grid-template-columns: 1fr min-content; - &.new, - &.more { - border-style: dashed; - } - &.more label { - display: block; - } + display: grid; + grid-template-columns: 1fr min-content; + &.new, + &.more { + border-style: dashed; } - &:not(.show-archive) .account.archived { - display: none; + &.more label { + display: block; } } + &:not(.show-archive) .account.archived { + display: none; + } } ul.statements, diff --git a/nummi/main/static/main/js/index.js b/nummi/main/static/main/js/index.js index 88438b2..550651b 100644 --- a/nummi/main/static/main/js/index.js +++ b/nummi/main/static/main/js/index.js @@ -1,10 +1,9 @@ -let accounts = document.querySelector(".accounts"); +let accounts = document.querySelector("dl.accounts"); let toggle = accounts.querySelector("input#show-archived-accounts"); -let dl = accounts.querySelector("dl"); -dl.classList.toggle("show-archive", toggle.checked); +accounts.classList.toggle("show-archive", toggle.checked); if (toggle) { toggle.addEventListener("change", (event) => { - dl.classList.toggle("show-archive", toggle.checked); + accounts.classList.toggle("show-archive", toggle.checked); }); } diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 0a11f61..3b82d2f 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -1,6 +1,6 @@ {% extends "main/base.html" %} {% load static %} -{% load main_extras %} +{% load main_extras account_extras %} {% load i18n %} {% block link %} {{ block.super }} @@ -10,42 +10,16 @@ {% endblock link %} {% block body %}
    -
    +

    {% translate "Accounts" %}

    -
    - {% for acc in accounts %} - - {% endfor %} - - -
    + {% account_table accounts index=True total=accounts|balance %}
    -
    +

    {% translate "Statements" %}

    {% include "statement/statement_table.html" %}
    -
    +

    {% translate "Categories" %}

    {% spaceless %}

    diff --git a/nummi/main/views.py b/nummi/main/views.py index 2786ed9..0dc8b3f 100644 --- a/nummi/main/views.py +++ b/nummi/main/views.py @@ -105,4 +105,4 @@ class LogoutView(auth_views.LogoutView): class NummiListView(UserMixin, ListView): - paginate_by = 96 + pass diff --git a/nummi/statement/views.py b/nummi/statement/views.py index 426436a..238d296 100644 --- a/nummi/statement/views.py +++ b/nummi/statement/views.py @@ -84,6 +84,7 @@ class StatementDetailView(NummiDetailView): class StatementListView(NummiListView): model = Statement context_object_name = "statements" + paginate_by = 32 class StatementMixin: diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 433177e..90e681d 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -124,6 +124,7 @@ class InvoiceDeleteView(NummiDeleteView): class TransactionListView(NummiListView): model = Transaction context_object_name = "transactions" + paginate_by = 50 class TransactionACMixin: From e8050fadb9600fc8f720038a7af7a05961855bca Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 10:16:05 +0100 Subject: [PATCH 157/213] Fix statement list, gaps --- nummi/main/static/main/css/main.css | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index b1b383d..e0e880c 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -81,7 +81,10 @@ a { main, nav, footer { - padding: 2rem; + padding: 2rem 1rem; + @media (width > 720px) { + padding: 2rem; + } } main { position: relative; @@ -94,8 +97,7 @@ main { .split { display: grid; - column-gap: var(--gap); - row-gap: var(--gap); + gap: var(--gap); grid-template-columns: 100%; @media (width > 720px) { grid-template-columns: minmax(20rem, max-content) 1fr; @@ -366,15 +368,15 @@ dl.accounts { ul.statements, ul.invoices { display: grid; - grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); grid-auto-rows: 1fr; - grid-gap: var(--gap); + gap: 0.5rem; list-style: none; padding: 0; li { display: grid; - grid-row-gap: var(--gap); + gap: 0.5rem; padding: var(--gap); border: var(--gray) 1px solid; text-align: right; @@ -423,7 +425,7 @@ ul.statements { overflow-x: auto; display: grid; grid-template-columns: repeat(4, min-content); - grid-gap: var(--gap); + gap: var(--gap); align-items: center; > span:nth-child(2) { @@ -483,8 +485,8 @@ ul.statements { .category { padding: 0 var(--gap); border: var(--gray) 1px solid; - margin-right: var(--gap); - margin-bottom: var(--gap); + margin-right: 0.5rem; + margin-bottom: 0.5rem; &.add { border-style: dashed; From cb939df81eb4ab7b661211d58e40e1b9c58a39bb Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 13:58:10 +0100 Subject: [PATCH 158/213] Fix #23, Fix #25 --- nummi/main/static/main/css/form.css | 22 ++++++++++++++++++---- nummi/main/static/main/css/main.css | 1 + 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 440f13d..c39223c 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -7,7 +7,7 @@ form ul.errorlist { form { display: grid; - grid-gap: var(--gap); + gap: 0.5rem; grid-template-columns: repeat(auto-fill, 32rem); @media (width < 1024px) { grid-template-columns: 1fr; @@ -15,7 +15,7 @@ form { .column { display: grid; - grid-gap: var(--gap); + gap: 0.5rem; border: 1px solid var(--gray); padding: var(--gap); @@ -23,7 +23,7 @@ form { display: grid; grid-auto-columns: 1fr; grid-auto-flow: column; - grid-gap: inherit; + gap: inherit; padding: 0; margin: 0; border: none; @@ -32,11 +32,25 @@ form { .field { display: grid; grid-auto-rows: min-content; + align-items: center; overflow: hidden; + column-gap: 0.5rem; &:has(> textarea) { grid-template-rows: min-content 1fr; } + &:has(input[type="checkbox"]) { + grid-template-columns: min-content 1fr; + > label { + font-size: inherit; + grid-row: 1; + grid-column: 2; + } + > input { + grid-row: 1; + grid-column: 1; + } + } > label { font-size: 0.8rem; @@ -91,7 +105,7 @@ form { display: grid; grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); grid-auto-rows: 1fr; - grid-gap: var(--gap); + gap: 0.5rem; align-items: center; input { diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index e0e880c..9181c72 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -373,6 +373,7 @@ ul.invoices { gap: 0.5rem; list-style: none; padding: 0; + margin: 0; li { display: grid; From bac3b593580b5ca2fcabbfaacb7940c8e1d04319 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 14:02:01 +0100 Subject: [PATCH 159/213] Fix #22 --- nummi/main/static/main/css/form.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index c39223c..a4412a2 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -68,6 +68,10 @@ form { background: none; z-index: 1; + &:not([type="checkbox"]) { + width: 100%; + } + &[name*="value"] { text-align: right; font-feature-settings: var(--num); From 090f1a3a5c716d3752a7d428add49f8061eff64f Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 14:05:08 +0100 Subject: [PATCH 160/213] Fix #21 --- .../0004_remove_transaction_account.py | 16 ++++++++++++++++ nummi/transaction/models.py | 16 +++------------- 2 files changed, 19 insertions(+), 13 deletions(-) create mode 100644 nummi/transaction/migrations/0004_remove_transaction_account.py diff --git a/nummi/transaction/migrations/0004_remove_transaction_account.py b/nummi/transaction/migrations/0004_remove_transaction_account.py new file mode 100644 index 0000000..0e6a7b9 --- /dev/null +++ b/nummi/transaction/migrations/0004_remove_transaction_account.py @@ -0,0 +1,16 @@ +# Generated by Django 4.2 on 2025-01-02 13:03 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("transaction", "0003_alter_transaction_account_and_more"), + ] + + operations = [ + migrations.RemoveField( + model_name="transaction", + name="account", + ), + ] diff --git a/nummi/transaction/models.py b/nummi/transaction/models.py index f831f22..0fb8dd8 100644 --- a/nummi/transaction/models.py +++ b/nummi/transaction/models.py @@ -2,7 +2,6 @@ import datetime from pathlib import Path from uuid import uuid4 -from account.models import Account from category.models import Category from django.core.validators import FileExtensionValidator from django.db import models @@ -44,22 +43,12 @@ class Transaction(UserModel): null=True, verbose_name=_("Statement"), ) - account = models.ForeignKey( - Account, - on_delete=models.CASCADE, - blank=True, - null=True, - verbose_name=_("Account"), - editable=False, - ) def save(self, *args, **kwargs): if Transaction.objects.filter(pk=self.pk): prev_self = Transaction.objects.get(pk=self.pk) else: prev_self = None - if self.statement: - self.account = self.statement.account super().save(*args, **kwargs) if prev_self is not None and prev_self.statement: prev_self.statement.update_sum() @@ -76,8 +65,9 @@ class Transaction(UserModel): return reverse("del_transaction", args=(self.pk,)) @property - def invoices(self): - return Invoice.objects.filter(transaction=self) + def account(self): + if self.statement: + return self.statement.account @property def has_invoice(self): From 786d7c213061356864baa5074288a4fb1cff018e Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 14:19:06 +0100 Subject: [PATCH 161/213] Use templatetags for statement_table --- nummi/account/templates/account/account_detail.html | 12 +++++++----- nummi/account/views.py | 3 ++- nummi/main/templates/main/index.html | 4 ++-- .../templates/statement/statement_list.html | 10 +++++----- nummi/statement/templatetags/statement_extras.py | 7 +++++++ 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/nummi/account/templates/account/account_detail.html b/nummi/account/templates/account/account_detail.html index 183a2f1..fcd9321 100644 --- a/nummi/account/templates/account/account_detail.html +++ b/nummi/account/templates/account/account_detail.html @@ -1,12 +1,14 @@ {% extends "main/base.html" %} -{% load main_extras %} +{% load main_extras statement_extras %} {% load i18n %} -{% block title %}{{ object }} – {{ block.super }}{% endblock %} +{% block title %} + {{ object }} – {{ block.super }} +{% endblock title %} {% block link %} {{ block.super }} {% css "main/css/table.css" %} {% css "main/css/plot.css" %} -{% endblock %} +{% endblock link %} {% block body %}

    {{ object.icon|remix }}{{ object }}

    @@ -14,7 +16,7 @@

    {% translate "Statements" %}

    - {% include "statement/statement_table.html" %} + {% statement_table statements statements_url=statements_url new_statement_url=new_statement_url %}
    {% if history %}
    @@ -22,4 +24,4 @@ {% include "history/plot.html" %}
    {% endif %} -{% endblock %} +{% endblock body %} diff --git a/nummi/account/views.py b/nummi/account/views.py index c3cbc36..92066cd 100644 --- a/nummi/account/views.py +++ b/nummi/account/views.py @@ -9,6 +9,7 @@ from main.views import ( NummiUpdateView, ) from statement.views import StatementListView +from transaction.models import Transaction from transaction.views import TransactionListView from .forms import AccountForm @@ -51,7 +52,7 @@ class AccountDetailView(NummiDetailView): "new_statement", kwargs={"account": account.pk} ), "statements": _statements[:_max], - "history": history(account.transaction_set), + "history": history(Transaction.objects.filter(statement__account=account)), } diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index 3b82d2f..d601937 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -1,6 +1,6 @@ {% extends "main/base.html" %} {% load static %} -{% load main_extras account_extras %} +{% load main_extras account_extras statement_extras %} {% load i18n %} {% block link %} {{ block.super }} @@ -16,7 +16,7 @@

    {% translate "Statements" %}

    - {% include "statement/statement_table.html" %} + {% statement_table statements statements_url=statements_url %}
    diff --git a/nummi/statement/templates/statement/statement_list.html b/nummi/statement/templates/statement/statement_list.html index 9d3ea04..6970a63 100644 --- a/nummi/statement/templates/statement/statement_list.html +++ b/nummi/statement/templates/statement/statement_list.html @@ -1,12 +1,12 @@ {% extends "main/list.html" %} -{% load i18n %} +{% load i18n statement_extras %} {% block name %} {% translate "Statements" %} -{% endblock %} +{% endblock name %} {% block h2 %} {% translate "Statements" %} -{% endblock %} +{% endblock h2 %} {% block table %} {% url "new_statement" as new_statement_url %} - {% include "statement/statement_table.html" %} -{% endblock %} + {% statement_table statements new_statement_url=new_statement_url %} +{% endblock table %} diff --git a/nummi/statement/templatetags/statement_extras.py b/nummi/statement/templatetags/statement_extras.py index a8631d1..54eef80 100644 --- a/nummi/statement/templatetags/statement_extras.py +++ b/nummi/statement/templatetags/statement_extras.py @@ -12,3 +12,10 @@ def check(s, diff): return remix("check", "green") else: return remix("close", "red") + + +@register.inclusion_tag("statement/statement_table.html") +def statement_table(statements, **kwargs): + return kwargs | { + "statements": statements, + } From b1fddd0dd6bc95a879450acc70df4d44f251b3ff Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 14:41:53 +0100 Subject: [PATCH 162/213] Use templatetag for statement_table --- .../templates/account/account_detail.html | 4 +++- .../templates/account/account_table.html | 8 +++----- nummi/account/views.py | 12 ------------ nummi/main/templates/main/index.html | 7 ++++--- nummi/main/views.py | 17 +++-------------- .../templates/statement/statement_list.html | 4 ++-- .../statement/templatetags/statement_extras.py | 5 +++++ 7 files changed, 20 insertions(+), 37 deletions(-) diff --git a/nummi/account/templates/account/account_detail.html b/nummi/account/templates/account/account_detail.html index fcd9321..a4b6676 100644 --- a/nummi/account/templates/account/account_detail.html +++ b/nummi/account/templates/account/account_detail.html @@ -16,7 +16,9 @@

    {% translate "Statements" %}

    - {% statement_table statements statements_url=statements_url new_statement_url=new_statement_url %} + {% url "new_statement" account=account.pk as ns_url %} + {% url "account_statements" account=account.pk as s_url %} + {% statement_table account.statement_set.all statements_url=s_url new_statement_url=ns_url n_max=6 %}
    {% if history %}
    diff --git a/nummi/account/templates/account/account_table.html b/nummi/account/templates/account/account_table.html index 25655b7..0de11e9 100644 --- a/nummi/account/templates/account/account_table.html +++ b/nummi/account/templates/account/account_table.html @@ -15,11 +15,9 @@
    {{ "gallery-view"|remixnl }}{% translate "All accounts" %}
    - {% if total %} -
    - {{ total|value }} -
    - {% endif %} +
    + {{ accounts|balance|value }} +
    {% else %}

    {% translate "Transactions" %}

    - {% include "transaction/transaction_table.html" %} + {% url "statement_transactions" statement.id as t_url %} + {% url "new_transaction" statement=statement.id as nt_url %} + {% transaction_table statement.transaction_set.all n_max=8 transactions_url=t_url new_transaction_url=nt_url %}

    {% translate "Categories" %}

    {% category_plot transactions budget=False statement=object %}
    -{% endblock %} +{% endblock body %} diff --git a/nummi/transaction/templates/transaction/transaction_list.html b/nummi/transaction/templates/transaction/transaction_list.html index 890cec7..abd6ef5 100644 --- a/nummi/transaction/templates/transaction/transaction_list.html +++ b/nummi/transaction/templates/transaction/transaction_list.html @@ -1,12 +1,12 @@ {% extends "main/list.html" %} -{% load i18n %} +{% load i18n transaction_extras %} {% block name %} {% translate "Transactions" %} -{% endblock %} +{% endblock name %} {% block h2 %} {% translate "Transactions" %} -{% endblock %} +{% endblock h2 %} {% block table %} - {% url "new_transaction" as new_transaction_url %} - {% include "transaction/transaction_table.html" %} -{% endblock %} + {% url "new_transaction" as nt_url %} + {% transaction_table transactions new_transaction_url=nt_url %} +{% endblock table %} diff --git a/nummi/transaction/templatetags/transaction_extras.py b/nummi/transaction/templatetags/transaction_extras.py index 00f17d4..b614674 100644 --- a/nummi/transaction/templatetags/transaction_extras.py +++ b/nummi/transaction/templatetags/transaction_extras.py @@ -10,6 +10,18 @@ from ..utils import ac_url register = template.Library() +@register.inclusion_tag("transaction/transaction_table.html") +def transaction_table(transactions, **kwargs): + if (n_max := kwargs.get("n_max")) is not None: + if transactions.count() <= n_max: + del kwargs["transactions_url"] + transactions = transactions[:n_max] + + return kwargs | { + "transactions": transactions, + } + + @register.simple_tag(takes_context=True) def month_url(context, month, cls="", fmt="Y-m"): url_name, url_params = ac_url( From b4654ec44519368de299aad9d37e7d1f92f6c839 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 16:40:27 +0100 Subject: [PATCH 165/213] Add automatic icons to category select (#24) --- nummi/category/forms.py | 5 +++++ .../category/forms/widgets/category.html | 5 +++++ nummi/main/static/main/css/form.css | 6 ++++++ nummi/main/static/main/js/base.js | 12 ++++++++++++ nummi/transaction/forms.py | 15 +++++++++++++++ 5 files changed, 43 insertions(+) create mode 100644 nummi/category/templates/category/forms/widgets/category.html diff --git a/nummi/category/forms.py b/nummi/category/forms.py index b0bbf27..25f5d9e 100644 --- a/nummi/category/forms.py +++ b/nummi/category/forms.py @@ -1,3 +1,4 @@ +from django.forms.widgets import Select from main.forms import NummiForm from .models import Category @@ -11,3 +12,7 @@ class CategoryForm(NummiForm): "icon", "budget", ] + + +class CategorySelect(Select): + template_name = "category/forms/widgets/category.html" diff --git a/nummi/category/templates/category/forms/widgets/category.html b/nummi/category/templates/category/forms/widgets/category.html new file mode 100644 index 0000000..625832f --- /dev/null +++ b/nummi/category/templates/category/forms/widgets/category.html @@ -0,0 +1,5 @@ +{% load main_extras %} + + {{ "folder"|remix }} + {% include "django/forms/widgets/select.html" %} + diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index a4412a2..13502eb 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -67,6 +67,7 @@ form { border-bottom: 1px solid var(--gray); background: none; z-index: 1; + padding: 0; &:not([type="checkbox"]) { width: 100%; @@ -102,6 +103,11 @@ form { } } } + > .category-select { + display: grid; + grid-template-columns: min-content 1fr; + column-gap: 0.5rem; + } } } .buttons { diff --git a/nummi/main/static/main/js/base.js b/nummi/main/static/main/js/base.js index 6080811..54be5c3 100644 --- a/nummi/main/static/main/js/base.js +++ b/nummi/main/static/main/js/base.js @@ -18,4 +18,16 @@ for (let form of forms) { form.addEventListener("reset", (event) => { window.removeEventListener("beforeunload", beforeUnloadHandler); }); + + let categorySelect = form.querySelector(".category-select"); + if (categorySelect) { + let input = categorySelect.querySelector("select"); + let icon = categorySelect.querySelector("span"); + let icons = JSON.parse(input.dataset.icons); + + icon.className = `ri-${icons[input.value] || "folder"}-line`; + input.addEventListener("input", (event) => { + icon.className = `ri-${icons[input.value] || "folder"}-line`; + }); + } } diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index 9255ab7..45267b0 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -1,3 +1,6 @@ +import json + +from category.forms import CategorySelect from django.forms.widgets import TextInput from main.forms import NummiFileInput, NummiForm @@ -19,6 +22,9 @@ class TransactionForm(NummiForm): "payment", "description", ] + widgets = { + "category": CategorySelect(), + } meta_fieldsets = [ [ @@ -50,6 +56,15 @@ class TransactionForm(NummiForm): self.fields["payment"].widget = DatalistInput( options=get_datalist(_user, "payment") ) + self.fields["category"].widget.attrs |= { + "class": "category", + "data-icons": json.dumps( + { + str(cat.id): cat.icon + for cat in self.fields["category"].queryset.only("id", "icon") + } + ), + } if _disable_statement: self.fields["statement"].disabled = True From 224f55a8b1ea7d23859fd2603254892c4dcb2df8 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 17:30:59 +0100 Subject: [PATCH 166/213] Add icon field, closes #24 --- nummi/account/forms.py | 5 +++- nummi/category/forms.py | 5 +++- .../category/forms/widgets/category.html | 2 +- nummi/main/forms.py | 29 +++++++++++++++++++ nummi/main/static/main/css/form.css | 2 +- nummi/main/static/main/js/base.js | 29 +++++++++++++++++-- .../main}/forms/widgets/datalist.html | 0 .../templates/main/forms/widgets/icon.html | 5 ++++ nummi/main/utils.py | 9 ++++++ nummi/transaction/forms.py | 19 +----------- 10 files changed, 81 insertions(+), 24 deletions(-) rename nummi/{transaction/templates/transaction => main/templates/main}/forms/widgets/datalist.html (100%) create mode 100644 nummi/main/templates/main/forms/widgets/icon.html create mode 100644 nummi/main/utils.py diff --git a/nummi/account/forms.py b/nummi/account/forms.py index 4b66f90..cde1416 100644 --- a/nummi/account/forms.py +++ b/nummi/account/forms.py @@ -1,4 +1,4 @@ -from main.forms import NummiForm +from main.forms import IconInput, NummiForm from .models import Account @@ -12,3 +12,6 @@ class AccountForm(NummiForm): "default", "archived", ] + widgets = { + "icon": IconInput(), + } diff --git a/nummi/category/forms.py b/nummi/category/forms.py index 25f5d9e..9988c6f 100644 --- a/nummi/category/forms.py +++ b/nummi/category/forms.py @@ -1,5 +1,5 @@ from django.forms.widgets import Select -from main.forms import NummiForm +from main.forms import IconInput, NummiForm from .models import Category @@ -12,6 +12,9 @@ class CategoryForm(NummiForm): "icon", "budget", ] + widgets = { + "icon": IconInput, + } class CategorySelect(Select): diff --git a/nummi/category/templates/category/forms/widgets/category.html b/nummi/category/templates/category/forms/widgets/category.html index 625832f..fc6724b 100644 --- a/nummi/category/templates/category/forms/widgets/category.html +++ b/nummi/category/templates/category/forms/widgets/category.html @@ -1,5 +1,5 @@ {% load main_extras %} - + {{ "folder"|remix }} {% include "django/forms/widgets/select.html" %} diff --git a/nummi/main/forms.py b/nummi/main/forms.py index 82c0146..05a6ae4 100644 --- a/nummi/main/forms.py +++ b/nummi/main/forms.py @@ -1,4 +1,7 @@ from django import forms +from django.forms.widgets import TextInput + +from .utils import get_icons class NummiFileInput(forms.ClearableFileInput): @@ -19,3 +22,29 @@ class NummiForm(forms.ModelForm): yield ((self[f] for f in fieldset) for fieldset in group) else: yield ([f] for f in self) + + +class DatalistInput(TextInput): + template_name = "main/forms/widgets/datalist.html" + + def __init__(self, *args, options=[]): + self.options = options + super().__init__(*args) + + def get_context(self, *args): + context = super().get_context(*args) + name = context["widget"]["name"] + context["widget"]["attrs"]["list"] = f"{name}-list" + context["widget"]["attrs"]["autocomplete"] = "off" + context["widget"]["options"] = self.options + return context + + +class IconInput(DatalistInput): + template_name = "main/forms/widgets/icon.html" + icon_list = get_icons() + + def get_context(self, *args): + context = super().get_context(*args) + context["widget"]["options"] = self.icon_list + return context diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 13502eb..5cb1504 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -103,7 +103,7 @@ form { } } } - > .category-select { + > .ico-input { display: grid; grid-template-columns: min-content 1fr; column-gap: 0.5rem; diff --git a/nummi/main/static/main/js/base.js b/nummi/main/static/main/js/base.js index 54be5c3..f294d85 100644 --- a/nummi/main/static/main/js/base.js +++ b/nummi/main/static/main/js/base.js @@ -25,9 +25,34 @@ for (let form of forms) { let icon = categorySelect.querySelector("span"); let icons = JSON.parse(input.dataset.icons); - icon.className = `ri-${icons[input.value] || "folder"}-line`; - input.addEventListener("input", (event) => { + function setIcon(event) { icon.className = `ri-${icons[input.value] || "folder"}-line`; + } + setIcon(); + input.addEventListener("input", setIcon); + form.addEventListener("reset", (event) => { + setTimeout(setIcon, 0); + }); + } + + let iconSelect = form.querySelector(".icon-select"); + if (iconSelect) { + let input = iconSelect.querySelector("input"); + let icon = iconSelect.querySelector("span"); + let icons = Array.from(iconSelect.querySelector("datalist").options).map( + (opt) => opt.value, + ); + + function setIcon(event) { + console.log(input.value); + icon.className = `ri-${ + icons.includes(input.value) ? input.value : "square" + }-line`; + } + setIcon(); + input.addEventListener("input", setIcon); + form.addEventListener("reset", (event) => { + setTimeout(setIcon, 0); }); } } diff --git a/nummi/transaction/templates/transaction/forms/widgets/datalist.html b/nummi/main/templates/main/forms/widgets/datalist.html similarity index 100% rename from nummi/transaction/templates/transaction/forms/widgets/datalist.html rename to nummi/main/templates/main/forms/widgets/datalist.html diff --git a/nummi/main/templates/main/forms/widgets/icon.html b/nummi/main/templates/main/forms/widgets/icon.html new file mode 100644 index 0000000..39e0e3c --- /dev/null +++ b/nummi/main/templates/main/forms/widgets/icon.html @@ -0,0 +1,5 @@ +{% load main_extras %} + + {{ "square"|remix }} + {% include "main/forms/widgets/datalist.html" %} + diff --git a/nummi/main/utils.py b/nummi/main/utils.py new file mode 100644 index 0000000..2a8bb28 --- /dev/null +++ b/nummi/main/utils.py @@ -0,0 +1,9 @@ +import json +from urllib import request + + +def get_icons(): + url = "https://cdn.jsdelivr.net/npm/remixicon@4.5.0/fonts/remixicon.glyph.json" + data = json.loads(request.urlopen(url).read()) + + return [i.removesuffix("-line") for i in data.keys() if i.endswith("-line")] diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index 45267b0..5c6160e 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -1,8 +1,7 @@ import json from category.forms import CategorySelect -from django.forms.widgets import TextInput -from main.forms import NummiFileInput, NummiForm +from main.forms import DatalistInput, NummiFileInput, NummiForm from .models import Invoice, Transaction from .utils import get_datalist @@ -82,19 +81,3 @@ class InvoiceForm(NummiForm): widgets = { "file": NummiFileInput, } - - -class DatalistInput(TextInput): - template_name = "transaction/forms/widgets/datalist.html" - - def __init__(self, *args, options=[]): - self.options = options - super().__init__(*args) - - def get_context(self, *args): - context = super().get_context(*args) - name = context["widget"]["name"] - context["widget"]["attrs"]["list"] = f"{name}-list" - context["widget"]["attrs"]["autocomplete"] = "off" - context["widget"]["options"] = self.options - return context From 57b315c842cd5136abcfcff36751c9ef17dc42d1 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 17:33:25 +0100 Subject: [PATCH 167/213] Fix bug with js for archived accounts --- nummi/account/templates/account/account_list.html | 1 - nummi/main/static/main/js/base.js | 10 ++++++++++ nummi/main/static/main/js/index.js | 9 --------- nummi/main/templates/main/index.html | 1 - 4 files changed, 10 insertions(+), 11 deletions(-) delete mode 100644 nummi/main/static/main/js/index.js diff --git a/nummi/account/templates/account/account_list.html b/nummi/account/templates/account/account_list.html index 9193e05..4c3c711 100644 --- a/nummi/account/templates/account/account_list.html +++ b/nummi/account/templates/account/account_list.html @@ -4,7 +4,6 @@ {{ block.super }} {% css "main/css/table.css" %} {% css "main/css/plot.css" %} - {% js "main/js/index.js" %} {% endblock link %} {% block name %} {% translate "Account" %} diff --git a/nummi/main/static/main/js/base.js b/nummi/main/static/main/js/base.js index f294d85..e07635f 100644 --- a/nummi/main/static/main/js/base.js +++ b/nummi/main/static/main/js/base.js @@ -56,3 +56,13 @@ for (let form of forms) { }); } } + +let accounts = document.querySelector("dl.accounts"); +let toggle = accounts.querySelector("input#show-archived-accounts"); + +if (toggle) { + accounts.classList.toggle("show-archive", toggle.checked); + toggle.addEventListener("change", (event) => { + accounts.classList.toggle("show-archive", toggle.checked); + }); +} diff --git a/nummi/main/static/main/js/index.js b/nummi/main/static/main/js/index.js deleted file mode 100644 index 550651b..0000000 --- a/nummi/main/static/main/js/index.js +++ /dev/null @@ -1,9 +0,0 @@ -let accounts = document.querySelector("dl.accounts"); -let toggle = accounts.querySelector("input#show-archived-accounts"); - -accounts.classList.toggle("show-archive", toggle.checked); -if (toggle) { - toggle.addEventListener("change", (event) => { - accounts.classList.toggle("show-archive", toggle.checked); - }); -} diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html index ce81ed3..a5329e3 100644 --- a/nummi/main/templates/main/index.html +++ b/nummi/main/templates/main/index.html @@ -6,7 +6,6 @@ {{ block.super }} {% css "main/css/table.css" %} {% css "main/css/plot.css" %} - {% js "main/js/index.js" %} {% endblock link %} {% block body %}
    From 1f22ac7042c2bfd37dad64124fdbc425a30b1831 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Thu, 2 Jan 2025 17:36:45 +0100 Subject: [PATCH 168/213] JS bugfix --- nummi/main/static/main/js/base.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/nummi/main/static/main/js/base.js b/nummi/main/static/main/js/base.js index e07635f..d4c6ea1 100644 --- a/nummi/main/static/main/js/base.js +++ b/nummi/main/static/main/js/base.js @@ -58,11 +58,12 @@ for (let form of forms) { } let accounts = document.querySelector("dl.accounts"); -let toggle = accounts.querySelector("input#show-archived-accounts"); - -if (toggle) { - accounts.classList.toggle("show-archive", toggle.checked); - toggle.addEventListener("change", (event) => { +if (accounts) { + let toggle = accounts.querySelector("input#show-archived-accounts"); + if (toggle) { accounts.classList.toggle("show-archive", toggle.checked); - }); + toggle.addEventListener("change", (event) => { + accounts.classList.toggle("show-archive", toggle.checked); + }); + } } From c6c67b9f935bc03b7298944df73e6f7308789249 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 12:33:33 +0100 Subject: [PATCH 169/213] Fix invoices not being shown on transactions --- nummi/transaction/models.py | 4 ---- .../templates/transaction/invoice_table.html | 5 ++--- .../templates/transaction/transaction_detail.html | 10 +++++----- .../templates/transaction/transaction_table.html | 2 +- nummi/transaction/templatetags/transaction_extras.py | 8 ++++++++ 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/nummi/transaction/models.py b/nummi/transaction/models.py index 0fb8dd8..adc78c0 100644 --- a/nummi/transaction/models.py +++ b/nummi/transaction/models.py @@ -69,10 +69,6 @@ class Transaction(UserModel): if self.statement: return self.statement.account - @property - def has_invoice(self): - return self.invoices.count() > 0 - class Meta: ordering = ["-date", "statement"] verbose_name = _("Transaction") diff --git a/nummi/transaction/templates/transaction/invoice_table.html b/nummi/transaction/templates/transaction/invoice_table.html index f67b659..7b5919b 100644 --- a/nummi/transaction/templates/transaction/invoice_table.html +++ b/nummi/transaction/templates/transaction/invoice_table.html @@ -1,8 +1,7 @@ -{% load main_extras %} -{% load i18n %} +{% load i18n main_extras %}
      - {% for invoice in transaction.invoices %} + {% for invoice in invoices %}
    • {{ "file"|remix }}{{ invoice.name }} [{{ invoice.file|extension }}] {{ "file-edit"|remix }}{% translate "Edit" %} diff --git a/nummi/transaction/templates/transaction/transaction_detail.html b/nummi/transaction/templates/transaction/transaction_detail.html index a879a3e..4cfd068 100644 --- a/nummi/transaction/templates/transaction/transaction_detail.html +++ b/nummi/transaction/templates/transaction/transaction_detail.html @@ -1,16 +1,16 @@ {% extends "main/form/base.html" %} {% load i18n %} -{% load main_extras %} +{% load main_extras transaction_extras %} {% block title %} {{ transaction }} – Nummi -{% endblock %} +{% endblock title %} {% block link %} {{ block.super }} {% css "main/css/form.css" %} {% css "main/css/table.css" %} {% css "main/css/plot.css" %} -{% endblock %} +{% endblock link %} {% block body %}

      {{ transaction }}

      @@ -43,6 +43,6 @@

      {% translate "Invoices" %}

      - {% include "transaction/invoice_table.html" %} + {% invoice_table transaction %}
      -{% endblock %} +{% endblock body %} diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index 396c511..6e34f14 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -39,7 +39,7 @@ {% for trans in transactions %} - {% for invoice in trans.invoices %} + {% for invoice in trans.invoice_set.all %} {{ "attachment"|remix }} {% endfor %} diff --git a/nummi/transaction/templatetags/transaction_extras.py b/nummi/transaction/templatetags/transaction_extras.py index b614674..7817cfb 100644 --- a/nummi/transaction/templatetags/transaction_extras.py +++ b/nummi/transaction/templatetags/transaction_extras.py @@ -22,6 +22,14 @@ def transaction_table(transactions, **kwargs): } +@register.inclusion_tag("transaction/invoice_table.html") +def invoice_table(transaction, **kwargs): + return kwargs | { + "transaction": transaction, + "invoices": transaction.invoice_set.all(), + } + + @register.simple_tag(takes_context=True) def month_url(context, month, cls="", fmt="Y-m"): url_name, url_params = ac_url( From 2cba5c6d837d76ec6a5af09c72febf6c80e2c958 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 12:46:19 +0100 Subject: [PATCH 170/213] Hide archived accounts in select for new statements --- nummi/statement/forms.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nummi/statement/forms.py b/nummi/statement/forms.py index e7afbb3..dbf77df 100644 --- a/nummi/statement/forms.py +++ b/nummi/statement/forms.py @@ -1,4 +1,3 @@ -from account.models import Account from django import forms from django.utils.translation import gettext_lazy as _ from main.forms import NummiFileInput, NummiForm @@ -28,7 +27,7 @@ class StatementForm(NummiForm): _user = kwargs.get("user") _disable_account = kwargs.pop("disable_account", False) super().__init__(*args, **kwargs) - self.fields["account"].queryset = Account.objects.filter(user=_user) + self.fields["account"].queryset = _user.account_set.exclude(archived=True) self.fields["transactions"] = forms.MultipleChoiceField( choices=( ((_transaction.id), _transaction) From 26f97dd1797ba2506a1c0164d45d8198f9a602ce Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 13:05:46 +0100 Subject: [PATCH 171/213] Use only budgeted categories in history plot --- nummi/history/templatetags/history_extras.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py index d7cd2c1..7d278f6 100644 --- a/nummi/history/templatetags/history_extras.py +++ b/nummi/history/templatetags/history_extras.py @@ -11,7 +11,7 @@ register = template.Library() @register.inclusion_tag("history/plot.html") def history_plot(transactions, **kwargs): return kwargs | { - "history": history(transactions), + "history": history(transactions.exclude(category__budget=False)), } From a6fc7f5a921162ae5f3f20cdccbaf8c77931f8b0 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 14:25:40 +0100 Subject: [PATCH 172/213] Move statement sum and diff to properties instead of model fields Fix #32 --- ...ove_statement_diff_remove_statement_sum.py | 20 +++++++++++ nummi/statement/models.py | 36 +++++-------------- 2 files changed, 29 insertions(+), 27 deletions(-) create mode 100644 nummi/statement/migrations/0003_remove_statement_diff_remove_statement_sum.py diff --git a/nummi/statement/migrations/0003_remove_statement_diff_remove_statement_sum.py b/nummi/statement/migrations/0003_remove_statement_diff_remove_statement_sum.py new file mode 100644 index 0000000..d76d0f8 --- /dev/null +++ b/nummi/statement/migrations/0003_remove_statement_diff_remove_statement_sum.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2 on 2025-01-03 13:23 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("statement", "0002_alter_statement_table"), + ] + + operations = [ + migrations.RemoveField( + model_name="statement", + name="diff", + ), + migrations.RemoveField( + model_name="statement", + name="sum", + ), + ] diff --git a/nummi/statement/models.py b/nummi/statement/models.py index c5e0337..fe661a8 100644 --- a/nummi/statement/models.py +++ b/nummi/statement/models.py @@ -4,7 +4,7 @@ from uuid import uuid4 from account.models import AccountModel from django.core.validators import FileExtensionValidator -from django.db import models, transaction +from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ from media.utils import get_path @@ -22,20 +22,6 @@ class Statement(AccountModel): start_value = models.DecimalField( max_digits=12, decimal_places=2, default=0, verbose_name=_("Start value") ) - diff = models.DecimalField( - max_digits=12, - decimal_places=2, - default=0, - verbose_name=_("Difference"), - editable=False, - ) - sum = models.DecimalField( - max_digits=12, - decimal_places=2, - default=0, - verbose_name=_("Transaction difference"), - editable=False, - ) file = models.FileField( upload_to=get_path, validators=[FileExtensionValidator(["pdf"])], @@ -54,21 +40,17 @@ class Statement(AccountModel): if _prever.file and _prever.file != self.file: Path(_prever.file.path).unlink(missing_ok=True) - with transaction.atomic(): - for trans in self.transaction_set.all(): - trans.save() - - self.diff = self.value - self.start_value - self.sum = ( - self.transaction_set.aggregate(sum=models.Sum("value")).get("sum", 0) or 0 - ) super().save(*args, **kwargs) - def update_sum(self): - self.sum = ( - self.transaction_set.aggregate(sum=models.Sum("value")).get("sum", 0) or 0 + @property + def sum(self): + return self.transaction_set.aggregate(sum=models.Sum("value", default=0)).get( + "sum" ) - super().save() + + @property + def diff(self): + return self.value - self.start_value def delete(self, *args, **kwargs): if self.file: From c14e075cad167a10ad19389845be38dda61535b9 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 14:54:47 +0100 Subject: [PATCH 173/213] Add VS Code debug config --- .vscode/launch.json | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..0d096fe --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "name": "Python Debugger: Django", + "type": "debugpy", + "request": "launch", + "program": "${workspaceFolder}\\nummi\\manage.py", + "args": [ + "runserver" + ], + "env": { + "NUMMI_CONFIG": "${workspaceFolder}\\env\\config.toml" + }, + "django": true + } + ] +} \ No newline at end of file From 5b49836bada5666ef73a5c9aa01ae07086d8411a Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 14:55:16 +0100 Subject: [PATCH 174/213] Fix history plot Fix #31 --- nummi/account/templates/account/account_detail.html | 2 +- nummi/category/templates/category/category_detail.html | 2 +- nummi/history/templatetags/history_extras.py | 10 +++++++--- nummi/transaction/views.py | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/nummi/account/templates/account/account_detail.html b/nummi/account/templates/account/account_detail.html index 5b7fa17..6d7e408 100644 --- a/nummi/account/templates/account/account_detail.html +++ b/nummi/account/templates/account/account_detail.html @@ -22,6 +22,6 @@

    {% translate "History" %}

    - {% history_plot account.transactions %} + {% history_plot account.transactions account=account %}
    {% endblock body %} diff --git a/nummi/category/templates/category/category_detail.html b/nummi/category/templates/category/category_detail.html index 3c13cbb..02b9635 100644 --- a/nummi/category/templates/category/category_detail.html +++ b/nummi/category/templates/category/category_detail.html @@ -20,6 +20,6 @@

    {% translate "History" %}

    - {% history_plot category.transaction_set.all %} + {% history_plot category.transaction_set category=category %}
    {% endblock body %} diff --git a/nummi/history/templatetags/history_extras.py b/nummi/history/templatetags/history_extras.py index 7d278f6..e8f940b 100644 --- a/nummi/history/templatetags/history_extras.py +++ b/nummi/history/templatetags/history_extras.py @@ -10,9 +10,13 @@ register = template.Library() @register.inclusion_tag("history/plot.html") def history_plot(transactions, **kwargs): - return kwargs | { - "history": history(transactions.exclude(category__budget=False)), - } + options = kwargs + if "category" in kwargs or "account" in kwargs: + options["history"] = history(transactions.all()) + else: + options["history"] = history(transactions.exclude(category__budget=False)) + + return options @register.simple_tag diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 90e681d..c3f854f 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -136,7 +136,7 @@ class TransactionACMixin: Account.objects.filter(user=self.request.user), pk=self.kwargs["account"], ) - return super().get_queryset().filter(account=self.account) + return super().get_queryset().filter(statement__account=self.account) if "category" in self.kwargs: self.category = get_object_or_404( Category.objects.filter(user=self.request.user), From d8961c8198b56c6a59474ac7ee504cd500d063f3 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 15:21:06 +0100 Subject: [PATCH 175/213] Improve forms Form errors displayed correctly (fix #30) Fix #26 Close #20 --- nummi/main/static/main/css/form.css | 47 +++++++++++++++---- nummi/main/templates/main/form/fileinput.html | 33 +------------ nummi/main/templates/main/form/form_base.html | 8 +++- 3 files changed, 45 insertions(+), 43 deletions(-) diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 5cb1504..06063b9 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -1,10 +1,3 @@ -form ul.errorlist { - color: var(--red); - font-weight: 550; - list-style-type: "! "; - margin: 0; -} - form { display: grid; gap: 0.5rem; @@ -29,26 +22,43 @@ form { border: none; } + ul.errorlist { + color: var(--red); + font-weight: 550; + list-style: none; + padding: 0; + margin: 0; + } + .field { display: grid; grid-auto-rows: min-content; align-items: center; - overflow: hidden; column-gap: 0.5rem; + ul.errorlist { + font-size: 0.8rem; + } + &:has(> textarea) { grid-template-rows: min-content 1fr; } - &:has(input[type="checkbox"]) { + &:has(> input[type="checkbox"]) { grid-template-columns: min-content 1fr; > label { font-size: inherit; grid-row: 1; grid-column: 2; + padding: 0.5rem; + line-height: initial; } > input { grid-row: 1; grid-column: 1; + margin: 0.5rem; + } + &:has(> :focus) { + background: var(--bg-01); } } @@ -64,13 +74,19 @@ form { font: inherit; line-height: initial; border: none; + border: 1px solid transparent; border-bottom: 1px solid var(--gray); background: none; z-index: 1; - padding: 0; + padding: 0.5rem; + + &:has(~ ul.errorlist) { + border-color: var(--red); + } &:not([type="checkbox"]) { width: 100%; + margin: 0; } &[name*="value"] { @@ -95,6 +111,9 @@ form { grid-template-columns: 1fr; grid-auto-columns: max-content; grid-auto-flow: column; + a { + padding: 0.5rem; + } } input[type="file"] { @@ -107,6 +126,14 @@ form { display: grid; grid-template-columns: min-content 1fr; column-gap: 0.5rem; + align-items: center; + span[class|="ri"] { + padding: 0.5rem; + } + + &:has(> :focus) { + background: var(--bg-01); + } } } } diff --git a/nummi/main/templates/main/form/fileinput.html b/nummi/main/templates/main/form/fileinput.html index 77989ae..8dd3985 100644 --- a/nummi/main/templates/main/form/fileinput.html +++ b/nummi/main/templates/main/form/fileinput.html @@ -5,7 +5,7 @@
    {{ "file"|remix }}{% translate "File" %} [{{ widget.value|extension }}] {% if not widget.required %} - +
    -{% comment %} - - {% if widget.is_initial %} - - - - - {% if not widget.required %} - - - - - {% endif %} - - - - - -
    {{ widget.initial_text }} - {% translate "File" %} [{{ widget.value|extension }}] -
    - - - -
    {{ widget.input_text }} - {% else %} -
    - {% endif %} - -
    -{% endcomment %} diff --git a/nummi/main/templates/main/form/form_base.html b/nummi/main/templates/main/form/form_base.html index 86341b8..4989c4b 100644 --- a/nummi/main/templates/main/form/form_base.html +++ b/nummi/main/templates/main/form/form_base.html @@ -12,10 +12,16 @@ {% for fieldset in group %}
    {% for field in fieldset %} - {% if field.errors %}

    {{ field.errors }}

    {% endif %}
    {{ field }} + {% if field.errors %} +
      + {% for error in field.errors %} +
    • {{ "error-warning"|remix }}{{ error }}
    • + {% endfor %} +
    + {% endif %}
    {% endfor %}
    From 7478404d8a313a05e9835ad334147bb767b9a5f8 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 15:55:58 +0100 Subject: [PATCH 176/213] Improve statement details page Fix #29 --- nummi/main/static/main/css/main.css | 48 +++++++++++++++++-- .../templates/statement/statement_detail.html | 27 +++++++++-- 2 files changed, 65 insertions(+), 10 deletions(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 9181c72..eb4eee6 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -423,13 +423,14 @@ ul.statements { } .statement-details { - overflow-x: auto; display: grid; - grid-template-columns: repeat(4, min-content); + @media (width > 720px) { + grid-template-columns: repeat(3, min-content); + } gap: var(--gap); align-items: center; - > span:nth-child(2) { + > span.evolution { display: grid; grid-auto-rows: min-content; > span[class^="ri-"] { @@ -439,12 +440,49 @@ ul.statements { text-align: right; } } - > span:first-child, - > span:nth-child(3) { + > span.start, + > span.end, + > span.file, + > span.incons { display: grid; border: var(--gray) 1px solid; padding: var(--gap); + &.file, + &.incons { + grid-column: 1 / -1; + } + &.incons { + border-color: var(--red); + grid-template-columns: min-content 1fr; + grid-auto-flow: column; + align-items: center; + gap: 0.5rem; + + > .ds { + display: grid; + grid-auto-rows: min-content; + } + .value { + text-align: right; + } + .diff { + font-weight: 650; + } + .sum { + text-decoration: line-through; + } + .links { + grid-column: 1 / -1; + grid-row: 2; + display: grid; + gap: inherit; + a { + color: var(--red); + } + } + } + > .date { text-align: right; } diff --git a/nummi/statement/templates/statement/statement_detail.html b/nummi/statement/templates/statement/statement_detail.html index e31ffcc..bb7c795 100644 --- a/nummi/statement/templates/statement/statement_detail.html +++ b/nummi/statement/templates/statement/statement_detail.html @@ -19,22 +19,39 @@ {{ "file-edit"|remix }}{% translate "Edit statement" %}

    - + {% if statement.sum != statement.diff %} + + {{ statement.sum|check:statement.diff }} + + {{ statement.diff|pmvalue }} + {{ statement.sum|pmvalue }} + + + {{ "file-edit"|remix }}{% translate "Edit statement" %} + {{ "add-circle"|remix }}{% translate "Add transaction" %} + + + {% endif %} + {% if statement.file %} + + {{ "file"|remix }}{{ statement }} [{{ statement.file|extension }}] + + {% endif %} + {{ statement.start_date|date:"Y-m-d" }} {{ statement.start_value|value }} - + {{ statement.sum|pmvalue }} - {{ "arrow-right"|remix }} + {{ "funds"|remix }} {% if statement.diff != statement.sum %} {{ statement.diff|pmvalue }} {% endif %} - + {{ statement.date|date:"Y-m-d" }} {{ statement.value|value }} - {{ statement.sum|check:statement.diff }}

    {% translate "Transactions" %}

    From 38ab29809471268945c7518c1ea4f356e9868fd3 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 16:25:49 +0100 Subject: [PATCH 177/213] Improve transaction form Default to no statement (fix #28) Add link to statement on statement transaction creation Fix textarea height --- nummi/main/static/main/css/form.css | 7 +++++++ nummi/statement/forms.py | 5 +++++ .../statement/forms/widgets/statement.html | 12 ++++++++++++ nummi/transaction/forms.py | 2 ++ nummi/transaction/views.py | 17 ++++++----------- 5 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 nummi/statement/templates/statement/forms/widgets/statement.html diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 06063b9..ec5fa90 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -42,6 +42,9 @@ form { &:has(> textarea) { grid-template-rows: min-content 1fr; + textarea { + height: 100%; + } } &:has(> input[type="checkbox"]) { grid-template-columns: min-content 1fr; @@ -68,6 +71,10 @@ form { z-index: 10; } + > a { + padding: 0.5rem; + } + input, select, textarea { diff --git a/nummi/statement/forms.py b/nummi/statement/forms.py index dbf77df..c3841f2 100644 --- a/nummi/statement/forms.py +++ b/nummi/statement/forms.py @@ -1,4 +1,5 @@ from django import forms +from django.forms.widgets import Select from django.utils.translation import gettext_lazy as _ from main.forms import NummiFileInput, NummiForm from transaction.models import Transaction @@ -50,3 +51,7 @@ class StatementForm(NummiForm): instance.transaction_set.add(*new_transactions, bulk=False) return instance + + +class StatementSelect(Select): + template_name = "statement/forms/widgets/statement.html" diff --git a/nummi/statement/templates/statement/forms/widgets/statement.html b/nummi/statement/templates/statement/forms/widgets/statement.html new file mode 100644 index 0000000..0689a39 --- /dev/null +++ b/nummi/statement/templates/statement/forms/widgets/statement.html @@ -0,0 +1,12 @@ +{% load main_extras %} +{% if widget.attrs.disabled %} + {% for group_name, group_choices, group_index in widget.optgroups %} + {% for option in group_choices %} + {% if option.selected %} + {{ "file"|remix }}{{ option.label }} + {% endif %} + {% endfor %} + {% endfor %} +{% else %} + {% include "django/forms/widgets/select.html" %} +{% endif %} diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index 5c6160e..31f7b09 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -2,6 +2,7 @@ import json from category.forms import CategorySelect from main.forms import DatalistInput, NummiFileInput, NummiForm +from statement.forms import StatementSelect from .models import Invoice, Transaction from .utils import get_datalist @@ -22,6 +23,7 @@ class TransactionForm(NummiForm): "description", ] widgets = { + "statement": StatementSelect(), "category": CategorySelect(), } diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index c3f854f..39f0f98 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -12,7 +12,6 @@ from main.views import ( NummiUpdateView, UserMixin, ) -from statement.models import Statement from .forms import InvoiceForm, TransactionForm from .models import Invoice, Transaction @@ -23,23 +22,19 @@ class TransactionCreateView(NummiCreateView): form_class = TransactionForm def get_initial(self): - _queryset = Statement.objects.filter(user=self.request.user) + initial = super().get_initial() if "statement" in self.kwargs: - self.statement = get_object_or_404(_queryset, pk=self.kwargs["statement"]) - else: - self.statement = _queryset.first() - return {"statement": self.statement} + initial["statement"] = get_object_or_404( + self.request.user.statement_set, pk=self.kwargs["statement"] + ) + + return initial def get_form_kwargs(self): if "statement" in self.kwargs: return super().get_form_kwargs() | {"disable_statement": True} return super().get_form_kwargs() - def get_context_data(self, **kwargs): - if "statement" in self.kwargs: - return super().get_context_data(**kwargs) | {"statement": self.statement} - return super().get_context_data(**kwargs) - class InvoiceCreateView(NummiCreateView): model = Invoice From f203d1db46e1a2275990ab9672045149d7b70f57 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 16:46:36 +0100 Subject: [PATCH 178/213] Fix transaction table (fix #33) --- .../transaction/transaction_table.html | 18 +++++------ .../templatetags/transaction_extras.py | 31 +++++++++---------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index 6e34f14..4879d3f 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -9,13 +9,13 @@ - {% if not category %}{% endif %} - {% if not account %}{% endif %} + {% if not hide_category %}{% endif %} + {% if not hide_account %}{% endif %} {% if new_transaction_url %} - + {% translate "Create transaction" %} @@ -27,10 +27,10 @@ {% translate "Expenses" %} {% translate "Income" %} {% translate "Trader" %} - {% if not category %} + {% if not hide_category %} {% translate "Category" %} {% endif %} - {% if not account %} + {% if not hide_account %} {% translate "Account" %} {% endif %} @@ -61,14 +61,14 @@ {{ trans.value|pmvalue }} {% if trans.value < 0 %}{% endif %} {{ trans.trader|default_if_none:"" }} - {% if not category %} + {% if not hide_category %} {% if trans.category %} {{ trans.category.icon|remix }}{{ trans.category }} {% endif %} {% endif %} - {% if not account %} + {% if not hide_account %} {% if trans.account %} {{ trans.account.icon|remix }}{{ trans.account|default_if_none:"" }} @@ -78,14 +78,14 @@ {% empty %} - {% translate "No transaction" %} + {% translate "No transaction" %} {% endfor %} {% if transactions_url %} - + {% translate "View all transactions" %} diff --git a/nummi/transaction/templatetags/transaction_extras.py b/nummi/transaction/templatetags/transaction_extras.py index 7817cfb..e2311a0 100644 --- a/nummi/transaction/templatetags/transaction_extras.py +++ b/nummi/transaction/templatetags/transaction_extras.py @@ -10,16 +10,25 @@ from ..utils import ac_url register = template.Library() -@register.inclusion_tag("transaction/transaction_table.html") -def transaction_table(transactions, **kwargs): - if (n_max := kwargs.get("n_max")) is not None: +@register.inclusion_tag("transaction/transaction_table.html", takes_context=True) +def transaction_table(context, transactions, n_max=None, **kwargs): + if n_max is not None: if transactions.count() <= n_max: del kwargs["transactions_url"] transactions = transactions[:n_max] - return kwargs | { - "transactions": transactions, - } + if "account" in context or "statement" in context: + kwargs.setdefault("hide_account", True) + if "category" in context: + kwargs.setdefault("hide_category", True) + + ncol = 8 + if kwargs.get("hide_account"): + ncol -= 1 + if kwargs.get("hide_category"): + ncol -= 1 + + return kwargs | {"transactions": transactions, "ncol": ncol} @register.inclusion_tag("transaction/invoice_table.html") @@ -54,13 +63,3 @@ def year_url(context, year, cls=""): f"""""" f"""""" ) - - -@register.simple_tag(takes_context=True) -def tr_colspan(context): - ncol = 8 - if context.get("category"): - ncol -= 1 - if context.get("account"): - ncol -= 1 - return ncol From 0cb4a681f1d74dbcd6909781cb8815024b1055ad Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 16:52:02 +0100 Subject: [PATCH 179/213] Refactor datalist input usage --- nummi/transaction/forms.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index 31f7b09..576347b 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -25,6 +25,9 @@ class TransactionForm(NummiForm): widgets = { "statement": StatementSelect(), "category": CategorySelect(), + "name": DatalistInput(), + "trader": DatalistInput(), + "payment": DatalistInput(), } meta_fieldsets = [ @@ -47,16 +50,17 @@ class TransactionForm(NummiForm): _disable_statement = kwargs.pop("disable_statement", False) super().__init__(*args, **kwargs) - self.fields["category"].queryset = _user.category_set - self.fields["statement"].queryset = _user.statement_set + self.fields["category"].queryset = self.fields["category"].queryset.filter( + user=_user + ) + self.fields["statement"].queryset = self.fields["statement"].queryset.filter( + user=_user + ) + + self.fields["name"].widget.options = get_datalist(_user, "name") + self.fields["trader"].widget.options = get_datalist(_user, "trader") + self.fields["payment"].widget.options = get_datalist(_user, "payment") - self.fields["name"].widget = DatalistInput(options=get_datalist(_user, "name")) - self.fields["trader"].widget = DatalistInput( - options=get_datalist(_user, "trader") - ) - self.fields["payment"].widget = DatalistInput( - options=get_datalist(_user, "payment") - ) self.fields["category"].widget.attrs |= { "class": "category", "data-icons": json.dumps( From ff519ea7d1cf45757ea4ec7d6d8b435e48570e99 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 18:50:50 +0100 Subject: [PATCH 180/213] Auto-fill transaction form Close #27 --- nummi/main/static/main/css/form.css | 11 +++ nummi/main/static/main/js/base.js | 70 ++++++++++++++++++- nummi/main/templates/main/form/form_base.html | 1 + nummi/transaction/forms.py | 29 ++++++++ nummi/transaction/views.py | 2 +- 5 files changed, 111 insertions(+), 2 deletions(-) diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index ec5fa90..21fc448 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -1,3 +1,11 @@ +@keyframes border-pulse { + from { + border-color: var(--green); + } + to { + } +} + form { display: grid; gap: 0.5rem; @@ -90,6 +98,9 @@ form { &:has(~ ul.errorlist) { border-color: var(--red); } + &.autocompleted:not(.mod) { + border-bottom-color: var(--green); + } &:not([type="checkbox"]) { width: 100%; diff --git a/nummi/main/static/main/js/base.js b/nummi/main/static/main/js/base.js index d4c6ea1..eaafec5 100644 --- a/nummi/main/static/main/js/base.js +++ b/nummi/main/static/main/js/base.js @@ -44,7 +44,6 @@ for (let form of forms) { ); function setIcon(event) { - console.log(input.value); icon.className = `ri-${ icons.includes(input.value) ? input.value : "square" }-line`; @@ -55,6 +54,75 @@ for (let form of forms) { setTimeout(setIcon, 0); }); } + + let ac_json = form.querySelector("#autocomplete"); + if (ac_json) { + let autocomplete_data = JSON.parse(ac_json.textContent); + let fields = form.querySelectorAll("[name]"); + function clearMod(event) { + event.target.classList.add("mod"); + event.target.removeEventListener("input", clearMod); + } + function setMod() { + for (let f of fields) { + f.addEventListener("input", clearMod); + } + } + setMod(); + form.addEventListener("reset", (event) => { + for (let f of fields) { + f.classList.remove("mod", "autocompleted"); + } + setMod(); + }); + + let old_values = []; + + let field = form.querySelector(`[name="${autocomplete_data.field}"]`); + field.addEventListener("change", (event) => { + if (field.value in autocomplete_data.data) { + old_values = []; + for (let comp of autocomplete_data.data[field.value]) { + let f = form.querySelector(`[name="${comp.field}"]`); + if (!f.classList.contains("mod")) { + old_values.push({ field: f, value: f.value }); + + f.value = comp.value; + f.dispatchEvent(new Event("input")); + f.animate([{ borderColor: "var(--green)" }, {}], 750); + f.classList.remove("mod"); + f.classList.add("autocompleted"); + f.addEventListener("input", clearMod); + function ccAutocomplete(event) { + document.removeEventListener("keyup", cancelAutocomplete); + for (comp of old_values) { + comp.field.removeEventListener("input", ccAutocomplete); + } + } + f.addEventListener("input", ccAutocomplete); + } + } + function cancelAutocomplete(event) { + if (event.code == "Escape") { + for (comp of old_values) { + let f = comp.field; + f.value = comp.value; + f.dispatchEvent(new Event("input")); + f.animate([{ borderColor: "var(--red)" }, {}], 750); + f.classList.remove("mod"); + f.classList.remove("autocompleted"); + f.addEventListener("input", clearMod); + } + document.removeEventListener("keyup", cancelAutocomplete); + } + } + document.addEventListener("keyup", cancelAutocomplete); + form.addEventListener("reset", (event) => { + document.removeEventListener("keyup", cancelAutocomplete); + }); + } + }); + } } let accounts = document.querySelector("dl.accounts"); diff --git a/nummi/main/templates/main/form/form_base.html b/nummi/main/templates/main/form/form_base.html index 4989c4b..08afb61 100644 --- a/nummi/main/templates/main/form/form_base.html +++ b/nummi/main/templates/main/form/form_base.html @@ -1,6 +1,7 @@ {% load i18n %} {% load main_extras %} {% block fields %} + {% if form.autocomplete %}{{ form.autocomplete|json_script:"autocomplete" }}{% endif %} {% if form.non_field_errors %}
      {% for error in form.non_field_errors %}
    • {{ error }}
    • {% endfor %} diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index 576347b..ffecd63 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -48,6 +48,7 @@ class TransactionForm(NummiForm): def __init__(self, *args, **kwargs): _user = kwargs.get("user") _disable_statement = kwargs.pop("disable_statement", False) + _autocomplete = kwargs.pop("autocomplete", False) super().__init__(*args, **kwargs) self.fields["category"].queryset = self.fields["category"].queryset.filter( @@ -71,6 +72,34 @@ class TransactionForm(NummiForm): ), } + if _autocomplete: + self.autocomplete = { + "field": "name", + "data": { + t.name: [ + { + "field": "value", + "value": t.value, + }, + { + "field": "category", + "value": t.category.id if t.category else "", + }, + { + "field": "trader", + "value": t.trader, + }, + { + "field": "payment", + "value": t.payment, + }, + ] + for t in _user.transaction_set.order_by("name", "-date").distinct( + "name" + ) + }, + } + if _disable_statement: self.fields["statement"].disabled = True diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 39f0f98..6d8461b 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -33,7 +33,7 @@ class TransactionCreateView(NummiCreateView): def get_form_kwargs(self): if "statement" in self.kwargs: return super().get_form_kwargs() | {"disable_statement": True} - return super().get_form_kwargs() + return super().get_form_kwargs() | {"autocomplete": True} class InvoiceCreateView(NummiCreateView): From 0c5ba6899b2fbd4bf4717cb5f5389f22e18e771a Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 19:04:40 +0100 Subject: [PATCH 181/213] Fix no autocomplete on statement transaction creation Fix #36 --- nummi/transaction/views.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 6d8461b..09c64da 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -31,9 +31,12 @@ class TransactionCreateView(NummiCreateView): return initial def get_form_kwargs(self): + form_kwargs = super().get_form_kwargs() if "statement" in self.kwargs: - return super().get_form_kwargs() | {"disable_statement": True} - return super().get_form_kwargs() | {"autocomplete": True} + form_kwargs["disable_statement"] = True + + form_kwargs["autocomplete"] = True + return form_kwargs class InvoiceCreateView(NummiCreateView): From ec5c0e2fefb1cc9dcc246cf992d8a81cc0d5b0ae Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 19:16:03 +0100 Subject: [PATCH 182/213] Fix update_sum left in transaction models --- .../templates/statement/forms/widgets/statement.html | 3 +-- nummi/transaction/forms.py | 1 + nummi/transaction/models.py | 11 ----------- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/nummi/statement/templates/statement/forms/widgets/statement.html b/nummi/statement/templates/statement/forms/widgets/statement.html index 0689a39..aad0402 100644 --- a/nummi/statement/templates/statement/forms/widgets/statement.html +++ b/nummi/statement/templates/statement/forms/widgets/statement.html @@ -7,6 +7,5 @@ {% endif %} {% endfor %} {% endfor %} -{% else %} - {% include "django/forms/widgets/select.html" %} {% endif %} +{% include "django/forms/widgets/select.html" %} diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index ffecd63..5583c84 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -102,6 +102,7 @@ class TransactionForm(NummiForm): if _disable_statement: self.fields["statement"].disabled = True + self.fields["statement"].widget.attrs["hidden"] = True class InvoiceForm(NummiForm): diff --git a/nummi/transaction/models.py b/nummi/transaction/models.py index adc78c0..37fc1d5 100644 --- a/nummi/transaction/models.py +++ b/nummi/transaction/models.py @@ -44,17 +44,6 @@ class Transaction(UserModel): verbose_name=_("Statement"), ) - def save(self, *args, **kwargs): - if Transaction.objects.filter(pk=self.pk): - prev_self = Transaction.objects.get(pk=self.pk) - else: - prev_self = None - super().save(*args, **kwargs) - if prev_self is not None and prev_self.statement: - prev_self.statement.update_sum() - if self.statement: - self.statement.update_sum() - def __str__(self): return f"{self.name}" From d2d101fe34f6e8c965920089911ade61426fd87a Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 21:49:47 +0100 Subject: [PATCH 183/213] Resize block on textarea Fix #41 --- nummi/main/static/main/css/form.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 21fc448..3a25e1d 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -19,6 +19,7 @@ form { gap: 0.5rem; border: 1px solid var(--gray); padding: var(--gap); + block-size: min-content; .fieldset { display: grid; @@ -51,7 +52,7 @@ form { &:has(> textarea) { grid-template-rows: min-content 1fr; textarea { - height: 100%; + resize: block; } } &:has(> input[type="checkbox"]) { From cb1882ef8a8857373aa220c469d162c15acd8ad3 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 21:53:01 +0100 Subject: [PATCH 184/213] Default statement transaction date Fix #40 --- nummi/transaction/views.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 09c64da..64e1f53 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -27,6 +27,9 @@ class TransactionCreateView(NummiCreateView): initial["statement"] = get_object_or_404( self.request.user.statement_set, pk=self.kwargs["statement"] ) + initial["date"] = ( + initial["statement"].transaction_set.order_by("-date").first().date + ) return initial From cfb2ceb2c37f51a5d4c15985ccd6008a47bd4d03 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Fri, 3 Jan 2025 22:46:53 +0100 Subject: [PATCH 185/213] Fix #39 --- nummi/main/static/main/css/main.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index eb4eee6..3dc29d4 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -1,5 +1,5 @@ @import "https://rsms.me/inter/inter.css"; -@import "https://cdn.jsdelivr.net/npm/remixicon@4.0.0/fonts/remixicon.css"; +@import "https://cdn.jsdelivr.net/npm/remixicon@4.5.0/fonts/remixicon.css"; *, *::before, From 805c7d3dc0f95b487a78f859ffa6296c61cd2283 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 12:37:09 +0100 Subject: [PATCH 186/213] Enable file drag and drop on transaction details page Close #37 --- nummi/main/forms.py | 3 +- nummi/main/static/main/css/form.css | 36 +++++++++++-- nummi/main/static/main/css/main.css | 1 + nummi/main/templatetags/main_extras.py | 2 +- nummi/statement/forms.py | 2 +- nummi/transaction/forms.py | 30 ++++++++++- .../static/transaction/js/invoice_form.js | 22 ++++++++ .../transaction/transaction_detail.html | 11 ++++ nummi/transaction/urls.py | 5 ++ nummi/transaction/views.py | 54 ++++++++++++++++--- 10 files changed, 151 insertions(+), 15 deletions(-) create mode 100644 nummi/transaction/static/transaction/js/invoice_form.js diff --git a/nummi/main/forms.py b/nummi/main/forms.py index 05a6ae4..36e5628 100644 --- a/nummi/main/forms.py +++ b/nummi/main/forms.py @@ -12,7 +12,8 @@ class NummiForm(forms.ModelForm): template_name = "main/form/form_base.html" meta_fieldsets = [] - def __init__(self, *args, user, **kwargs): + def __init__(self, *args, **kwargs): + kwargs.pop("user", None) super().__init__(*args, **kwargs) @property diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 3a25e1d..73c9eb9 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -1,8 +1,32 @@ -@keyframes border-pulse { - from { - border-color: var(--green); +.drop-zone { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + grid-template-columns: 1fr; + grid-template-rows: 1fr; + align-items: center; + text-align: center; + color: transparent; + display: grid; + transition-property: backdrop-filter; + transition-duration: 750ms; + z-index: -1; + + > span { + font-weight: 650; + font-size: 2rem; + transition-property: color; + transition-duration: inherit; } - to { + + main.highlight > & { + z-index: 100; + backdrop-filter: blur(0.1rem); + > span { + color: var(--green); + } } } @@ -14,6 +38,10 @@ form { grid-template-columns: 1fr; } + &.hidden { + display: none; + } + .column { display: grid; gap: 0.5rem; diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 3dc29d4..a154868 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -85,6 +85,7 @@ footer { @media (width > 720px) { padding: 2rem; } + background: var(--bg); } main { position: relative; diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index 0a9abcc..c5eea6c 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -59,7 +59,7 @@ def messageicon(level): @register.filter def extension(file): - return file.name.split(".")[-1].upper() + return file.name.split(".", 1)[1].upper() @register.filter diff --git a/nummi/statement/forms.py b/nummi/statement/forms.py index c3841f2..353ebe7 100644 --- a/nummi/statement/forms.py +++ b/nummi/statement/forms.py @@ -25,7 +25,7 @@ class StatementForm(NummiForm): ] def __init__(self, *args, **kwargs): - _user = kwargs.get("user") + _user = kwargs.pop("user") _disable_account = kwargs.pop("disable_account", False) super().__init__(*args, **kwargs) self.fields["account"].queryset = _user.account_set.exclude(archived=True) diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index 5583c84..807c00e 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -1,6 +1,8 @@ import json from category.forms import CategorySelect +from django import forms +from django.forms import formset_factory from main.forms import DatalistInput, NummiFileInput, NummiForm from statement.forms import StatementSelect @@ -46,7 +48,7 @@ class TransactionForm(NummiForm): ] def __init__(self, *args, **kwargs): - _user = kwargs.get("user") + _user = kwargs.pop("user") _disable_statement = kwargs.pop("disable_statement", False) _autocomplete = kwargs.pop("autocomplete", False) super().__init__(*args, **kwargs) @@ -117,3 +119,29 @@ class InvoiceForm(NummiForm): widgets = { "file": NummiFileInput, } + + +class MultipleFileInput(forms.ClearableFileInput): + allow_multiple_selected = True + + +class MultipleFileField(forms.FileField): + def __init__(self, *args, **kwargs): + kwargs.setdefault("widget", MultipleFileInput()) + super().__init__(*args, **kwargs) + + def clean(self, data, initial=None): + single_file_clean = super().clean + if isinstance(data, (list, tuple)): + result = [single_file_clean(d, initial) for d in data] + else: + result = single_file_clean(data, initial) + return result + + +class MultipleInvoicesForm(forms.Form): + prefix = "invoices" + invoices = MultipleFileField() + + +InvoicesFormSet = formset_factory(MultipleInvoicesForm) diff --git a/nummi/transaction/static/transaction/js/invoice_form.js b/nummi/transaction/static/transaction/js/invoice_form.js new file mode 100644 index 0000000..d18abfa --- /dev/null +++ b/nummi/transaction/static/transaction/js/invoice_form.js @@ -0,0 +1,22 @@ +const dropArea = document.querySelector("main"); +const form = document.querySelector("form.invoices"); + +dropArea.addEventListener("dragover", (event) => { + event.preventDefault(); + dropArea.classList.add("highlight"); +}); + +dropArea.addEventListener("dragleave", () => { + dropArea.classList.remove("highlight"); +}); + +dropArea.addEventListener("drop", (event) => { + console.log(event); + event.preventDefault(); + dropArea.classList.remove("highlight"); + const files = event.dataTransfer.files; + console.log(files); + const input = form.querySelector("input[type=file]"); + input.files = files; + form.submit(); +}); diff --git a/nummi/transaction/templates/transaction/transaction_detail.html b/nummi/transaction/templates/transaction/transaction_detail.html index 4cfd068..7e58c0f 100644 --- a/nummi/transaction/templates/transaction/transaction_detail.html +++ b/nummi/transaction/templates/transaction/transaction_detail.html @@ -10,6 +10,7 @@ {% css "main/css/form.css" %} {% css "main/css/table.css" %} {% css "main/css/plot.css" %} + {% js "transaction/js/invoice_form.js" %} {% endblock link %} {% block body %}

      {{ transaction }}

      @@ -44,5 +45,15 @@

      {% translate "Invoices" %}

      {% invoice_table transaction %} +
      +
      + {{ "file-add"|remix }}{% translate "Add invoice" %} +
      {% endblock body %} diff --git a/nummi/transaction/urls.py b/nummi/transaction/urls.py index c39aef6..7b3c802 100644 --- a/nummi/transaction/urls.py +++ b/nummi/transaction/urls.py @@ -31,6 +31,11 @@ urlpatterns = [ views.InvoiceCreateView.as_view(), name="new_invoice", ), + path( + "/invoice/multiple", + views.MultipleInvoiceCreateView.as_view(), + name="multiple_invoice", + ), path( "/invoice/", views.InvoiceUpdateView.as_view(), diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 64e1f53..ebf2238 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -1,8 +1,13 @@ from account.models import Account from category.models import Category +from django.contrib import messages +from django.forms import ValidationError from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy +from django.utils.html import format_html +from django.utils.translation import gettext as _ from django.views.generic.dates import MonthArchiveView, YearArchiveView +from django.views.generic.edit import FormView from history.utils import history from main.views import ( NummiCreateView, @@ -13,7 +18,7 @@ from main.views import ( UserMixin, ) -from .forms import InvoiceForm, TransactionForm +from .forms import InvoiceForm, MultipleInvoicesForm, TransactionForm from .models import Invoice, Transaction @@ -57,6 +62,45 @@ class InvoiceCreateView(NummiCreateView): return reverse_lazy("transaction", args=(self.object.transaction.pk,)) +class MultipleInvoiceCreateView(FormView): + form_class = MultipleInvoicesForm + + def form_valid(self, form): + transaction = get_object_or_404( + self.request.user.transaction_set, pk=self.kwargs["transaction"] + ) + + invoices = [] + for file in form.cleaned_data["invoices"]: + invoice = Invoice( + transaction=transaction, + user=self.request.user, + file=file, + name=file.name.split(".", 1)[0], + ) + try: + invoice.full_clean() + except ValidationError as err: + for msg in err.messages: + messages.error( + self.request, + format_html( + "{msg} {file}. {err}", + msg=_("Error processing file"), + file=file.name, + err=msg, + ), + ) + else: + invoices.append(invoice) + + Invoice.objects.bulk_create(invoices) + return super().form_valid(form) + + def get_success_url(self): + return reverse_lazy("transaction", args=(self.kwargs["transaction"],)) + + class TransactionUpdateView(NummiUpdateView): model = Transaction form_class = TransactionForm @@ -70,12 +114,8 @@ class TransactionDetailView(NummiDetailView): def get_context_data(self, **kwargs): data = super().get_context_data(**kwargs) - transaction = data.get("transaction") - - return data | { - "statement": transaction.statement, - "category": transaction.category, - } + data["invoices_form"] = MultipleInvoicesForm() + return data class InvoiceUpdateView(NummiUpdateView): From e1f29f90c6f40ce0bbed525509b0b58e1d2d8300 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 14:17:48 +0100 Subject: [PATCH 187/213] Move transaction link Close #35 Progress #38 --- .../templates/category/category_detail.html | 3 +++ nummi/main/static/main/css/main.css | 3 ++- nummi/main/static/main/css/table.css | 4 +--- nummi/main/templates/main/pagination.html | 9 ++------ .../main/templates/main/pagination_links.html | 13 ++++++++++++ nummi/main/templatetags/main_extras.py | 21 +++++++++++++++++++ .../templates/statement/statement_detail.html | 8 +++++-- .../transaction/transaction_list.html | 8 ++++--- .../transaction/transaction_table.html | 7 ------- 9 files changed, 53 insertions(+), 23 deletions(-) create mode 100644 nummi/main/templates/main/pagination_links.html diff --git a/nummi/category/templates/category/category_detail.html b/nummi/category/templates/category/category_detail.html index 02b9635..10d3a80 100644 --- a/nummi/category/templates/category/category_detail.html +++ b/nummi/category/templates/category/category_detail.html @@ -16,6 +16,9 @@

      {% translate "Transactions" %}

      {% url "category_transactions" category.id as t_url %} +

      + {{ "list-check"|remixnl }}{% translate "View all transactions" %} +

      {% transaction_table category.transaction_set.all n_max=8 transactions_url=t_url %}
      diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index a154868..03b0bc2 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -522,7 +522,8 @@ ul.statements { } } -.category { +.category, +.big-link { padding: 0 var(--gap); border: var(--gray) 1px solid; margin-right: 0.5rem; diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index c6284ec..1021922 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -45,9 +45,7 @@ table { font-weight: 300; } } - tfoot tr:not(.new) { - background: var(--bg-01); - } + .l { text-align: left; } diff --git a/nummi/main/templates/main/pagination.html b/nummi/main/templates/main/pagination.html index 0cad121..a97e1d2 100644 --- a/nummi/main/templates/main/pagination.html +++ b/nummi/main/templates/main/pagination.html @@ -1,11 +1,6 @@ -{% load i18n transaction_extras %} +{% load i18n main_extras transaction_extras %} {% if page_obj %} -

      - {% for page in paginator.page_range %} - {{ page }} - {% endfor %} -

      +

      {% pagination_links page_obj %}

      {% endif %} {% if month %}

      {% year_url month %}

      diff --git a/nummi/main/templates/main/pagination_links.html b/nummi/main/templates/main/pagination_links.html new file mode 100644 index 0000000..fcd8531 --- /dev/null +++ b/nummi/main/templates/main/pagination_links.html @@ -0,0 +1,13 @@ +{% load i18n main_extras %} +{% if first.show %} + 1 + {% if first.dots %}{% endif %} +{% endif %} +{% for page in pages %} + {{ page.number }} +{% endfor %} +{% if last.show %} + {% if last.dots %}{% endif %} + {{ last.number }} +{% endif %} diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index c5eea6c..9dd97e4 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -89,3 +89,24 @@ def balance(accounts): return sum( statement.value for acc in accounts if (statement := acc.statement_set.first()) ) + + +@register.inclusion_tag("main/pagination_links.html") +def pagination_links(page_obj): + _n = 3 + return { + "pages": [ + {"number": p, "current": p == page_obj.number} + for p in page_obj.paginator.page_range + if abs(p - page_obj.number) < _n + ], + "first": { + "show": page_obj.number > _n, + "dots": page_obj.number > _n + 1, + }, + "last": { + "show": page_obj.number <= page_obj.paginator.num_pages - _n, + "dots": page_obj.number < page_obj.paginator.num_pages - _n, + "number": page_obj.paginator.num_pages, + }, + } diff --git a/nummi/statement/templates/statement/statement_detail.html b/nummi/statement/templates/statement/statement_detail.html index bb7c795..232b22f 100644 --- a/nummi/statement/templates/statement/statement_detail.html +++ b/nummi/statement/templates/statement/statement_detail.html @@ -56,8 +56,12 @@

      {% translate "Transactions" %}

      {% url "statement_transactions" statement.id as t_url %} - {% url "new_transaction" statement=statement.id as nt_url %} - {% transaction_table statement.transaction_set.all n_max=8 transactions_url=t_url new_transaction_url=nt_url %} +

      + {{ "add-circle"|remix }}{% translate "Add transaction" %} + {{ "list-check"|remixnl }}{% translate "View all transactions" %} +

      + {% transaction_table statement.transaction_set.all n_max=8 transactions_url=t_url %}

      {% translate "Categories" %}

      diff --git a/nummi/transaction/templates/transaction/transaction_list.html b/nummi/transaction/templates/transaction/transaction_list.html index abd6ef5..0c2ca7f 100644 --- a/nummi/transaction/templates/transaction/transaction_list.html +++ b/nummi/transaction/templates/transaction/transaction_list.html @@ -1,5 +1,5 @@ {% extends "main/list.html" %} -{% load i18n transaction_extras %} +{% load i18n main_extras transaction_extras %} {% block name %} {% translate "Transactions" %} {% endblock name %} @@ -7,6 +7,8 @@ {% translate "Transactions" %} {% endblock h2 %} {% block table %} - {% url "new_transaction" as nt_url %} - {% transaction_table transactions new_transaction_url=nt_url %} +

      + {{ "add-circle"|remix }}{% translate "Add transaction" %} +

      + {% transaction_table transactions %} {% endblock table %} diff --git a/nummi/transaction/templates/transaction/transaction_table.html b/nummi/transaction/templates/transaction/transaction_table.html index 4879d3f..7dbe47c 100644 --- a/nummi/transaction/templates/transaction/transaction_table.html +++ b/nummi/transaction/templates/transaction/transaction_table.html @@ -13,13 +13,6 @@ {% if not hide_account %}{% endif %} - {% if new_transaction_url %} - - - {% translate "Create transaction" %} - - - {% endif %} {{ "attachment"|remix }} {% translate "Date" %} From 6a17a3e333c9e9c42c5164b4c752c1de011e045f Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 14:21:59 +0100 Subject: [PATCH 188/213] Add pre-commit hook to prevent commits to main --- .pre-commit-config.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b84af83..d6f30de 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,10 @@ repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: check-added-large-files + - id: no-commit-to-branch + args: ["--branch", "main"] - repo: https://github.com/PyCQA/isort rev: 5.12.0 hooks: From 7851e8afbbac7287c35eaecc02685c7c963b0adb Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 14:33:57 +0100 Subject: [PATCH 189/213] Improve form buttons styling Close #34 --- nummi/main/static/main/css/form.css | 36 ++++++++++++++-------------- nummi/main/static/main/css/main.css | 8 +++---- nummi/main/static/main/css/table.css | 5 ++-- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 73c9eb9..5685fa5 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -186,33 +186,33 @@ form { } .buttons { grid-column: 1 / -1; - display: grid; - grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); - grid-auto-rows: 1fr; - gap: 0.5rem; - align-items: center; - - input { + line-height: 2rem; + input, + a { font: inherit; - line-height: 1.5; - border-radius: var(--radius); - padding: 0 var(--gap); cursor: pointer; + padding: 0 var(--gap); + border: var(--gray) 1px solid; + margin-right: 0.5rem; + margin-bottom: 0.5rem; + color: inherit; &:hover { text-decoration: underline; } - &[type="submit"] { - border: 0.1rem solid var(--green); - background: var(--green-1); - } - &[type="reset"] { - border: 0.1rem solid var(--red); - background: var(--red-1); - } + } + + input[type="submit"] { + background: var(--green-1); + border-color: var(--green); + } + input[type="reset"] { + background: var(--bg-1); } a.del { color: var(--red); + border-color: var(--red); + border-style: dashed; } } } diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index 03b0bc2..b0ef3b0 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -24,7 +24,7 @@ --bg-inv: var(--theme-1); --text-inv: #ffffffde; - --bg-01: #f0f0f0; + --bg-1: #f0f0f0; --text-green: #296629; --text-link: var(--text-green); @@ -118,7 +118,7 @@ nav { top: 0; overflow-y: auto; - background: var(--bg-01); + background: var(--bg-1); line-height: 2rem; h1 img { @@ -240,7 +240,7 @@ footer { color: var(--bg); } &.white { - background: var(--bg-01); + background: var(--bg-1); } border-radius: var(--radius); height: 1.5em; @@ -283,7 +283,7 @@ ul.messages { list-style-type: none; margin: 0; margin-bottom: var(--gap); - background: var(--bg-01); + background: var(--bg-1); padding: 0; li { diff --git a/nummi/main/static/main/css/table.css b/nummi/main/static/main/css/table.css index 1021922..d43b15e 100644 --- a/nummi/main/static/main/css/table.css +++ b/nummi/main/static/main/css/table.css @@ -1,5 +1,4 @@ -.table, -form { +.table { overflow-x: auto; width: 100%; } @@ -17,7 +16,7 @@ table { width: 1ch; } thead tr:not(.new) { - background: var(--bg-01); + background: var(--bg-1); } tr { border: 1px solid var(--gray); From b848bf8d650d34c39001004b84d67b729194aa9e Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 18:28:37 +0100 Subject: [PATCH 190/213] Implement filters and sorting for transactions Close #5 --- nummi/main/static/main/css/form.css | 227 +++++++++--------- nummi/main/static/main/css/main.css | 19 ++ nummi/main/static/main/js/base.js | 11 + .../main/templates/main/pagination_links.html | 6 +- nummi/main/templatetags/main_extras.py | 12 +- nummi/transaction/forms.py | 53 ++++ .../transaction/transaction_filters.html | 19 ++ .../transaction/transaction_list.html | 5 + .../templatetags/transaction_extras.py | 12 +- nummi/transaction/views.py | 57 ++++- 10 files changed, 297 insertions(+), 124 deletions(-) create mode 100644 nummi/transaction/templates/transaction/transaction_filters.html diff --git a/nummi/main/static/main/css/form.css b/nummi/main/static/main/css/form.css index 5685fa5..f4fd25e 100644 --- a/nummi/main/static/main/css/form.css +++ b/nummi/main/static/main/css/form.css @@ -48,141 +48,140 @@ form { border: 1px solid var(--gray); padding: var(--gap); block-size: min-content; + } + .fieldset { + display: grid; + grid-auto-columns: 1fr; + grid-auto-flow: column; + gap: inherit; + padding: 0; + margin: 0; + border: none; + } - .fieldset { - display: grid; - grid-auto-columns: 1fr; - grid-auto-flow: column; - gap: inherit; - padding: 0; - margin: 0; - border: none; - } + ul.errorlist { + color: var(--red); + font-weight: 550; + list-style: none; + padding: 0; + margin: 0; + } + + .field { + display: grid; + grid-auto-rows: min-content; + align-items: center; + column-gap: 0.5rem; ul.errorlist { - color: var(--red); - font-weight: 550; - list-style: none; - padding: 0; - margin: 0; + font-size: 0.8rem; } - .field { - display: grid; - grid-auto-rows: min-content; - align-items: center; - column-gap: 0.5rem; - - ul.errorlist { - font-size: 0.8rem; - } - - &:has(> textarea) { - grid-template-rows: min-content 1fr; - textarea { - resize: block; - } - } - &:has(> input[type="checkbox"]) { - grid-template-columns: min-content 1fr; - > label { - font-size: inherit; - grid-row: 1; - grid-column: 2; - padding: 0.5rem; - line-height: initial; - } - > input { - grid-row: 1; - grid-column: 1; - margin: 0.5rem; - } - &:has(> :focus) { - background: var(--bg-01); - } - } - - > label { - font-size: 0.8rem; - line-height: 0.8rem; - z-index: 10; - } - - > a { - padding: 0.5rem; - } - - input, - select, + &:has(> textarea) { + grid-template-rows: min-content 1fr; textarea { - font: inherit; - line-height: initial; - border: none; - border: 1px solid transparent; - border-bottom: 1px solid var(--gray); - background: none; - z-index: 1; + resize: block; + } + } + &:has(> input[type="checkbox"]) { + grid-template-columns: min-content 1fr; + > label { + font-size: inherit; + grid-row: 1; + grid-column: 2; padding: 0.5rem; + line-height: initial; + } + > input { + grid-row: 1; + grid-column: 1; + margin: 0.5rem; + } + &:has(> :focus) { + background: var(--bg-1); + } + } - &:has(~ ul.errorlist) { - border-color: var(--red); - } - &.autocompleted:not(.mod) { - border-bottom-color: var(--green); - } + > label { + font-size: 0.8rem; + line-height: 0.8rem; + z-index: 10; + } - &:not([type="checkbox"]) { - width: 100%; - margin: 0; - } + > a { + padding: 0.5rem; + } - &[name*="value"] { - text-align: right; - font-feature-settings: var(--num); - } - &[name*="date"] { - font-feature-settings: var(--num); - } + input, + select, + textarea { + font: inherit; + line-height: initial; + border: none; + border: 1px solid transparent; + border-bottom: 1px solid var(--gray); + background: none; + z-index: 1; + padding: 0.5rem; - &:focus { - outline: none; - background: var(--bg-01); - } + &:has(~ ul.errorlist) { + border-color: var(--red); + } + &.autocompleted:not(.mod) { + border-bottom-color: var(--green); } - > .file-input { - display: grid; - - > .current { - display: grid; - grid-template-columns: 1fr; - grid-auto-columns: max-content; - grid-auto-flow: column; - a { - padding: 0.5rem; - } - } - - input[type="file"] { - &::file-selector-button { - display: none; - } - } + &:not([type="checkbox"]) { + width: 100%; + margin: 0; } - > .ico-input { + + &[name*="value"] { + text-align: right; + font-feature-settings: var(--num); + } + &[name*="date"] { + font-feature-settings: var(--num); + } + + &:focus { + outline: none; + background: var(--bg-1); + } + } + + > .file-input { + display: grid; + + > .current { display: grid; - grid-template-columns: min-content 1fr; - column-gap: 0.5rem; - align-items: center; - span[class|="ri"] { + grid-template-columns: 1fr; + grid-auto-columns: max-content; + grid-auto-flow: column; + a { padding: 0.5rem; } + } - &:has(> :focus) { - background: var(--bg-01); + input[type="file"] { + &::file-selector-button { + display: none; } } } + > .ico-input { + display: grid; + grid-template-columns: min-content 1fr; + column-gap: 0.5rem; + align-items: center; + span[class|="ri"] { + padding: 0.5rem; + } + + &:has(> :focus) { + background: var(--bg-1); + } + } } .buttons { grid-column: 1 / -1; diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index b0ef3b0..a3f9ed5 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -538,3 +538,22 @@ ul.statements { .value { font-feature-settings: var(--num); } + +details { + border: var(--gray) 1px solid; + margin-bottom: var(--gap); + + summary { + font-weight: 650; + cursor: pointer; + padding: var(--gap); + } + + &[open] summary { + background: var(--bg-1); + } + + form { + padding: var(--gap); + } +} diff --git a/nummi/main/static/main/js/base.js b/nummi/main/static/main/js/base.js index eaafec5..3cf2d92 100644 --- a/nummi/main/static/main/js/base.js +++ b/nummi/main/static/main/js/base.js @@ -135,3 +135,14 @@ if (accounts) { }); } } + +const filterForm = document.querySelector("form.filter"); +if (filterForm) { + filterForm.addEventListener("submit", (event) => { + for (element of filterForm.elements) { + if (element.value == "") { + element.disabled = true; + } + } + }); +} diff --git a/nummi/main/templates/main/pagination_links.html b/nummi/main/templates/main/pagination_links.html index fcd8531..e2a55b9 100644 --- a/nummi/main/templates/main/pagination_links.html +++ b/nummi/main/templates/main/pagination_links.html @@ -1,13 +1,13 @@ {% load i18n main_extras %} {% if first.show %} - 1 + 1 {% if first.dots %}{% endif %} {% endif %} {% for page in pages %} - {{ page.number }} {% endfor %} {% if last.show %} {% if last.dots %}{% endif %} - {{ last.number }} + {{ last.number }} {% endif %} diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index 9dd97e4..1b1e5dc 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -91,10 +91,11 @@ def balance(accounts): ) -@register.inclusion_tag("main/pagination_links.html") -def pagination_links(page_obj): +@register.inclusion_tag("main/pagination_links.html", takes_context=True) +def pagination_links(context, page_obj): _n = 3 return { + "request": context["request"], "pages": [ {"number": p, "current": p == page_obj.number} for p in page_obj.paginator.page_range @@ -110,3 +111,10 @@ def pagination_links(page_obj): "number": page_obj.paginator.num_pages, }, } + + +@register.simple_tag(takes_context=True) +def page_url(context, page): + query = context["request"].GET.copy() + query["page"] = page + return query.urlencode() diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index 807c00e..15d3dbd 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -3,6 +3,7 @@ import json from category.forms import CategorySelect from django import forms from django.forms import formset_factory +from django.utils.translation import gettext_lazy as _ from main.forms import DatalistInput, NummiFileInput, NummiForm from statement.forms import StatementSelect @@ -145,3 +146,55 @@ class MultipleInvoicesForm(forms.Form): InvoicesFormSet = formset_factory(MultipleInvoicesForm) + + +class DateInput(forms.DateInput): + input_type = "date" + + def __init__(self, attrs=None): + super().__init__(attrs) + self.format = "%Y-%m-%d" + + +class DateField(forms.DateField): + def __init__(self, *args, **kwargs): + kwargs.setdefault("widget", DateInput()) + super().__init__(*args, **kwargs) + + +class TransactionFiltersForm(forms.Form): + start_date = DateField(required=False) + end_date = DateField(required=False) + category = forms.ModelChoiceField( + queryset=None, required=False, widget=CategorySelect() + ) + account = forms.ModelChoiceField(queryset=None, required=False) + search = forms.CharField(label=_("Search"), required=False) + sort_by = forms.ChoiceField( + label=_("Sort by"), + choices=[ + ("", _("Default")), + ("date", _("Date +")), + ("-date", _("Date -")), + ("value", _("Value +")), + ("-value", _("Value -")), + ], + required=False, + ) + + def __init__(self, *args, **kwargs): + _user = kwargs.pop("user") + super().__init__(*args, **kwargs) + + self.fields["category"].queryset = _user.category_set + self.fields["account"].queryset = _user.account_set + + self.fields["category"].widget.attrs |= { + "class": "category", + "data-icons": json.dumps( + { + str(cat.id): cat.icon + for cat in self.fields["category"].queryset.only("id", "icon") + } + ), + } diff --git a/nummi/transaction/templates/transaction/transaction_filters.html b/nummi/transaction/templates/transaction/transaction_filters.html new file mode 100644 index 0000000..907a14f --- /dev/null +++ b/nummi/transaction/templates/transaction/transaction_filters.html @@ -0,0 +1,19 @@ +{% load i18n %} +
      + {% translate "Filters" %} +
      + {% for field in form %} +
      + + {{ field }} +
      + {% endfor %} +
      + + + {% if filters %} + {% translate "Clear" %} + {% endif %} +
      +
      +
      diff --git a/nummi/transaction/templates/transaction/transaction_list.html b/nummi/transaction/templates/transaction/transaction_list.html index 0c2ca7f..afd3b7c 100644 --- a/nummi/transaction/templates/transaction/transaction_list.html +++ b/nummi/transaction/templates/transaction/transaction_list.html @@ -3,6 +3,10 @@ {% block name %} {% translate "Transactions" %} {% endblock name %} +{% block link %} + {{ block.super }} + {% css "main/css/form.css" %} +{% endblock link %} {% block h2 %} {% translate "Transactions" %} {% endblock h2 %} @@ -10,5 +14,6 @@

      {{ "add-circle"|remix }}{% translate "Add transaction" %}

      + {% transaction_filters form=filter_form %} {% transaction_table transactions %} {% endblock table %} diff --git a/nummi/transaction/templatetags/transaction_extras.py b/nummi/transaction/templatetags/transaction_extras.py index e2311a0..e905a02 100644 --- a/nummi/transaction/templatetags/transaction_extras.py +++ b/nummi/transaction/templatetags/transaction_extras.py @@ -17,10 +17,8 @@ def transaction_table(context, transactions, n_max=None, **kwargs): del kwargs["transactions_url"] transactions = transactions[:n_max] - if "account" in context or "statement" in context: - kwargs.setdefault("hide_account", True) - if "category" in context: - kwargs.setdefault("hide_category", True) + kwargs.setdefault("hide_account", "account" in context or "statement" in context) + kwargs.setdefault("hide_category", "category" in context) ncol = 8 if kwargs.get("hide_account"): @@ -31,6 +29,12 @@ def transaction_table(context, transactions, n_max=None, **kwargs): return kwargs | {"transactions": transactions, "ncol": ncol} +@register.inclusion_tag("transaction/transaction_filters.html", takes_context=True) +def transaction_filters(context, **kwargs): + kwargs.setdefault("filters", context.get("filters")) + return kwargs + + @register.inclusion_tag("transaction/invoice_table.html") def invoice_table(transaction, **kwargs): return kwargs | { diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index ebf2238..41fd184 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -1,6 +1,13 @@ from account.models import Account from category.models import Category from django.contrib import messages +from django.contrib.postgres.search import ( + SearchQuery, + SearchRank, + SearchVector, + TrigramSimilarity, +) +from django.db import models from django.forms import ValidationError from django.shortcuts import get_object_or_404 from django.urls import reverse_lazy @@ -18,7 +25,12 @@ from main.views import ( UserMixin, ) -from .forms import InvoiceForm, MultipleInvoicesForm, TransactionForm +from .forms import ( + InvoiceForm, + MultipleInvoicesForm, + TransactionFiltersForm, + TransactionForm, +) from .models import Invoice, Transaction @@ -167,6 +179,49 @@ class TransactionListView(NummiListView): context_object_name = "transactions" paginate_by = 50 + def get_queryset(self, **kwargs): + queryset = super().get_queryset(**kwargs) + + if date := self.request.GET.get("start_date"): + queryset = queryset.filter(date__gte=date) + if date := self.request.GET.get("end_date"): + queryset = queryset.filter(date__lte=date) + if category := self.request.GET.get("category"): + queryset = queryset.filter(category=category) + if account := self.request.GET.get("account"): + queryset = queryset.filter(statement__account=account) + if search := self.request.GET.get("search"): + queryset = ( + queryset.annotate( + rank=SearchRank( + SearchVector("name", weight="A") + + SearchVector("description", weight="B") + + SearchVector("trader", weight="B") + + SearchVector("category__name", weight="C"), + SearchQuery(search, search_type="websearch"), + ), + similarity=TrigramSimilarity("name", search), + ) + .filter(models.Q(rank__gte=0.1) | models.Q(similarity__gte=0.3)) + .order_by("-rank", "-date") + ) + if sort_by := self.request.GET.get("sort_by"): + queryset = queryset.order_by(sort_by) + + return queryset + + def get_context_data(self, **kwargs): + data = super().get_context_data(**kwargs) + + filters = self.request.GET.copy() + filters.pop("page", None) + if filters: + data["filters"] = True + data["filter_form"] = TransactionFiltersForm( + initial=filters, user=self.request.user + ) + return data + class TransactionACMixin: model = Transaction From ccbf433ec0705b33f128c285e45dfd82530ee41b Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 18:33:04 +0100 Subject: [PATCH 191/213] Add filter icon --- nummi/main/static/main/css/main.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/nummi/main/static/main/css/main.css b/nummi/main/static/main/css/main.css index a3f9ed5..43baf37 100644 --- a/nummi/main/static/main/css/main.css +++ b/nummi/main/static/main/css/main.css @@ -547,6 +547,12 @@ details { font-weight: 650; cursor: pointer; padding: var(--gap); + + &::marker { + content: "\ed27\2002"; + font-family: remixicon; + font-weight: initial; + } } &[open] summary { From a238401f13451f5285da56c82a93b41427bf5fde Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 18:45:36 +0100 Subject: [PATCH 192/213] Add AccountSelect widget and update account field in forms - Introduced AccountSelect widget for improved account selection in forms. - Updated AccountForm, StatementForm, and TransactionFiltersForm to use AccountSelect. - Modified account model options to include 'archived' in ordering. - Added new migration for account model options change. --- nummi/account/forms.py | 5 +++++ .../migrations/0004_alter_account_options.py | 20 +++++++++++++++++++ nummi/account/models.py | 2 +- .../account/forms/widgets/account.html | 5 +++++ nummi/main/static/main/js/base.js | 15 ++++++++++++++ nummi/statement/forms.py | 14 +++++++++++++ nummi/transaction/forms.py | 14 ++++++++++++- 7 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 nummi/account/migrations/0004_alter_account_options.py create mode 100644 nummi/account/templates/account/forms/widgets/account.html diff --git a/nummi/account/forms.py b/nummi/account/forms.py index cde1416..8dc869a 100644 --- a/nummi/account/forms.py +++ b/nummi/account/forms.py @@ -1,3 +1,4 @@ +from django.forms.widgets import Select from main.forms import IconInput, NummiForm from .models import Account @@ -15,3 +16,7 @@ class AccountForm(NummiForm): widgets = { "icon": IconInput(), } + + +class AccountSelect(Select): + template_name = "account/forms/widgets/account.html" diff --git a/nummi/account/migrations/0004_alter_account_options.py b/nummi/account/migrations/0004_alter_account_options.py new file mode 100644 index 0000000..7c4fd2d --- /dev/null +++ b/nummi/account/migrations/0004_alter_account_options.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.7 on 2025-01-04 17:44 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("account", "0003_account_archived"), + ] + + operations = [ + migrations.AlterModelOptions( + name="account", + options={ + "ordering": ["-default", "archived", "name"], + "verbose_name": "Account", + "verbose_name_plural": "Accounts", + }, + ), + ] diff --git a/nummi/account/models.py b/nummi/account/models.py index 16aca17..07ee795 100644 --- a/nummi/account/models.py +++ b/nummi/account/models.py @@ -41,7 +41,7 @@ class Account(UserModel): ) class Meta: - ordering = ["-default", "name"] + ordering = ["-default", "archived", "name"] verbose_name = _("Account") verbose_name_plural = _("Accounts") diff --git a/nummi/account/templates/account/forms/widgets/account.html b/nummi/account/templates/account/forms/widgets/account.html new file mode 100644 index 0000000..0641a32 --- /dev/null +++ b/nummi/account/templates/account/forms/widgets/account.html @@ -0,0 +1,5 @@ +{% load main_extras %} + diff --git a/nummi/main/static/main/js/base.js b/nummi/main/static/main/js/base.js index 3cf2d92..2b41ee2 100644 --- a/nummi/main/static/main/js/base.js +++ b/nummi/main/static/main/js/base.js @@ -34,6 +34,21 @@ for (let form of forms) { setTimeout(setIcon, 0); }); } + let accountSelect = form.querySelector(".account-select"); + if (accountSelect) { + let input = accountSelect.querySelector("select"); + let icon = accountSelect.querySelector("span"); + let icons = JSON.parse(input.dataset.icons); + + function setIcon(event) { + icon.className = `ri-${icons[input.value] || "bank"}-line`; + } + setIcon(); + input.addEventListener("input", setIcon); + form.addEventListener("reset", (event) => { + setTimeout(setIcon, 0); + }); + } let iconSelect = form.querySelector(".icon-select"); if (iconSelect) { diff --git a/nummi/statement/forms.py b/nummi/statement/forms.py index 353ebe7..e2b9f46 100644 --- a/nummi/statement/forms.py +++ b/nummi/statement/forms.py @@ -1,3 +1,6 @@ +import json + +from account.forms import AccountSelect from django import forms from django.forms.widgets import Select from django.utils.translation import gettext_lazy as _ @@ -13,6 +16,7 @@ class StatementForm(NummiForm): fields = ["account", "start_date", "date", "start_value", "value", "file"] widgets = { "file": NummiFileInput, + "account": AccountSelect, } meta_fieldsets = [ @@ -40,6 +44,16 @@ class StatementForm(NummiForm): required=False, ) + self.fields["account"].widget.attrs |= { + "class": "account", + "data-icons": json.dumps( + { + str(acc.id): acc.icon + for acc in self.fields["account"].queryset.only("id", "icon") + } + ), + } + if _disable_account: self.fields["account"].disabled = True diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index 15d3dbd..16110a0 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -1,5 +1,6 @@ import json +from account.forms import AccountSelect from category.forms import CategorySelect from django import forms from django.forms import formset_factory @@ -168,7 +169,9 @@ class TransactionFiltersForm(forms.Form): category = forms.ModelChoiceField( queryset=None, required=False, widget=CategorySelect() ) - account = forms.ModelChoiceField(queryset=None, required=False) + account = forms.ModelChoiceField( + queryset=None, required=False, widget=AccountSelect() + ) search = forms.CharField(label=_("Search"), required=False) sort_by = forms.ChoiceField( label=_("Sort by"), @@ -198,3 +201,12 @@ class TransactionFiltersForm(forms.Form): } ), } + self.fields["account"].widget.attrs |= { + "class": "account", + "data-icons": json.dumps( + { + str(acc.id): acc.icon + for acc in self.fields["account"].queryset.only("id", "icon") + } + ), + } From e42410863d201871be4f890913ac954c00c8a518 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 18:57:13 +0100 Subject: [PATCH 193/213] Update French translations --- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 810 -> 905 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 39 +++-- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 968 -> 1080 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 24 ++- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 490 -> 534 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 20 ++- nummi/main/locale/fr_FR/LC_MESSAGES/django.mo | Bin 1687 -> 1484 bytes nummi/main/locale/fr_FR/LC_MESSAGES/django.po | 101 ++++++------ .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 1305 -> 1401 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 93 ++++++----- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 1577 -> 2196 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 146 ++++++++++++------ 12 files changed, 254 insertions(+), 169 deletions(-) diff --git a/nummi/account/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/account/locale/fr_FR/LC_MESSAGES/django.mo index d0a97cf8b790f1183168d8f4c957f9c7d6f0f41f..52b402c1ae272c1bd4e329b0227fb4dc104ce126 100644 GIT binary patch delta 479 zcmXw#Jxjw-6ozkNZT&`C5QGfboE#OLB)HVk)~SOK;;ktpO-a%^)=d<**3HF5sH6S? zv7`UNKj9`0J}0?7gT{snGwT)nYaBk=+E&=;!Wf9$g0FWko4OXUC!DBgk6 za39v;0hBsTDEHftM|F6~fEQ5C#ZW%v23qu2%NPks%48DsEJ7xiViMAfiHoB02Ud|3 zmZn8`L68jlxiZX@7e%gLCNXIc_D1?rout~&wb_^)TZcPga_#zy?RL&?to!-(>m oo+rc1jdbP)Nj%8)qRxCa`LtV(*X{O#P^aele3q$}j`TiKh*%28abQ62Ah)IpTrH#%e}uN$rL?k7 zDftWOt$gO(6d8E;*>`qlc6RQqi|J1-zZ9Z^n&<=FpaaslGa??mhb8z3tMJL?yHIO; z&JST8KXMG<6@Cmap@n)sg%3tj`D9ZhvAsAy^aZc+JLkV)4S#^z;1}xsBg{d=q5~D6 z4p@i!Knv133$|IU<|)fUhb&3kIZ#Fgq|J3=4gI-vgCL$o_K(RTHqQ;~+i)62Hj%-b dA0>WZU*l-AHyyKR=3Z|5;Us+Dt^S=Rasr#HEQA06 diff --git a/nummi/account/locale/fr_FR/LC_MESSAGES/django.po b/nummi/account/locale/fr_FR/LC_MESSAGES/django.po index 14f7e1a..30ea931 100644 --- a/nummi/account/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/account/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-04 16:18+0100\n" +"POT-Creation-Date: 2025-01-04 18:51+0100\n" "PO-Revision-Date: 2023-04-22 15:17+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -17,46 +17,59 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.2.2\n" -#: .\account\models.py:11 .\account\models.py:37 .\account\models.py:45 +#: .\account\models.py:12 .\account\models.py:45 .\account\models.py:53 +#: .\account\templates\account\account_list.html:9 msgid "Account" msgstr "Compte" -#: .\account\models.py:11 +#: .\account\models.py:12 msgid "Name" msgstr "Nom" -#: .\account\models.py:15 +#: .\account\models.py:16 msgid "Icon" msgstr "Icône" -#: .\account\models.py:17 +#: .\account\models.py:18 msgid "Default" msgstr "Défaut" -#: .\account\models.py:38 +#: .\account\models.py:19 +msgid "Archived" +msgstr "Archivé" + +#: .\account\models.py:46 .\account\templates\account\account_list.html:12 msgid "Accounts" msgstr "Comptes" -#: .\account\templates\account\account_detail.html:13 +#: .\account\templates\account\account_detail.html:15 msgid "Edit account" msgstr "Modifier le compte" -#: .\account\templates\account\account_detail.html:16 +#: .\account\templates\account\account_detail.html:18 msgid "Statements" msgstr "Relevés" -#: .\account\templates\account\account_detail.html:20 -msgid "Transactions" -msgstr "Transactions" - -#: .\account\templates\account\account_detail.html:25 +#: .\account\templates\account\account_detail.html:24 msgid "History" msgstr "Historique" #: .\account\templates\account\account_form.html:5 +#: .\account\templates\account\account_table.html:35 msgid "Create account" msgstr "Créer un compte" #: .\account\templates\account\account_form.html:8 msgid "New account" msgstr "Nouveau compte" + +#: .\account\templates\account\account_table.html:16 +msgid "All accounts" +msgstr "Tous les comptes" + +#: .\account\templates\account\account_table.html:26 +msgid "Show archived" +msgstr "Afficher archivés" + +#~ msgid "Transactions" +#~ msgstr "Transactions" diff --git a/nummi/category/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/category/locale/fr_FR/LC_MESSAGES/django.mo index 53d58b5e6341c6055989605e6b469824c309374e..3beb30965957e002abe1d70e0a3327a808f11a53 100644 GIT binary patch delta 480 zcmXxgF-yZx5Ww+^X>E)))k<|xA-K5s0bKnGBApHCLjoaz<`p-y>Lx@dC!w384!Y{% zBsjPT3c7T25qJL=>cRDw^u2fQa!;*0ul(pXE`(Sj*U2%tN^U#+5GOc`r|9DudU%N) z9Ag`AF~EoE`U|#rf5QfTq1Ks9-@kD|q?8{X^q|a$G@*kmNDq6siCgU1K`n6Lip=97 zYC{F;zGGa$bJT{eaSrcM_dTMXe@1QW6&W=tT{#i delta 405 zcmYk&u};EJ6vpvWN(B`m!6<`FEQG}wR+$OUAh9A7jm4=$6T{@-(mJxRG7=MvgA0Qz zgR5ck1$Y7fA8CvyJ@!EStr)VdC*(n|=7fCb=V3c;T8IV*}N|C7xji&#{k( zc$<9>P<0Wikw@gQCx%me#wyOyV}E;PqK@8?J^w<*I)OqP=%+fdn#hr=`5%<;Z$`~3 qINknWn(Kz_>fvVSPpo@A@rUF4ksmTmW=<>la(c^lE_9MNckm0N$t4~D diff --git a/nummi/category/locale/fr_FR/LC_MESSAGES/django.po b/nummi/category/locale/fr_FR/LC_MESSAGES/django.po index d66c030..8e0da23 100644 --- a/nummi/category/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/category/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-04 16:18+0100\n" +"POT-Creation-Date: 2025-01-04 18:51+0100\n" "PO-Revision-Date: 2023-04-22 15:18+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -18,7 +18,7 @@ msgstr "" "X-Generator: Poedit 3.2.2\n" #: .\category\models.py:12 .\category\models.py:32 -#: .\category\templates\category\category_plot.html:14 +#: .\category\templates\category\category_plot.html:13 msgid "Category" msgstr "Catégorie" @@ -38,15 +38,19 @@ msgstr "Budget" msgid "Categories" msgstr "Catégories" -#: .\category\templates\category\category_detail.html:12 +#: .\category\templates\category\category_detail.html:14 msgid "Edit category" msgstr "Modifier la catégorie" -#: .\category\templates\category\category_detail.html:15 +#: .\category\templates\category\category_detail.html:17 msgid "Transactions" msgstr "Transactions" #: .\category\templates\category\category_detail.html:20 +msgid "View all transactions" +msgstr "Voir toutes les transactions" + +#: .\category\templates\category\category_detail.html:25 msgid "History" msgstr "Historique" @@ -58,18 +62,22 @@ msgstr "Créer une catégorie" msgid "New category" msgstr "Nouvelle catégorie" -#: .\category\templates\category\category_plot.html:15 +#: .\category\templates\category\category_plot.html:14 msgid "Expenses" msgstr "Dépenses" -#: .\category\templates\category\category_plot.html:16 +#: .\category\templates\category\category_plot.html:15 msgid "Income" msgstr "Revenus" -#: .\category\templates\category\category_plot.html:62 +#: .\category\templates\category\category_plot.html:58 msgid "No transaction" msgstr "Aucune transaction" -#: .\category\templates\category\category_plot.html:70 +#: .\category\templates\category\category_plot.html:66 msgid "Total" msgstr "Total" + +#: .\category\templates\category\category_plot.html:89 +msgid "Expected total" +msgstr "Total attendu" diff --git a/nummi/history/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/history/locale/fr_FR/LC_MESSAGES/django.mo index cdfe26fffdcf15c1ca75914eaed79c8fc4615fe2..4c77aead32e5fea8924d904e3b8926f1bc4f81b4 100644 GIT binary patch delta 194 zcmaFGJdLIPo)F7a1|VPqVi_Rz0b*_-t^r~YSOLTwK)e!&L25PuF)I-7gwp$gGz$

      $+Iv)^l<`dkU9K78Yra%WI_PQP>=)&fHW|JSquzJ d6C34NL-I=!b2iR%W#k337##ER4zEmQ003vA76)k1``OeOk60p@u&+UyJKG7;gzWj E0JmEaxBvhE diff --git a/nummi/history/locale/fr_FR/LC_MESSAGES/django.po b/nummi/history/locale/fr_FR/LC_MESSAGES/django.po index c0e51e2..ea07229 100644 --- a/nummi/history/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/history/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-03 15:51+0100\n" +"POT-Creation-Date: 2025-01-04 18:51+0100\n" "PO-Revision-Date: 2023-04-22 15:18+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -17,18 +17,22 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.2.2\n" -#: .\history\templates\history\plot.html:17 +#: .\history\templates\history\plot.html:10 +msgid "Year" +msgstr "Année" + +#: .\history\templates\history\plot.html:13 +msgid "Total" +msgstr "Total" + +#: .\history\templates\history\plot.html:56 msgid "Month" msgstr "Mois" -#: .\history\templates\history\plot.html:18 +#: .\history\templates\history\plot.html:57 msgid "Expenses" msgstr "Dépenses" -#: .\history\templates\history\plot.html:19 +#: .\history\templates\history\plot.html:58 msgid "Income" msgstr "Revenus" - -#: .\history\templates\history\plot.html:55 -msgid "Year" -msgstr "Année" diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/main/locale/fr_FR/LC_MESSAGES/django.mo index 258a1ed85a97ab8bc46848e7e6b7e75135ee0dd7..78a2ba7ff6196d0d429a791a51e55bb200368672 100644 GIT binary patch delta 582 zcmXxhy)Q#i7{~F`+um}uRoc?VOKe#17g(ec28l&149HCzkqA04-82@7m*u2sVj>J| z5@wskU@(Y9Vvrck*nEGt*ONT`+^6T9`N8B?6?!Hx=8gw7xW^uR2nT40TJVW#_!ZSZ zsK(l*PMX099K=qXLp4}Jt*c@m?x1e+1hu}2Df*jB9{TYHb?bTZKlB0)5{6E%2%Dpt zup|sFBMfaoo63=D)=lcu>L3dCZhA?N>>|@TxlWxS?XELpADz+c+Dgr@Y;NzFvcKWi ee4CHY-d5s=G5edCwq!R delta 751 zcmYk)JxCj29LMn|=Os~-G}hXhXoqA_aS(^%sE}X=A+>`YDs+jLv;;L5B^k6sii?Yg zaFkLP2f@X$;8;3jD728hl@8eoZZ1L{{Qlxo=pX*~x##`m?nmrnqV;>&{a}cvHg9o) zybSRm>W(o{+`@j`!Fk-X^(VW(2iR z+Lp7Zi6?FS3{Fy>LoM_g!}u1N$ZVqeZ{rB=p!ywR96zD@onZ>kaVpd@rp=26UeT%z zTw@;pq83=-q54IPVG#%L6>8iX4q+7^KyRI&UT6hXI!807g1=IqosQzoHem;)lJJeUym`9{S^YI0G?JBqEV@630ROpH{ zxk9Jma(buJiFIvh@(HO8{~y|ju3aZpXhWQ%_g@WTf_zB!BIkL2v(_**g)<#3-8ThwC*>B()kd)IEDbLE8C(Ck;~a#7mu@k<;%}5I!HGK?&3OK1y-^9; aZZ`7VFIV4GgRZ+C&o#Yf?O$6l{QeGEWKeDZ diff --git a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po index 4ff140a..e97a01e 100644 --- a/nummi/main/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/main/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-04 16:18+0100\n" +"POT-Creation-Date: 2025-01-04 18:51+0100\n" "PO-Revision-Date: 2023-04-23 08:03+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -25,110 +25,105 @@ msgstr "Utilisateur" msgid "Skip to main content" msgstr "Aller au contenu principal" -#: .\main\templates\main\base.html:34 +#: .\main\templates\main\base.html:35 msgid "Home" msgstr "Accueil" -#: .\main\templates\main\base.html:39 +#: .\main\templates\main\base.html:42 .\main\templates\main\index.html:17 msgid "Statements" msgstr "Relevés" -#: .\main\templates\main\base.html:45 +#: .\main\templates\main\base.html:49 msgid "Transactions" msgstr "Transactions" -#: .\main\templates\main\base.html:51 .\main\templates\main\list.html:10 -#: .\main\templates\main\list.html:34 +#: .\main\templates\main\base.html:57 .\main\templates\main\list.html:10 +#: .\main\templates\main\list.html:37 msgid "Search" msgstr "Rechercher" -#: .\main\templates\main\base.html:54 -msgid "Log out" -msgstr "Se déconnecter" - -#: .\main\templates\main\base.html:59 .\main\templates\main\form\login.html:6 -#: .\main\templates\main\login.html:11 -msgid "Log in" -msgstr "Se connecter" - -#: .\main\templates\main\base.html:65 +#: .\main\templates\main\base.html:62 #, python-format msgid "Logged in as %(user)s" msgstr "Connecté en tant que %(user)s" +#: .\main\templates\main\base.html:66 +msgid "Log out" +msgstr "Se déconnecter" + +#: .\main\templates\main\base.html:74 .\main\templates\main\form\login.html:5 +#: .\main\templates\main\login.html:11 +msgid "Log in" +msgstr "Se connecter" + #: .\main\templates\main\confirm_delete.html:15 #, python-format msgid "Are you sure you want do delete %(object)s ?" msgstr "Êtes-vous sûr de vouloir supprimer %(object)s ?" -#: .\main\templates\main\confirm_delete.html:19 +#: .\main\templates\main\confirm_delete.html:20 msgid "Cancel" msgstr "Annuler" -#: .\main\templates\main\confirm_delete.html:20 +#: .\main\templates\main\confirm_delete.html:21 msgid "Confirm" msgstr "Confirmer" -#: .\main\templates\main\form\fileinput.html:8 +#: .\main\templates\main\form\fileinput.html:6 msgid "File" msgstr "Fichier" -#: .\main\templates\main\form\form_base.html:30 -msgid "Delete" -msgstr "Supprimer" - -#: .\main\templates\main\form\form_base.html:32 -msgid "Reset" -msgstr "Réinitialiser" - -#: .\main\templates\main\form\form_base.html:34 +#: .\main\templates\main\form\form_base.html:46 msgid "Create" msgstr "Créer" -#: .\main\templates\main\form\form_base.html:36 +#: .\main\templates\main\form\form_base.html:48 msgid "Save" msgstr "Enregistrer" +#: .\main\templates\main\form\form_base.html:50 +msgid "Reset" +msgstr "Réinitialiser" + +#: .\main\templates\main\form\form_base.html:52 +msgid "Delete" +msgstr "Supprimer" + #: .\main\templates\main\index.html:13 msgid "Accounts" msgstr "Comptes" -#: .\main\templates\main\index.html:17 -msgid "Account" -msgstr "Compte" - -#: .\main\templates\main\index.html:18 -msgid "Balance" -msgstr "Solde" - -#: .\main\templates\main\index.html:19 .\main\templates\main\index.html:31 -msgid "Edit" -msgstr "Modifier" - -#: .\main\templates\main\index.html:36 -msgid "No account" -msgstr "Aucun compte" - -#: .\main\templates\main\index.html:43 -msgid "Create account" -msgstr "Créer un compte" - -#: .\main\templates\main\index.html:50 +#: .\main\templates\main\index.html:23 msgid "Categories" msgstr "Catégories" -#: .\main\templates\main\index.html:56 +#: .\main\templates\main\index.html:29 msgid "Create category" msgstr "Créer une catégorie" -#: .\main\templates\main\index.html:63 +#: .\main\templates\main\index.html:34 msgid "History" msgstr "Historique" -#: .\main\views.py:69 +#: .\main\views.py:54 msgid "was created successfully" msgstr "a été créé avec succès" +#~ msgid "Account" +#~ msgstr "Compte" + +#~ msgid "Balance" +#~ msgstr "Solde" + +#~ msgid "Edit" +#~ msgstr "Modifier" + +#~ msgid "No account" +#~ msgstr "Aucun compte" + +#~ msgid "Create account" +#~ msgstr "Créer un compte" + #~ msgid "Create statement" #~ msgstr "Créer un relevé" diff --git a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.mo index d4b610942111d253874c027edf8d6c8edff418c8..860f60ee66ba1c98b795a814d88d00adf088d797 100644 GIT binary patch literal 1401 zcmZ{iJ#W)M7{?E2c`@&W0umtI!kduO)NQ3IKt)>8Qi+r(gsKuq;M!;RTGx*5&M8Q& zh)=-42Vls|NViOg1y&@Om>7YLh5zF?X;j2X&hPHY^YVY5yKf^yuNl^9d>8O-WqNLDlP6-?aGE{tN29L4NsS2xL({iI!uz48?wj{O&ydD@= znXX@V+x5gg*VW%?)>xC8Z^RP}_|J=GuL`E?SbD>^sn1;!e?-u#1zn zn-O&(+4x^hB;nREbyo&{e!v;IpaPSffGQga|*)Zs4|{f16S$B?^I> zL3kXdZYb=Aa5qu5cP{ZjJ(;gt)x~OMN9=f^Xw4>kV=;I=eY-F8pj{)0Nm50RtJChku1-5k!Bw{ct3pwLY4Aw&Z8U8>1|GYJ>Q}fo~%$Ab0CEWC%2*1-_O-(OI#?nX%%iHM@uUvQ%ub1nz*;H~9LNjL6MSRjAPM7m%H_4!}-?Q-E%;c zsi_bWEu|~?02ByQ(9%#M_ySaPAjE&p=ZBJ!*T0>)*?H}LA0K_qAm_0zVSUEBj1?Wg zALIu(4*mp>fWN`h;9oEYj*WEn32+qpBuMr=coe)19s}pI?KY>?K%ePGbcaX8eu#cmd3GgCFab55XI1A#(%9(vV zqX$x54UqbL0iFVPGy5y>B=onL{XIy2A3^H#3rO?(3R0cFK&s;pNcE4PXq1`Gnf$4C z5{f}Wxk%ui&I9eFbyH20mu5mjcR_+S`$BoBH@X*^4do{}M}JqY1)dd?h8qhuL~Pld z@2i9u1l(#bHlA;#iVa(UN2s(E*lGb~=+GimwkYd$p+)QqR*C~ok<(4fixR<>WF**{ z*cm#triPTq*3-6osJrbR!#*plzcZ{lsEY@KtV3qQYH8M*L`E-)28j$SYqc$W>nsOO zO=yGWiab{lO{J}~YC;(}^GRr&s)D)v(5Z-)BqxWOEONKtPCJF0j_dNNTSeEsUT_PA z+=^$clje^+t8|f0osXlL_C@Y@X8_md*@g43Xn-TWjdUeT}8Tir2 za6L{b_EjL`u*hdNrOiEY9*9`zZqa2W0%`el-p#u?RuPeCb=o{gc<-IC1=VQcTIaS^ zVuj{`F#8@!r`>-goi==unCosN)_*3QcK4l-0YP|O#&lsK(X_<|&&A)ueAt>wTEa{E zA?6Z)Pe3{!blRJV?S+uBw332k9rS3@Cz|EnU;EzYgKAh!NzJWF43E%i)`wyL0hAy? A82|tP diff --git a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po index f969e8b..6068d95 100644 --- a/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/statement/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-03 15:51+0100\n" +"POT-Creation-Date: 2025-01-04 18:51+0100\n" "PO-Revision-Date: 2023-04-22 15:22+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.2.2\n" -#: .\statement\forms.py:28 +#: .\statement\forms.py:43 msgid "Add transactions" msgstr "Ajouter des transactions" @@ -37,36 +37,53 @@ msgstr "Valeur finale" msgid "Start value" msgstr "Valeur initiale" -#: .\statement\models.py:29 -#: .\statement\templates\statement\statement_table.html:30 -msgid "Difference" -msgstr "Différence" - -#: .\statement\models.py:36 -msgid "Transaction difference" -msgstr "Différence des transactions" - -#: .\statement\models.py:42 +#: .\statement\models.py:28 msgid "File" msgstr "Fichier" -#: .\statement\models.py:49 +#: .\statement\models.py:35 #, python-format msgid "%(date)s statement" msgstr "Relevé du %(date)s" -#: .\statement\models.py:89 +#: .\statement\models.py:68 msgid "Statement" msgstr "Relevé" -#: .\statement\models.py:90 +#: .\statement\models.py:69 #: .\statement\templates\statement\statement_list.html:4 #: .\statement\templates\statement\statement_list.html:7 msgid "Statements" msgstr "Relevés" +#: .\statement\templates\statement\confirm_delete.html:5 +msgid "This will delete all transactions in this statement." +msgstr "Ceci va supprimer toutes les transactions de ce relevé." + +#: .\statement\templates\statement\statement_detail.html:19 +#: .\statement\templates\statement\statement_detail.html:30 +msgid "Edit statement" +msgstr "Modifier le relevé" + +#: .\statement\templates\statement\statement_detail.html:31 +#: .\statement\templates\statement\statement_detail.html:61 +msgid "Add transaction" +msgstr "Ajouter une transaction" + +#: .\statement\templates\statement\statement_detail.html:57 +msgid "Transactions" +msgstr "Transactions" + +#: .\statement\templates\statement\statement_detail.html:62 +msgid "View all transactions" +msgstr "Afficher toutes les transactions" + +#: .\statement\templates\statement\statement_detail.html:67 +msgid "Categories" +msgstr "Catégories" + #: .\statement\templates\statement\statement_form.html:4 -#: .\statement\templates\statement\statement_table.html:18 +#: .\statement\templates\statement\statement_table.html:7 msgid "Create statement" msgstr "Créer un relevé" @@ -74,34 +91,28 @@ msgstr "Créer un relevé" msgid "New statement" msgstr "Nouveau relevé" -#: .\statement\templates\statement\statement_form.html:23 -msgid "Categories" -msgstr "Catégories" +#: .\statement\templates\statement\statement_form.html:12 +msgid "Back" +msgstr "Retour" -#: .\statement\templates\statement\statement_form.html:27 -#: .\statement\templates\statement\statement_table.html:31 -msgid "Transactions" -msgstr "Transactions" - -#: .\statement\templates\statement\statement_table.html:25 -msgid "Date" -msgstr "Date" - -#: .\statement\templates\statement\statement_table.html:27 -msgid "Account" -msgstr "Compte" - -#: .\statement\templates\statement\statement_table.html:29 -msgid "Value" -msgstr "Valeur" - -#: .\statement\templates\statement\statement_table.html:62 -msgid "No statement" -msgstr "Aucun relevé" - -#: .\statement\templates\statement\statement_table.html:70 +#: .\statement\templates\statement\statement_table.html:28 msgid "View all statements" msgstr "Voir tous les relevés" +#~ msgid "Difference" +#~ msgstr "Différence" + +#~ msgid "Transaction difference" +#~ msgstr "Différence des transactions" + +#~ msgid "Date" +#~ msgstr "Date" + +#~ msgid "Account" +#~ msgstr "Compte" + +#~ msgid "Value" +#~ msgstr "Valeur" + #~ msgid "No transaction" #~ msgstr "Aucune transaction" diff --git a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.mo b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.mo index cf6c6811b2a425ceddb1e39654b793780693ed22..1a322027d0cdc9900c9d58538267e3772346df61 100644 GIT binary patch literal 2196 zcmZvcO>7%Q7={OE3pkWQfI^{^X$u4zt?M{|QkNnU$AKUcjAJ6CN}%a_>`c4fb!TVO z1_^OMa6p1vxq-MKo)LVyGa`Gf@Og(LKU5H|#;asi3=U9X)DV&re0`PupA`x{@G z+;vHyO+yYs+%-a+1i!x)9opyD32{C61vmkI3+@Ad0C#~ug9Y#x@CNXAa5s1ryczr( zoCGKEF~2{AZVz}g<1vu>XF%#d0pcfW=xza@0q+1$gVcW>#813}j(T1LdH&6e?_}%m zX7l$zp8F8QPkfAy_k0S{k8eQQc^RahE8vabZy^2n6XZQtv;BXv{oUB)`aY2Q_JcQp zM?n0`yEJqKZ1eQ96XTsJOl ze*z-K;!BYE`Wn0)ybRLLUqPPx3uJsaVZ8T()O!%*{Zk-55i=m|J&~~n^4#+v{d)<- zPw0#x$hy4%BCKh92>k&F<3n56Xd@f%VrfeV^|9RtVGP;sf!v#phTS3HF35wBW5Xr! za7J92<`k(EM<9$R8{@#*VmmxU>MQe1Ul^CY5ZZk=DXBn#>#gl3dMr*&xxvXx)WKWO%@B*HP3$7OC6+@!>S|!fpR#ziP4Xpy%qB9L0 zYbVy=zP};XBJ1RtEwSdXm44W?ss($1aS(IkSgflc(Ze1gNoUd%>jq}1Ajsbxi@J@@ zYTtRwEpJ`h7zwG!LPPg(skah$Ov_tHIW( zT%|NST`HGKg=balywsvVAyO4tYju>B^`cxz?70mEe;#-6AxR71NzL7!(bno>+dhHg zVJA@??KQRP;@Z)?BHQ-mrAA?8d8M{(>`bv#s79ef1ij`~4@NnC(H-vv%7iDSkJ}K- zQ!g}^yt(b~7`e8#UJWU1A?p=6cgDEFi{4W@)OKieJ<=?e*?IAPsXQKqQ zAd^tbHVQbgJJ;aWI42G5q67u3+@QZ*+u2yu+BlCaR_&nwABDN4yuSad^FbelzO&9( z;87dV6r+I*R6gedC9e}JgUH6Rm2k@p3yZV1@i%yQanK(>f#C{YfyK^{qi0~wqtqJO z*Us^|WFg6jw-9w9$)*m1?SPFJ^4`rSK7*QHsw*=r`1ElzPS7G6gT4ukGb%7K%)#9o z8t(+dCjLM0mhq?2(1G3@^qIA;wu6rpo>w!Mn%p>jE{F%;3B!^;7!L4aB4Z_T2+w2y J$=Mc*e*wFy?lu4b delta 811 zcmY+?PiPZC6vy#tvYSoYR89Z*r++Mn5K0fC_SS<4X~3gM=|vB+jCCPR;wCAtQc&=2Jqn%_6hbNV8t^1YLGb&Fi_`~`&+P8Zd-Ha)o$ut@$D`hkA!ZoU z3~#`gIqae0b;_6kx6s2q9KwCfVh1naTO7p?sC8d3gWqu&Pf+W7$@8B`-nKboqJ^pS z-$H|^g?Ut>NmPPayomFt11zEnmrw^>#zB0NxQfdA0=2(|IedjaZs7#=%`TGy-5#Je ze5I=FqBfqQ3jRQKc!rm8ge*+WO;q7I)cU*0^*z+V9-#I=L^bv}xo>q%eY3`d+GZUu z;Y%FH4OEA3P=yas364;md_ooYhAMoL*h`-OLN(&^qfeVdeO0Z^Gjyo-BtJ^7;7jy3 zT)_$5Ak?Ws3G^RPVZ~L34y^;~uzC~cgWCO2Lu1KYhgaw`>WvXI{SKy>jWDk1mg0UG zR-2WE>!zpN?{s0-mTkkDqOFHc F=|6TUUR3}9 diff --git a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po index 2266d5a..15336a6 100644 --- a/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po +++ b/nummi/transaction/locale/fr_FR/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-03 15:51+0100\n" +"POT-Creation-Date: 2025-01-04 18:51+0100\n" "PO-Revision-Date: 2023-04-23 08:03+0200\n" "Last-Translator: Edgar P. Burkhart \n" "Language-Team: \n" @@ -17,103 +17,119 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.2.2\n" -#: .\transaction\models.py:19 .\transaction\models.py:82 +#: .\transaction\forms.py:175 +msgid "Search" +msgstr "Rechercher" + +#: .\transaction\forms.py:177 +msgid "Sort by" +msgstr "Trier par" + +#: .\transaction\forms.py:179 +msgid "Default" +msgstr "Défaut" + +#: .\transaction\forms.py:180 +msgid "Date +" +msgstr "Date +" + +#: .\transaction\forms.py:181 +msgid "Date -" +msgstr "Date -" + +#: .\transaction\forms.py:182 +msgid "Value +" +msgstr "Valeur +" + +#: .\transaction\forms.py:183 +msgid "Value -" +msgstr "Valeur -" + +#: .\transaction\models.py:18 .\transaction\models.py:63 msgid "Transaction" msgstr "Transaction" -#: .\transaction\models.py:19 .\transaction\models.py:89 -#: .\transaction\templates\transaction\invoice_table.html:10 -#: .\transaction\templates\transaction\transaction_table.html:32 +#: .\transaction\models.py:18 .\transaction\models.py:70 +#: .\transaction\templates\transaction\transaction_table.html:19 msgid "Name" msgstr "Nom" -#: .\transaction\models.py:21 +#: .\transaction\models.py:20 msgid "Description" msgstr "Description" -#: .\transaction\models.py:23 +#: .\transaction\models.py:22 msgid "Value" msgstr "Valeur" -#: .\transaction\models.py:25 -#: .\transaction\templates\transaction\transaction_table.html:31 +#: .\transaction\models.py:24 +#: .\transaction\templates\transaction\transaction_table.html:18 msgid "Date" msgstr "Date" -#: .\transaction\models.py:26 +#: .\transaction\models.py:25 msgid "Real date" msgstr "Date réelle" -#: .\transaction\models.py:28 -#: .\transaction\templates\transaction\transaction_table.html:35 +#: .\transaction\models.py:27 +#: .\transaction\templates\transaction\transaction_table.html:22 msgid "Trader" msgstr "Commerçant" -#: .\transaction\models.py:31 +#: .\transaction\models.py:30 msgid "Payment" msgstr "Paiement" -#: .\transaction\models.py:38 -#: .\transaction\templates\transaction\transaction_table.html:37 +#: .\transaction\models.py:37 +#: .\transaction\templates\transaction\transaction_table.html:24 msgid "Category" msgstr "Catégorie" -#: .\transaction\models.py:43 +#: .\transaction\models.py:44 msgid "Statement" msgstr "Relevé" -#: .\transaction\models.py:48 -#: .\transaction\templates\transaction\transaction_table.html:40 -msgid "Account" -msgstr "Compte" - -#: .\transaction\models.py:83 -#: .\transaction\templates\transaction\transaction_archive_month.html:27 +#: .\transaction\models.py:64 +#: .\transaction\templates\transaction\transaction_archive_month.html:25 #: .\transaction\templates\transaction\transaction_archive_year.html:31 #: .\transaction\templates\transaction\transaction_list.html:4 -#: .\transaction\templates\transaction\transaction_list.html:7 +#: .\transaction\templates\transaction\transaction_list.html:11 msgid "Transactions" msgstr "Transactions" -#: .\transaction\models.py:89 .\transaction\models.py:122 +#: .\transaction\models.py:70 .\transaction\models.py:103 msgid "Invoice" msgstr "Facture" -#: .\transaction\models.py:94 -#: .\transaction\templates\transaction\invoice_table.html:11 -#: .\transaction\templates\transaction\invoice_table.html:22 +#: .\transaction\models.py:75 msgid "File" msgstr "Fichier" -#: .\transaction\models.py:123 -#: .\transaction\templates\transaction\transaction_form.html:20 +#: .\transaction\models.py:104 +#: .\transaction\templates\transaction\transaction_detail.html:46 msgid "Invoices" msgstr "Factures" #: .\transaction\templates\transaction\invoice_form.html:4 -#: .\transaction\templates\transaction\invoice_table.html:37 msgid "Create invoice" msgstr "Créer une facture" #: .\transaction\templates\transaction\invoice_form.html:7 +#: .\transaction\templates\transaction\invoice_table.html:12 msgid "New invoice" msgstr "Nouvelle facture" -#: .\transaction\templates\transaction\invoice_table.html:12 -#: .\transaction\templates\transaction\invoice_table.html:25 -msgid "Delete" -msgstr "Supprimer" +#: .\transaction\templates\transaction\invoice_table.html:7 +msgid "Edit" +msgstr "Modifier" -#: .\transaction\templates\transaction\invoice_table.html:30 -msgid "No invoice" -msgstr "Aucune facture" - -#: .\transaction\templates\transaction\transaction_archive_month.html:14 +#: .\transaction\templates\transaction\transaction_archive_month.html:13 #: .\transaction\templates\transaction\transaction_archive_year.html:13 +#: .\transaction\templates\transaction\transaction_form.html:18 msgid "Back" msgstr "Retour" -#: .\transaction\templates\transaction\transaction_archive_month.html:22 +#: .\transaction\templates\transaction\transaction_archive_month.html:20 #: .\transaction\templates\transaction\transaction_archive_year.html:26 msgid "Categories" msgstr "Catégories" @@ -122,8 +138,31 @@ msgstr "Catégories" msgid "History" msgstr "Historique" +#: .\transaction\templates\transaction\transaction_detail.html:39 +msgid "Edit transaction" +msgstr "Modifier la transaction" + +#: .\transaction\templates\transaction\transaction_detail.html:57 +msgid "Add invoice" +msgstr "Ajouter une facture" + +#: .\transaction\templates\transaction\transaction_filters.html:3 +msgid "Filters" +msgstr "Filtres" + +#: .\transaction\templates\transaction\transaction_filters.html:12 +msgid "Filter" +msgstr "Filtrer" + +#: .\transaction\templates\transaction\transaction_filters.html:13 +msgid "Reset" +msgstr "Réinitialiser" + +#: .\transaction\templates\transaction\transaction_filters.html:15 +msgid "Clear" +msgstr "Effacer" + #: .\transaction\templates\transaction\transaction_form.html:5 -#: .\transaction\templates\transaction\transaction_table.html:25 msgid "Create transaction" msgstr "Créer une transaction" @@ -131,18 +170,33 @@ msgstr "Créer une transaction" msgid "New transaction" msgstr "Nouvelle transaction" -#: .\transaction\templates\transaction\transaction_table.html:33 +#: .\transaction\templates\transaction\transaction_list.html:15 +msgid "Add transaction" +msgstr "Ajouter une transaction" + +#: .\transaction\templates\transaction\transaction_table.html:20 msgid "Expenses" msgstr "Dépenses" -#: .\transaction\templates\transaction\transaction_table.html:34 +#: .\transaction\templates\transaction\transaction_table.html:21 msgid "Income" msgstr "Recettes" -#: .\transaction\templates\transaction\transaction_table.html:87 +#: .\transaction\templates\transaction\transaction_table.html:27 +msgid "Account" +msgstr "Compte" + +#: .\transaction\templates\transaction\transaction_table.html:74 msgid "No transaction" msgstr "Aucune transaction" -#: .\transaction\templates\transaction\transaction_table.html:95 +#: .\transaction\templates\transaction\transaction_table.html:82 msgid "View all transactions" msgstr "Voir toutes les transactions" + +#: .\transaction\views.py:101 +msgid "Error processing file" +msgstr "Erreur lors du traitement du fichier" + +#~ msgid "Delete" +#~ msgstr "Supprimer" From 02c53c7daba566d4d87b5bbf77311906c6e81972 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 20:28:32 +0100 Subject: [PATCH 194/213] Fix template variable references in transaction detail view --- .../templates/transaction/transaction_detail.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nummi/transaction/templates/transaction/transaction_detail.html b/nummi/transaction/templates/transaction/transaction_detail.html index 7e58c0f..065a7bc 100644 --- a/nummi/transaction/templates/transaction/transaction_detail.html +++ b/nummi/transaction/templates/transaction/transaction_detail.html @@ -16,17 +16,17 @@

      {{ transaction }}

        - {% if statement %} + {% if transaction.statement %}
      • - {% with statement.account as account %} + {% with transaction.statement.account as account %} {{ account.icon|remix }}{{ account }} – {% endwith %} - {{ statement }} + {{ transaction.statement }}
      • {% endif %} - {% if category %} + {% if transaction.category %}
      • - {{ category.icon|remix }}{{ category }} + {{ transaction.category.icon|remix }}{{ transaction.category }}
      • {% endif %} {% if transaction.trader %} From d44407d9ab64e49464ec0641451b8148af24f7b9 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 21:14:46 +0100 Subject: [PATCH 195/213] Refactor transaction URL handling and enhance filter form functionality Close #43 --- .../templates/category/category_detail.html | 2 +- .../templates/category/category_plot.html | 4 +-- nummi/main/static/main/js/base.js | 20 ++++++++++- nummi/main/templatetags/main_extras.py | 19 ++++++++++ .../templates/statement/statement_detail.html | 2 +- nummi/transaction/forms.py | 9 +++++ .../transaction/transaction_filters.html | 36 ++++++++++--------- nummi/transaction/views.py | 2 ++ pkgbuild/PKGBUILD | 1 + 9 files changed, 73 insertions(+), 22 deletions(-) diff --git a/nummi/category/templates/category/category_detail.html b/nummi/category/templates/category/category_detail.html index 10d3a80..7768101 100644 --- a/nummi/category/templates/category/category_detail.html +++ b/nummi/category/templates/category/category_detail.html @@ -15,7 +15,7 @@

        {% translate "Transactions" %}

        - {% url "category_transactions" category.id as t_url %} + {% url_get "transactions" category=category.id as t_url %}

        {{ "list-check"|remixnl }}{% translate "View all transactions" %}

        diff --git a/nummi/category/templates/category/category_plot.html b/nummi/category/templates/category/category_plot.html index fd80fc3..1ffa4f7 100644 --- a/nummi/category/templates/category/category_plot.html +++ b/nummi/category/templates/category/category_plot.html @@ -22,9 +22,9 @@ {% if cat.category %} {% if month %} - {{ cat.category__icon|remix }}{{ cat.category__name }} + {{ cat.category__icon|remix }}{{ cat.category__name }} {% elif year %} - {{ cat.category__icon|remix }}{{ cat.category__name }} + {{ cat.category__icon|remix }}{{ cat.category__name }} {% else %} {{ cat.category__icon|remix }}{{ cat.category__name }} {% endif %} diff --git a/nummi/main/static/main/js/base.js b/nummi/main/static/main/js/base.js index 2b41ee2..2f760d6 100644 --- a/nummi/main/static/main/js/base.js +++ b/nummi/main/static/main/js/base.js @@ -153,9 +153,27 @@ if (accounts) { const filterForm = document.querySelector("form.filter"); if (filterForm) { + const accountSelect = filterForm.querySelector("[name='account']"); + const statementSelect = filterForm.querySelector("[name='statement']"); + if (!statementSelect.disabled) { + accountSelect.addEventListener("input", (event) => { + statementSelect.value = ""; + statementSelect.disabled = true; + }); + filterForm.addEventListener("reset", (event) => { + statementSelect.disabled = false; + }); + } + let disableStatement = false; filterForm.addEventListener("submit", (event) => { for (element of filterForm.elements) { - if (element.value == "") { + if ( + element.value == "" || + (disableStatement && element.name == "statement") + ) { + if (element.name == "account") { + disableStatement = true; + } element.disabled = true; } } diff --git a/nummi/main/templatetags/main_extras.py b/nummi/main/templatetags/main_extras.py index 1b1e5dc..34b5182 100644 --- a/nummi/main/templatetags/main_extras.py +++ b/nummi/main/templatetags/main_extras.py @@ -1,5 +1,9 @@ +from urllib import parse + +from dateutil.relativedelta import relativedelta from django import template from django.templatetags.static import static +from django.urls import reverse from django.utils import formats from django.utils.safestring import mark_safe @@ -118,3 +122,18 @@ def page_url(context, page): query = context["request"].GET.copy() query["page"] = page return query.urlencode() + + +@register.simple_tag +def url_get(name, **kwargs): + return f"{reverse(name)}?{parse.urlencode(kwargs)}" + + +@register.filter +def end_of_month(month): + return month + relativedelta(months=1, days=-1) + + +@register.filter +def end_of_year(year): + return year + relativedelta(years=1, days=-1) diff --git a/nummi/statement/templates/statement/statement_detail.html b/nummi/statement/templates/statement/statement_detail.html index 232b22f..fa963e1 100644 --- a/nummi/statement/templates/statement/statement_detail.html +++ b/nummi/statement/templates/statement/statement_detail.html @@ -55,7 +55,7 @@

        {% translate "Transactions" %}

        - {% url "statement_transactions" statement.id as t_url %} + {% url_get "transactions" account=account.id statement=statement.id as t_url %}

        {{ "add-circle"|remix }}{% translate "Add transaction" %} diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index 16110a0..a093bbc 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -172,6 +172,7 @@ class TransactionFiltersForm(forms.Form): account = forms.ModelChoiceField( queryset=None, required=False, widget=AccountSelect() ) + statement = forms.ModelChoiceField(queryset=None, required=False) search = forms.CharField(label=_("Search"), required=False) sort_by = forms.ChoiceField( label=_("Sort by"), @@ -191,6 +192,14 @@ class TransactionFiltersForm(forms.Form): self.fields["category"].queryset = _user.category_set self.fields["account"].queryset = _user.account_set + print(kwargs.get("initial")) + if acc_id := kwargs.get("initial", {}).get("account"): + self.fields["statement"].queryset = ( + self.fields["account"].queryset.get(id=acc_id).statement_set + ) + else: + self.fields["statement"].queryset = _user.statement_set.none() + self.fields["statement"].disabled = True self.fields["category"].widget.attrs |= { "class": "category", diff --git a/nummi/transaction/templates/transaction/transaction_filters.html b/nummi/transaction/templates/transaction/transaction_filters.html index 907a14f..f29766d 100644 --- a/nummi/transaction/templates/transaction/transaction_filters.html +++ b/nummi/transaction/templates/transaction/transaction_filters.html @@ -1,19 +1,21 @@ {% load i18n %} -

        - {% translate "Filters" %} -
        - {% for field in form %} -
        - - {{ field }} +{% if form %} +
        + {% translate "Filters" %} + + {% for field in form %} +
        + + {{ field }} +
        + {% endfor %} +
        + + + {% if filters %} + {% translate "Clear" %} + {% endif %}
        - {% endfor %} -
        - - - {% if filters %} - {% translate "Clear" %} - {% endif %} -
        - -
        + +
        +{% endif %} diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 41fd184..a928f01 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -190,6 +190,8 @@ class TransactionListView(NummiListView): queryset = queryset.filter(category=category) if account := self.request.GET.get("account"): queryset = queryset.filter(statement__account=account) + if statement := self.request.GET.get("statement"): + queryset = queryset.filter(statement=statement) if search := self.request.GET.get("search"): queryset = ( queryset.annotate( diff --git a/pkgbuild/PKGBUILD b/pkgbuild/PKGBUILD index 16ac39e..88e06a0 100644 --- a/pkgbuild/PKGBUILD +++ b/pkgbuild/PKGBUILD @@ -10,6 +10,7 @@ depends=( "python-django" "python-toml" "python-psycopg" + "python-dateutil" ) makedepends=("git") optdepends=("postgresql: database") From d5292911c23bd1e2b8666100324d2e5fc43f5b38 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sat, 4 Jan 2025 21:57:21 +0100 Subject: [PATCH 196/213] Refactor models to inherit from NummiModel and implement custom query sets for enhanced search functionality --- nummi/account/models.py | 6 +-- .../templates/account/account_table.html | 4 +- nummi/category/models.py | 4 +- nummi/main/models.py | 33 ++++++++++++- .../search/templates/search/search_form.html | 5 +- .../templates/search/search_results.html | 47 +++++++++++++++++++ nummi/search/views.py | 40 +++++----------- nummi/transaction/models.py | 16 +++++-- nummi/transaction/views.py | 22 +-------- 9 files changed, 116 insertions(+), 61 deletions(-) create mode 100644 nummi/search/templates/search/search_results.html diff --git a/nummi/account/models.py b/nummi/account/models.py index 07ee795..c1203de 100644 --- a/nummi/account/models.py +++ b/nummi/account/models.py @@ -4,10 +4,10 @@ from django.apps import apps from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from main.models import UserModel +from main.models import NummiModel -class Account(UserModel): +class Account(NummiModel): id = models.UUIDField(primary_key=True, default=uuid4, editable=False) name = models.CharField(max_length=64, default=_("Account"), verbose_name=_("Name")) icon = models.SlugField( @@ -46,7 +46,7 @@ class Account(UserModel): verbose_name_plural = _("Accounts") -class AccountModel(UserModel): +class AccountModel(NummiModel): account = models.ForeignKey( Account, on_delete=models.CASCADE, diff --git a/nummi/account/templates/account/account_table.html b/nummi/account/templates/account/account_table.html index 0de11e9..f938ad1 100644 --- a/nummi/account/templates/account/account_table.html +++ b/nummi/account/templates/account/account_table.html @@ -1,7 +1,7 @@ {% load i18n main_extras %}
        {% for acc in accounts %} -