37 lines
1020 B
Python
37 lines
1020 B
Python
from __future__ import annotations
|
|
|
|
from typing import Iterable
|
|
|
|
from .csv_parsers import get_parser
|
|
from .models import Expense
|
|
|
|
|
|
class CSVImportResult:
|
|
def __init__(self, imported: int, duplicated: int) -> None:
|
|
self.imported = imported
|
|
self.duplicated = duplicated
|
|
|
|
|
|
def import_csv_lines(lines: Iterable[str]) -> CSVImportResult:
|
|
buffered_lines = list(lines)
|
|
parser = get_parser(buffered_lines)
|
|
rows = parser.parse(buffered_lines)
|
|
imported = 0
|
|
duplicated = 0
|
|
for row in rows:
|
|
expense, created = Expense.objects.get_or_create(
|
|
source=row.source,
|
|
source_hash=row.source_hash,
|
|
defaults={
|
|
'use_date': row.use_date,
|
|
'description': row.description,
|
|
'amount': row.amount,
|
|
'note': row.note,
|
|
},
|
|
)
|
|
if created:
|
|
imported += 1
|
|
else:
|
|
duplicated += 1
|
|
return CSVImportResult(imported=imported, duplicated=duplicated)
|