#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""Convert for Series.
"""
# Standard library imports.
from collections import namedtuple
# First party library imports.
from berhoel.helper import count_with_msg
from berhoel.django.media.models import (
Seen,
Person,
Season,
Series,
Purchase,
SeriesEpisode,
)
# Local library imports.
from ._helper import get_media
__date__ = "2022/08/13 17:23:24 hoel"
__author__ = "Berthold Höllmann"
__copyright__ = "Copyright © 2020 by Berthold Höllmann"
__credits__ = ["Berthold Höllmann"]
__maintainer__ = "Berthold Höllmann"
__email__ = "berhoel@gmail.com"
SerieRow = namedtuple(
"SerieRow",
(
"date",
"season",
"episode",
"disk",
"index",
"diskset",
"info",
"desc",
"dvd_link",
),
)
[docs]class Serie:
"Represent series on import"
index = None
[docs] def __init__(self, table):
""" """
self.table = table
self.name = table.name
self.is_active = not table.hidden
if Serie.index is None:
set_ = Series.objects.filter().order_by("-order_no")
Serie.index = 1 if not set_ else set_[0].order_no
Serie.index += 1
[docs] def process(self) -> None:
"Process Series information"
rows = zip(self.table.rows, count_with_msg(f"Importing '{self.name}', line"))
row, _ = next(rows)
title, *_ = row.cells
try:
name, url = title.text, title.url
except IndexError:
if self.name not in {"Spejbl & Hurvinek", "Lucky Luke"}:
raise
series = Series.objects.create(title=name, imdb_url=url, order_no=Serie.index)
# skip one row
_ = next(rows)
media = None
for row, _ in rows:
row = (row.cells[:8] + row.cells[9:])[:9]
if len(row) < 9:
break
data = SerieRow(*row)
# Season
season = data.season.int
if season is None:
continue
diskset = data.diskset.float
if (diskset is not None) and int(diskset) != diskset:
sub_season = round((diskset - int(diskset)) * 10)
else:
sub_season = None
# Media
if data.dvd_link is not None and data.dvd_link.text is not None:
media, _ = get_media(
media=data.dvd_link,
index=data.disk.text,
name=name, # data.info.text,
season=season,
subseason=sub_season,
)
season, _ = Season.objects.get_or_create(series=series, season=season)
# Episode
episode = data.episode.float
if int(episode) == episode:
sub_episode = None
episode = int(episode)
else:
sub_episode = round((episode - int(episode)) * 10)
episode = int(episode)
episode_name, imdb_url = data.info.text, data.info.url
index = None if data.index is None else data.index.int
desc = None if data.desc is None else data.desc.text
series_episode, _ = SeriesEpisode.objects.get_or_create(
title=episode_name,
medium=media,
imdb_url=imdb_url,
dvd_index=index,
season=season,
episode=episode,
sub_episode=sub_episode,
desc=desc,
)
# Seen
date = data.date.date
if date is not None:
Seen.objects.create(date=date, watch_item=series_episode)
if (
data.dvd_link.text is not None
and data.dvd_link.link is None
and data.dvd_link.float > 0.0
):
vendor, _ = Person.objects.get_or_create(name=row.season.text)
purchase = Purchase.objects.create(
date=row.date.date, price=row.dvd_link.float, vendor=vendor
)
purchase.media.set([media])
purchase.save()
# Local Variables:
# mode: python
# compile-command: "poetry run tox"
# time-stamp-pattern: "30/__date__ = \"%:y/%02m/%02d %02H:%02M:%02S %u\""
# End: