Make /resto deal with vegan and unrecognized kinds

Better to show a fallback category if a kind isn't recognized than
nothing at all!

The code is refactored to have a table definition in RESTO_TABLES, this
allows to DRY when recognizing unrecognized meals (hah).

The ** operator is used to copy dicts while being able to amend them:
{**meal, "name": …} is a copy of meal but with a different name.
This commit is contained in:
Midgard 2019-09-23 16:25:34 +02:00
parent b5033e8b0c
commit 5ba49e6ecd
Signed by: midgard
GPG Key ID: 511C112F1331BBB4
1 changed files with 37 additions and 9 deletions

View File

@ -246,12 +246,24 @@ RESTO_TEMPLATE = """
## Vegetoarisch
{vegi_table}
{uncategorized}
## Groensels
{vegetable_table}
"""
UNCATEGORIZED_TEMPLATE = """
## Nog etwad anders...
{}
"""
RESTO_TABLES = {
"soup_table": {"soup"},
"meat_table": {"meat"},
"fish_table": {"fish"},
"vegi_table": {"vegetarian", "vegan"},
}
@app.route('/resto', methods=['GET'])
def resto_menu():
today = datetime.today()
@ -262,11 +274,14 @@ def resto_menu():
if not resto["open"]:
return 'De resto is vandaag gesloten.'
else:
def table_for(kind):
items = [meal for meal in resto["meals"] if meal["kind"] == kind]
if len(items) == 0:
def table_for(kinds):
items = [meal for meal in resto["meals"] if meal["kind"] in kinds]
return format_items(items)
def format_items(items):
if not items:
return "None :("
maxwidth = max(map(lambda item: len(item["name"]), items))
maxwidth = max(len(item["name"]) for item in items)
return "\n".join("{name: <{width}}{price}".format(
name=item["name"],
width=maxwidth + 2,
@ -274,11 +289,24 @@ def resto_menu():
for item in items
)
recognized_kinds = set.union(*RESTO_TABLES.values())
uncategorized_meals = [
meal for meal in resto["meals"]
if meal["kind"] not in recognized_kinds
]
uncategorized = "" if not uncategorized_meals else \
UNCATEGORIZED_TEMPLATE.format(
format_items([
# Small hack: change "name" into "name (kind)"
{**meal, "name": "{} ({})".format(meal["name"], meal["kind"])}
for meal in uncategorized_meals
])
)
return RESTO_TEMPLATE.format(
soup_table=table_for("soup"),
meat_table=table_for("meat"),
fish_table=table_for("fish"),
vegi_table=table_for("vegetarian"),
**{k: table_for(v) for k,v in RESTO_TABLES.items()},
uncategorized=uncategorized,
vegetable_table="\n".join(resto["vegetables"])
)