from django.utils import timezone from rest_framework import serializers from files.api.v1.serializers import FileUploadSerializer, NoIDFileUploadSerializer from shop.models import ( Product, ProductPrice, Customer, Tax, OrderLine, Order, ProductBatch, Provider, Tag, ) class TaxSerializer(serializers.ModelSerializer): class Meta: model = Tax fields = ( "id", "code", "value", ) class TagSerializer(serializers.ModelSerializer): class Meta: model = Tag fields = ( "id", "name", ) class ProductPriceSerializer(serializers.ModelSerializer): tax = TaxSerializer() class Meta: model = ProductPrice fields = ( "price", "date", "tax", "price_with_tax", ) class CreateProductPriceSerializer(serializers.ModelSerializer): class Meta: model = ProductPrice fields = ( "id", "price", "tax", ) class ProductSerializer(serializers.ModelSerializer): images = FileUploadSerializer(many=True, read_only=True) price = ProductPriceSerializer() class Meta: model = Product fields = ( "id", "name", "description", "stock", "is_digital_asset", "images", "price", "tags", ) class ListProductSerializer(serializers.ModelSerializer): price = ProductPriceSerializer() tags = TagSerializer(many=True) images = NoIDFileUploadSerializer(many=True, read_only=True) class Meta: model = Product fields = ( "id", "name", "description", "stock", "is_digital_asset", "price", "tags", "images", ) class CreateProductSerializer(serializers.ModelSerializer): price = serializers.DecimalField( max_digits=13, decimal_places=4, required=False, write_only=True ) tax = serializers.PrimaryKeyRelatedField( queryset=Tax.objects.all(), write_only=True ) def create(self, validated_data): instance = Product.objects.create( name=validated_data.get("name"), description=validated_data.get("description"), stock=validated_data.get("stock"), is_digital_asset=validated_data.get("is_digital_asset"), url=validated_data.get("url"), ) tags = validated_data.get('tags') for tag in tags: instance.tags.add(tag) ProductPrice.objects.create( product=instance, date=timezone.now(), price=validated_data.get("price"), tax=validated_data.get("tax"), ) return instance class Meta: model = Product fields = ( "id", "name", "description", "stock", "is_digital_asset", "url", "price", "tax", "tags", "images", ) class UpdateProductSerializer(serializers.ModelSerializer): class Meta: model = Product fields = ( "id", "name", "description", "stock", "is_digital_asset", "url", "tags", "images", ) class ProductBatchSerializer(serializers.ModelSerializer): class Meta: model = ProductBatch fields = ( "id", "code", "product", "quantity", "creation_date", "expiration_date", ) class CustomerSerializer(serializers.ModelSerializer): class Meta: model = Customer fields = ( "id", "vat_id", "first_name", "last_name", "email", "address", "city", "state", "country", "zip", ) class ProviderSerializer(serializers.ModelSerializer): class Meta: model = Provider fields = ( "id", "vat_id", "name", "email", "phone", "address", "city", "state", "country", "zip", ) class OrderSerializer(serializers.ModelSerializer): class Meta: model = Order fields = ( "uuid", "creation_date", "last_modification_date", "base_total", "total", "customer", "billing_address", "billing_city", "billing_state", "billing_country", "billing_zip", "shipping_address", "shipping_city", "shipping_state", "shipping_country", "shipping_zip", "contact_phone", ) read_only_fields = ( "uuid", "base_total", "total", ) class OrderLineSerializer(serializers.ModelSerializer): class Meta: model = OrderLine fields = ( "id", "product", "quantity", "price", "base_total", "total", "taxes", "tax_value", ) read_only_fields = ( "price", "base_total", "total", "taxes", "tax_value", )