headers validation in CSV

This commit is contained in:
Diego Calvo
2021-03-26 12:07:50 +01:00
parent 0251ce034e
commit 9604eee0ef
3 changed files with 10 additions and 2 deletions

View File

@@ -1,4 +1,4 @@
sku,nombre-producto,descripcion,imagen,url,precio,gastos-envio,cond-envio,descuento,stock,tags,categoria,identificadores, sku,nombre-producto,descripcion,imagen,url,precio,gastos-envio,cond-envio,descuento,stock,tags,categoria,identificadores
,mi-nombre,mi-descripcion1,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio,"color/rojo, talla/xxl" ,mi-nombre,mi-descripcion1,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio,"color/rojo, talla/xxl"
,mi-nombre,,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio, "color/rojo, talla/xxl" ,mi-nombre,,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio, "color/rojo, talla/xxl"
,mi-nombre,mi-descripcion2,,coop.com,3.25,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio,"dimension/alto, forma/redondo" ,mi-nombre,mi-descripcion2,,coop.com,3.25,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio,"dimension/alto, forma/redondo"
Can't render this file because it has a wrong number of fields in line 2.

View File

@@ -241,7 +241,7 @@ def product_loader(csv_reader, user, company=None):
'sku': row['sku'], 'sku': row['sku'],
'name': row['nombre-producto'], 'name': row['nombre-producto'],
'description': row['descripcion'], 'description': row['descripcion'],
'url': row['url'].strip(), 'url': row['url'],
'price': row['precio'], 'price': row['precio'],
'shipping_cost': row['gastos-envio'], 'shipping_cost': row['gastos-envio'],
'shipping_terms': row['cond-envio'], 'shipping_terms': row['cond-envio'],

View File

@@ -102,12 +102,20 @@ def load_coop_products(request):
try: try:
csv_file = request.FILES['csv_file'] csv_file = request.FILES['csv_file']
expected_fieldnames = ['sku','nombre-producto','descripcion','imagen','url','precio','gastos-envio','cond-envio','descuento','stock','tags','categoria','identificadores']
if csv_file.name.endswith('.csv') is not True: if csv_file.name.endswith('.csv') is not True:
logging.error(f"File {csv_file.name} is not a CSV file") logging.error(f"File {csv_file.name} is not a CSV file")
return Response({"errors":{"details": "File is not CSV type"}}, status=status.HTTP_406_NOT_ACCEPTABLE) return Response({"errors":{"details": "File is not CSV type"}}, status=status.HTTP_406_NOT_ACCEPTABLE)
logging.info(f"Reading contents of {csv_file.name}") logging.info(f"Reading contents of {csv_file.name}")
decoded_file = csv_file.read().decode('utf-8').splitlines() decoded_file = csv_file.read().decode('utf-8').splitlines()
fieldnames = decoded_file[0].split(',')
# Check the fieldnames are as specified, if requested
if expected_fieldnames and fieldnames != expected_fieldnames:
return Response({"errors": {"details": f"The CSV fields are expected to be {','.join(expected_fieldnames)}"}}, status=status.HTTP_400_BAD_REQUEST)
csv_reader = csv.DictReader(decoded_file, delimiter=',') csv_reader = csv.DictReader(decoded_file, delimiter=',')
count = product_loader(csv_reader, request.user) count = product_loader(csv_reader, request.user)
if count is None: if count is None: