From 719436f9ad60131da8ab65113d20cdaf1674ecc8 Mon Sep 17 00:00:00 2001
From: "Edgar P. Burkhart" <git@edgarpierre.fr>
Date: Sat, 22 Apr 2023 12:03:08 +0200
Subject: [PATCH] Implemented frontend for account

---
 nummi/account/models.py                       |  4 +--
 .../templates/account/account_form.html}      |  2 +-
 nummi/account/urls.py                         | 20 ++++++-----
 nummi/account/views.py                        | 34 ++++++++++---------
 nummi/category/urls.py                        |  3 +-
 nummi/main/templates/main/base.html           | 12 +++----
 .../form/{snapshot.html => statement.html}    |  0
 nummi/main/templates/main/index.html          |  6 ++--
 .../list/{snapshot.html => statement.html}    | 20 ++++++++---
 .../main/templates/main/list/transaction.html | 14 ++++++--
 .../table/{snapshot.html => statement.html}   | 18 +++++-----
 .../templates/main/table/transaction.html     |  6 ++--
 nummi/main/urls.py                            |  7 +++-
 nummi/main/views.py                           |  5 +++
 nummi/statement/urls.py                       |  5 +--
 nummi/transaction/forms.py                    |  2 +-
 16 files changed, 97 insertions(+), 61 deletions(-)
 rename nummi/{main/templates/main/form/account.html => account/templates/account/account_form.html} (92%)
 rename nummi/main/templates/main/form/{snapshot.html => statement.html} (100%)
 rename nummi/main/templates/main/list/{snapshot.html => statement.html} (53%)
 rename nummi/main/templates/main/table/{snapshot.html => statement.html} (76%)

diff --git a/nummi/account/models.py b/nummi/account/models.py
index 594f5e9..4709ef5 100644
--- a/nummi/account/models.py
+++ b/nummi/account/models.py
@@ -27,10 +27,10 @@ class Account(UserModel):
         return str(self.name)
 
     def get_absolute_url(self):
-        return reverse("account", kwargs={"pk": self.pk})
+        return reverse("account", args=(self.pk,))
 
     def get_delete_url(self):
-        return reverse("del_account", kwargs={"pk": self.pk})
+        return reverse("del_account", args=(self.pk,))
 
     class Meta:
         ordering = ["-default", "name"]
diff --git a/nummi/main/templates/main/form/account.html b/nummi/account/templates/account/account_form.html
similarity index 92%
rename from nummi/main/templates/main/form/account.html
rename to nummi/account/templates/account/account_form.html
index 5d16607..0e18fbb 100644
--- a/nummi/main/templates/main/form/account.html
+++ b/nummi/account/templates/account/account_form.html
@@ -11,7 +11,7 @@
 {% block tables %}
     {% if not form.instance|adding %}
         <h3>{% translate "Statements" %}</h3>
-        {% include "main/table/snapshot.html" %}
+        {% include "main/table/statement.html" %}
     {% endif %}
     {% if transactions %}
         <h3>{% translate "Transactions" %}</h3>
diff --git a/nummi/account/urls.py b/nummi/account/urls.py
index b5158ea..43bc302 100644
--- a/nummi/account/urls.py
+++ b/nummi/account/urls.py
@@ -1,33 +1,35 @@
 from django.urls import path
+from statement.views import StatementCreateView
+from transaction.views import TransactionMonthView
 
 from . import views
 
 urlpatterns = [
-    path("account", views.AccountCreateView.as_view(), name="new_account"),
-    path("account/<pk>", views.AccountUpdateView.as_view(), name="account"),
+    path("", views.AccountCreateView.as_view(), name="new_account"),
+    path("<account>", views.AccountUpdateView.as_view(), name="account"),
     path(
-        "account/<pk>/transactions",
+        "<account>/transactions",
         views.AccountTListView.as_view(),
         name="account_transactions",
     ),
     path(
-        "account/<pk>/statements",
+        "<account>/statements",
         views.AccountSListView.as_view(),
         name="account_statements",
     ),
     path(
-        "account/<account>/statement",
-        views.StatementCreateView.as_view(),
+        "<account>/statement",
+        StatementCreateView.as_view(),
         name="new_statement",
     ),
     path(
-        "account/<pk>/delete",
+        "<account>/delete",
         views.AccountDeleteView.as_view(),
         name="del_account",
     ),
     path(
-        "account/<account>/history/<int:year>/<int:month>",
-        views.TransactionMonthView.as_view(),
+        "<account>/history/<int:year>/<int:month>",
+        TransactionMonthView.as_view(),
         name="transaction_month",
     ),
 ]
