home · contact · privacy
Simplify, refactor page rendering.
authorChristian Heller <c.heller@plomlompom.de>
Tue, 20 Jan 2026 15:18:21 +0000 (16:18 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 20 Jan 2026 15:18:21 +0000 (16:18 +0100)
13 files changed:
src/ledgplom/http.py
src/ledgplom/testing.py
src/templates/_macros.tmpl
src/templates/balance.tmpl
src/tests/empty.ledger_raw
src/tests/empty.ledger_structured
src/tests/full.balance
src/tests/full.edit_raw.1
src/tests/full.edit_raw.4
src/tests/full.edit_structured.1
src/tests/full.edit_structured.4
src/tests/full.ledger_raw
src/tests/full.ledger_structured

index 3d989915faf060fc83e960bbc58b1826413a26ee..5ffb60537c36d891e378955160b819246cd3be56 100644 (file)
@@ -9,18 +9,35 @@ from ledgplom.ledger import DEFAULT_INDENT, Ledger
 
 
 PATH_TEMPLATES = Path('templates')
-_PREFIX_EDIT = 'edit_'
-_PREFIX_FILE = 'file_'
-PREFIX_LEDGER = 'ledger_'
+_PREFIX_EDIT = 'edit'
+_PREFIX_FILE = 'file'
+PREFIX_LEDGER = 'ledger'
 _SERVER_HOST = '127.0.0.1'
 _SERVER_PORT = 8084
 _SUFFIX_RAW = 'raw'
 _SUFFIX_STRUCTURED = 'structured'
 PAGENAME_BALANCE = 'balance'
-PAGENAME_EDIT_RAW = f'{_PREFIX_EDIT}{_SUFFIX_RAW}'
-PAGENAME_EDIT_STRUCTURED = f'{_PREFIX_EDIT}{_SUFFIX_STRUCTURED}'
-PAGENAME_LEDGER_RAW = f'{PREFIX_LEDGER}{_SUFFIX_RAW}'
-PAGENAME_LEDGER_STRUCTURED = f'{PREFIX_LEDGER}{_SUFFIX_STRUCTURED}'
+PAGENAME_EDIT_RAW = f'{_PREFIX_EDIT}_{_SUFFIX_RAW}'
+PAGENAME_EDIT_STRUCTURED = f'{_PREFIX_EDIT}_{_SUFFIX_STRUCTURED}'
+PAGENAME_LEDGER_RAW = f'{PREFIX_LEDGER}_{_SUFFIX_RAW}'
+PAGENAME_LEDGER_STRUCTURED = f'{PREFIX_LEDGER}_{_SUFFIX_STRUCTURED}'
+
+
+def render_ctx_on_path(ledger, short_path_toks):
+    'Prepare template rendering context based on ledger and path.'
+    pagename = short_path_toks[0]
+    prefix, suffix = (pagename + '_').split('_')[:2]
+    method = getattr(ledger, f'view_ctx_{prefix}')
+    method_kwargs = {}
+    if prefix != PREFIX_LEDGER:
+        method_kwargs['id_'] = -1
+        if len(short_path_toks) > 1:
+            id_str = short_path_toks[1] or '-1'
+            if id_str.isdigit() or (id_str[1:].isdigit() and id_str[0] == '-'):
+                method_kwargs['id_'] = int(id_str)
+    if prefix == _PREFIX_EDIT:
+        method_kwargs['raw'] = suffix == _SUFFIX_RAW
+    return method(**method_kwargs)
 
 
 class Server(PlomHttpServer):
@@ -54,9 +71,9 @@ class _Handler(PlomHttpHandler):
 
     def post_file_action(self, file_prefixed: str) -> None:
         'Based on file_prefixed name, trigger .server.ledger.(load|save).'
-        if file_prefixed == f'{_PREFIX_FILE}load':
+        if file_prefixed == f'{_PREFIX_FILE}_load':
             self.server.ledger.load()
-        elif file_prefixed == f'{_PREFIX_FILE}save':
+        elif file_prefixed == f'{_PREFIX_FILE}_save':
             self.server.ledger.save()
 
     def post_edit(self) -> Path:
@@ -108,18 +125,14 @@ class _Handler(PlomHttpHandler):
             self.redirect(
                 Path('/', PAGENAME_EDIT_STRUCTURED, self.path_toks[2]))
             return
-        ctx = {'unsaved_changes': self.server.ledger.tainted,
-               'path': self.path}
         if self.pagename.endswith('.js'):
             self.get_js()
-        elif self.pagename == PAGENAME_BALANCE:
-            self.get_balance(ctx)
-        elif self.pagename.startswith(_PREFIX_EDIT):
-            self.get_edit(ctx, self.pagename == PAGENAME_EDIT_RAW)
-        elif self.pagename.startswith(PREFIX_LEDGER):
-            self.get_ledger(ctx, self.pagename == PAGENAME_LEDGER_RAW)
-        else:
-            self.get_ledger(ctx, False)
+            return
+        ctx = {'unsaved_changes': self.server.ledger.tainted,
+               'path': self.path}
+        self._send_rendered(self.pagename,
+                            ctx | render_ctx_on_path(self.server.ledger,
+                                                     self.path_toks[1:]))
 
     def get_js(self) -> None:
         'Deliver .js module.'
@@ -135,24 +148,3 @@ class _Handler(PlomHttpHandler):
             bytes(self.server.jinja.get_template(self.pagename).render(**ctx),
                   encoding='utf8'),
             [('Content-Type', 'text/javascript')])
