|
|
|
""" Budget Parser """
|
|
|
|
|
|
|
|
from collections import namedtuple
|
|
|
|
|
|
|
|
from .exceptions import BudgetParserError
|
|
|
|
|
|
|
|
EXPECTED_TABLE_HEADERS = [
|
|
|
|
"Nr.",
|
|
|
|
"Projekt",
|
|
|
|
"Laufzeit",
|
|
|
|
"BA",
|
|
|
|
"Budget",
|
|
|
|
"Ausgaben",
|
|
|
|
"Rest",
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
ExcelRow = namedtuple("ExcelRow", ["row", "data"])
|
|
|
|
|
|
|
|
BudgetData = namedtuple(
|
|
|
|
"BudgetData",
|
|
|
|
[
|
|
|
|
"row",
|
|
|
|
"number",
|
|
|
|
"project_name",
|
|
|
|
"period",
|
|
|
|
"project",
|
|
|
|
"budget",
|
|
|
|
"expenses",
|
|
|
|
"rest",
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def _check_table_header(xl_row):
|
|
|
|
fields = [c.strip() for c in xl_row.data[:7]]
|
|
|
|
print(fields)
|
|
|
|
print(EXPECTED_TABLE_HEADERS)
|
|
|
|
if fields != EXPECTED_TABLE_HEADERS:
|
|
|
|
raise BudgetParserError(f"unexpected headers: '{xl_row.data}'")
|
|
|
|
|
|
|
|
|
|
|
|
def _skip_empty_lines(rows):
|
|
|
|
for xl_row in rows:
|
|
|
|
first_cell = xl_row.data[0]
|
|
|
|
if first_cell is None:
|
|
|
|
continue
|
|
|
|
if isinstance(first_cell, str) and first_cell.strip() == "":
|
|
|
|
continue
|
|
|
|
yield xl_row
|
|
|
|
|
|
|
|
|
|
|
|
def _parse_data_table(rows):
|
|
|
|
for xl_row in _skip_empty_lines(rows):
|
|
|
|
yield BudgetData(xl_row.row, *xl_row.data[:7])
|
|
|
|
|
|
|
|
|
|
|
|
def parse_budget_data(xls_sheet):
|
|
|
|
""" parses the budget data """
|
|
|
|
rows = (ExcelRow(i, v) for i, v in enumerate(xls_sheet.values, start=1))
|
|
|
|
_check_table_header(next(rows))
|
|
|
|
return list(_parse_data_table(rows))
|