Source code for berhoel.django.media_ooimport.console.kuv
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""Process the `k&v` sheet.
"""
# Standard library imports.
from collections import namedtuple
# First party library imports.
from berhoel.helper import count_with_msg, timed_process_msg_context
from berhoel.django.media.models import DVD, Sell, Person, Purchase
# Local library imports.
from ..models import SaveLine
__date__ = "2022/08/13 17:39:08 hoel"
__author__ = "Berthold Höllmann"
__copyright__ = "Copyright © 2020 by Berthold Höllmann"
__credits__ = ["Berthold Höllmann"]
__maintainer__ = "Berthold Höllmann"
__email__ = "berhoel@gmail.com"
# line in "k&v" sheet where header line is located.
K_V_HEADER = 6
KaufenUndVerkaufenRow = namedtuple(
"KaufenUndVerkaufenRow",
(
"title",
"kaufdatum",
"kaufpreis",
"verkauft_am",
"verkaufpreis",
"familie",
"verkäufer",
"käufer",
),
)
[docs]class KaufenUndVerkaufen:
"""Process the `k&v` sheet."""
[docs] def __init__(self, table):
"""
Args:
table (berhoel.odf.ods.Ods): OpenOffice table."""
self.table = table
[docs] def process(self) -> None:
"Read sheet 'k&v' (kaufen und verkaufen)."
purchases = []
line_ids = []
rows = iter(self.table.rows)
_ = [_ for _ in zip(range(K_V_HEADER), rows)]
for row, line in zip(
rows, count_with_msg("Importing k&v, line", K_V_HEADER + 1)
):
row = (row.cells[:5] + row.cells[7:8] + row.cells[9:])[:8]
data = KaufenUndVerkaufenRow(*row)
if data.title.text is None:
break
if data.kaufdatum is not None:
price = 0.0 if data.kaufpreis is None else data.kaufpreis.float
purchase = Purchase(date=data.kaufdatum.date, price=price)
if data.verkäufer.text is not None:
vendor, _ = Person.objects.get_or_create(name=data.verkäufer.text)
purchase.vendor = vendor
purchases.append((purchase, []))
dvd = DVD.objects.create(
name=data.title.text,
adver_name=data.title.text,
family=data.familie.text == "X",
)
line_ids.append(SaveLine(dvd=dvd, line=line))
purchases[-1][1].append(dvd)
if data.verkauft_am is not None and data.verkauft_am.date is not None:
buyer = None
if data.käufer.text is not None:
buyer, _ = Person.objects.get_or_create(name=data.käufer.text)
sold, _ = Sell.objects.get_or_create(
date=data.verkauft_am.date,
price=data.verkaufpreis.float,
buyer=buyer,
)
sold.dvds.add(dvd)
sold.save()
with timed_process_msg_context("Store Purchase"):
Purchase.objects.bulk_create(purchase for purchase, _ in purchases)
for (purchase, dvds), _ in zip(
purchases, count_with_msg("Store Purchase, line")
):
purchase.media.set(dvds)
purchase.save()
with timed_process_msg_context("Store SaveLine"):
SaveLine.objects.bulk_create(line_ids)
# Local Variables:
# mode: python
# compile-command: "poetry run tox"
# time-stamp-pattern: "30/__date__ = \"%:y/%02m/%02d %02H:%02M:%02S %u\""
# End: