def build_page(eatable_rows, consumption_rows, eatables_selection, day_rows):
return """<html>
<meta charset="UTF-8">
<style>
def build_page(eatable_rows, consumption_rows, eatables_selection, day_rows):
return """<html>
<meta charset="UTF-8">
<style>
-table {
- margin-bottom: 2em;
-}
-td, th {
- text-align: right;
-}
+table { margin-bottom: 2em; }
+th, td { text-align: left; }
+td.number { text-align: right; }
+input[type="number"] { text-align: right; }
-<td><input name="title" type="text" value="" /></td>
-<td><input name="cals" type="number" min="0" step="0.1" value="0" /></td>
-<td><input name="sugar_g" type="number" min="0" step="0.1" value="0" /></td>
-<td><input name="standard_g" type="number" min="1" step="0.1" value="1" /></td>
-<td><input name="comments" type="text" value="" /></td>
+<input type="hidden" name="keep_visible" value="0">
+<td><select name="eatable_key">{eatables_selection}</select></td>
+<td class="number"><input class="unit_count" name="unit_count" type="number" step="0.1" min="0" value="0" /></td>
+<td></td>
-<td><select name="eatable_key">{eatables_selection}</select></td>
-<td><input name="unit_count" type="number" step="1" min="0" value="0" /></td>
-<td></td>
+<td><input name="title" type="text" value="" /></td>
+<td class="number"><input name="cals" type="number" min="0" step="0.1" value="0" /></td>
+<td class="number"><input name="sugar_g" type="number" min="0" step="0.1" value="0" /></td>
+<td class="number"><input name="standard_g" type="number" min="1" step="0.1" value="1" /></td>
+<td><input name="comments" type="text" value="" /></td>
+<script>
+""" + """
+var unit_count_inputs = document.getElementsByClassName("unit_count");
+for (let i = 0; i < unit_count_inputs.length; i++) {
+ let input = unit_count_inputs[i];
+ let button = document.createElement('button');
+ button.innerHTML = '+1';
+ button.onclick = function(event) {
+ event.preventDefault();
+ input.value = parseFloat(input.value) + 1.0;
+ };
+ input.insertAdjacentElement('afterend', button);
+}
+
+</script>
+</html>
+"""
- 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.title = title
self.cals = cals # per 100g
self.sugar_g = sugar_g # per 100g
self.standard_g = standard_g # common unit weight
- 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
def to_dict(self):
return {
"eatable_key": self.eatable_key,
"unit_count": self.unit_count,
def to_dict(self):
return {
"eatable_key": self.eatable_key,
"unit_count": self.unit_count,
eatable = self.eatables[c.eatable_key]
calories = eatable.cals * c.unit_count
sugar_g = eatable.sugar_g * c.unit_count
eatable = self.eatables[c.eatable_key]
calories = eatable.cals * c.unit_count
sugar_g = eatable.sugar_g * c.unit_count
self.today.calories += calories
self.today.sugar_g += sugar_g
return {"cals": calories, "sugar": sugar_g }
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 '<option value="" />'
- for k,v in self.eatables.items():
- selected = ' selected' if k==selection else ''
- html += '<option value="%s"%s>%s</option>' % (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 += '<option value="%s">%s</option>' % (k, v.title)
return html
def add_eatable(self, id_, eatable):
self.eatables[id_] = eatable
def add_consumption(self, consumption):
return html
def add_eatable(self, id_, eatable):
self.eatables[id_] = eatable
def add_consumption(self, 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
def set_today_date(self, today_date):
self.today_date = today_date
length = int(self.headers['content-length'])
postvars = parse_qs(self.rfile.read(length).decode(), keep_blank_values=1)
db = Database(False)
length = int(self.headers['content-length'])
postvars = parse_qs(self.rfile.read(length).decode(), keep_blank_values=1)
db = Database(False)
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)
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)
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']:
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)))
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)))
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]
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
+ 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
eatables += "<tr>"\
"<input name=\"eatable_uuid\" type=\"hidden\" value=\"%s\" />"\
"<td><input name=\"title\" value=\"%s\" /></td>"\
eatables += "<tr>"\
"<input name=\"eatable_uuid\" type=\"hidden\" value=\"%s\" />"\
"<td><input name=\"title\" value=\"%s\" /></td>"\
- "<td><input name=\"cals\" type=\"number\" step=\"0.1\" min=\"0\" value=\"%.1f\" /></td>"\
- "<td><input name=\"sugar_g\" type=\"number\" step=\"0.1\" min=\"0\" value=\"%.1f\" /></td>"\
- "<td><input name=\"standard_g\" type=\"number\" step=\"0.1\" min=\"1\" value=\"%1.f\" /></td>"\
+ "<td class\"number\"><input name=\"cals\" type=\"number\" step=\"0.1\" min=\"0\" value=\"%.1f\" /></td>"\
+ "<td class\"number\"><input name=\"sugar_g\" type=\"number\" step=\"0.1\" min=\"0\" value=\"%.1f\" /></td>"\
+ "<td class\"number\"><input name=\"standard_g\" type=\"number\" step=\"0.1\" min=\"1\" value=\"%1.f\" /></td>"\
"<td><input name=\"comments\" value=\"%s\" /></td>"\
"<td><input name=\"delete\" type=\"checkbox\" value=\"%s\" /></td>"\
"</tr>" % (k, v.title, v.cals, v.sugar_g, v.standard_g, v.comments, k)
consumptions = ""
"<td><input name=\"comments\" value=\"%s\" /></td>"\
"<td><input name=\"delete\" type=\"checkbox\" value=\"%s\" /></td>"\
"</tr>" % (k, v.title, v.cals, v.sugar_g, v.standard_g, v.comments, k)
consumptions = ""
for c in db.consumptions:
r = db.calc_consumption(c)
consumptions += "<tr />"\
for c in db.consumptions:
r = db.calc_consumption(c)
consumptions += "<tr />"\
- "<td><select name=\"eatable_key\">%s</select></td>"\
- "<td><input name=\"unit_count\" type=\"number\" min=\"0\" value=\"%d\" /></td>"\
+ "<input type=\"hidden\" name=\"keep_visible\" value=\"1\"><input name=\"eatable_key\" type=\"hidden\" value=\"%s\">"\
+ "<td>%s</td>"\
+ "<td class\"number\"><input class=\"unit_count number\" name=\"unit_count\" type=\"number\" min=\"0\" step=\"0.1\" value=\"%.1f\" /></td>"\
- "<td>%.1f</td>"\
- "<td>%.1f</td>"\
- "</tr>" % (db.eatables_selection(c.eatable_key), c.unit_count, r["cals"], r["sugar"])
+ "<td class=\"number\">%.1f</td>"\
+ "<td class=\"number\">%.1f</td>"\
+ "</tr>" % (c.eatable_key, db.eatables[c.eatable_key].title, c.unit_count, r["cals"], r["sugar"])
- "<td><input name=\"day_cals\" type=\"hidden\" step=\"0.1\" min=\"0\" value=\"%.1f\" />%.1f</td>"\
- "<td><input name=\"day_sugar\" type=\"hidden\" step=\"0.1\" min=\"0\" value=\"%.1f\" />%.1f</td>"\
- "</tr>" % (date, date[:10], day.calories, day.calories, day.sugar_g, day.sugar_g)
- day_rows += "<tr>"\
+ "<td class=\"number\"><input name=\"day_cals\" type=\"hidden\" step=\"0.1\" min=\"0\" value=\"%.1f\" />%.1f</td>"\
+ "<td class=\"number\"><input name=\"day_sugar\" type=\"hidden\" step=\"0.1\" min=\"0\" value=\"%.1f\" />%.1f</td>"\
+ "</tr>" % (date, date[:10], day.calories, day.calories, day.sugar_g, day.sugar_g) + day_rows
+ day_rows = "<tr>"\
"<th>today:</th><th></th><th></th><th>archive?</th>"\
"</tr>"\
"<tr>"\
"<td><input name=\"new_date\" size=8 value=\"%s\" /></td>"\
"<th>today:</th><th></th><th></th><th>archive?</th>"\
"</tr>"\
"<tr>"\
"<td><input name=\"new_date\" size=8 value=\"%s\" /></td>"\
- "<td><input name=\"new_day_cals\" type=\"hidden\" value=\"%.1f\" readonly />%.1f</td>"\
- "<td><input name=\"new_day_sugar\" type=\"hidden\" value=\"%.1f\" readonly />%.1f</td>"\
+ "<td class=\"number\"><input name=\"new_day_cals\" type=\"hidden\" value=\"%.1f\" readonly />%.1f</td>"\
+ "<td class=\"number\"><input name=\"new_day_sugar\" type=\"hidden\" value=\"%.1f\" readonly />%.1f</td>"\
- "</tr>" % (db.today_date, db.today.calories, db.today.calories, db.today.sugar_g, db.today.sugar_g)
+ "</tr>" % (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"))
page = build_page(eatables, consumptions, db.eatables_selection(), day_rows)
self.wfile.write(bytes(page, "utf-8"))