From cc32b0459d1ff7c9551cae37a852b99d0e13e310 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Sun, 24 Sep 2023 22:19:09 +0100 Subject: [PATCH 1/3] Add admin mode --- main.py | 22 +++++++++++++++++++++- templates/login.html | 16 ++++++++++++++++ templates/person.html | 2 +- 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 templates/login.html diff --git a/main.py b/main.py index 7751551..abeffd0 100755 --- a/main.py +++ b/main.py @@ -59,7 +59,7 @@ def drop_start(s: str, start: str) -> str: @app.route("/person/", methods=["GET", "POST"]) def person(person_id: int) -> str | Response: item = model.Person.query.get(person_id) - if flask.request.method == "POST": + if flask.request.method == "POST" and check_admin_mode(): qid = flask.request.form["wikidata_qid"] or None item.name = flask.request.form["name"] @@ -115,6 +115,7 @@ def person(person_id: int) -> str | Response: Event=model.Event, plural=plural, wikidata_hits=wikidata_hits, + is_admin=check_admin_mode, ) @@ -405,6 +406,25 @@ def person_image_filename(person_id: int) -> str: return os.path.join("wikidata_photo", "thumb", person.wikidata_photo[0]) +@app.route("/login", methods=["GET", "POST"]) +def login() -> str | Response: + """Login page.""" + if flask.request.method == "GET": + return flask.render_template("login.html") + password = flask.request.form["password"] + if password != app.config["ADMIN_PASSWORD"]: + endpoint = flask.endpoint + return flask.redirect(endpoint) + + flask.session["admin_password"] = password + return flask.redirect(flask.url_for("index")) + + +def check_admin_mode() -> bool: + """User is an admin.""" + return bool(flask.session.get("admin_password") == app.config["ADMIN_PASSWORD"]) + + @app.route("/github_wikidata") def github_wikidata() -> str: """Look for speakers on Wikidata based on the GitHub property.""" diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000..efcd454 --- /dev/null +++ b/templates/login.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} + +{% block title %}Conference archive{% endblock %} + + {% block content %} +

Conference archive

+ +
Admin login.
+ +
+ + + +
+ +{% endblock %} diff --git a/templates/person.html b/templates/person.html index d37ddde..786998d 100644 --- a/templates/person.html +++ b/templates/person.html @@ -45,7 +45,7 @@ {% endif %}

- {% if config.ADMIN_MODE %} + {% if is_admin() %} {% set search_for = item.name + ' ' + " haswbstatement:P31=Q5" %}

Search for {{ item.name }} on Wikidata

From b36ff3a9c118c9058e5644c45ed110e5d3e7c45f Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Mon, 25 Sep 2023 12:58:28 +0100 Subject: [PATCH 2/3] Reorder people on Github Wikidata report. --- main.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.py b/main.py index abeffd0..de9dacb 100755 --- a/main.py +++ b/main.py @@ -436,6 +436,8 @@ def github_wikidata() -> str: continue items.append((person, qid, wd_name, photo)) + items.sort(key=lambda i: len(i[0].name)) + return flask.render_template("github.html", items=items) From 08a4ffa89f2b144c8c12a46fd61f1083fd9977a5 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Mon, 25 Sep 2023 13:05:12 +0100 Subject: [PATCH 3/3] Web UI to edit conference title Resolves: #3 --- main.py | 20 +++++++++++++++++--- templates/conference.html | 15 +++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index de9dacb..c85ec45 100755 --- a/main.py +++ b/main.py @@ -125,13 +125,27 @@ def event_page(event_id: int) -> str: return flask.render_template("event.html", item=item) -@app.route("/conference/") -def conference_page(short_name: str) -> str: +@app.route("/conference/", methods=["GET", "POST"]) +def conference_page(short_name: str) -> str | Response: item = model.Conference.query.filter_by(short_name=short_name).one_or_none() if item is None: flask.abort(404) + + if flask.request.method == "POST" and check_admin_mode(): + item.short_name = flask.request.form["short_name"] + item.title = flask.request.form["title"] + database.session.commit() + + assert flask.request.endpoint + return flask.redirect( + flask.url_for(flask.request.endpoint, short_name=item.short_name) + ) + return flask.render_template( - "conference.html", item=item, person_image_filename=person_image_filename + "conference.html", + item=item, + person_image_filename=person_image_filename, + is_admin=check_admin_mode, ) diff --git a/templates/conference.html b/templates/conference.html index 56fc448..3c58ea6 100644 --- a/templates/conference.html +++ b/templates/conference.html @@ -86,6 +86,21 @@ + {% if is_admin() %} +
+
+ + +
+
+ + +
+ + +
+ {% endif %} +

Talks

{{ item.events.count() }} talks