# coding=utf-8 from __future__ import unicode_literals from django.conf import settings from django.contrib.auth import get_user_model from rest_framework import serializers from rest_framework.fields import Field from adim.models import AnObj, Annotation # from sorl.thumbnail import get_thumbnail import json from django.core.cache import cache ANOBJ_THUMB_CACHE_BASE_KEY = 'anobj_thumb_url' #from rest_framework.pagination import PaginationSerializer class UserSerializer(serializers.ModelSerializer): # full_name = serializers.Field(source='get_full_name') class Meta: model = get_user_model() fields = ('id', 'username', 'email') class AnnotationSerializer(serializers.ModelSerializer): class Meta: model = Annotation fields = ("id", "owner", "annotable", "item", "comment", "order") read_only_fields = ("id",) # class OwnerOnlyField(serializers.WritableField): # """ # A field that display it's value to the owner only # """ # # def field_to_native(self, obj, field_name): # if self.context['request'].user == obj.owner: # return super(OwnerOnlyField, self).field_to_native(obj, field_name) # else: # return "" class BaseAnObjSerializer(serializers.ModelSerializer): #owner_name = serializers.ReadOnlyField(source='owner.username') owner_name = serializers.SerializerMethodField() annotations = serializers.SerializerMethodField() # members = serializers.SerializerMethodField('get_members') # members = UserSerializer(many=True, read_only=True) # sharing_opts = OwnerOnlyField(source='sharing_opts', required=False) # attrs = serializers.SerializerMethodField('attrs_as_dict') # image_url = serializers.Field(source='image.url') #image_thumb = serializers.Field(source='thumb_url') #image_thumb = serializers.SerializerMethodField('get_image_thumb') class Meta: model = AnObj fields = ('id', 'uuid', 'name', 'owners', 'owner', 'owner_name', 'annotations', 'sharing_mode', 'locked') read_only_fields = ('members',) def get_annotations(self, anobj): request = self.context.get('request') annot_serializer = AnnotationSerializer(instance=anobj.annotations.filter(owner=request.user), many=True, context=self.context) return annot_serializer.data def get_owner_name(self, anobj): return anobj.owners.all()[0].username # def get_sharing_opts(self, anobj): # request = self.context.get('request') # if request is not None and request.user == anobj.owner: # return anobj.sharing_opts # return "" # # def get_members(self, anobj): # request = self.context.get('request') # if request is not None and request.user == anobj.owner: # users_serializer = UserSerializer(instance=anobj.members.all(), many=True, context=self.context) # return users_serializer.data # return [] # # def get_image_thumb(self, obj): # cache_key = '_'.join((ANOBJ_THUMB_CACHE_BASE_KEY, str(obj.id))) # im_url = cache.get(cache_key) # if im_url is None: # im = get_thumbnail(obj.image.name, '150x150', quality=80, crop="center") # im_url = im.url # cache.set(cache_key, im_url, None) # return im_url # def attrs_as_dict(self, obj): return None # obj_dict = dict((a.schema.name, getattr(obj, a.schema.name)) for a in obj.attrs.all()) # return json.loads(json.dumps(obj_dict, default=unicode)) def attrs_as_json(self, obj): return json.dumps(self.attrs_as_dict(obj), default=unicode) class AnObjSerializer(BaseAnObjSerializer): members = UserSerializer(many=True, required=False, read_only=True) class Meta: model = AnObj fields = ('id', 'uuid', 'name', 'owners', 'owner', 'owner_name', 'annotations', 'members', 'sharing_mode', 'sharing_opts', 'locked', 'allow_public_publishing') class SharedAnObjSerializer(BaseAnObjSerializer): class Meta: model = AnObj fields = ('id', 'uuid', 'name', 'owners', 'owner', 'owner_name', 'annotations', 'locked', 'sharing_mode', 'allow_public_publishing') class AnObjListSerializer(BaseAnObjSerializer): class Meta: model = AnObj fields = ('id', 'uuid', 'name', 'owners', 'owner', 'locked', 'sharing_mode')