Import multiple sheets

This commit is contained in:
Alexis M 2019-09-16 22:37:30 +02:00
parent 49b16a761f
commit f609c51366

View file

@ -1,42 +1,51 @@
import csv import csv
import functools
from zipfile import BadZipFile from zipfile import BadZipFile
from openpyxl import load_workbook, Workbook from openpyxl import load_workbook, Workbook
from .models import Product from .models import Product, Producer
PRODUCT_FIELDS = {"ref", "name", "price"} PRODUCT_FIELDS = {"ref", "name", "price"}
PRODUCER_FIELDS = {"id", "name"}
def products_from_xlsx(delivery, data): def append_list(field, item):
if not isinstance(data, Workbook): return field.append(item)
try:
data = load_workbook(data)
except BadZipFile: def append_dict(field, item):
raise ValueError("Impossible de lire le fichier") return field(item.id, item)
rows = list(data.active.values)
if not rows:
def items_from_xlsx(data, items, model_class, required_fields, append_method):
if not data:
raise ValueError raise ValueError
headers = rows[0] headers = data[0]
if not set(headers) >= PRODUCT_FIELDS: if not set(headers) >= required_fields:
raise ValueError("Colonnes obligatoires: name, ref, price") raise ValueError(f"Colonnes obligatoires: {', '.join(required_fields)}")
delivery.products = [] for row in data[1:]:
for row in rows[1:]:
raw = {k: v for k, v in dict(zip(headers, row)).items() if v} raw = {k: v for k, v in dict(zip(headers, row)).items() if v}
try: try:
delivery.products.append(Product(**raw)) append_method(items, model_class(**raw))
except TypeError as e: except TypeError as e:
raise ValueError(f"Erreur durant l'importation de {raw['ref']}") raise ValueError(f"Erreur durant l'importation de {raw['ref']}")
delivery.persist() return items
def products_from_csv(delivery, data): def products_and_producers_from_xlsx(delivery, data):
reader = csv.DictReader(data.splitlines(), delimiter=";") if not isinstance(data, Workbook):
if not set(reader.fieldnames) >= PRODUCT_FIELDS: try:
raise ValueError("Colonnes obligatoires: name, ref, price. " data = load_workbook(data)
"Assurez-vous que le délimiteur soit bien «;»") except BadZipFile:
delivery.products = [] raise ValueError("Impossible de lire le fichier")
for row in reader:
delivery.products.append(Product(**row)) sheet_names = data.get_sheet_names()
delivery.persist() # 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()