From d32686b6d5cbf3b1b81f59d9a9435ef2529cd25e Mon Sep 17 00:00:00 2001 From: marcsello Date: Thu, 24 Sep 2020 17:09:02 +0200 Subject: [PATCH] Did done --- .gitignore | 8 +++++ app.py | 72 +++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 3 ++ templates/report.html | 20 ++++++++++++ 4 files changed, 103 insertions(+) create mode 100644 .gitignore create mode 100644 app.py create mode 100644 requirements.txt create mode 100644 templates/report.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d9b18ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +*.swp +venv/* +*.pyc +__pycache__/* +__pycache__ +*.wpr +*.log +.idea/ diff --git a/app.py b/app.py new file mode 100644 index 0000000..dd23cae --- /dev/null +++ b/app.py @@ -0,0 +1,72 @@ +from flask import Flask, render_template, request, abort +from flask_sqlalchemy import SQLAlchemy +from sqlalchemy import func +import os +import json +from datetime import datetime + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('SQLALCHEMY_DATABASE_URI', "sqlite://") +db = SQLAlchemy(app) +KEY = os.environ['KEBAB_KEY'] + + +class ResultRecord(db.Model): + id = db.Column(db.Integer, primary_key=True, auto_increment=True) + score = db.Column(db.Integer, unique=False, nullable=False) + content = db.Column(db.Text) + + +class Workers(db.Model): + id = db.Column(db.Integer, primary_key=True, auto_increment=True) + ipaddr = db.Column(db.String, unique=True, nullable=False) + last_seen = db.Column(db.TIMESTAMP, nullable=False, server_default=func.now()) + + +@app.before_first_request +def create_db(): + db.create_all() + + +@app.route(f'/result/{KEY}', methods=['POST']) +def save_result(): + result = request.get_json() + if not result: + abort(400) + + if not isinstance(result, list): + abort(400) + + rr = ResultRecord(content=json.dumps(result), score=len(result)) + db.session.add(rr) + + if request.headers.getlist("X-Forwarded-For"): + ip = request.headers.getlist("X-Forwarded-For")[0] + else: + ip = request.remote_addr + + w = Workers.query.filter_by(ipaddr=ip).first() + if not w: + w = Workers(ipaddr=ip) + else: + w.last_seen = datetime.now() + + db.session.add(w) + db.session.commit() + + return "stored", 200 + + +@app.route(f'/result/{KEY}', methods=['GET']) +def get_result(): + best_result = ResultRecord.query.filter(ResultRecord.score == func.min(ResultRecord.score).select()).first_or_404() + res_count = ResultRecord.query.count() + workers = Workers.query.all() + + best_result_content = json.loads(best_result.content) + + return render_template('report.html', best_result=best_result_content, result_count=res_count, workers=workers) + + +if __name__ == '__main__': + app.run() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0cf140b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +flask +sqlalchemy +flask-sqlalchemy \ No newline at end of file diff --git a/templates/report.html b/templates/report.html new file mode 100644 index 0000000..682a581 --- /dev/null +++ b/templates/report.html @@ -0,0 +1,20 @@ + + +

Current vertex count: {{ best_result|length }}

+

Total results submitted: {{ result_count }}

+ +

Current best solution

+
+{% for id in best_result %}
+{{- id }}
+{% endfor %}
+
+ +

Workers:

+ + + \ No newline at end of file