Files
OpenMensa-Parser-STW-Potsdam/stw_potsdam/feed.py
T
Kai Fabian 5adf85ab65 feature/metafeeds: Support for canteen meta feeds and index feed (#2)
* 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.
2018-10-22 09:16:14 +02:00

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()