improvements to csv product loading

This commit is contained in:
Sam
2021-03-03 10:41:34 +00:00
parent 794250a6ab
commit ddf7aee312
4 changed files with 25 additions and 24 deletions

View File

@@ -1,10 +1,10 @@
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-descripcion,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio, "alto, forma/redondo" ,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, "alto, forma/redondo" ,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-descripcion,,coop.com,,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio, "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"
,mi-nombre,mi-descripcion,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio, "alto, forma/redondo" ,mi-nombre,mi-descripcion3,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio,"alto, forma/redondo"
,mi-nombre,mi-descripcion,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio, "alto, forma/redondo" ,mi-nombre,mi-descripcion4,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio,"alto, forma/redondo"
,mi-nombre,mi-descripcion,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio, "alto, forma/redondo" ,mi-nombre,mi-descripcion5,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio,"alto, forma/redondo"
,mi-nombre,mi-descripcion,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio, "alto, forma/redondo" ,mi-nombre,mi-descripcion6,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio,"alto, forma/redondo"
,mi-nombre,mi-descripcion,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio, "alto, forma/redondo" ,mi-nombre,mi-descripcion7,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl", limpio,"alto, forma/redondo"
,mi-nombre,mi-descripcion,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl" ,mi-nombre,mi-descripcion8,,coop.com,10.00,5.01,"condiciones de envio, una cosa, y la otra",4.05,1000,"color/rojo, talla/xxl",,
Can't render this file because it has a wrong number of fields in line 10.

View File

@@ -434,11 +434,10 @@ class LoadCoopProductsTestCase(APITestCase):
# send in request # send in request
response = self.client.post(self.endpoint, files) response = self.client.post(self.endpoint, files)
# check response # check response
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
# check for object creation # check for object creation
self.assertEquals(5, self.model.objects.count()) self.assertEquals(9, self.model.objects.count())
def test_auth_user_with_no_company_cannot_load_csv(self): def test_auth_user_with_no_company_cannot_load_csv(self):
# delete existing instances # delete existing instances
@@ -455,7 +454,7 @@ class LoadCoopProductsTestCase(APITestCase):
response = self.client.post(self.endpoint, files) response = self.client.post(self.endpoint, files)
# check response # check response
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 406)
# check for object creation # check for object creation
self.assertEqual(0, self.model.objects.count()) self.assertEqual(0, self.model.objects.count())

View File

@@ -187,16 +187,19 @@ def product_loader(csv_reader, user, company=None):
for row in csv_reader: for row in csv_reader:
# trim strings # trim strings
for key in row: for key in row:
if row[key]: try:
if 'imagen' in key or 'categoria' in key: if row[key]:
row[key] = row[key].strip() if 'imagen' in key or 'categoria' in key:
elif key in ['precio', 'gastos-envio']: row[key] = row[key].strip()
row[key] = Decimal(row[key][:-1].strip().replace(',','.')) elif key in ['precio', 'gastos-envio']:
row[key] = Decimal(row[key][:-1].strip().replace(',','.'))
else:
row[key] = row[key].strip()
else: else:
row[key] = row[key].strip() row[key] = None
if row[key] == '': except Exception as e:
row[key] = None logging.error(f"Could not access key {key}: {str(e)}")
continue
# check required data # check required data
if '' in (row['nombre-producto'], row['descripcion'], row['precio'],): if '' in (row['nombre-producto'], row['descripcion'], row['precio'],):
logging.error(f"Required data missing: {row}") logging.error(f"Required data missing: {row}")

View File

@@ -80,13 +80,12 @@ def load_coop_products(request):
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()
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:
return Response({"errors": {"details": "Authenticated user is not related to any company"}}, status=status.HTTP_406_NOT_ACCEPTABLE) return Response({"errors": {"details": "Authenticated user is not related to any company"}}, status=status.HTTP_406_NOT_ACCEPTABLE)
return Response(f"{count} products registered for {request.user.company.company_name}") return Response(f"{count} products registered for {request.user.company.company_name}")
except Exception as e: except Exception as e:
return Response({"errors": {"details": str(type(e))}}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) return Response({"errors": {"details": str(e)}}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@api_view(['GET',]) # include allowed methods @api_view(['GET',]) # include allowed methods