X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=ledger.py;h=244a68444c6d60901330cd3df6ff637be24553f6;hb=436e0f40b45319ef4452ce6ced1a3c3df813119b;hp=b4d9fd99191af8cdf3a45d2686654b4b371eb3fe;hpb=5f3b9e7eb997cacea086decc3dcd04d6619b9121;p=misc diff --git a/ledger.py b/ledger.py index b4d9fd9..244a684 100755 --- a/ledger.py +++ b/ledger.py @@ -1,6 +1,4 @@ -from http.server import BaseHTTPRequestHandler, HTTPServer import os -import html import jinja2 import decimal from datetime import datetime, timedelta @@ -8,6 +6,89 @@ from urllib.parse import parse_qs, urlparse from plomlib import PlomDB, PlomException, run_server, run_server, PlomServer server_port = 8082 +db_path = '/home/plom/org/ledger2023.dat' + +html_head = """ + + +ledger +balance +add free +add structured +
+""" +booking_html = """ +

{{date}} {{desc}} {{head_comment|e}}
+[edit: structured +/ free +| copy:structured +/ free +| move {% if move_up %}up{% else %}up{% endif %}/{% if move_down %}down{% else %}down{% endif %} +| balance after +] + +{% for l in booking_lines %} +{% if l.acc %} + +{% else %} + +{% endif %} +{% endfor %} +
{{l.acc|e}}{{l.money|e}}{{l.comment|e}}
{{l.comment|e}}

+""" +add_form_header = """
+ + +""" +add_form_footer = """ + + + +
+""" +add_free_html = """
+ +""" +add_structured_html = """ + + + +
+ + + + +
+{% for line in booking_lines %} + + + + + + + +
+{% endfor %} +{% for name, items in datalist_sets.items() %} + +{% for item in items %} + +{% endfor %} + +{% endfor %} +""" def apply_booking_to_account_balances(account_sums, account, currency, amount): @@ -256,7 +337,7 @@ class LedgerDB(PlomDB): self.bookings = [] self.comments = [] self.real_lines = [] - super().__init__('_ledger') + super().__init__(db_path) ret = parse_lines(self.real_lines) self.bookings += ret[0] self.comments += ret[1] @@ -433,55 +514,9 @@ class LedgerDB(PlomDB): class LedgerServer(PlomServer): - header = """ - - - -ledger -balance -add free -add structured -
-""" - booking_tmpl = jinja2.Template(""" -

{{date}} {{desc}} {{head_comment|e}}
-[edit: structured -/ free -| copy:structured -/ free -| move {% if move_up %}up{% else %}up{% endif %}/{% if move_down %}down{% else %}down{% endif %} -| balance after -] - -{% for l in booking_lines %} -{% if l.acc %} - -{% else %} - -{% endif %} -{% endfor %} -
{{l.acc|e}}{{l.money|e}}{{l.comment|e}}
{{l.comment|e}}

-""") - add_form_header = """
- - -""" - add_form_footer = """ - - - -
-""" - footer = "\n" + + def pre_init(self): + self.html_head += [html_head] def do_POST(self): try: @@ -522,15 +557,14 @@ input[type=number] { text-align: right; font-family: monospace; } nth = db.get_nth_for_booking_of_start_line(new_start) if new_start > start: nth -= 1 - redir_url = f'/#{nth}' - self.send_code_and_headers(302, [('Location', redir_url)]) + self.redirect( f'/#{nth}') # otherwise just re-build editing form else: if '/add_structured' == parsed_url.path: edit_content = self.add_structured(db, start, end, temp_lines=lines, add_empty_line=add_empty_line) else: edit_content = self.add_free(db, start, end) - self.send_HTML(self.header + edit_content + self.footer) + self.send_HTML(edit_content) except PlomException as e: self.fail_400(e) @@ -541,29 +575,27 @@ input[type=number] { text-align: right; font-family: monospace; } start = int(params.get('start', ['0'])[0]) end = int(params.get('end', ['0'])[0]) db = LedgerDB() - page = self.header if parsed_url.path == '/balance': stop = params.get('stop', [None])[0] - page += self.balance_as_html(db, stop) + page = self.balance_as_html(db, stop) elif parsed_url.path == '/add_free': - page += self.add_free(db, start, end) + page = self.add_free(db, start, end) elif parsed_url.path == '/add_structured': - page += self.add_structured(db, start, end) + page = self.add_structured(db, start, end) elif parsed_url.path == '/copy_free': - page += self.add_free(db, start, end, copy=True) + page = self.add_free(db, start, end, copy=True) elif parsed_url.path == '/copy_structured': - page += self.add_structured(db, start, end, copy=True) + page = self.add_structured(db, start, end, copy=True) elif parsed_url.path == '/move_up': nth = self.move_up(db, start, end) - self.send_code_and_headers(302, [('Location', f'/#{nth}')]) + self.redirect(f'/#{nth}') return elif parsed_url.path == '/move_down': nth = self.move_down(db, start, end) - self.send_code_and_headers(302, [('Location', f'/#{nth}')]) + self.redirect(f'/#{nth}') return else: - page += self.ledger_as_html(db) - page += self.footer + page = self.ledger_as_html(db) self.send_HTML(page) except PlomException as e: self.fail_400(e) @@ -644,6 +676,7 @@ input[type=number] { text-align: right; font-family: monospace; } return f"
{content}
" def ledger_as_html(self, db): + booking_tmpl = jinja2.Template(booking_html) single_c_tmpl = jinja2.Template('{{c|e}}
') ## elements_to_write = [] last_i = i = 0 ## @@ -665,7 +698,7 @@ input[type=number] { text-align: right; font-family: monospace; } if booking_line[1] is not None: money = f'{booking_line[1]} {booking_line[2]}' booking_lines += [{'acc': booking_line[0], 'money':money, 'comment':comment}] ## - elements_to_write += [self.booking_tmpl.render( + elements_to_write += [booking_tmpl.render( nth=nth, start=booking.start_line, end=booking_end, @@ -679,46 +712,14 @@ input[type=number] { text-align: right; font-family: monospace; } return '\n'.join(elements_to_write) def add_free(self, db, start=0, end=0, copy=False): - tmpl = jinja2.Template(self.add_form_header + """
- -""" + self.add_form_footer) + tmpl = jinja2.Template(add_form_header + add_free_html + add_form_footer) lines = db.get_lines(start, end) if copy: start = end = 0 return tmpl.render(action='add_free', start=start, end=end, lines=lines) def add_structured(self, db, start=0, end=0, copy=False, temp_lines=[], add_empty_line=None): - tmpl = jinja2.Template(self.add_form_header + """ - - - -
- - - - -
-{% for line in booking_lines %} - - - - - - - -
-{% endfor %} -{% for name, items in datalist_sets.items() %} - -{% for item in items %} - -{% endfor %} - -{% endfor %} -""" + self.add_form_footer) + tmpl = jinja2.Template(add_form_header + add_structured_html + add_form_footer) lines = temp_lines if len(''.join(temp_lines)) > 0 else db.get_lines(start, end) bookings, comments = parse_lines(lines, validate_bookings=False) if len(bookings) > 1: