diff --git a/db.py b/db.py index 952667c..40b6f5f 100644 --- a/db.py +++ b/db.py @@ -20,7 +20,7 @@ def connect_db(): def query_db(query, args=(), one=False, cls=None): """Runs an SQL query on an new database connection, returning the fetched rv""" - log.info(f"Running query ({query}) with arguments ({args})") + log.debug(f"Running query ({query}) with arguments ({args})") cur = connect_db().execute(query, args) rv = cur.fetchall() cur.close() @@ -34,6 +34,7 @@ def update_db(query, args=()): Runs an changing query on the database Returns either False if no error has occurred, or an sqlite3 Exception """ + log.debug(f"Running query ({query}) with arguments ({args})") with connect_db() as con: try: con.cursor().execute(query, args) @@ -195,9 +196,9 @@ def save_episode(episode: models.Episode): episode.season_id, episode.title, episode.date, - time_to_str(episode.start), - time_to_str(episode.end), - episode.code + episode.start.timestamp(), + episode.end.timestamp(), + episode.code, ) else: sql = ( @@ -209,8 +210,8 @@ def save_episode(episode: models.Episode): episode.season_id, episode.title, episode.date, - time_to_str(episode.start), - time_to_str(episode.end), + episode.start.timestamp(), + episode.end.timestamp(), episode.code, episode.id, ) diff --git a/models.py b/models.py index f9291a5..5169e33 100644 --- a/models.py +++ b/models.py @@ -1,12 +1,10 @@ import datetime -import logging -from typing import Dict, List +from numbers import Rational +from typing import Dict, List, Union from dataclasses import dataclass import forms -from util import str_to_time - -INVALID_STR = 'Form entry "{}" is invalid' +import util @dataclass @@ -110,27 +108,30 @@ class Episode: id: int season_id: int title: str - date: datetime.date - start: datetime.time - end: datetime.time + date: Union[datetime.date, Rational] + start: Union[datetime.datetime, Rational] + end: Union[datetime.datetime, Rational] code: str def __post_init__(self): - 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)) + if isinstance(self.date, Rational): + self.date = datetime.date.fromtimestamp(self.date) + if isinstance(self.start, Rational): + self.start = datetime.datetime.fromtimestamp(self.start) + if isinstance(self.end, Rational): + self.end = datetime.datetime.fromtimestamp(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) + title = str(form.title.data) + + date = form.date.data + start = util.combine_datetime(date, form.start.data) + end = util.combine_datetime(date, form.end.data) + if end < start: + end = end + datetime.timedelta(days=1) return cls(episode_id, season_id, title, date, start, end, code) diff --git a/schema.sql b/schema.sql index 9e91f32..2840196 100644 --- a/schema.sql +++ b/schema.sql @@ -78,3 +78,27 @@ create unique index if not exists episode_id_uindex alter table episode add code text not null default 'EXX'; + + +create table episode_dg_tmp +( + id integer not null + constraint episode_pk + primary key autoincrement, + season_id integer not null + references season, + title text not null, + date text not null, + start timestamp not null, + end timestamp not null, + code text default 'EXX' not null +); + +insert into episode_dg_tmp(id, season_id, title, date, start, end, code) select id, season_id, title, date, start, end, code from episode; + +drop table episode; + +alter table episode_dg_tmp rename to episode; + +create unique index episode_id_uindex + on episode (id); diff --git a/util.py b/util.py index 22807c2..887e441 100644 --- a/util.py +++ b/util.py @@ -4,9 +4,12 @@ TIME_FMT = "%H:%M" DATE_FMT = "%Y-%m-%d" -def str_to_time(data: str) -> datetime.time: +def str_to_datetime(data: str) -> datetime.datetime: + """ + Convert %H:%M formatted string into a python datetime object + """ data = ":".join(data.split(":")[:2]) - return datetime.datetime.strptime(data, TIME_FMT).time() + return datetime.datetime.strptime(data, TIME_FMT) def time_to_str(data: datetime.time) -> str: @@ -16,3 +19,18 @@ def time_to_str(data: datetime.time) -> str: :return: str """ return data.strftime(TIME_FMT) + + +def combine_datetime(date: datetime.date, time: datetime.time): + """ + Combine a date and time object into a datetime object + """ + return datetime.datetime( + date.year, + date.month, + date.day, + time.hour, + time.minute, + time.second, + time.microsecond + )