diff --git a/build/lib/thsf/__init__.py b/build/lib/thsf/__init__.py new file mode 100644 index 0000000..ca9eed4 --- /dev/null +++ b/build/lib/thsf/__init__.py @@ -0,0 +1,126 @@ +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')) + + +# ------------------------------------------------------------------------------ +# -- 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) diff --git a/build/lib/thsf/backend/__init__.py b/build/lib/thsf/backend/__init__.py new file mode 100644 index 0000000..1eb615d --- /dev/null +++ b/build/lib/thsf/backend/__init__.py @@ -0,0 +1,15 @@ +import requests +import logging + +class Backend: + def __init__(self, url, apiprefix, apikey): + self.url = url + self.apiprefix = apiprefix + self.apikey = apikey + self.session = requests.Session() + + def get(self, endpoint, params=None): + url = f"{self.url}/{self.apiprefix}/{endpoint}" + headers = {"Authorization": f"Token {self.apikey}", + "Accept": "application/json"} + return self.session.get(url, params=params, headers=headers) diff --git a/build/lib/thsf/schedule/__init__.py b/build/lib/thsf/schedule/__init__.py new file mode 100644 index 0000000..adba87e --- /dev/null +++ b/build/lib/thsf/schedule/__init__.py @@ -0,0 +1,6 @@ +class Schedule: + def __init__(self): + self.slots = list() + + def set_slots(self, slots): + self.slots = slots diff --git a/build/lib/thsf/static/css/planning.css b/build/lib/thsf/static/css/planning.css new file mode 100644 index 0000000..26338bc --- /dev/null +++ b/build/lib/thsf/static/css/planning.css @@ -0,0 +1,50 @@ +#schedule { + display: flex; + flex-direction: column; + justify-content: start; + align-items: flex-start; + align-content: flex-start; + margin-bottom: 5em; +} + +.slot { + display: flex; + flex-direction: row; + align-items: flex-start; + align-content: flex-start; + margin: 1em; + border-radius: 5px; + border-color: var(--alt-color); + background-color: var(--main-color); + border-style: solid; + border-width: 1px; + font-size: 2em; + width: 25em; +} + +.metadata { + display: flex; + flex-direction: column; + justify-content: start; + align-items: flex-start; + align-content: flex-start; +} + +.data { + display: flex; + flex-direction: column; + justify-content: start; + align-items: flex-start; + align-content: flex-start; + margin-left: 2em; +} + +.speaker_avatar { + height: 50px; + width: 50px; +} + +.data_img { + height: 50px; + width: 50px; +} diff --git a/build/lib/thsf/static/css/style.css b/build/lib/thsf/static/css/style.css new file mode 100644 index 0000000..bfbcdb6 --- /dev/null +++ b/build/lib/thsf/static/css/style.css @@ -0,0 +1,156 @@ +@font-face { + font-family: pfdintextcomppromedium; + src: url(../fonts/PFDinTextCompPro-Medium.ttf); +} + +@font-face { + font-family: pfdintextcompprothin; + src: url(../fonts/PFDinTextCompPro-Thin.ttf); +} + +:root { + --main-bg-color: #e6007e; + --main-color: #ffffff; + --alt-color: #1A000D; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + background-color: var(--main-bg-color); + font-family: pfdintextcomppromedium; +} + +.white { + color: var(--main-color); +} + +.black { + color: var(--alt-color); +} + +.thin { + font-family: pfdintextcompprothin; +} + +.bold { + font-family: pfdintextcomppromedium; +} + +.button { + font-size: 2.5em; + transition-property: color; + transition-duration: 1s; +} + +.button:hover { + color: var(--main-color); + cursor: pointer; +} + +.logo { + width: inherit; +} + +.cursor { + width: 0; + height: 0; + border-left: 0.75em solid transparent; + border-right: 0.75em solid transparent; + border-bottom: 0.75em solid var(--alt-color); +} + +a { + font-family: pfdintextcomppromedium; + font-weight: 250; + color: var(--alt-color); + transition-property: color; + transition-duration: 1s; + text-decoration: wavy; +} + +a:hover { + color: var(--main-color); + cursor: pointer; +} + +#main_wrapper { + display: flex; + flex-direction: row; + justify-content: center; + align-items: flex-start; + align-content: flex-start; + margin-bottom: 5em; +} + +#center_wrapper, #header_wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; +} + +#header { + display: flex; + flex-direction: row; + justify-content: center; + gap: 0; + text-align: center; + font-size: 9.75em; + font-weight: bold; + padding: 0; +} + +#header > span { + margin: 0; +} + +#subheader { + margin: -1em 0 0 0; + font-size: 3.47em; +} + +#place { + margin: 0; + font-size: 2.145em; +} + +#logo_wrapper { + margin-top: 1em; + width: 40em; +} + +#navbar_wrapper { + position: fixed; + bottom: 0; + padding: 1em 0; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 2em; + background-color: var(--main-bg-color); + width: 100vw; +} + +#cursorbar { + margin-top: 1em; +} + +#blah { + margin: 2em 0 2em; + font-size: 2em; + font-family: pfdintextcompprothin; + color: var(--main-color); + width: 20em; + text-align:justify; + text-justify:inter-word; +} + +#blah > p, blah.h2 { + margin-top: 1em; +} diff --git a/build/lib/thsf/static/css/tooltip.css b/build/lib/thsf/static/css/tooltip.css new file mode 100644 index 0000000..c1204fc --- /dev/null +++ b/build/lib/thsf/static/css/tooltip.css @@ -0,0 +1,36 @@ +.tooltip { + position: relative; + display: inline-block; +} + +.tooltip .tooltiptext { + visibility: hidden; + background-color: var(--main-color); + color: var(--alt-color); + text-align: center; + border-radius: 6px; + padding: 5px 0; + position: absolute; + z-index: 1; + bottom: 125%; + left: 50%; + margin-left: -60px; + opacity: 0; + transition: opacity 1s; +} + +.tooltip .tooltiptext::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -5px; + border-width: 5px; +} + +.tooltip:hover .tooltiptext { + visibility: visible; + opacity: 1; + font-size: 0.7em; + padding: 0.2em; +} diff --git a/build/lib/thsf/static/fonts/PFDinTextCompPro-Medium.ttf b/build/lib/thsf/static/fonts/PFDinTextCompPro-Medium.ttf new file mode 100644 index 0000000..1a83209 Binary files /dev/null and b/build/lib/thsf/static/fonts/PFDinTextCompPro-Medium.ttf differ diff --git a/build/lib/thsf/static/fonts/PFDinTextCompPro-Thin.ttf b/build/lib/thsf/static/fonts/PFDinTextCompPro-Thin.ttf new file mode 100644 index 0000000..23cc0a0 Binary files /dev/null and b/build/lib/thsf/static/fonts/PFDinTextCompPro-Thin.ttf differ diff --git a/build/lib/thsf/static/fonts/Uni Sans Bold.otf b/build/lib/thsf/static/fonts/Uni Sans Bold.otf new file mode 100644 index 0000000..d56a006 Binary files /dev/null and b/build/lib/thsf/static/fonts/Uni Sans Bold.otf differ diff --git a/build/lib/thsf/static/fonts/Uni Sans Book.otf b/build/lib/thsf/static/fonts/Uni Sans Book.otf new file mode 100644 index 0000000..e210e8c Binary files /dev/null and b/build/lib/thsf/static/fonts/Uni Sans Book.otf differ diff --git a/build/lib/thsf/static/images/affiche_v1.png b/build/lib/thsf/static/images/affiche_v1.png new file mode 100644 index 0000000..bba9baf Binary files /dev/null and b/build/lib/thsf/static/images/affiche_v1.png differ diff --git a/build/lib/thsf/static/images/bg.png b/build/lib/thsf/static/images/bg.png new file mode 100644 index 0000000..c6734cb Binary files /dev/null and b/build/lib/thsf/static/images/bg.png differ diff --git a/build/lib/thsf/static/images/favicon.png b/build/lib/thsf/static/images/favicon.png new file mode 100755 index 0000000..15df07e Binary files /dev/null and b/build/lib/thsf/static/images/favicon.png differ diff --git a/build/lib/thsf/static/images/logo.svg b/build/lib/thsf/static/images/logo.svg new file mode 100644 index 0000000..c2b921e --- /dev/null +++ b/build/lib/thsf/static/images/logo.svg @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/lib/thsf/static/images/pretalx-header.png b/build/lib/thsf/static/images/pretalx-header.png new file mode 100644 index 0000000..c8e3346 Binary files /dev/null and b/build/lib/thsf/static/images/pretalx-header.png differ diff --git a/build/lib/thsf/templates/base.html b/build/lib/thsf/templates/base.html new file mode 100644 index 0000000..4898cfd --- /dev/null +++ b/build/lib/thsf/templates/base.html @@ -0,0 +1,77 @@ + + + + THSF 2023: S/Extraire + + + + + + + {% block headers %} + {% endblock %} + + + +{% block content %} +{% endblock %} + + + diff --git a/build/lib/thsf/templates/index.html b/build/lib/thsf/templates/index.html new file mode 100644 index 0000000..76ff3c3 --- /dev/null +++ b/build/lib/thsf/templates/index.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% block content %} +
+
+
+ +
+ Toulouse Hacker Space Factory +
+
+ 26 28 mai 2023 - + CINÉMA UTOPIA BORDEROUGE +
+
+
+ +
+
+

