From 73fff016a32086d33b22c896f10d08d6f21326fb Mon Sep 17 00:00:00 2001 From: monomono Date: Sat, 10 Oct 2026 16:35:43 -0500 Subject: [PATCH] #51 feat: serializadores de categorias y categorias anidadas en productos Issue #51: discriminacion y administracion de categorias de productos. - ProductCategorySerializer (name/external_id read_only) - ProductCategoryBriefSerializer para el JSON de productos - ProductSerializer.categories ahora devuelve objetos anidados --- .../don_confiao/serializers/__init__.py | 9 ++- .../don_confiao/serializers/products.py | 21 +++++++ .../tests/test_product_categories.py | 56 ++++++++++++++++++- 3 files changed, 83 insertions(+), 3 deletions(-) diff --git a/tienda_ilusion/don_confiao/serializers/__init__.py b/tienda_ilusion/don_confiao/serializers/__init__.py index 46480a9..33780a3 100644 --- a/tienda_ilusion/don_confiao/serializers/__init__.py +++ b/tienda_ilusion/don_confiao/serializers/__init__.py @@ -1,5 +1,10 @@ from .catalogue_images import CatalogueImageSerializer -from .products import ProductSerializer, ListProductSerializer +from .products import ( + ProductSerializer, + ListProductSerializer, + ProductCategorySerializer, + ProductCategoryBriefSerializer, +) from .customers import CustomerSerializer, ListCustomerSerializer from .sales import ( SaleSerializer, @@ -26,6 +31,8 @@ __all__ = [ # Products "ProductSerializer", "ListProductSerializer", + "ProductCategorySerializer", + "ProductCategoryBriefSerializer", # Customers "CustomerSerializer", "ListCustomerSerializer", diff --git a/tienda_ilusion/don_confiao/serializers/products.py b/tienda_ilusion/don_confiao/serializers/products.py index d43c07c..0baa835 100644 --- a/tienda_ilusion/don_confiao/serializers/products.py +++ b/tienda_ilusion/don_confiao/serializers/products.py @@ -4,11 +4,32 @@ from ..models.products import Product, ProductCategory from ..models.provenance import Supplier +class ProductCategorySerializer(serializers.ModelSerializer): + class Meta: + model = ProductCategory + fields = [ + "id", + "name", + "external_id", + "description", + "alternative_name", + "active", + ] + read_only_fields = ["name", "external_id"] + + +class ProductCategoryBriefSerializer(serializers.ModelSerializer): + class Meta: + model = ProductCategory + fields = ["id", "name", "alternative_name", "active"] + + class ProductSerializer(serializers.ModelSerializer): catalogue_images = serializers.SerializerMethodField() suppliers = serializers.PrimaryKeyRelatedField( many=True, queryset=Supplier.objects.all(), required=False ) + categories = ProductCategoryBriefSerializer(many=True, read_only=True) class Meta: model = Product diff --git a/tienda_ilusion/don_confiao/tests/test_product_categories.py b/tienda_ilusion/don_confiao/tests/test_product_categories.py index 90420f9..d20b42c 100644 --- a/tienda_ilusion/don_confiao/tests/test_product_categories.py +++ b/tienda_ilusion/don_confiao/tests/test_product_categories.py @@ -1,6 +1,6 @@ from django.test import TestCase -from ..models.products import ProductCategory +from ..models.products import Product, ProductCategory class TestProductCategoryModel(TestCase): @@ -22,4 +22,56 @@ class TestProductCategoryModel(TestCase): category = ProductCategory.objects.create(name="Granos") self.assertTrue(category.active) self.assertEqual(category.description, "") - self.assertIsNone(category.alternative_name) \ No newline at end of file + self.assertIsNone(category.alternative_name) + + +class TestProductCategorySerializers(TestCase): + def test_product_category_serializer_devuelve_campos_don_confiao(self): + from ..serializers import ProductCategorySerializer + + category = ProductCategory.objects.create( + name="Bebidas", + external_id="8", + description="Bebidas naturales", + alternative_name="Jugos", + active=False, + ) + data = ProductCategorySerializer(category).data + self.assertEqual( + data, + { + "id": category.pk, + "name": "Bebidas", + "external_id": "8", + "description": "Bebidas naturales", + "alternative_name": "Jugos", + "active": False, + }, + ) + + def test_product_serializer_incluye_categorias_anidadas(self): + from ..serializers import ProductSerializer + + category = ProductCategory.objects.create( + name="Bebidas", external_id="8", alternative_name="Jugos" + ) + product = Product.objects.create( + name="Jugo de naranja", + price=2500, + measuring_unit="UNIT", + external_id="10", + ) + product.categories.add(category) + + data = ProductSerializer(product).data + self.assertEqual( + data["categories"], + [ + { + "id": category.pk, + "name": "Bebidas", + "alternative_name": "Jugos", + "active": True, + } + ], + ) \ No newline at end of file