import sys import json import logging from logging import config import yaml from flask import Flask, render_template, redirect, request, url_for from thsf.backend import Backend from thsf.schedule import Schedule # ------------------------------------------------------------------------------ # -- Configuration # ------------------------------------------------------------------------------ class AppConfig: """ Flask application config """ CONFIG_FILENAME = "config.yml" # ------------------------------------------------------------------------------ # -- Application # ------------------------------------------------------------------------------ logger = logging.getLogger('wsgi') app = Flask(__name__) # ------------------------------------------------------------------------------ # -- Local configuration # ------------------------------------------------------------------------------ app.config.from_object(__name__ + '.AppConfig') try: with open(app.config["CONFIG_FILENAME"], mode="r", encoding="utf-8") as local_config_file: app.local_config = yaml.load(local_config_file, Loader=yaml.SafeLoader) app.config["SECRET_KEY"] = app.local_config["app"]["secret_key"] app.config["LANGUAGES"] = app.local_config["app"]["languages"] config.dictConfig(app.local_config["log"]) backend = Backend(url=app.local_config["pretalx"]["url"], apiprefix=app.local_config["pretalx"]["apiprefix"], apikey=app.local_config["pretalx"]["apikey"]) schedule = Schedule() except Exception as err: logger.critical("[{}] {}".format(err.__class__, str(err))) sys.exit(1) # ------------------------------------------------------------------------------ # -- Tools # ------------------------------------------------------------------------------ @app.errorhandler(404) def page_not_found(err): return redirect(url_for('index')) # ------------------------------------------------------------------------------ # -- Custom filters # ------------------------------------------------------------------------------ @app.template_filter('date2dmyhm') def date2dmyhm(date): splitted_date = date.split("-") splitted_time = splitted_date[2].split("T")[1].split(":") year, month, day = (splitted_date[0], splitted_date[1], splitted_date[2].split("T")[0]) hour, minutes = (splitted_time[0], splitted_time[1].split("+")[0]) return f"{day}/{month} {hour}:{minutes}" @app.template_filter('toicon') def date2dmyhm(slot_type): slot_types = {"Projection": "fa-solid fa-film", "Presentation Courte": "fa-solid fa-person-chalkboard", "DJ Set": "fa-solid fa-guitar", "Concert": "fa-solid fa-guitar", "Présentation": "fa-solid fa-person-chalkboard", "Table Ronde": "fa-solid fa-users-line", "Atelier": "fa-solid fa-screwdriver-wrench", "Exposition": "fa-solid fa-palette"} return slot_types[slot_type] # ------------------------------------------------------------------------------ # -- Routes # ------------------------------------------------------------------------------ @app.route('/favicon.ico', methods=['GET']) def favicon(): return redirect(url_for('static', filename='images/favicon.png')) @app.route('/', methods=['GET']) def index(): return render_template("index.html") @app.route('/planning', methods=['GET']) def planning(): slots = backend.get(endpoint=f"events/{app.local_config['pretalx']['event']}/schedules/{app.local_config['pretalx']['schedule']}").json() # schedule.set_slots(slots["slots"]) return render_template("planning.html", slots=slots["slots"]) # return "toto" # for slot in sched["slots"]: # schedule.add_slot(slot) # return schedule.df.to_html() @app.route('/concerts', methods=['GET']) def concerts(): return "concerts" @app.route('/djsets', methods=['GET']) def djsets(): return "djsets" @app.route('/exhibitions', methods=['GET']) def exhibitions(): return "exhibitions" @app.route('/lighttalks', methods=['GET']) def lighttalks(): return "lighttalks" @app.route('/paneldiscussions', methods=['GET']) def paneldiscussions(): return "paneldiscussions" @app.route('/screenings', methods=['GET']) def screenings(): return "screenings" @app.route('/talks', methods=['GET']) def talks(): return "talks" @app.route('/workshops', methods=['GET']) def workshops(): return "workshops" # ------------------------------------------------------------------------------ # -- Main # ------------------------------------------------------------------------------ if __name__ == '__main__': app.run(host='127.0.0.1', port=5000, debug=True)