X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=calories.py;h=5d2fc98c3aaf99ceaeae0708e6f06094370c8bc3;hb=169d6b20b9f3d63508180971426db3bc195a3581;hp=771b11af8eab34f14e683066b1acf521e409b10e;hpb=e6eeaa6d863dfcef8bf60715e418b875a3dcc800;p=misc diff --git a/calories.py b/calories.py index 771b11a..5d2fc98 100644 --- a/calories.py +++ b/calories.py @@ -1,33 +1,34 @@ from http.server import BaseHTTPRequestHandler, HTTPServer import os import json +import datetime + +hostName = "localhost" +serverPort = 8081 def build_page(eatable_rows, consumption_rows, eatables_selection, day_rows): return """ """ + f"""
- -{eatable_rows} + +{consumption_rows} - + - - - - - + + + +
titlecaloriessugar (g)standard weight (g)commentsdelete
eatableunit countunit weight (g)caloriessugar (g)
add:add from DB:
@@ -35,32 +36,51 @@ td, th { {day_rows}
- -{consumption_rows} + +{eatable_rows} - + - - - + + + + +
eatableunit countunit weight (g)caloriessugar (g)
titlecaloriessugar (g)standard weight (g)commentsdelete
add from DB:add:
-""" + + +""" class LockFileDetected(Exception): pass class Eatable: - def __init__(self, title, cals, sugar_g, standard_g=100, comments=""): + def __init__(self, title, cals, sugar_g, standard_g=100, comments="", popularity=0): self.title = title self.cals = cals # per 100g self.sugar_g = sugar_g # per 100g self.standard_g = standard_g # common unit weight - self.comments = comments + self.comments = comments + self.popularity = popularity def to_dict(self): return { @@ -68,19 +88,22 @@ class Eatable: "cals": self.cals, "sugar_g": self.sugar_g, "standard_g": self.standard_g, - "comments": self.comments + "comments": self.comments, + "popularity": self.popularity } class Consumption: - def __init__(self, eatable_key, unit_count=None): - self.eatable_key = eatable_key + def __init__(self, eatable_key, unit_count=None, keep_visible=0): + self.eatable_key = eatable_key self.unit_count = unit_count + self.keep_visible = keep_visible def to_dict(self): return { "eatable_key": self.eatable_key, "unit_count": self.unit_count, + "keep_visible": self.keep_visible } class Day: @@ -95,7 +118,7 @@ class Day: "sugar_g": self.sugar_g, } -class Database: +class Database: def __init__(self, load_from_file=True): db_name = "calories_db" @@ -133,27 +156,30 @@ class Database: eatable = self.eatables[c.eatable_key] calories = eatable.cals * c.unit_count sugar_g = eatable.sugar_g * c.unit_count - # calories = float(eatable.cals / eatable.standard_g) * c.unit_count * c.unit_weight - # sugar_g = float(eatable.sugar_g / eatable.standard_g) * c.unit_count * c.unit_weight self.today.calories += calories self.today.sugar_g += sugar_g return {"cals": calories, "sugar": sugar_g } - def eatables_selection(self, selection=None): - html = '' # if selection else '' % (k, selected, v.title) + def eatables_selection(self): + html = '' + already_selected = [c.eatable_key for c in self.consumptions] + for k, v in sorted(self.eatables.items(), key=lambda item: item[1].title): + if k in already_selected: + continue + v = self.eatables[k] + html += '' % (k, v.title) return html def add_eatable(self, id_, eatable): self.eatables[id_] = eatable def add_consumption(self, consumption): - self.consumptions += [consumption] + self.consumptions += [consumption] - def add_day(self, date, day): - self.days[date] = day + def add_day(self, date, day, archives_today=False): + if archives_today: + date = date + str(datetime.datetime.now())[10:] + self.days[date] = day def set_today_date(self, today_date): self.today_date = today_date @@ -179,7 +205,6 @@ class MyServer(BaseHTTPRequestHandler): def do_POST(self): from uuid import uuid4 from urllib.parse import parse_qs - import datetime length = int(self.headers['content-length']) postvars = parse_qs(self.rfile.read(length).decode(), keep_blank_values=1) db = Database(False) @@ -198,31 +223,40 @@ class MyServer(BaseHTTPRequestHandler): if uuid not in to_delete: e = Eatable(decode("title", i, False), decode("cals", i), decode("sugar_g", i), decode("standard_g", i), decode("comments", i, False)) db.add_eatable(uuid, e) - i += 1 + i += 1 if 'title' in postvars.keys() and len(postvars['title'][i]) > 0: e = Eatable(decode("title", i, False), decode("cals", i), decode("sugar_g", i), decode("standard_g", i), decode("comments", i, False)) db.add_eatable(str(uuid4()), e) i = 0 if 'eatable_key' in postvars.keys(): for eatable_key in postvars['eatable_key']: - c = Consumption(decode("eatable_key", i, False), decode("unit_count", i)) - i += 1 - if c.unit_count == 0: + c = Consumption(decode("eatable_key", i, False), decode("unit_count", i), decode("keep_visible", i)) + i += 1 + if c.unit_count == 0 and c.keep_visible == 0: continue db.add_consumption(c) i = 0 if 'day_date' in postvars.keys(): for date in postvars['day_date']: db.add_day((date), Day(decode("day_cals", i), decode("day_sugar", i))) - i += 1 + i += 1 if 'new_date' in postvars.keys(): db.set_today_date(postvars["new_date"][0]) if 'archive_day' in postvars.keys(): new_cals = postvars["new_day_cals"][0] new_sugar = postvars["new_day_sugar"][0] - db.add_day(db.today_date, Day(float(new_cals), float(new_sugar))) - db.set_today_date(str(datetime.datetime.now()))#[:10]) + db.add_day(db.today_date, Day(float(new_cals), float(new_sugar)), archives_today=True) + db.set_today_date(str(datetime.datetime.now())[:10]) + for c in db.consumptions: + if c.unit_count > 0: + db.eatables[c.eatable_key].popularity += 1 db.consumptions = [] + default_slots = 10 + for k, v in sorted(db.eatables.items(), key=lambda item: -item[1].popularity): + db.add_consumption(Consumption(k, 0)) + default_slots -= 1 + if (default_slots <= 0): + break try: db.write() self.send_response(302) @@ -244,47 +278,48 @@ class MyServer(BaseHTTPRequestHandler): eatables += ""\ ""\ ""\ - ""\ - ""\ - ""\ + ""\ + ""\ + ""\ ""\ ""\ "" % (k, v.title, v.cals, v.sugar_g, v.standard_g, v.comments, k) consumptions = "" + db.consumptions = sorted(db.consumptions, key=lambda x: db.eatables[x.eatable_key].title) for c in db.consumptions: r = db.calc_consumption(c) consumptions += ""\ - ""\ - ""\ + ""\ + ""\ + "%s"\ ""\ - "%.1f"\ - "%.1f"\ - "" % (db.eatables_selection(c.eatable_key), c.unit_count, r["cals"], r["sugar"]) + "%.1f"\ + "%.1f"\ + "" % (c.eatable_key, c.unit_count, db.eatables[c.eatable_key].title, r["cals"], r["sugar"]) day_rows = "" - for date, day in db.days.items(): - day_rows += ""\ + for date in sorted(db.days.keys()): + day = db.days[date] + day_rows = ""\ "%s"\ - "%.1f"\ - "%.1f"\ - "" % (date, date[:10], day.calories, day.calories, day.sugar_g, day.sugar_g) - day_rows += ""\ + "%.1f"\ + "%.1f"\ + "" % (date, date[:10], day.calories, day.calories, day.sugar_g, day.sugar_g) + day_rows + day_rows = ""\ "today:archive?"\ ""\ ""\ ""\ - "%.1f"\ - "%.1f"\ + "%.1f"\ + "%.1f"\ ""\ - "" % (db.today_date, db.today.calories, db.today.calories, db.today.sugar_g, db.today.sugar_g) + "" % (db.today_date, db.today.calories, db.today.calories, db.today.sugar_g, db.today.sugar_g) + day_rows page = build_page(eatables, consumptions, db.eatables_selection(), day_rows) self.wfile.write(bytes(page, "utf-8")) -hostName = "localhost" -serverPort = 8080 -if __name__ == "__main__": +if __name__ == "__main__": webServer = HTTPServer((hostName, serverPort), MyServer) - print("Server started http://%s:%s" % (hostName, serverPort)) + print(f"Server started http://{hostName}:{serverPort}") try: webServer.serve_forever() except KeyboardInterrupt: