Store time codes as timestamps in database

This commit is contained in:
2019-02-18 19:27:35 +01:00
parent 87a7238fe9
commit d1ce253e4c
4 changed files with 70 additions and 26 deletions

13
db.py
View File

@@ -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,
)

View File

@@ -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)

View File

@@ -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);

22
util.py
View File

@@ -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
)