diff --git a/nummi/account/views.py b/nummi/account/views.py
index 576d153..a73c7a8 100644
--- a/nummi/account/views.py
+++ b/nummi/account/views.py
@@ -1,6 +1,7 @@
+from django.shortcuts import get_object_or_404
 from django.urls import reverse_lazy
 from main.views import NummiCreateView, NummiDeleteView, NummiUpdateView
-from snapshot.views import SnapshotListView
+from statement.views import StatementListView
 from transaction.utils import history
 from transaction.views import TransactionListView
 
@@ -11,13 +12,12 @@ from .models import Account
 class AccountCreateView(NummiCreateView):
     model = Account
     form_class = AccountForm
-    template_name = "main/form/account.html"
 
 
 class AccountUpdateView(NummiUpdateView):
     model = Account
     form_class = AccountForm
-    template_name = "main/form/account.html"
+    pk_url_kwarg = "account"
 
     def get_context_data(self, **kwargs):
         _max = 8
@@ -29,40 +29,42 @@ class AccountUpdateView(NummiUpdateView):
             data["transactions_url"] = reverse_lazy(
                 "account_transactions", args=(account.pk,)
             )
-        _snapshots = account.snapshot_set.all()
-        if _snapshots.count() > _max:
-            data["snapshots_url"] = reverse_lazy(
-                "account_snapshots", 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_snapshot_url": reverse_lazy(
-                "new_snapshot", kwargs={"account": account.pk}
+            "new_statement_url": reverse_lazy(
+                "new_statement", kwargs={"account": account.pk}
             ),
-            "snapshots": _snapshots[:8],
+            "statements": _statements[:8],
             "history": history(account.transaction_set),
         }
 
 
 class AccountDeleteView(NummiDeleteView):
     model = Account
+    pk_url_kwarg = "account"
 
 
 class AccountMixin:
     def get_queryset(self):
-        return super().get_queryset().filter(account=self.kwargs.get("pk"))
+        self.account = get_object_or_404(
+            Account.objects.filter(user=self.request.user),
+            pk=self.kwargs.get("account"),
+        )
+        return super().get_queryset().filter(account=self.account)
 
     def get_context_data(self, **kwargs):
-        return super().get_context_data(**kwargs) | {
-            "object": Account.objects.get(pk=self.kwargs.get("pk")),
-            "account": True,
-        }
+        return super().get_context_data(**kwargs) | {"account": self.account}
 
 
 class AccountTListView(AccountMixin, TransactionListView):
     pass
 
 
-class AccountSListView(AccountMixin, SnapshotListView):
+class AccountSListView(AccountMixin, StatementListView):
     pass
diff --git a/nummi/category/urls.py b/nummi/category/urls.py
index 113aac9..601e925 100644
--- a/nummi/category/urls.py
+++ b/nummi/category/urls.py
@@ -1,4 +1,5 @@
 from django.urls import path
+from transaction.views import TransactionMonthView
 
 from . import views
 
@@ -15,7 +16,7 @@ urlpatterns = [
     ),
     path(
         "category/<category>/history/<int:year>/<int:month>",
-        views.TransactionMonthView.as_view(),
+        TransactionMonthView.as_view(),
         name="transaction_month",
     ),
 ]
diff --git a/nummi/main/templates/main/base.html b/nummi/main/templates/main/base.html
index c58e059..274bfd4 100644
--- a/nummi/main/templates/main/base.html
+++ b/nummi/main/templates/main/base.html
@@ -33,9 +33,9 @@
                                    accesskey="h">{% translate "Home" %}</a>
                             </li>
                             <li>
