5adf85ab65
* feature/metafeeds: Restructured API, splitted menu and meta feed * feature/metafeeds: add field 'key' to Canteen * feature/metafeeds: added helper function for reverse urls * feature/metafeeds: added menu feed url to meta feed * feature/metafeeds: added missing test (added: testing meta feed rendering in retrievaltest) * feature/metafeeds: added feed index page * whitespace fix * feature/metafeeds: added alias urls * feature/metafeeds: moved meta feed default url * feature/metafeeds: moved index generation to views * feature/metafeeds: inlined builder instance creation * feature/metafeeds: removed unused 'menu' parameter * feature/metafeeds: replaced 'reverse' module with Flask's url_for * feature/metafeeds: removed unused import * feature/metafeeds: removed unused function parameters * feature/metafeeds: moved menu feed url generation to views.py * feature/metafeeds: cleanup debug prints removing debug prints that should never have been committed.
71 lines
1.7 KiB
Python
71 lines
1.7 KiB
Python
# -*- encoding: utf-8 -*-
|
|
|
|
from pyopenmensa.feed import LazyBuilder
|
|
|
|
|
|
PRICE_ROLE_MAPPING = {
|
|
'student': 'preis_s',
|
|
'other': 'preis_g',
|
|
'employee': 'preis_m'
|
|
}
|
|
|
|
|
|
def _active_days(menu):
|
|
for container in menu['wochentage']:
|
|
day = container['datum']
|
|
active = 'angebote' in day
|
|
if active:
|
|
yield day
|
|
|
|
|
|
def _notes(offer):
|
|
result = []
|
|
for label in offer['labels']:
|
|
result.append(label['name'].capitalize())
|
|
return result
|
|
|
|
|
|
def _prices(offer):
|
|
result = {}
|
|
for role, api_role in PRICE_ROLE_MAPPING.items():
|
|
if api_role not in offer:
|
|
continue
|
|
|
|
price = offer[api_role]
|
|
# When no price is set, this can be empty dict
|
|
if (isinstance(price, unicode) or isinstance(price, str)) and price.strip():
|
|
result[role] = str(price) # Convert unicode to str for PyOpenMensa -> misses type check
|
|
|
|
return result
|
|
|
|
|
|
def _process_day(builder, day):
|
|
for offer in day['angebote']:
|
|
builder.addMeal(date=day['data'],
|
|
category=offer['titel'],
|
|
name=offer['beschreibung'],
|
|
notes=_notes(offer),
|
|
prices=_prices(offer),
|
|
roles=None)
|
|
|
|
|
|
def render_menu(menu):
|
|
builder = LazyBuilder()
|
|
|
|
for day in _active_days(menu):
|
|
_process_day(builder, day)
|
|
|
|
return builder.toXMLFeed()
|
|
|
|
|
|
def render_meta(canteen, menu_feed_url):
|
|
builder = LazyBuilder()
|
|
|
|
builder.name = canteen.name
|
|
builder.address = canteen.street
|
|
builder.city = canteen.city
|
|
|
|
builder.define(name="full", priority="0", url=menu_feed_url, source=None, dayOfWeek="*", dayOfMonth="*", hour="8-18", minute="0", retry="30 1")
|
|
|
|
return builder.toXMLFeed()
|