"""Product app serializers.""" from rest_framework import serializers from utils.serializers import TranslatedField, FavoritesCreateSerializer from product.models import Product, ProductSubType, ProductType from utils import exceptions as utils_exceptions from django.utils.translation import gettext_lazy as _ from location.serializers import WineRegionBaseSerializer, CountrySimpleSerializer from gallery.models import Image class ProductSubTypeBaseSerializer(serializers.ModelSerializer): """ProductSubType base serializer""" name_translated = TranslatedField() index_name_display = serializers.CharField(source='get_index_name_display') class Meta: model = ProductSubType fields = [ 'id', 'name_translated', 'index_name_display', ] class ProductTypeBaseSerializer(serializers.ModelSerializer): """ProductType base serializer""" name_translated = TranslatedField() index_name_display = serializers.CharField(source='get_index_name_display') class Meta: model = ProductType fields = [ 'id', 'name_translated', 'index_name_display', ] class ProductBaseSerializer(serializers.ModelSerializer): """Product base serializer.""" name_translated = TranslatedField() description_translated = TranslatedField() category_display = serializers.CharField(source='get_category_display') product_type = ProductTypeBaseSerializer() subtypes = ProductSubTypeBaseSerializer(many=True) wine_region = WineRegionBaseSerializer(allow_null=True) available_countries = CountrySimpleSerializer(source='country', many=True) class Meta: """Meta class.""" model = Product fields = [ 'id', 'slug', 'name_translated', 'category_display', 'description_translated', 'available', 'product_type', 'subtypes', 'public_mark', 'wine_region', 'standards', 'available_countries', ] class ProductFavoritesCreateSerializer(FavoritesCreateSerializer): """Serializer to create favorite object w/ model Product.""" def validate(self, attrs): """Overridden validate method""" # Check establishment object product_qs = Product.objects.filter(slug=self.slug) # Check establishment obj by slug from lookup_kwarg if not product_qs.exists(): raise serializers.ValidationError({'detail': _('Object not found.')}) else: product = product_qs.first() # Check existence in favorites if product.favorites.filter(user=self.user).exists(): raise utils_exceptions.FavoritesError() attrs['product'] = product return attrs def create(self, validated_data, *args, **kwargs): """Overridden create method""" validated_data.update({ 'user': self.user, 'content_object': validated_data.pop('product') }) return super().create(validated_data) # class CropImageSerializer(serializers.Serializer): # """Serializer for crop images for News object.""" # # preview_url = serializers.SerializerMethodField() # promo_horizontal_web_url = serializers.SerializerMethodField() # promo_horizontal_mobile_url = serializers.SerializerMethodField() # tile_horizontal_web_url = serializers.SerializerMethodField() # tile_horizontal_mobile_url = serializers.SerializerMethodField() # tile_vertical_web_url = serializers.SerializerMethodField() # highlight_vertical_web_url = serializers.SerializerMethodField() # editor_web_url = serializers.SerializerMethodField() # editor_mobile_url = serializers.SerializerMethodField() # # def get_preview_url(self, obj): # """Get crop preview.""" # return obj.instance.get_image_url('news_preview') # # def get_promo_horizontal_web_url(self, obj): # """Get crop promo_horizontal_web.""" # return obj.instance.get_image_url('news_promo_horizontal_web') # # def get_promo_horizontal_mobile_url(self, obj): # """Get crop promo_horizontal_mobile.""" # return obj.instance.get_image_url('news_promo_horizontal_mobile') # # def get_tile_horizontal_web_url(self, obj): # """Get crop tile_horizontal_web.""" # return obj.instance.get_image_url('news_tile_horizontal_web') # # def get_tile_horizontal_mobile_url(self, obj): # """Get crop tile_horizontal_mobile.""" # return obj.instance.get_image_url('news_tile_horizontal_mobile') # # def get_tile_vertical_web_url(self, obj): # """Get crop tile_vertical_web.""" # return obj.instance.get_image_url('news_tile_vertical_web') # # def get_highlight_vertical_web_url(self, obj): # """Get crop highlight_vertical_web.""" # return obj.instance.get_image_url('news_highlight_vertical_web') # # def get_editor_web_url(self, obj): # """Get crop editor_web.""" # return obj.instance.get_image_url('news_editor_web') # # def get_editor_mobile_url(self, obj): # """Get crop editor_mobile.""" # return obj.instance.get_image_url('news_editor_mobile') class ProductImageSerializer(serializers.ModelSerializer): """Serializer for returning crop images of product image.""" orientation_display = serializers.CharField(source='get_orientation_display', read_only=True) original_url = serializers.URLField(source='image.url') # auto_crop_images = CropImageSerializer(source='image', allow_null=True) class Meta: model = Image fields = [ 'id', 'title', 'orientation_display', 'original_url', # 'auto_crop_images', ] extra_kwargs = { 'orientation': {'write_only': True} }