-
-    def get_balance(self, ctx) -> None:
-        'Display tree of calculated Accounts over blocks up_incl+1.'
-        id_str = self.params.first('up_incl')
-        self._send_rendered(
-                PAGENAME_BALANCE,
-                ctx | self.server.ledger.view_ctx_balance(int(id_str) if id_str
-                                                          else -1))
-
-    def get_edit(self, ctx, raw: bool) -> None:
-        'Display edit form for individual Booking.'
-        self._send_rendered(
-                PAGENAME_EDIT_RAW if raw else PAGENAME_EDIT_STRUCTURED,
-                ctx | self.server.ledger.view_ctx_edit(int(self.path_toks[2]),
-                                                       raw))
-
-    def get_ledger(self, ctx: dict[str, Any], raw: bool) -> None:
-        'Display ledger of all Bookings.'
-        self._send_rendered(
-                PAGENAME_LEDGER_RAW if raw else PAGENAME_LEDGER_STRUCTURED,
-                ctx | self.server.ledger.view_ctx_ledger())
index f06f15416b9d0e1a2fa025dea34d979e819dc171..2c17d855e7d608576265ab342773e2e4a1298331 100644 (file)
@@ -9,8 +9,8 @@ from jinja2 import (Environment as JinjaEnv,
 # ourselves
 from ledgplom.http import (
         PAGENAME_BALANCE, PAGENAME_EDIT_RAW, PAGENAME_EDIT_STRUCTURED,
-        PAGENAME_LEDGER_RAW, PAGENAME_LEDGER_STRUCTURED,
-        PATH_TEMPLATES, PREFIX_LEDGER)
+        PAGENAME_LEDGER_RAW, PAGENAME_LEDGER_STRUCTURED, PATH_TEMPLATES,
+        render_ctx_on_path)
 from ledgplom.ledger import Ledger
 
 
@@ -42,17 +42,9 @@ def run_tests() -> None:
                           if p != dat_path
                           and p.parts[-1].startswith(
                               str(dat_path.parts[-1])[:-len(_EXT_DAT)] + '.')]:
-            tmpl_name, id_str = (str(test_path.parts[-1]).split('.')
-                                 + ['-1'])[1:3]
-            if tmpl_name not in templates.keys():
-                continue
-            tmpl_name_start = tmpl_name.split("_")[0]
-            lines_rendered = templates[tmpl_name].render(
-                **getattr(ledger, f'view_ctx_{tmpl_name_start}')(
-                    **({'raw': False} if tmpl_name == PAGENAME_EDIT_STRUCTURED
-                       else {}) | ({} if tmpl_name_start == PREFIX_LEDGER[:-1]
-                                   else {'id_': int(id_str)}))
-                       ).split('\n')
+            path_toks = str(test_path.parts[-1]).split('.')[1:]
+            lines_rendered = templates[path_toks[0]].render(
+                    render_ctx_on_path(ledger, path_toks)).split('\n')
             with test_path.open('r', encoding='utf8') as f:
                 lines_expected = tuple(line.rstrip('\n')
                                        for line in f.readlines())