Le T.H.S.F est enfin de retour !

+

Nous vous invitons à passer un week-end de 3 jours à Utopia Borderouge Toulouse pour partager avec vous nos projets, nos réflexions, nos performances, nos poésies et nos doutes sur la technologie.

+ +

Après avoir été soutenu et accueilli pendant 10 ans par Mix'Art Myrys, le Toulouse HackerSpace Factory (T.H.S.F) se tient désormais dans un autre lieu où l'utopie nécessaire est inscrite programme.

+ +

Cette année nous mettrons en avant des réflexions sur l'extractivisme des ressources planétaires, des données, de la valeur travail.

+ +

Comme toujours, notre objectif est de créer un festival qui poétise les bifurcations de nos idées communes et qui réinvente le sens de certains schémas imposés par notre époque. Rejoignez-nous pour une expérience enrichissante et pleine de surprises !

+
+
+
+{% endblock %} diff --git a/build/lib/thsf/templates/planning.html b/build/lib/thsf/templates/planning.html new file mode 100644 index 0000000..a4199f8 --- /dev/null +++ b/build/lib/thsf/templates/planning.html @@ -0,0 +1,44 @@ +{% extends "base.html" %} +{% block headers %} + +{% endblock %} +{% block content %} +
+
+ {% for slot in slots %} +
+ +
+
{{slot["abstract"]}}
+
{{slot["description"]}}
+ +
+ {% for resource in slot["resources"] %} + + {% endfor %} +
+
+
+ {% endfor %} +
+
+{% endblock %} diff --git a/setup.cfg b/setup.cfg index da00782..0f2491c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -23,6 +23,7 @@ install_requires = gunicorn pyYAML requests + pandas [options.packages.find] where = src diff --git a/src/thsf.egg-info/PKG-INFO b/src/thsf.egg-info/PKG-INFO new file mode 100644 index 0000000..0bc80e6 --- /dev/null +++ b/src/thsf.egg-info/PKG-INFO @@ -0,0 +1,54 @@ +Metadata-Version: 2.1 +Name: thsf +Version: 0.0.1 +Summary: "THSF website" +Home-page: https://git.tetalab.org/tetalab/thsf.net +Author: Doug Le Tough +Author-email: doug@redatomik.org +License: UNKNOWN +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +Provides-Extra: dev + +# THSF.NET + +Le site du THSF + +## Modifier le site + +Il n'est **pas possible** de pousser directement des modifications sur la branche `master`. + +Pour modifier le site, il est nécessaire de créer une branche spécifique et d'y pousser vos modifications. + +## Publication du site + +Lorsque vous êtes satisfaits de vos modifications, vous pouvez créer [une demande d'ajout](https://git.tetalab.org/tetalab/thsf.net/pulls) de votre branche sur la branche `master`. + +Lorsque la demande de fusion sera acceptée (vous pouvez auto-accepter vos demandes de fusion), vos modifications seront automatiquement publiées sur [le site du THSF](https://www.thsf.net). + +### Personnalisation de la publication + +Afin de rendre le processus plus souple, il est possible de personnaliser la livraison en plaçant **à la racine du dépôt** un fichier `Makefile` contenant une cible `all` qui sera systématiquement exécutée. + +C'est dans cette cible `all` que vous pourrez mettre toutes vos commandes personnalisées, typiquement l'installation de modules `python`, etc. + +Le processus de publication est le suivant: + +1. Le site actuellement en production est **supprimé** + +2. La branche `master` du présent dépôt est cloné sur le serveur hébergeant le site du **THSF** + +3. Si un fichier `Makefile` se trouve **à la racine du dépôt**, la cible `all` (i.e: `make all`) est automatiquement exécutée. + + +## Contrôle de qualité et tests + +Aucun contrôle de qualité ou de tests n'est mis en place. Vous êtes seuls sur le coup. + +Soyez responsable et **testez vos modifications sur votre machine locale avant de fusionner votre branche** sur la branche `master`. + + diff --git a/src/thsf.egg-info/SOURCES.txt b/src/thsf.egg-info/SOURCES.txt new file mode 100644 index 0000000..3d066dd --- /dev/null +++ b/src/thsf.egg-info/SOURCES.txt @@ -0,0 +1,28 @@ +MANIFEST.in +README.md +pyproject.toml +setup.cfg +setup.py +src/thsf/__init__.py +src/thsf.egg-info/PKG-INFO +src/thsf.egg-info/SOURCES.txt +src/thsf.egg-info/dependency_links.txt +src/thsf.egg-info/requires.txt +src/thsf.egg-info/top_level.txt +src/thsf/backend/__init__.py +src/thsf/schedule/__init__.py +src/thsf/static/css/planning.css +src/thsf/static/css/style.css +src/thsf/static/css/tooltip.css +src/thsf/static/fonts/PFDinTextCompPro-Medium.ttf +src/thsf/static/fonts/PFDinTextCompPro-Thin.ttf +src/thsf/static/fonts/Uni Sans Bold.otf +src/thsf/static/fonts/Uni Sans Book.otf +src/thsf/static/images/affiche_v1.png +src/thsf/static/images/bg.png +src/thsf/static/images/favicon.png +src/thsf/static/images/logo.svg +src/thsf/static/images/pretalx-header.png +src/thsf/templates/base.html +src/thsf/templates/index.html +src/thsf/templates/planning.html \ No newline at end of file diff --git a/src/thsf.egg-info/dependency_links.txt b/src/thsf.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/thsf.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/thsf.egg-info/requires.txt b/src/thsf.egg-info/requires.txt new file mode 100644 index 0000000..2ca4830 --- /dev/null +++ b/src/thsf.egg-info/requires.txt @@ -0,0 +1,18 @@ +flask +gunicorn +pyYAML +requests +pandas + +[dev] +twine +build +wheel>=0.37.0 +flake8>=4.0.1 +flake8-breakpoint>=1.1.0 +flake8-builtins>=1.5.3 +flake8-print>=4.0.0 +flake8-return>=1.1.3 +pep8-naming>=0.8.2 +setuptools>=60.9.2 +pylint>=2.12.2 diff --git a/src/thsf.egg-info/top_level.txt b/src/thsf.egg-info/top_level.txt new file mode 100644 index 0000000..95f0ebd --- /dev/null +++ b/src/thsf.egg-info/top_level.txt @@ -0,0 +1 @@ +thsf diff --git a/src/thsf/__init__.py b/src/thsf/__init__.py index e77af2c..ca9eed4 100644 --- a/src/thsf/__init__.py +++ b/src/thsf/__init__.py @@ -1,9 +1,11 @@ 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.backend import Backend +from thsf.schedule import Schedule # ------------------------------------------------------------------------------ @@ -26,14 +28,15 @@ app = Flask(__name__) # ------------------------------------------------------------------------------ app.config.from_object(__name__ + '.AppConfig') try: - with open(app.config["CONFIG_FILENAME"], "r") as local_config_file: + 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"]) + 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) @@ -54,43 +57,63 @@ def page_not_found(err): 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(): - backend.get(endpoint=f"events/{app.local_config['pretalx']['event']}/schedules/{app.local_config['pretalx']['schedule']}") - return "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" diff --git a/src/thsf/backend/__init__.py b/src/thsf/backend/__init__.py index 86a51c9..1eb615d 100644 --- a/src/thsf/backend/__init__.py +++ b/src/thsf/backend/__init__.py @@ -1,7 +1,7 @@ import requests +import logging - -class Backend(url, apiprefix, apikey): +class Backend: def __init__(self, url, apiprefix, apikey): self.url = url self.apiprefix = apiprefix @@ -10,6 +10,6 @@ class Backend(url, apiprefix, apikey): def get(self, endpoint, params=None): url = f"{self.url}/{self.apiprefix}/{endpoint}" - headers = {f"Authorization: Token {self.apikey}"} - return self.session.get(url, **{"params": params, "headers": headers}) - + headers = {"Authorization": f"Token {self.apikey}", + "Accept": "application/json"} + return self.session.get(url, params=params, headers=headers) diff --git a/src/thsf/schedule/__init__.py b/src/thsf/schedule/__init__.py new file mode 100644 index 0000000..adba87e --- /dev/null +++ b/src/thsf/schedule/__init__.py @@ -0,0 +1,6 @@ +class Schedule: + def __init__(self): + self.slots = list() + + def set_slots(self, slots): + self.slots = slots diff --git a/src/thsf/static/css/planning.css b/src/thsf/static/css/planning.css new file mode 100644 index 0000000..26338bc --- /dev/null +++ b/src/thsf/static/css/planning.css @@ -0,0 +1,50 @@ +#schedule { + display: flex; + flex-direction: column; + justify-content: start; + align-items: flex-start; + align-content: flex-start; + margin-bottom: 5em; +} + +.slot { + display: flex; + flex-direction: row; + align-items: flex-start; + align-content: flex-start; + margin: 1em; + border-radius: 5px; + border-color: var(--alt-color); + background-color: var(--main-color); + border-style: solid; + border-width: 1px; + font-size: 2em; + width: 25em; +} + +.metadata { + display: flex; + flex-direction: column; + justify-content: start; + align-items: flex-start; + align-content: flex-start; +} + +.data { + display: flex; + flex-direction: column; + justify-content: start; + align-items: flex-start; + align-content: flex-start; + margin-left: 2em; +} + +.speaker_avatar { + height: 50px; + width: 50px; +} + +.data_img { + height: 50px; + width: 50px; +} diff --git a/src/thsf/templates/planning.html b/src/thsf/templates/planning.html index 0630c4f..a4199f8 100644 --- a/src/thsf/templates/planning.html +++ b/src/thsf/templates/planning.html @@ -1,18 +1,44 @@ {% extends "base.html" %} {% block headers %} - + {% endblock %} - {% block content %} -
- -