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: