From 47098c48af0b66ed0f9cde50225aca2ed36d5330 Mon Sep 17 00:00:00 2001
From: Mono Mono <monomono@disroot.org>
Date: Sat, 29 Jun 2024 18:12:25 -0500
Subject: [PATCH] fix: actualizacion de categorias en la importacion de
 productos.

---
 .../don_confiao/example_products2.csv         |  2 +-
 tienda_ilusion/don_confiao/test_products.py   | 15 +++++++++++++
 tienda_ilusion/don_confiao/views.py           | 21 +++++++++++--------
 3 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/tienda_ilusion/don_confiao/example_products2.csv b/tienda_ilusion/don_confiao/example_products2.csv
index f46428b..787e48d 100644
--- a/tienda_ilusion/don_confiao/example_products2.csv
+++ b/tienda_ilusion/don_confiao/example_products2.csv
@@ -1,4 +1,4 @@
 "producto","unidad","precio","categorias"
 "Aceite","Unidad", 50000,"Aceites&Alimentos"
 "Café","Unidad", 15000,"Cafes&Alimentos"
-"Arroz","Unidad", 6000,"Cafes&Alimentos"
+"Arroz","Unidad", 6000,"Alimentos&Granos"
diff --git a/tienda_ilusion/don_confiao/test_products.py b/tienda_ilusion/don_confiao/test_products.py
index 94870a6..0b4e0dc 100644
--- a/tienda_ilusion/don_confiao/test_products.py
+++ b/tienda_ilusion/don_confiao/test_products.py
@@ -48,6 +48,21 @@ class TestProducts(TestCase):
         id_post_updated = Product.objects.get(name='Aceite').id
         self.assertEqual(id_aceite, id_post_updated)
 
+    def test_update_categories_on_import(self):
+        self._import_csv()
+        first_products = self._get_products()
+        first_categories = {p["name"]: p["categories"] for p in first_products}
+        self._import_csv('example_products2.csv')
+        updated_products = self._get_products()
+        updated_categories = {p["name"]: p["categories"] for p in updated_products}
+
+        self.assertIn('Cafes', first_categories['Arroz'])
+        self.assertNotIn('Granos', first_categories['Arroz'])
+
+        self.assertIn('Granos', updated_categories['Arroz'])
+        self.assertNotIn('Cafes', updated_categories['Arroz'])
+
+
     def test_update_price(self):
         self._import_csv()
         first_products = self._get_products()
diff --git a/tienda_ilusion/don_confiao/views.py b/tienda_ilusion/don_confiao/views.py
index 8f04092..257b779 100644
--- a/tienda_ilusion/don_confiao/views.py
+++ b/tienda_ilusion/don_confiao/views.py
@@ -55,6 +55,14 @@ def import_products(request):
         {'form': form}
     )
 
+def _categories_from_csv_string(categories_string, separator="&"):
+    categories = categories_string.split(separator)
+    clean_categories = [c.strip() for c in categories]
+    return [_category_from_name(category) for category in clean_categories]
+
+def _category_from_name(name):
+    return ProductCategory.objects.get_or_create(name=name)[0]
+
 def handle_import_products_file(csv_file):
     data = io.StringIO(csv_file.read().decode('utf-8'))
     reader = csv.DictReader(data, quotechar='"')
@@ -63,15 +71,10 @@ def handle_import_products_file(csv_file):
             name=row['producto'],
             defaults={
                 'price': row['precio'],
-                'measuring_unit': row['unidad'],
+                'measuring_unit': row['unidad']
             }
         )
-
-        categories = [n.strip() for n in row["categorias"].split("&")]
+        categories = _categories_from_csv_string(row["categorias"])
+        product.categories.clear()
         for category in categories:
-            category_model, _ = ProductCategory.objects.get_or_create(
-                name=category
-            )
-            category_model.save()
-            product.categories.add(category_model)
-        product.save()
+            product.categories.add(category)