From 4d65120d56fe7987344a362cd4423dfe72065256 Mon Sep 17 00:00:00 2001 From: Lukas Winkler Date: Fri, 9 Jun 2017 07:56:55 +0200 Subject: [PATCH] server --- .gitignore | 1 + init.sql | 2 +- main.py | 11 ++++--- parser/fladerei.py | 2 +- parser/zuppa.py | 2 +- requirements.txt | 7 +++++ server.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 server.py diff --git a/.gitignore b/.gitignore index 259ed2a..764c260 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __pycache__/ .idea +config.py diff --git a/init.sql b/init.sql index f5a72ee..e9948e8 100644 --- a/init.sql +++ b/init.sql @@ -15,7 +15,7 @@ create table menus venue int not null, meal int not null, constraint eindeutig - unique (venue, date), + unique (venue, date, meal), constraint menus_meals_id_fk foreign key (meal) references hunger.meals (id) ) diff --git a/main.py b/main.py index bd697f0..ac60b29 100644 --- a/main.py +++ b/main.py @@ -1,14 +1,13 @@ -import json - import pymysql.cursors +import config import parser # Connect to the database -connection = pymysql.connect(host='localhost', - user='root', - password='Findus', - db='hunger', +connection = pymysql.connect(host=config.host, + user=config.user, + password=config.password, + db=config.db, charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor) diff --git a/parser/fladerei.py b/parser/fladerei.py index 6e0e470..668ebe6 100644 --- a/parser/fladerei.py +++ b/parser/fladerei.py @@ -40,7 +40,7 @@ def get_menus(): descr += " " + extradescr date = datetime.strptime(datestring, "%d.%m.").replace(year=datetime.today().year) tagesflade = { - "date": date.strftime("%Y-%m-%d"), + "date": date.isoformat(), "name": descr } tagesfladen.append(tagesflade) diff --git a/parser/zuppa.py b/parser/zuppa.py index 8c08f5a..128000e 100644 --- a/parser/zuppa.py +++ b/parser/zuppa.py @@ -38,7 +38,7 @@ def get_menus(): if not any(str.isdigit(c) for c in strong.text): title.append(strong.text.strip()) tagesflade = { - "date": date.strftime("%Y-%m-%d"), + "date": date.isoformat(), "name": " ".join(title).replace("\n", " ") } day_p = p # findNext should find the second mea diff --git a/requirements.txt b/requirements.txt index 1925f6c..77f2b20 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,13 @@ beautifulsoup4==4.6.0 certifi==2017.4.17 chardet==3.0.3 +click==6.7 +Flask==0.12.2 idna==2.5 +itsdangerous==0.24 +Jinja2==2.9.6 +MarkupSafe==1.0 +PyMySQL==0.7.11 requests==2.17.3 urllib3==1.21.1 +Werkzeug==0.12.2 diff --git a/server.py b/server.py new file mode 100644 index 0000000..a18ef09 --- /dev/null +++ b/server.py @@ -0,0 +1,71 @@ +from datetime import date +from pprint import pprint + +import pymysql +from flask import Flask, jsonify, url_for, redirect, request, abort +from flask.json import JSONEncoder + +app = Flask(__name__) +import config + +# Connect to the database +connection = pymysql.connect(host=config.host, + user=config.user, + password=config.password, + db=config.db, + charset='utf8mb4', + cursorclass=pymysql.cursors.DictCursor) + + +@app.route('/venue/') +def get_venues(): + with connection.cursor() as cursor: + sql = "SELECT * FROM venues" + cursor.execute(sql) + venues = cursor.fetchall() + for venue in venues: + # venue["meals_url"] = url_for("get_meals", venueid=venue["id"]) + venue["meals_url"] = url_for("get_meals", venueid=venue["id"], _external=True) + return jsonify(venues) + + +@app.route('/venue//') +def get_meals(venueid): + with connection.cursor() as cursor: + select = request.args.get("select") + if not select or select == "week": + sql_range = " AND YEARWEEK(date, 1) = YEARWEEK(CURDATE(), 1)" + elif select == "today": + sql_range = " AND date=CURDATE()" + else: + return abort(400) + sql = """SELECT venue, date, name, description +FROM menus + JOIN meals ON meals.id = menus.meal +WHERE venue = %s""" + cursor.execute(sql + sql_range, venueid) + menues = cursor.fetchall() + return jsonify(menues) + + +@app.route("/") +def redirect_to_correct_api(): + return redirect(url_for("get_venues")) + + +class CustomJSONEncoder(JSONEncoder): + def default(self, obj): + try: + if isinstance(obj, date): + return obj.isoformat() + iterable = iter(obj) + except TypeError: + pass + else: + return list(iterable) + return JSONEncoder + + +if __name__ == "__main__": + app.json_encoder = CustomJSONEncoder + app.run(host="0.0.0.0", debug=True)