mirror of
https://github.com/almet/copanier.git
synced 2025-04-28 19:42:37 +02:00
Import multiple sheets
This commit is contained in:
parent
49b16a761f
commit
f609c51366
1 changed files with 34 additions and 25 deletions
|
@ -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))
|
||||
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()
|
Loading…
Reference in a new issue