-                                <a href="{% url "snapshots" %}"
-                                   class="{% if request.resolver_match.url_name == "snapshots" %}cur{% endif %}">
-                                    {% translate "Snapshots" %}
+                                <a href="{% url "statements" %}"
+                                   class="{% if request.resolver_match.url_name == "statements" %}cur{% endif %}">
+                                    {% translate "Statements" %}
                                 </a>
                             </li>
                             <li>
@@ -50,9 +50,9 @@
                                    accesskey="a">{% translate "Create account" %}</a>
                             </li>
                             <li>
-                                <a href="{% url "new_snapshot" %}"
-                                   class="{% if request.resolver_match.url_name == "new_snapshot" %}cur{% endif %}"
-                                   accesskey="s">{% translate "Create snapshot" %}</a>
+                                <a href="{% url "new_statement" %}"
+                                   class="{% if request.resolver_match.url_name == "new_statement" %}cur{% endif %}"
+                                   accesskey="s">{% translate "Create statement" %}</a>
                             </li>
                             <li>
                                 <a href="{% url "new_category" %}"
diff --git a/nummi/main/templates/main/form/snapshot.html b/nummi/main/templates/main/form/statement.html
similarity index 100%
rename from nummi/main/templates/main/form/snapshot.html
rename to nummi/main/templates/main/form/statement.html
diff --git a/nummi/main/templates/main/index.html b/nummi/main/templates/main/index.html
index 6f48b67..b2dbbaa 100644
--- a/nummi/main/templates/main/index.html
+++ b/nummi/main/templates/main/index.html
@@ -36,9 +36,9 @@
             </p>
         {% endspaceless %}
     {% endif %}
-    {% if snapshots %}
-        <h2>{% translate "Snapshots" %}</h2>
-        {% include "main/table/snapshot.html" %}
+    {% if statements %}
+        <h2>{% translate "Statements" %}</h2>
+        {% include "main/table/statement.html" %}
     {% endif %}
     {% if history.data %}
         <h2>{% translate "History" %}</h2>
diff --git a/nummi/main/templates/main/list/snapshot.html b/nummi/main/templates/main/list/statement.html
similarity index 53%
rename from nummi/main/templates/main/list/snapshot.html
rename to nummi/main/templates/main/list/statement.html
index b7ce44a..f6b31a9 100644
--- a/nummi/main/templates/main/list/snapshot.html
+++ b/nummi/main/templates/main/list/statement.html
@@ -4,7 +4,8 @@
 {% load i18n %}
 {% block title %}
     {% translate "Statements" %}
-    {% if object %}– {{ object }}{% endif %}
+    {% if account %}– {{ account }}{% endif %}
+    {% if category %}– {{ category }}{% endif %}
     – Nummi
 {% endblock %}
 {% block link %}
@@ -18,12 +19,21 @@
 {% endblock %}
 {% block body %}
     <h2>{% translate "Statements" %}</h2>
-    {% if object %}<a href="{{ object.get_absolute_url }}">{{ object }}</a>{% endif %}
-    {% if snapshots %}
+    {% if account %}
+        <p>
+            <a href="{{ account.get_absolute_url }}">{{ account.icon|remix }}{{ account }}</a>
+        </p>
+    {% endif %}
+    {% if category %}
+        <p>
+            <a href="{{ category.get_absolute_url }}">{{ category.icon|remix }}{{ category }}</a>
+        </p>
+    {% endif %}
+    {% if statements %}
         {% include "main/list/pagination.html" %}
-        {% include "main/table/snapshot.html" %}
+        {% include "main/table/statement.html" %}
         {% include "main/list/pagination.html" %}
     {% else %}
-        <p>{% translate "No snapshots to show" %}</p>
+        <p>{% translate "No statements to show" %}</p>
     {% endif %}
 {% endblock %}