index f09f619183f82eacef92278f9b66c3cbf02968a0..b41be34326295a6851bc2c5851b39f58c61091e1 100644 (file)
@@ -109,7 +109,7 @@ Detected redundant empty lines in gaps, <input type="submit" name="remove_redund
             class="block_column{{ ' critical' if block.booking
                                               and block.booking.sink_error }}">
             [<a href="#block_{{ block.id_ }}">#</a>]<br />
-            [<a href="/balance?up_incl={{ block.id_ }}">b</a>]<br />
+            [<a href="/balance/{{ block.id_ }}">b</a>]<br />
             [<a href="/edit_{{ mode }}/{{ block.id_ }}">e</a>]
         </td>
     </tr>
@@ -148,7 +148,7 @@ td.direct_target {
 <span class="disable_on_taint">
 <a href="/edit_{{ there }}/{{ block.id_ }}">switch to {{ there }}</a>
 ·
-<a href="/balance?up_incl={{ block.id_ }}">balance after</a>
+<a href="/balance/{{ block.id_ }}">balance after</a>
 ·
 <a href="/ledger_{{ here }}/#block_{{ block.id_ }}">in ledger</a>
 </span>
index 403fe88fa3e7620153ed9905a5f7ae34e6d9ab95..684fa45106ece3919e4af7143a51ce31b3483332 100644 (file)
@@ -86,8 +86,8 @@ span.indent {
 
 {% block content %}
 <p>
-    {{ macros.conditional_block_nav('/balance?up_incl=', 'prev', block) -}}{##}
-    {{ macros.conditional_block_nav('/balance?up_incl=', 'next', block) }}{##}
+    {{ macros.conditional_block_nav('/balance/', 'prev', block) -}}{##}
+    {{ macros.conditional_block_nav('/balance/', 'next', block) }}{##}
     |
     balance after {# -#}
     <a href="/blocks/{{block.id_}}">{# -#}
index 1ac17d3649ff1b5c6d9813cf49cd1f1098f0831e..2408dbe12efe0f6338ddba24a4ddad8821b7e21a 100644 (file)
@@ -73,7 +73,7 @@ table {
         </td>
         <td rowspan=2 class="block_column">
             [<a href="#block_0">#</a>]<br />
-            [<a href="/balance?up_incl=0">b</a>]<br />
+            [<a href="/balance/0">b</a>]<br />
             [<a href="/edit_raw/0">e</a>]
         </td>
     </tr>
index 5d6be3041f45bdd08585552fcfeaf20e54327aa0..3dbab6a2ecada3351922daad73e77ef0dc0b1564 100644 (file)
@@ -78,7 +78,7 @@ td.currency {
         </td>
         <td rowspan=2 class="block_column">
             [<a href="#block_0">#</a>]<br />
-            [<a href="/balance?up_incl=0">b</a>]<br />
+            [<a href="/balance/0">b</a>]<br />
             [<a href="/edit_structured/0">e</a>]
         </td>
     </tr>
index 7344f13504f6b0ee9224cc9e1c74e1b0391b55c9..d43eddeb77d7d3d14a2c1aac36d0682eb1e7254a 100644 (file)
@@ -80,7 +80,7 @@ span.indent {
     </form>
 </div>
 <p>
-    <a href="/balance?up_incl=3">prev</a>
+    <a href="/balance/3">prev</a>
     <del>next</del>
     |
     balance after <a href="/blocks/4">booking 4 (2001-01-01: test)</a>
index 58aa58875292104a2947270caa010df0d27f6c9e..282a832f525fa3b1a77035bc8ad1158b1d84848f 100644 (file)
@@ -88,7 +88,7 @@ td.direct_target {
 <span class="disable_on_taint">
 <a href="/edit_structured/1">switch to structured</a>
 ·
-<a href="/balance?up_incl=1">balance after</a>
+<a href="/balance/1">balance after</a>
 ·
 <a href="/ledger_raw/#block_1">in ledger</a>
 </span>
index bdecd6944d24f7ac0ac24f3c38a1e7a80189d48e..8230dc61e534b775a03f98b664b487b96582f725 100644 (file)
@@ -88,7 +88,7 @@ td.direct_target {
 <span class="disable_on_taint">
 <a href="/edit_structured/4">switch to structured</a>
 ·
-<a href="/balance?up_incl=4">balance after</a>
+<a href="/balance/4">balance after</a>
 ·
 <a href="/ledger_raw/#block_4">in ledger</a>
 </span>
index b65f398a8e8c7c4ad914f1377d5beaba2bcf4f36..195c72bd746f2e617e8739bccfaa0708e89f281d 100644 (file)
@@ -97,7 +97,7 @@ input.amount {
 <span class="disable_on_taint">
 <a href="/edit_raw/1">switch to raw</a>
 ·
-<a href="/balance?up_incl=1">balance after</a>
+<a href="/balance/1">balance after</a>
 ·
 <a href="/ledger_structured/#block_1">in ledger</a>
 </span>
index 2f84cfabae0f1e001bea42645a8fe5c1c8014565..d217c6245263c176d9d554d4af5fb34b0c08c12a 100644 (file)
@@ -97,7 +97,7 @@ input.amount {
 <span class="disable_on_taint">
 <a href="/edit_raw/4">switch to raw</a>
 ·
-<a href="/balance?up_incl=4">balance after</a>
+<a href="/balance/4">balance after</a>
 ·
 <a href="/ledger_structured/#block_4">in ledger</a>
 </span>
index 19eb486299b321df21fd88660893ec259329abad..a9bd1692e0a1b9fa8671e9ecf9fd7582dbf62bcc 100644 (file)
@@ -75,7 +75,7 @@ Detected redundant empty lines in gaps, <input type="submit" name="remove_redund
         </td>
         <td rowspan=3 class="block_column">
             [<a href="#block_0">#</a>]<br />
-            [<a href="/balance?up_incl=0">b</a>]<br />
+            [<a href="/balance/0">b</a>]<br />
             [<a href="/edit_raw/0">e</a>]
         </td>
     </tr>
@@ -100,7 +100,7 @@ Detected redundant empty lines in gaps, <input type="submit" name="remove_redund
         </td>
         <td rowspan=5 class="block_column">
             [<a href="#block_1">#</a>]<br />
-            [<a href="/balance?up_incl=1">b</a>]<br />
+            [<a href="/balance/1">b</a>]<br />
             [<a href="/edit_raw/1">e</a>]
         </td>
     </tr>
@@ -126,7 +126,7 @@ Detected redundant empty lines in gaps, <input type="submit" name="remove_redund
         </td>
         <td rowspan=7 class="block_column">
             [<a href="#block_2">#</a>]<br />
-            [<a href="/balance?up_incl=2">b</a>]<br />
+            [<a href="/balance/2">b</a>]<br />
             [<a href="/edit_raw/2">e</a>]
         </td>
     </tr>
@@ -154,7 +154,7 @@ Detected redundant empty lines in gaps, <input type="submit" name="remove_redund
         </td>
         <td rowspan=6 class="block_column critical">
             [<a href="#block_3">#</a>]<br />
-            [<a href="/balance?up_incl=3">b</a>]<br />
+            [<a href="/balance/3">b</a>]<br />
             [<a href="/edit_raw/3">e</a>]
         </td>
     </tr>
@@ -182,7 +182,7 @@ Detected redundant empty lines in gaps, <input type="submit" name="remove_redund
         </td>
         <td rowspan=7 class="block_column">
             [<a href="#block_4">#</a>]<br />
-            [<a href="/balance?up_incl=4">b</a>]<br />
+            [<a href="/balance/4">b</a>]<br />
             [<a href="/edit_raw/4">e</a>]
         </td>
     </tr>
index 7a2c49ca269a66d507fae1bb593bae3aa820e6ef..d4fc05d3c464145a7df82ca4ef93ab8f7dfcef4e 100644 (file)
@@ -80,7 +80,7 @@ Detected redundant empty lines in gaps, <input type="submit" name="remove_redund
         </td>
         <td rowspan=3 class="block_column">
             [<a href="#block_0">#</a>]<br />
-            [<a href="/balance?up_incl=0">b</a>]<br />
+            [<a href="/balance/0">b</a>]<br />
             [<a href="/edit_structured/0">e</a>]
         </td>
     </tr>
@@ -109,7 +109,7 @@ Detected redundant empty lines in gaps, <input type="submit" name="remove_redund
         </td>
         <td rowspan=5 class="block_column">
             [<a href="#block_1">#</a>]<br />
-            [<a href="/balance?up_incl=1">b</a>]<br />
+            [<a href="/balance/1">b</a>]<br />
             [<a href="/edit_structured/1">e</a>]
         </td>
     </tr>
@@ -150,7 +150,7 @@ Detected redundant empty lines in gaps, <input type="submit" name="remove_redund
         </td>
         <td rowspan=7 class="block_column">
             [<a href="#block_2">#</a>]<br />
-            [<a href="/balance?up_incl=2">b</a>]<br />
+            [<a href="/balance/2">b</a>]<br />
             [<a href="/edit_structured/2">e</a>]
         </td>
     </tr>
@@ -200,7 +200,7 @@ Detected redundant empty lines in gaps, <input type="submit" name="remove_redund
         </td>
         <td rowspan=6 class="block_column critical">
             [<a href="#block_3">#</a>]<br />
-            [<a href="/balance?up_incl=3">b</a>]<br />
+            [<a href="/balance/3">b</a>]<br />
             [<a href="/edit_structured/3">e</a>]
         </td>
     </tr>
@@ -248,7 +248,7 @@ Detected redundant empty lines in gaps, <input type="submit" name="remove_redund
         </td>
         <td rowspan=7 class="block_column">
             [<a href="#block_4">#</a>]<br />
-            [<a href="/balance?up_incl=4">b</a>]<br />
+            [<a href="/balance/4">b</a>]<br />
             [<a href="/edit_structured/4">e</a>]
         </td>
     </tr>