From 5699da32cf3eea331a098818fdaf29fd04872086 Mon Sep 17 00:00:00 2001 From: luxick Date: Sat, 16 Feb 2019 13:26:05 +0100 Subject: [PATCH] Show episodes on season overview page. --- app.py | 50 ++++++++++++++++++++++++++++------ db.py | 41 ++++++++++++++++++++++++++++ models.py | 24 ++++++++++++++-- schema.sql | 4 +++ templates/season_overview.html | 42 +++++++++++++++++++++++++++- util.py | 18 ++++++++++++ 6 files changed, 166 insertions(+), 13 deletions(-) create mode 100644 util.py diff --git a/app.py b/app.py index 0053970..17d3b9a 100644 --- a/app.py +++ b/app.py @@ -160,14 +160,22 @@ def season_edit(season_id: int): @authorize def season_overview(season_id: int): sql, args = db.load_season(season_id) - db_season = db.query_db(sql, args, one=True, cls=models.Season) + season = db.query_db(sql, args, one=True, cls=models.Season) + + sql, args = db.load_episodes(season.id) + episodes = db.query_db(sql, args, cls=models.Episode) + infos = { - "Number": db_season.code, - "Game": db_season.game, - "Start Date": db_season.start, - "End Date": db_season.end if db_season.end else "Ongoing", + "Number": season.code, + "Game": season.game, + "Start Date": season.start, + "End Date": season.end if season.end else "Ongoing", + } + model = { + "title": f"{season.code} {season.game}", + "season_info": infos, + "episodes": episodes } - model = {"title": f"{db_season.code} {db_season.game}", "season_info": infos} return render_template("season_overview.html", model=model) @@ -187,7 +195,7 @@ def episode_new(season_id: int): model = models.GenericFormModel( page_title="New Episode", form_title="Create New Episode", - post_url="/episodes/save", + post_url=f"/seasons/{season_id}/episodes/edit/null", ) form = forms.EpisodeForm(request.form) @@ -198,10 +206,34 @@ def episode_new(season_id: int): @app.route("/seasons//episodes/edit/", methods=["GET", "POST"]) @authorize def episode_edit(season_id: int, episode_id: int): + model = models.GenericFormModel( + page_title="Edit Episode", + form_title="Edit Episode", + post_url=f"/seasons/{season_id}/episodes/edit/{episode_id}", + ) + if request.method == "GET": - pass + sql, args = db.load_episode(episode_id) + episode: models.Episode = db.query_db(sql, args, one=True, cls=models.Episode) + + form = forms.EpisodeForm() + + model.form_title = f"Edit Episode '{episode.code}: {episode.title}'" + return render_template("generic_form.html", model=model, form=form) else: - pass + form = forms.EpisodeForm() + + if not form.validate_on_submit(): + model.errors = form.errors + return render_template("generic_form.html", model=model, form=form) + + episode = models.Episode.from_form(form) + sql, args = db.save_episode(episode) + errors = db.update_db(sql, args) + if errors: + model.errors = {"Error saving episode": [errors]} + return render_template("generic_form.html", model=model, form=form) + return redirect(url_for("season_overview", season_id=season_id)) @app.route("/players/new") diff --git a/db.py b/db.py index e307690..952667c 100644 --- a/db.py +++ b/db.py @@ -4,6 +4,7 @@ from flask import g import models from config import Config +from util import time_to_str def connect_db(): @@ -166,6 +167,16 @@ def load_season(id=None): return sql, args +def load_episode(episode_id: int = None): + sql = "select * from episode" + args = () + if episode_id: + sql += " where episode.id = ?" + args = (episode_id,) + sql += " order by episode.code" + return sql, args + + def load_episodes(season_id: int = None): sql = "select * from episode" args = () @@ -174,3 +185,33 @@ def load_episodes(season_id: int = None): args = (season_id,) sql += " order by episode.code" return sql, args + + +def save_episode(episode: models.Episode): + if not episode.id: + sql = "insert into episode values (?, ?, ?, ?, ?, ?, ?)" + args = ( + None, + episode.season_id, + episode.title, + episode.date, + time_to_str(episode.start), + time_to_str(episode.end), + episode.code + ) + else: + sql = ( + "update episode " + "set season_id=?, title=?, date=?, start=?, end=?, code=?" + "where id==?" + ) + args = ( + episode.season_id, + episode.title, + episode.date, + time_to_str(episode.start), + time_to_str(episode.end), + episode.code, + episode.id, + ) + return sql, args diff --git a/models.py b/models.py index ef440b6..f9291a5 100644 --- a/models.py +++ b/models.py @@ -1,8 +1,10 @@ import datetime +import logging from typing import Dict, List from dataclasses import dataclass import forms +from util import str_to_time INVALID_STR = 'Form entry "{}" is invalid' @@ -111,8 +113,24 @@ class Episode: date: datetime.date start: datetime.time end: datetime.time + code: str def __post_init__(self): - self.date = datetime.datetime.strptime(self.date, "%Y-%m-%d").date() - self.start = datetime.datetime.strptime(self.start, "%H:%M").time() - self.end = datetime.datetime.strptime(self.end, "%H:%M").time() + try: + self.date = datetime.datetime.strptime(self.date, "%Y-%m-%d").date() + except TypeError as err: + logging.warning(err) + self.start = str_to_time(str(self.start)) + self.end = str_to_time(str(self.end)) + + @classmethod + def from_form(cls, form: forms.EpisodeForm): + episode_id = int(form.episode_id.data) if form.episode_id.data else None + season_id = int(form.season_id.data) + title = str(form.title.data) + date = form.date.data + start = form.start.data + end = form.end.data + code = str(form.code.data) + + return cls(episode_id, season_id, title, date, start, end, code) diff --git a/schema.sql b/schema.sql index 8559492..9e91f32 100644 --- a/schema.sql +++ b/schema.sql @@ -74,3 +74,7 @@ create table if not exists episode create unique index if not exists episode_id_uindex on episode (id); + + +alter table episode + add code text not null default 'EXX'; diff --git a/templates/season_overview.html b/templates/season_overview.html index 822237c..b17c3bb 100644 --- a/templates/season_overview.html +++ b/templates/season_overview.html @@ -32,7 +32,47 @@
Episodes
- Episode list here + {% if not model.episodes %} +
No Episodes in this Season
+ {% else %} + + + + + + + + + + {% if g.is_editor %} + + {% endif %} + + + + {% for item in model.episodes %} + + + + + + + + {% if g.is_editor %} + + {% endif %} + + {% endfor %} + +
#DateTitleViewEditor
{{ item.code }}{{ item.date }}{{ item.title }} + + + + + +
+ + {% endif %}
diff --git a/util.py b/util.py new file mode 100644 index 0000000..22807c2 --- /dev/null +++ b/util.py @@ -0,0 +1,18 @@ +import datetime + +TIME_FMT = "%H:%M" +DATE_FMT = "%Y-%m-%d" + + +def str_to_time(data: str) -> datetime.time: + data = ":".join(data.split(":")[:2]) + return datetime.datetime.strptime(data, TIME_FMT).time() + + +def time_to_str(data: datetime.time) -> str: + """ + Convert a datetime.time object into a formatted string for sqlite + :param data: datetime.time + :return: str + """ + return data.strftime(TIME_FMT)