diff --git a/nummi/main/templates/main/list/transaction.html b/nummi/main/templates/main/list/transaction.html
index 70a0c2e..de2f7b0 100644
--- a/nummi/main/templates/main/list/transaction.html
+++ b/nummi/main/templates/main/list/transaction.html
@@ -4,7 +4,8 @@
 {% load i18n %}
 {% block title %}
     {% translate "Transactions" %}
-    {% if object %}– {{ object }}{% endif %}
+    {% if account %}– {{ account }}{% endif %}
+    {% if category %}– {{ category }}{% endif %}
     {% if search %}
         – {% translate "Search" %}
     {% endif %}
@@ -21,7 +22,16 @@
 {% endblock %}
 {% block body %}
     <h2>{% translate "Transactions" %}</h2>
-    {% if object %}<a href="{{ object.get_absolute_url }}">{{ object }}</a>{% endif %}
+    {% if account %}
+        <p>
+            <a href="{{ account.get_absolute_url }}">{{ account.icon|remix }}{{ account }}</a>
+        </p>
+    {% endif %}
+    {% if category %}
+        <p>
+            <a href="{{ category.get_absolute_url }}">{{ category.icon|remix }}{{ category }}</a>
+        </p>
+    {% endif %}
     {% if search %}
         <a href="{% url "search" %}">{% translate "Search" %}</a>
     {% endif %}
diff --git a/nummi/main/templates/main/table/snapshot.html b/nummi/main/templates/main/table/statement.html
similarity index 76%
rename from nummi/main/templates/main/table/snapshot.html
rename to nummi/main/templates/main/table/statement.html
index 23cc6d5..ebe81b7 100644
--- a/nummi/main/templates/main/table/snapshot.html
+++ b/nummi/main/templates/main/table/statement.html
@@ -1,12 +1,12 @@
 {% load main_extras %}
 {% load i18n %}
-{% if new_snapshot_url %}
+{% if new_statement_url %}
     <p>
-        <a href="{{ new_snapshot_url }}">{% translate "Create statement" %}</a>
+        <a href="{{ new_statement_url }}">{% translate "Create statement" %}</a>
     </p>
 {% endif %}
-<div id="snapshots" class="table">
-    <table class="full-width {% if snapshots_url %}more{% endif %}">
+<div id="statements" class="table">
+    <table class="full-width {% if statements_url %}more{% endif %}">
         <colgroup>
             <col class="icon" span="2">
             <col class="date">
@@ -28,7 +28,7 @@
             <th>{% translate "Transactions" %}</th>
         </thead>
         <tbody>
-            {% for snap in snapshots %}
+            {% for snap in statements %}
                 <tr>
                     {% if snap.sum == snap.diff %}
                         <td class="c green">{{ "check"|remix }}</td>
@@ -39,12 +39,12 @@
                         {% if snap.file %}<a href="{{ snap.file.url }}">{{ "attachment"|remix }}</a>{% endif %}
                     </td>
                     <th class="date" scope="row">
-                        <a href="{% url "snapshot" pk=snap.id %}">{{ snap.date|date:"Y-m-d" }}</a>
+                        <a href="{% url "statement" snap.id %}">{{ snap.date|date:"Y-m-d" }}</a>
                     </th>
                     {% if not account %}
                         <td class="r">{{ snap.account.icon|remix }}</td>
                         <td>
-                            <a href="{% url "account" pk=snap.account.id %}">{{ snap.account }}</a>
+                            <a href="{% url "account" snap.account.id %}">{{ snap.account }}</a>
                         </td>
                     {% endif %}
                     <td class="value">{{ snap.value|value }}</td>
@@ -55,8 +55,8 @@
         </tbody>
     </table>
 </div>
-{% if snapshots_url %}
+{% if statements_url %}
     <p>
-        <a href="{{ snapshots_url }}">{% translate "View all statements" %}</a>
+        <a href="{{ statements_url }}">{% translate "View all statements" %}</a>
     </p>
 {% endif %}
