From f609c5136625441bad98714c4634cdacdbd0d983 Mon Sep 17 00:00:00 2001 From: Alexis M Date: Mon, 16 Sep 2019 22:37:30 +0200 Subject: [PATCH] Import multiple sheets --- copanier/imports.py | 59 ++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/copanier/imports.py b/copanier/imports.py index 802028d..115fc6a 100644 --- a/copanier/imports.py +++ b/copanier/imports.py @@ -1,42 +1,51 @@ import csv +import functools + from zipfile import BadZipFile from openpyxl import load_workbook, Workbook -from .models import Product +from .models import Product, Producer PRODUCT_FIELDS = {"ref", "name", "price"} +PRODUCER_FIELDS = {"id", "name"} -def products_from_xlsx(delivery, data): - if not isinstance(data, Workbook): - try: - data = load_workbook(data) - except BadZipFile: - raise ValueError("Impossible de lire le fichier") - rows = list(data.active.values) - if not rows: +def append_list(field, item): + return field.append(item) + + +def append_dict(field, item): + return field(item.id, item) + + +def items_from_xlsx(data, items, model_class, required_fields, append_method): + if not data: raise ValueError - headers = rows[0] - if not set(headers) >= PRODUCT_FIELDS: - raise ValueError("Colonnes obligatoires: name, ref, price") - delivery.products = [] - for row in rows[1:]: + headers = data[0] + if not set(headers) >= required_fields: + raise ValueError(f"Colonnes obligatoires: {', '.join(required_fields)}") + for row in data[1:]: raw = {k: v for k, v in dict(zip(headers, row)).items() if v} try: - delivery.products.append(Product(**raw)) + append_method(items, model_class(**raw)) except TypeError as e: raise ValueError(f"Erreur durant l'importation de {raw['ref']}") - delivery.persist() + return items -def products_from_csv(delivery, data): - reader = csv.DictReader(data.splitlines(), delimiter=";") - if not set(reader.fieldnames) >= PRODUCT_FIELDS: - raise ValueError("Colonnes obligatoires: name, ref, price. " - "Assurez-vous que le délimiteur soit bien «;»") - delivery.products = [] - for row in reader: - delivery.products.append(Product(**row)) - delivery.persist() +def products_and_producers_from_xlsx(delivery, data): + if not isinstance(data, Workbook): + try: + data = load_workbook(data) + except BadZipFile: + raise ValueError("Impossible de lire le fichier") + + sheet_names = data.get_sheet_names() + # First, get the products data from the first tab. + delivery.products = items_from_xlsx(list(data.active.values), [], Products, PRODUCT_FIELDS, append_list) + + # Then import producers info + delivery.producers = items_from_xlsx(list(data.active.values), {}, Producer, PRODUCER_FIELDS, append_dict) + delivery.persist() \ No newline at end of file