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):
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 = 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:
append_method(items, model_class(**raw))
except TypeError as e:
raise ValueError(f"Erreur durant l'importation de {raw['ref']}")
return items
def products_and_producers_from_xlsx(delivery, data):
if not isinstance(data, Workbook): if not isinstance(data, Workbook):
try: try:
data = load_workbook(data) data = load_workbook(data)
except BadZipFile: except BadZipFile:
raise ValueError("Impossible de lire le fichier") raise ValueError("Impossible de lire le fichier")
rows = list(data.active.values)
if not rows:
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:]:
raw = {k: v for k, v in dict(zip(headers, row)).items() if v}
try:
delivery.products.append(Product(**raw))
except TypeError as e:
raise ValueError(f"Erreur durant l'importation de {raw['ref']}")
delivery.persist()
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)
def products_from_csv(delivery, data): # Then import producers info
reader = csv.DictReader(data.splitlines(), delimiter=";") delivery.producers = items_from_xlsx(list(data.active.values), {}, Producer, PRODUCER_FIELDS, append_dict)
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() delivery.persist()