Files
Pinry/core/drf_api.py

137 lines
3.7 KiB
Python

from rest_framework import serializers, viewsets, routers, mixins
from rest_framework.viewsets import GenericViewSet
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',
settings.DRF_URL_FIELD_NAME,
)
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",
)
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 ImageViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
queryset = Image.objects.all()
serializer_class = ImageSerializer
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)
drf_router.register(r'images', ImageViewSet)