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)