_SUFFIX_HTML = '.html'
_SUFFIX_JS = '.js'
_SUFFIX_STRUCTURED = 'structured'
+_PAGENAME_BALANCE = 'balance'
_PAGENAME_EDIT_STRUCTURED = f'{_PREFIX_EDIT}_{_SUFFIX_STRUCTURED}'
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))
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 []):