Add python code
This commit is contained in:
parent
32e9302a10
commit
01d4a8b415
5 changed files with 212 additions and 0 deletions
17
app.py
Normal file
17
app.py
Normal file
|
@ -0,0 +1,17 @@
|
|||
from flask import Flask, abort
|
||||
|
||||
import parsers
|
||||
import utils
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
parsers.define_parsers()
|
||||
|
||||
|
||||
@app.route('/mensa/<parser_name>/<mensa_name>')
|
||||
def mensa(parser_name, mensa_name):
|
||||
try:
|
||||
return utils.get_parser(parser_name).parse(mensa_name)
|
||||
except KeyError:
|
||||
abort(404)
|
||||
|
5
parsers/__init__.py
Normal file
5
parsers/__init__.py
Normal file
|
@ -0,0 +1,5 @@
|
|||
from parsers import tuebingen
|
||||
|
||||
|
||||
def define_parsers():
|
||||
tuebingen.define_parsers()
|
76
parsers/tuebingen.json
Normal file
76
parsers/tuebingen.json
Normal file
|
@ -0,0 +1,76 @@
|
|||
{
|
||||
"name": "tuebingen-hohenheim",
|
||||
"base_url": "https://www.my-stuwe.de/wp-json/mealplans/v1/canteens/",
|
||||
"canteens": [
|
||||
{
|
||||
"id": "mensa-shedhalle",
|
||||
"suffix": "611",
|
||||
"name": "Mensa Shedhalle",
|
||||
"street": "Schlachthausstraße 13",
|
||||
"city": "72074 Tübingen"
|
||||
},
|
||||
{
|
||||
"id": "mensa-morgenstelle",
|
||||
"suffix": "621",
|
||||
"name": "Mensa Morgenstelle",
|
||||
"street": "Auf der Morgenstelle 26",
|
||||
"city": "72076 Tübingen"
|
||||
},
|
||||
{
|
||||
"id": "mensa-prinz_karl",
|
||||
"suffix": "623",
|
||||
"name": "Mensa Prinz Karl",
|
||||
"street": "Hafengasse 6",
|
||||
"city": "72070 Tübingen"
|
||||
},
|
||||
{
|
||||
"id": "mensa-hohenheim",
|
||||
"suffix": "661",
|
||||
"name": "Mensa Hohenheim",
|
||||
"street": "Garbenstraße 29",
|
||||
"city": "70599 Stuttgart"
|
||||
},
|
||||
{
|
||||
"id": "mensa-reutlingen",
|
||||
"suffix": "631",
|
||||
"name": "Mensa Reutlingen",
|
||||
"street": "Alteburgstraße 150 Gebäude 7",
|
||||
"city": "72762 Reutlingen"
|
||||
},
|
||||
{
|
||||
"id": "mensa-nuertingen",
|
||||
"suffix": "665",
|
||||
"name": "Mensa Nürtingen",
|
||||
"street": "Neckarsteige 6-10",
|
||||
"city": "72622 Nürtingen"
|
||||
},
|
||||
{
|
||||
"id": "mensa-rottenburg",
|
||||
"suffix": "655",
|
||||
"name": "Mensa Rottenburg",
|
||||
"street": "Schadenweiler Hof 1",
|
||||
"city": "72108 Rottenburg"
|
||||
},
|
||||
{
|
||||
"id": "mensa-albstadt",
|
||||
"suffix": "645",
|
||||
"name": "Mensa Albstadt",
|
||||
"street": "Jakobstraße 1",
|
||||
"city": "72458 Albstadt"
|
||||
},
|
||||
{
|
||||
"id": "mensa-sigmaringen",
|
||||
"suffix": "640",
|
||||
"name": "Mensa Sigmaringen",
|
||||
"street": "Anton-Günther-Straße 51",
|
||||
"city": " 72488 Sigmaringen"
|
||||
},
|
||||
{
|
||||
"id": "cafeteria-morgenstelle",
|
||||
"suffix": "724",
|
||||
"name": "Cafeteria Morgenstelle",
|
||||
"street": "Auf der Morgenstelle 26",
|
||||
"city": "72076 Tübingen"
|
||||
}
|
||||
]
|
||||
}
|
93
parsers/tuebingen.py
Normal file
93
parsers/tuebingen.py
Normal file
|
@ -0,0 +1,93 @@
|
|||
import json
|
||||
import re
|
||||
from urllib.request import urlopen, Request
|
||||
|
||||
from pyopenmensa.feed import LazyBuilder
|
||||
|
||||
from utils import Parser
|
||||
|
||||
allergens = {
|
||||
'Gl-a': 'Weizen',
|
||||
'Gl-b': 'Roggen',
|
||||
'Gl-c': 'Gerste',
|
||||
'Gl-d': 'Hafer',
|
||||
'Gl-e': 'Dinkel',
|
||||
'Nu-a': 'Mandeln',
|
||||
'Ei': 'Eier',
|
||||
'Er': 'Erdnüsse',
|
||||
'So': 'Soja',
|
||||
'Sn': 'Senf',
|
||||
'Kr': 'Krebstiere (Krusten- und Schalentiere)',
|
||||
'Fi': 'Fisch',
|
||||
'ML': 'Milch/Laktose',
|
||||
'Se': 'Sellerie',
|
||||
'Sf': 'Schwefeldioxid und Sulfite',
|
||||
'Sa': 'Sesam',
|
||||
'Lu': 'Lupine',
|
||||
'We': 'Weichtiere',
|
||||
'ALK': 'Alkohol'
|
||||
}
|
||||
|
||||
additives = {
|
||||
'1': 'Farbstoff',
|
||||
'2': 'Konservierungsstoff',
|
||||
'3': 'Nitritpökelsalz',
|
||||
'4': 'Antioxidationsmittel',
|
||||
'5': 'Geschmacksverstärker',
|
||||
'6': 'geschwefelt',
|
||||
'7': 'geschwärzt',
|
||||
'8': 'gewachst',
|
||||
'9': 'Süßungsmittel',
|
||||
'10': 'enthält eine Phenylalaninquelle',
|
||||
'11': 'Phosphat'
|
||||
}
|
||||
|
||||
legend = {
|
||||
'F': 'Fisch', 'G': 'Geflügel', 'K': 'Kalb',
|
||||
'L': 'Lamm', 'R': 'Rind', 'S': 'Schwein',
|
||||
'W': 'Wild', 'top': 'Empfehlung',
|
||||
'V': 'vegetarisch', 'vegan': 'vegan',
|
||||
}
|
||||
|
||||
multiple_whitespaces_regex = re.compile('\\s{2,}')
|
||||
|
||||
|
||||
def parse_url(url, today=False):
|
||||
canteen = LazyBuilder()
|
||||
with urlopen(Request(url, None, {'User-Agent': 'Mozilla/5.0'})) as response:
|
||||
data = json.loads(response.read())
|
||||
if len(data) == 0:
|
||||
return canteen.toXMLFeed()
|
||||
canteen_data = data[list(data)[0]]
|
||||
menus = canteen_data['menus']
|
||||
canteen.name = canteen_data['canteen']
|
||||
canteen.setLegendData(legend)
|
||||
|
||||
for menu in menus:
|
||||
canteen.addMeal(menu['menuDate'], menu['menuLine'],
|
||||
build_menu_name(menu['menu']) if len(menu['menu']) != 0 else menu['menuLine'],
|
||||
build_allergens_additives(menu['allergens'], menu['additives']),
|
||||
{'student': menu['studentPrice'], 'pupil': menu['pupilPrice'], 'other': menu['guestPrice']})
|
||||
return canteen.toXMLFeed()
|
||||
|
||||
|
||||
def build_menu_name(menu):
|
||||
output = ', '.join(menu)
|
||||
output = multiple_whitespaces_regex.sub(' ', output)
|
||||
output = output.replace(' [', '(').replace(']', ')').replace('(vegan)', '')
|
||||
return output
|
||||
|
||||
|
||||
def build_allergens_additives(raw_allergens, raw_additives):
|
||||
output = [allergens.get(element, element) for element in raw_allergens] + \
|
||||
[additives.get(element, element) for element in raw_additives]
|
||||
return output
|
||||
|
||||
|
||||
def define_parsers():
|
||||
with open('parsers/tuebingen.json') as canteen_file:
|
||||
canteen_json = json.load(canteen_file)
|
||||
|
||||
parser = Parser(canteen_json['name'], handler=parse_url, shared_prefix=canteen_json['base_url'])
|
||||
for canteen in canteen_json['canteens']:
|
||||
parser.define(canteen['id'], canteen['suffix'])
|
21
utils.py
Normal file
21
utils.py
Normal file
|
@ -0,0 +1,21 @@
|
|||
parser_list = {}
|
||||
|
||||
|
||||
class Parser:
|
||||
sources = {}
|
||||
|
||||
def __init__(self, name, handler, shared_prefix: str):
|
||||
self.name = name
|
||||
self.handler = handler
|
||||
self.shared_prefix = shared_prefix
|
||||
parser_list[name] = self
|
||||
|
||||
def define(self, name: str, suffix: str):
|
||||
self.sources[name] = suffix
|
||||
|
||||
def parse(self, source: str):
|
||||
return self.handler(self.shared_prefix + self.sources[source])
|
||||
|
||||
|
||||
def get_parser(parser_name: str) -> Parser:
|
||||
return parser_list[parser_name]
|
Loading…
Reference in a new issue