from tastypie import fields from tastypie.authorization import DjangoAuthorization from tastypie.resources import ModelResource from django_images.models import Thumbnail from pinry.core.models import User from pinry.pins.models import Image, Pin class UserResource(ModelResource): gravatar = fields.CharField(readonly=True) def dehydrate_gravatar(self, bundle): return bundle.obj.gravatar class Meta: list_allowed_methods = ['get'] queryset = User.objects.all() resource_name = 'user' fields = ['username'] include_resource_uri = False def filter_generator_for(size): def wrapped_func(bundle, **kwargs): return Thumbnail.objects.get_or_create_at_size(bundle.obj.pk, size, **kwargs) return wrapped_func class ThumbnailResource(ModelResource): class Meta: list_allowed_methods = ['get'] fields = ['image', 'width', 'height'] queryset = Thumbnail.objects.all() resource_name = 'thumbnail' include_resource_uri = False class ImageResource(ModelResource): standard = fields.ToOneField(ThumbnailResource, full=True, attribute=lambda bundle: filter_generator_for('standard')(bundle)) thumbnail = fields.ToOneField(ThumbnailResource, full=True, attribute=lambda bundle: filter_generator_for('thumbnail')(bundle)) class Meta: fields = ['image', 'width', 'height'] include_resource_uri = False resource_name = 'image' queryset = Image.objects.all() authorization = DjangoAuthorization() class PinResource(ModelResource): submitter = fields.ToOneField(UserResource, 'submitter', full=True) image = fields.ToOneField(ImageResource, 'image', full=True) tags = fields.ListField() def hydrate_image(self, bundle): url = bundle.data.get('url', None) if url: image = Image.objects.create_for_url(url) bundle.data['image'] = '/api/v1/image/{}/'.format(image.pk) return bundle def dehydrate_tags(self, bundle): return map(str, bundle.obj.tags.all()) def build_filters(self, filters=None): if filters is None: filters = {} orm_filters = super(PinResource, self).build_filters(filters) if 'tag' in filters: orm_filters['tags__name__in'] = filters['tag'].split(',') return orm_filters def save_m2m(self, bundle): tags = bundle.data.get('tags', []) bundle.obj.tags.set(*tags) return super(PinResource, self).save_m2m(bundle) class Meta: fields = ['id', 'url', 'description'] ordering = ['id'] queryset = Pin.objects.all() resource_name = 'pin' include_resource_uri = False always_return_data = True authorization = DjangoAuthorization()