from rest_framework import serializers
from oscarapi.utils import (
OscarModelSerializer,
overridable,
OscarHyperlinkedModelSerializer
)
from oscar.core.loading import get_model
Product = get_model('catalogue', 'Product')
ProductClass = get_model('catalogue', 'ProductClass')
ProductCategory = get_model('catalogue', 'ProductCategory')
ProductAttribute = get_model('catalogue', 'ProductAttribute')
ProductAttributeValue = get_model('catalogue', 'ProductAttributeValue')
ProductImage = get_model('catalogue', 'ProductImage')
Option = get_model('catalogue', 'Option')
Partner = get_model('partner', 'Partner')
class PartnerSerializer(OscarModelSerializer):
class Meta:
model = Partner
fields = '__all__'
[docs]class OptionSerializer(OscarHyperlinkedModelSerializer):
class Meta:
model = Option
fields = overridable('OSCARAPI_OPTION_FIELDS', default=(
'url', 'id', 'name', 'code', 'type'
))
[docs]class ProductLinkSerializer(OscarHyperlinkedModelSerializer):
class Meta:
model = Product
fields = overridable(
'OSCARAPI_PRODUCT_FIELDS', default=(
'url', 'id', 'title'
))
[docs]class ProductAttributeValueSerializer(OscarModelSerializer):
name = serializers.StringRelatedField(source="attribute")
value = serializers.StringRelatedField()
class Meta:
model = ProductAttributeValue
fields = overridable('OSCARAPI_PRODUCT_ATTRIBUTE_VALUE_FIELDS', default=('name', 'value',))
[docs]class ProductAttributeSerializer(OscarModelSerializer):
productattributevalue_set = ProductAttributeValueSerializer(many=True)
class Meta:
model = ProductAttribute
fields = overridable('OSCARAPI_PRODUCT_ATTRIBUTE_FIELDS', default=('name', 'productattributevalue_set'))
class ProductImageSerializer(OscarModelSerializer):
class Meta:
model = ProductImage
fields = '__all__'
class AvailabilitySerializer(serializers.Serializer):
is_available_to_buy = serializers.BooleanField()
num_available = serializers.IntegerField(required=False)
message = serializers.CharField()
[docs]class RecommmendedProductSerializer(OscarModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='product-detail')
class Meta:
model = Product
fields = overridable(
'OSCARAPI_RECOMMENDED_PRODUCT_FIELDS', default=('url',))
[docs]class ProductSerializer(OscarModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='product-detail')
stockrecords = serializers.HyperlinkedIdentityField(
view_name='product-stockrecord-list')
attributes = ProductAttributeValueSerializer(
many=True, required=False, source="attribute_values")
categories = serializers.StringRelatedField(many=True, required=False)
product_class = serializers.StringRelatedField(required=False)
images = ProductImageSerializer(many=True, required=False)
price = serializers.HyperlinkedIdentityField(view_name='product-price')
availability = serializers.HyperlinkedIdentityField(
view_name='product-availability')
options = OptionSerializer(many=True, required=False)
recommended_products = RecommmendedProductSerializer(
many=True, required=False)
class Meta:
model = Product
fields = overridable(
'OSCARAPI_PRODUCTDETAIL_FIELDS',
default=(
'url', 'id', 'title', 'description',
'date_created', 'date_updated', 'recommended_products',
'attributes', 'categories', 'product_class',
'stockrecords', 'images', 'price', 'availability', 'options'))
class OptionValueSerializer(serializers.Serializer):
option = serializers.HyperlinkedRelatedField(
view_name='option-detail', queryset=Option.objects)
value = serializers.CharField()
class AddProductSerializer(serializers.Serializer):
"""
Serializes and validates an add to basket request.
"""
quantity = serializers.IntegerField(required=True)
url = serializers.HyperlinkedRelatedField(
view_name='product-detail', queryset=Product.objects, required=True)
options = OptionValueSerializer(many=True, required=False)
class Meta:
model = Product