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' @dataclass class GenericFormModel: page_title: str form_title: str post_url: str errors: Dict[str, List[str]] = None @dataclass class Player: id: int real_name: str alias: str hex_id: str anon: bool = False @property def name(self) -> str: return self.real_name if self.real_name and not self.anon else self.alias @classmethod def from_form(cls, form: forms.PlayerForm): id = int(form.player_id.data) if form.player_id.data else None real_name = str(form.real_name.data) if form.real_name.data else None alias = str(form.alias.data) hex_id = str(form.hex_id.data) if form.hex_id.data else None anon = bool(form.anonymize.data) return cls(id=id, real_name=real_name, alias=alias, hex_id=hex_id, anon=anon) @dataclass class Drink: id: int name: str vol: float @classmethod def from_form(cls, form: forms.DrinkForm): id = int(form.drink_id.data) if form.drink_id.data else None name = str(form.name.data) vol = float(form.vol.data) self = cls(id=id, name=name, vol=vol) return self @dataclass class Enemy: id: int name: str boss: bool season_id: int @classmethod def from_form(cls, form: forms.EnemyForm): id = int(form.enemy_id.data) if form.enemy_id.data else None name = str(form.name.data) boss = bool(form.is_boss.data) season = int(form.season_id.data) self = cls(id=id, name=name, boss=boss, season_id=season) return self @dataclass class Season: id: int game: str description: str start: datetime.date end: datetime.date code: str def __post_init__(self): try: self.start = datetime.datetime.strptime(self.start, "%Y-%m-%d").date() except Exception: pass try: self.end = datetime.datetime.strptime(self.end, "%Y-%m-%d").date() except Exception: pass @classmethod def from_form(cls, form: forms.SeasonForm): season_id = int(form.season_id.data) if form.season_id.data else None code = str(form.code.data) game = str(form.game_name.data) description = str(form.description.data) if form.description.data else None start = form.start.data end = form.end.data self = cls(season_id, game, description, start, end, code) return self @dataclass class Episode: id: int season_id: int title: str date: datetime.date start: datetime.time end: datetime.time 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)) @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)