diff --git a/nummi/main/templates/main/table/transaction.html b/nummi/main/templates/main/table/transaction.html
index da11aa8..fe7c34b 100644
--- a/nummi/main/templates/main/table/transaction.html
+++ b/nummi/main/templates/main/table/transaction.html
@@ -43,7 +43,7 @@
                     </td>
                     <td class="date">{{ trans.date|date:"Y-m-d" }}</td>
                     <th scope="row" class="l">
-                        <a href="{% url "transaction" pk=trans.id %}">{{ trans.name }}</a>
+                        <a href="{% url "transaction" trans.id %}">{{ trans.name }}</a>
                     </th>
                     <td class="value">{{ trans.value|pmvalue }}</td>
                     <td>{{ trans.trader|default_if_none:"" }}</td>
@@ -51,7 +51,7 @@
                         {% if trans.category %}
                             <td class="r">{{ trans.category.icon|remix }}</td>
                             <td>
-                                <a href="{% url "category" pk=trans.category.id %}">{{ trans.category }}</a>
+                                <a href="{% url "category" trans.category.id %}">{{ trans.category }}</a>
                             </td>
                         {% else %}
                             <td colspan="2"></td>
@@ -60,7 +60,7 @@
                     {% if not account %}
                         <td class="r">{{ trans.account.icon|remix }}</td>
                         <td>
-                            <a href="{% url "account" pk=trans.account.id %}">{{ trans.account }}</a>
+                            <a href="{% url "account" trans.account.id %}">{{ trans.account }}</a>
                         </td>
                     {% endif %}
                 </tr>
diff --git a/nummi/main/urls.py b/nummi/main/urls.py
index 3b911ad..0b5893d 100644
--- a/nummi/main/urls.py
+++ b/nummi/main/urls.py
@@ -1,4 +1,4 @@
-from django.urls import path
+from django.urls import include, path
 
 from . import views
 
@@ -6,4 +6,9 @@ urlpatterns = [
     path("", views.IndexView.as_view(), name="index"),
     path("login", views.LoginView.as_view(), name="login"),
     path("logout", views.LogoutView.as_view(), name="logout"),
+    path("account/", include("account.urls")),
+    path("category/", include("category.urls")),
+    path("statement/", include("statement.urls")),
+    path("transaction/", include("transaction.urls")),
+    path("search/", include("search.urls")),
 ]
diff --git a/nummi/main/views.py b/nummi/main/views.py
index 7ede354..e7fbea9 100644
--- a/nummi/main/views.py
+++ b/nummi/main/views.py
@@ -66,6 +66,11 @@ class NummiDeleteView(UserMixin, DeleteView):
     template_name = "main/confirm_delete.html"
     success_url = reverse_lazy("index")
 
+    def get_form_kwargs(self):
+        _res = super().get_form_kwargs()
+        _res.pop("user")
+        return _res
+
 
 class LoginView(auth_views.LoginView):
     template_name = "main/login.html"
diff --git a/nummi/statement/urls.py b/nummi/statement/urls.py
index 65ac4ec..c5d7442 100644
--- a/nummi/statement/urls.py
+++ b/nummi/statement/urls.py
@@ -1,9 +1,10 @@
 from django.urls import path
+from transaction.views import TransactionCreateView
 
 from . import views
 
 urlpatterns = [
-    path("statements", views.SnapshotListView.as_view(), name="statements"),
+    path("statements", views.StatementListView.as_view(), name="statements"),
     path("statement", views.StatementCreateView.as_view(), name="new_statement"),
     path("statement/<pk>", views.StatementUpdateView.as_view(), name="statement"),
     path(
@@ -13,7 +14,7 @@ urlpatterns = [
     ),
     path(
         "statement/<statement>/transaction",
-        views.TransactionCreateView.as_view(),
+        TransactionCreateView.as_view(),
         name="new_transaction",
     ),
     path(
diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py
index f492e21..0d661e0 100644
--- a/nummi/transaction/forms.py
+++ b/nummi/transaction/forms.py
@@ -1,6 +1,6 @@
 from category.models import Category
 from main.forms import NummiFileInput, NummiForm
-from Statement.models import Statement
+from statement.models import Statement
 
 from .models import Invoice, Transaction
 
