home · contact · privacy
Some refactoring.
authorChristian Heller <c.heller@plomlompom.de>
Sat, 24 Jan 2026 12:41:24 +0000 (13:41 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Sat, 24 Jan 2026 12:41:24 +0000 (13:41 +0100)
src/ledgplom/http.py
src/ledgplom/ledger.py

index 1fe17edb4ee32c1c87fb994e2aa67e97fc8b12e2..79cc6e484fd345b3bb9808ca0b5fc30a96cdcc7a 100644 (file)
@@ -17,6 +17,7 @@ SERVER_PORT = 8084
 _SUFFIX_HTML = '.html'
 _SUFFIX_JS = '.js'
 _SUFFIX_STRUCTURED = 'structured'
+_PAGENAME_BALANCE = 'balance'
 _PAGENAME_EDIT_STRUCTURED = f'{_PREFIX_EDIT}_{_SUFFIX_STRUCTURED}'
 
 
@@ -108,41 +109,31 @@ class _Handler(PlomHttpHandler):
         if self.pagename == 'blocks':
             return self.redirect(
                     Path(f'/{_PAGENAME_EDIT_STRUCTURED}', self.path_toks[2]))
-        ctx: dict[str, Any] = {}
-        template_names = tuple(str(path.parts[-1])
-                               for path in _PATH_TEMPLATES.iterdir())
-        if self.pagename.endswith(_SUFFIX_JS):
-            if self.pagename not in template_names:
-                return send_404()
-            if self.pagename.startswith(_PAGENAME_EDIT_STRUCTURED):
-                block = self.server.ledger.blocks[int(self.path_toks[2])]
-                ctx['raw_gap_lines'] = [dl.raw for dl in block.gap.lines]
-                ctx['booking_lines'] = (
-                    [block.booking.intro_line.as_dict]
-                    + [tf_line.as_dict
-                       for tf_line in block.booking.transfer_lines]
-                    ) if block.booking else []
-            return self.send_http(
-                    bytes(self.server.jinja.get_template(self.pagename
-                                                         ).render(**ctx),
-                          encoding='utf8'),
-                    [('Content-Type', 'text/javascript')])
-        template_name = f'{self.pagename}{_SUFFIX_HTML}'
-        if template_name not in template_names:
+        is_js = self.pagename.endswith(_SUFFIX_JS)
+        template_name = f'{self.pagename}{"" if is_js else _SUFFIX_HTML}'
+        if template_name not in tuple(str(path.parts[-1])
+                                      for path in _PATH_TEMPLATES.iterdir()):
             return send_404()
+        ctx: dict[str, Any] = {}
         ctx['path'] = self.path
         ctx['unsaved_changes'] = self.server.ledger.tainted
-        prefix, suffix = (self.pagename + '_').split('_')[:2]
-        method_kwargs = {}
-        if prefix != _PREFIX_LEDGER:
-            method_kwargs['id_'] = -1
-            if len(self.path_toks) > 2:
-                id_str = self.path_toks[2] 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_STRUCTURED
-        ctx |= getattr(self.server.ledger,
-                       f'view_ctx_{prefix}')(**method_kwargs)
-        return self.send_rendered(Path(f'{self.pagename}{_SUFFIX_HTML}'), ctx)
+        prefix, suffix = (self.pagename.split('.')[0] + '_').split('_')[:2]
+        if prefix in {_PREFIX_EDIT, _PREFIX_LEDGER, _PAGENAME_BALANCE}:
+            method_kwargs = {}
+            if prefix != _PREFIX_LEDGER:
+                method_kwargs['id_'] = -1
+                if len(self.path_toks) > 2:
+                    id_str = self.path_toks[2] 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 |= ({'lines': True} if is_js
+                                  else {'raw': suffix != _SUFFIX_STRUCTURED})
+            ctx |= getattr(self.server.ledger,
+                           f'view_ctx_{prefix}')(**method_kwargs)
+        return (self.send_http(
+            bytes(self.server.jinja.get_template(self.pagename).render(**ctx),
+                  encoding='utf8'),
+            [('Content-Type', 'text/javascript')]) if is_js
+                else self.send_rendered(Path(template_name), ctx))
index 9af74cb07c3b7f84f1001fbe8944d1a02b49204d..dce6140b44d56e5621817f037a32603de9c93a9d 100644 (file)
@@ -747,10 +747,17 @@ class Ledger:
                                  if not ac.parent],
                                 key=lambda root: root.basename)}
 
-    def view_ctx_edit(self, id_: int, raw=True) -> dict[str, Any]:
+    def view_ctx_edit(self, id_: int, raw=True, lines=False) -> dict[str, Any]:
         'All context data relevant for rendering an edit view.'
-        accounts = self._calc_accounts()
         block = self.blocks[id_]
+        if lines:
+            return {'raw_gap_lines': [dl.raw for dl in block.gap.lines],
+                    'booking_lines': (
+                        [block.booking.intro_line.as_dict]
+                        + [tf_line.as_dict
+                           for tf_line in block.booking.transfer_lines]
+                        ) if block.booking else []}
+        accounts = self._calc_accounts()
         roots: list[dict[str, Any]] = []
         for full_path in sorted(block.booking.diffs_targeted.keys()
                                 if block.booking else []):