X-Git-Url: https://plomlompom.com/repos/process?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}}
+[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 %}
+{{l.acc|e}} | {{l.money|e}} |
+{% else %}
+ |
+{% endif %}
+{% endfor %}
+
+"""
+add_form_header = """
+"""
+add_free_html = """
+
+"""
+add_structured_html = """
+
+
+
+
+
+
+
+
+
+{% for line in booking_lines %}
+
+
+
+
+
+
+
+
+{% endfor %}
+{% for name, items in datalist_sets.items() %}
+
+{% 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}}
-[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 %}
-{{l.acc|e}} | {{l.money|e}} |
-{% else %}
- |
-{% endif %}
-{% endfor %}
-
-""")
- add_form_header = """
-"""
- 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('
') ##
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() %}
-
-{% 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: