Files
Pinry/core/serializers.py

142 lines
3.8 KiB
Python
Raw Normal View History

2019-02-20 18:03:27 +08:00
from django.conf import settings
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from taggit.models import Tag
2019-02-20 18:03:27 +08:00
from core.models import Image
from core.models import Pin
from django_images.models import Thumbnail
from users.models import User
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = (
'username',
'gravatar',
settings.DRF_URL_FIELD_NAME,
)
class ThumbnailSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Thumbnail
fields = (
"image",
"width",
"height",
)
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Image
fields = (
"id",
"image",
"width",
"height",
"standard",
"thumbnail",
"square",
)
extra_kwargs = {
"width": {"read_only": True},
"height": {"read_only": True},
}
standard = ThumbnailSerializer(read_only=True)
thumbnail = ThumbnailSerializer(read_only=True)
square = ThumbnailSerializer(read_only=True)
def create(self, validated_data):
image = super(ImageSerializer, self).create(validated_data)
for size in settings.IMAGE_SIZES:
Thumbnail.objects.get_or_create_at_size(image.pk, size)
return image
class TagSerializer(serializers.SlugRelatedField):
class Meta:
model = Tag
fields = ("name",)
queryset = Tag.objects.all()
def __init__(self, **kwargs):
super(TagSerializer, self).__init__(
slug_field="name",
**kwargs
)
def to_internal_value(self, data):
obj, _ = self.get_queryset().get_or_create(
**{self.slug_field: data},
defaults={self.slug_field: data, "slug": data}
)
return obj
class PinSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Pin
fields = (
settings.DRF_URL_FIELD_NAME,
"id",
"submitter",
"url",
"origin",
"description",
"referer",
"image",
"image_by_id",
"tags",
)
submitter = UserSerializer(read_only=True)
tags = TagSerializer(
many=True,
source="tag_list",
2019-02-21 15:12:37 +08:00
required=False,
)
image = ImageSerializer(required=False, read_only=True)
image_by_id = serializers.PrimaryKeyRelatedField(
queryset=Image.objects.all(),
write_only=True,
required=False,
)
def validate(self, attrs):
if 'url' not in attrs and 'image_by_id' not in attrs:
raise ValidationError(
detail={
"url-or-image": "Either url or image_by_id is required."
},
)
return attrs
def create(self, validated_data):
submitter = self.context['request'].user
if 'url' in validated_data and validated_data['url']:
url = validated_data['url']
image = Image.objects.create_for_url(
url,
validated_data.get('referer', url),
)
else:
image = validated_data.pop("image_by_id")
tags = validated_data.pop('tag_list', [])
pin = Pin.objects.create(submitter=submitter, image=image, **validated_data)
if tags:
pin.tags.set(*tags)
return pin
def update(self, instance, validated_data):
tags = validated_data.pop('tag_list')
if tags:
instance.tags.set(*tags)
2019-02-21 15:12:37 +08:00
# change for image-id is not allowed
validated_data.pop('image_by_id', None)
return super(PinSerializer, self).update(instance, validated_data)