thsf.net/src/thsf/__init__.py

220 lines
7.9 KiB
Python
Raw Normal View History

2023-04-09 04:38:07 +02:00
import re
2023-04-05 16:14:50 +02:00
import sys
2023-04-08 21:17:34 +02:00
import json
2023-04-05 16:14:50 +02:00
import logging
from logging import config
import yaml
from flask import Flask, render_template, redirect, request, url_for
2023-04-10 02:12:26 +02:00
from flask_minify import minify
2023-04-08 21:17:34 +02:00
from thsf.backend import Backend
from thsf.schedule import Schedule
2023-04-09 04:38:07 +02:00
from thsf.navbar import Navbar
2023-04-05 16:14:50 +02:00
# ------------------------------------------------------------------------------
# -- Configuration
# ------------------------------------------------------------------------------
class AppConfig:
2023-05-09 09:55:45 +02:00
""" Flask application config """
CONFIG_FILENAME = "config.yml"
2023-04-05 16:14:50 +02:00
# ------------------------------------------------------------------------------
# -- Application
# ------------------------------------------------------------------------------
logger = logging.getLogger('wsgi')
app = Flask(__name__)
# ------------------------------------------------------------------------------
# -- Local configuration
# ------------------------------------------------------------------------------
app.config.from_object(__name__ + '.AppConfig')
try:
2023-04-08 21:17:34 +02:00
with open(app.config["CONFIG_FILENAME"], mode="r", encoding="utf-8") as local_config_file:
2023-04-05 16:14:50 +02:00
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"])
2023-04-08 21:17:34 +02:00
backend = Backend(url=app.local_config["pretalx"]["url"],
apiprefix=app.local_config["pretalx"]["apiprefix"],
apikey=app.local_config["pretalx"]["apikey"])
schedule = Schedule()
2023-04-09 04:38:07 +02:00
navbar = Navbar(config=app.local_config["navbar"])
2023-04-05 16:14:50 +02:00
except Exception as err:
2023-05-09 09:55:45 +02:00
logger.critical(f"[{err.__class__}] {str(err)}")
2023-04-05 16:14:50 +02:00
sys.exit(1)
2023-04-16 09:38:01 +02:00
if app.local_config["log"]["root"]["level"] != "DEBUG":
minify(app=app, html=True, js=True, cssless=True)
2023-04-05 16:14:50 +02:00
# ------------------------------------------------------------------------------
# -- Tools
# ------------------------------------------------------------------------------
@app.errorhandler(404)
def page_not_found(err):
return redirect(url_for('index'))
2023-05-09 09:55:45 +02:00
2023-04-09 13:13:29 +02:00
def get_slots():
2023-04-19 12:29:39 +02:00
return backend.get(endpoint=f"events/{app.local_config['pretalx']['event']}/schedules/{app.local_config['pretalx']['schedule']}/").json()
2023-04-09 13:13:29 +02:00
2023-05-09 09:55:45 +02:00
2023-04-16 09:38:01 +02:00
def get_speaker_biography(name):
try:
speaker_info = backend.get(endpoint=f"events/{app.local_config['pretalx']['event']}/speakers/", params={"q": name}).json()
2023-04-22 09:53:55 +02:00
logger.debug(speaker_info)
2023-04-16 09:38:01 +02:00
return speaker_info["results"][0]["biography"].strip()
except Exception as err:
2023-05-09 09:55:45 +02:00
logger.warning(f"UnknownSpeakerError: {name} from {str(err)}")
2023-04-16 09:38:01 +02:00
return None
2023-05-09 09:55:45 +02:00
2023-04-09 02:12:29 +02:00
# ------------------------------------------------------------------------------
# -- 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}"
2023-04-05 16:14:50 +02:00
2023-05-09 09:55:45 +02:00
2023-04-09 12:37:50 +02:00
@app.template_filter('date2dayclass')
def date2dayclass(date):
classes = {"26/05": "bg1",
"27/05": "bg2",
2023-05-09 09:55:45 +02:00
"28/05": "bg3"}
2023-04-09 12:37:50 +02:00
splitted_date = date.split("-")
month, day = (splitted_date[1],
splitted_date[2].split("T")[0])
return classes[f"{day}/{month}"]
2023-05-09 09:55:45 +02:00
2023-04-09 02:12:29 +02:00
@app.template_filter('toicon')
2023-05-09 09:55:45 +02:00
def type2icon(slot_type):
2023-04-09 02:12:29 +02:00
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",
2023-04-20 15:07:47 +02:00
"Installation": "fa-solid fa-palette"}
2023-04-09 02:12:29 +02:00
return slot_types[slot_type]
2023-04-09 04:38:07 +02:00
2023-05-09 09:55:45 +02:00
2023-04-05 16:14:50 +02:00
# ------------------------------------------------------------------------------
# -- Routes
# ------------------------------------------------------------------------------
@app.route('/favicon.ico', methods=['GET'])
def favicon():
return redirect(url_for('static', filename='images/favicon.png'))
2023-04-08 21:17:34 +02:00
2023-04-05 16:14:50 +02:00
@app.route('/', methods=['GET'])
def index():
2023-04-09 04:38:07 +02:00
return render_template("index.html",
navbar=navbar.get_from_page(page="/"))
2023-04-08 21:17:34 +02:00
2023-05-09 09:55:45 +02:00
2023-04-05 16:14:50 +02:00
@app.route('/planning', methods=['GET'])
def planning():
2023-04-09 13:13:29 +02:00
slots = get_slots()
2023-04-19 12:18:27 +02:00
for slot in slots.get("slots"):
for speaker in slot.get("speakers"):
speaker["biography"] = get_speaker_biography(speaker.get("name"))
2023-04-09 04:38:07 +02:00
return render_template("planning.html",
2023-04-19 12:18:27 +02:00
slots=sorted(slots.get("slots"),
key=lambda slot: slot.get("slot").get("start")),
2023-04-20 15:07:47 +02:00
navbar=navbar.get_from_page(page="/planning"),
filter=["concert", "dj set", "panel discussion", "talk", "screening"])
2023-04-08 21:17:34 +02:00
2023-05-09 09:55:45 +02:00
2023-04-09 04:38:07 +02:00
@app.route('/place', methods=['GET'])
def place():
2023-04-20 15:07:47 +02:00
return render_template("place.html",
2023-04-09 04:38:07 +02:00
navbar=navbar.get_from_page(page="/place"))
2023-04-08 21:17:34 +02:00
2023-05-09 09:55:45 +02:00
2023-04-09 04:38:07 +02:00
@app.route('/food', methods=['GET'])
def food():
2023-04-20 15:07:47 +02:00
return render_template("food.html",
2023-04-09 04:38:07 +02:00
navbar=navbar.get_from_page(page="/food"))
2023-04-08 21:17:34 +02:00
2023-05-09 09:55:45 +02:00
2023-04-09 04:38:07 +02:00
@app.route('/goodies', methods=['GET'])
def goodies():
2023-04-09 12:19:55 +02:00
return render_template("goodies.html",
2023-04-09 04:38:07 +02:00
navbar=navbar.get_from_page(page="/goodies"))
2023-04-05 16:14:50 +02:00
2023-05-09 09:55:45 +02:00
2023-04-05 16:14:50 +02:00
@app.route('/concerts', methods=['GET'])
def concerts():
2023-04-09 13:13:29 +02:00
slots = get_slots()
return render_template("planning.html",
2023-04-19 12:18:27 +02:00
slots=sorted(slots.get("slots"),
key=lambda slot: slot.get("slot").get("start")),
2023-04-09 13:13:29 +02:00
navbar=navbar.get_from_page(page="/concerts"),
2023-04-12 13:31:33 +02:00
filter=["concert", "dj set"])
2023-04-05 16:14:50 +02:00
2023-05-09 09:55:45 +02:00
2023-04-09 04:38:07 +02:00
@app.route('/workshops', methods=['GET'])
def workshops():
2023-04-09 13:13:29 +02:00
slots = get_slots()
return render_template("planning.html",
2023-04-19 12:18:27 +02:00
slots=sorted(slots.get("slots"),
key=lambda slot: slot.get("slot").get("start")),
2023-04-09 13:13:29 +02:00
navbar=navbar.get_from_page(page="/workshops"),
filter=["workshop"])
2023-04-08 21:17:34 +02:00
2023-05-09 09:55:45 +02:00
2023-04-09 04:38:07 +02:00
@app.route('/screenings', methods=['GET'])
def screenings():
2023-04-09 13:13:29 +02:00
slots = get_slots()
return render_template("planning.html",
2023-04-19 12:18:27 +02:00
slots=sorted(slots.get("slots"),
key=lambda slot: slot.get("slot").get("start")),
2023-04-09 13:13:29 +02:00
navbar=navbar.get_from_page(page="/screenings"),
filter=["screening"])
2023-04-05 16:14:50 +02:00
2023-05-09 09:55:45 +02:00
2023-04-09 04:38:07 +02:00
@app.route('/discussions', methods=['GET'])
def discussions():
2023-04-09 13:13:29 +02:00
slots = get_slots()
return render_template("planning.html",
2023-04-19 12:18:27 +02:00
slots=sorted(slots.get("slots"),
key=lambda slot: slot.get("slot").get("start")),
2023-04-09 13:13:29 +02:00
navbar=navbar.get_from_page(page="/discussions"),
filter=["panel discussion"])
2023-04-08 21:17:34 +02:00
2023-05-09 09:55:45 +02:00
2023-04-05 16:14:50 +02:00
@app.route('/exhibitions', methods=['GET'])
def exhibitions():
2023-04-09 13:13:29 +02:00
slots = get_slots()
return render_template("planning.html",
2023-04-19 12:18:27 +02:00
slots=sorted(slots.get("slots"),
key=lambda slot: slot.get("slot").get("start")),
2023-04-09 13:13:29 +02:00
navbar=navbar.get_from_page(page="/exhibitions"),
2023-04-20 15:07:47 +02:00
filter=["installation"])
2023-04-08 21:17:34 +02:00
2023-05-09 09:55:45 +02:00
2023-04-05 16:14:50 +02:00
@app.route('/talks', methods=['GET'])
def talks():
2023-04-09 13:13:29 +02:00
slots = get_slots()
return render_template("planning.html",
2023-04-19 12:18:27 +02:00
slots=sorted(slots.get("slots"),
key=lambda slot: slot.get("slot").get("start")),
2023-04-09 13:13:29 +02:00
navbar=navbar.get_from_page(page="/talks"),
filter=["talk", "light talk"])
2023-04-05 16:14:50 +02:00
# ------------------------------------------------------------------------------
# -- Main
# ------------------------------------------------------------------------------
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, debug=True)