Files
Pinry/core/drf_api.py

118 lines
3.1 KiB
Python
Raw Normal View History

from rest_framework import serializers, viewsets, routers
from taggit.models import Tag
from core.models import Image, Pin
from core.permissions import IsOwnerOrReadOnly
from django_images.models import Thumbnail
from django.conf import settings
from users.models import User
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = (
'username',
'gravatar',
'url',
)
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class ThumbnailSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Thumbnail
fields = (
"image",
"width",
"height",
)
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Image
fields = (
"image",
"width",
"height",
"standard",
"thumbnail",
"square",
)
standard = ThumbnailSerializer(read_only=True)
thumbnail = ThumbnailSerializer(read_only=True)
square = ThumbnailSerializer(read_only=True)
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ("name", )
class PinSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Pin
fields = (
settings.DRF_URL_FIELD_NAME,
"id",
"submitter",
"url",
"origin",
"description",
"referer",
"image",
"tags",
)
tags = serializers.SlugRelatedField(
many=True,
source="tag_list",
queryset=Tag.objects.all(),
slug_field="name",
)
image = ImageSerializer(required=False)
def create(self, validated_data):
image_file = validated_data.pop('image')
if validated_data['url']:
image = Image.objects.create_for_url(
validated_data['url'],
validated_data['referer'],
)
else:
image = Image.objects.create(image=image_file['image'])
pin = Pin.objects.create(image=image, **validated_data)
tags = validated_data.pop('tag_list')
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)
image_file = validated_data.pop('image', None)
if image_file:
image = Image.objects.create(image=image_file['image'])
instance.image = image
return super(PinSerializer, self).update(instance, validated_data)
class PinViewSet(viewsets.ModelViewSet):
queryset = Pin.objects.all()
serializer_class = PinSerializer
filter_fields = ('submitter__username', )
permission_classes = [IsOwnerOrReadOnly("submitter"), ]
drf_router = routers.DefaultRouter()
drf_router.register(r'users', UserViewSet)
drf_router.register(r'pins', PinViewSet)