168 lines
5.9 KiB
Python
168 lines
5.9 KiB
Python
"""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}
|
|
}
|