Skip to content

Commit

Permalink
Add: 增加图片API
Browse files Browse the repository at this point in the history
  • Loading branch information
doraemonext committed Mar 18, 2015
1 parent 96e8f10 commit dde4271
Show file tree
Hide file tree
Showing 7 changed files with 134 additions and 0 deletions.
Empty file.
60 changes: 60 additions & 0 deletions wechat_platform/api/library/image/serializer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# -*- coding: utf-8 -*-

from django.core.urlresolvers import reverse

from rest_framework import serializers

from lib.tools import validator
from system.library.image.models import LibraryImage
from system.media.models import Media


class LibraryImageSerializer(serializers.ModelSerializer):
"""
系统素材库 - 图片库 序列化类
"""
image = serializers.PrimaryKeyRelatedField(error_messages={
'required': u'必须上传图片文件',
})
image_url = serializers.SerializerMethodField('get_image_url')
image_detail = serializers.SerializerMethodField('get_image_detail')

def get_image_url(self, obj):
if obj.image:
return reverse('filetranslator:download', kwargs={'key': obj.image.pk})
else:
return None

def get_image_detail(self, obj):
if obj.image:
return obj.image.__dict__
else:
return {}

def validate_image(self, attrs, source):
image = attrs.get(source)
if not image:
raise serializers.ValidationError(u'必须上传图片文件')
return attrs

def save(self, **kwargs):
"""
重载默认的 save 方法,使得在 POST 请求新建公众号时可以调用 LibraryMusic manager 中的方法
:return: 保存好的 object
"""
view = self.context.get('view')

if view and view.request.method == 'POST':
self.object = LibraryImage.manager.add(
official_account=self.object.official_account,
plugin_iden=self.object.plugin_iden,
image=self.object.image,
)
return self.object
else:
return super(LibraryImageSerializer, self).save(**kwargs)

class Meta:
model = LibraryImage
fields = ('id', 'official_account', 'plugin_iden', 'image', 'image_url', 'image_detail', 'fid', 'media_id')
read_only_fields = ('fid', 'media_id')
9 changes: 9 additions & 0 deletions wechat_platform/api/library/image/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url

from api.library.image.views import LibraryImageListAPI, LibraryImageDetailAPI

urlpatterns = patterns('',
url(r'^$', LibraryImageListAPI.as_view(), name='list'),
url(r'^(?P<pk>[0-9]+)', LibraryImageDetailAPI.as_view(), name='detail'),
)
53 changes: 53 additions & 0 deletions wechat_platform/api/library/image/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-

from django.core.urlresolvers import reverse
from django.core.exceptions import ValidationError

from rest_framework.generics import GenericAPIView
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions, mixins, filters
from rest_framework import status, parsers

from system.official_account.models import OfficialAccount
from system.library.image.models import LibraryImage
from api.library.image.serializer import LibraryImageSerializer


class LibraryImageListAPI(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
permission_classes = (permissions.IsAuthenticated, )
model = LibraryImage
serializer_class = LibraryImageSerializer
filter_fields = ('official_account', 'plugin_iden')
ordering = ('id', )

def get_queryset(self):
return LibraryImage.manager.get_list(official_account=self.request.GET.get('official_account'))

def get(self, request, *args, **kwargs):
# 对 official_account 参数进行检查
official_account_id = request.GET.get('official_account')
if not official_account_id:
return Response({'official_account': [u'缺少 official_account 参数']}, status=status.HTTP_400_BAD_REQUEST)
if not OfficialAccount.manager.exists(official_account_id):
return Response({'official_account': [u'指定公众号不存在']}, status=status.HTTP_400_BAD_REQUEST)

return super(LibraryImageListAPI, self).list(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
return super(LibraryImageListAPI, self).create(request, *args, **kwargs)


class LibraryImageDetailAPI(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, GenericAPIView):
permission_classes = (permissions.IsAuthenticated, )
model = LibraryImage
serializer_class = LibraryImageSerializer

def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)

def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)

def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
1 change: 1 addition & 0 deletions wechat_platform/api/library/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@

urlpatterns = patterns('',
url(r'^music/', include('api.library.music.urls', namespace='music')),
url(r'^image/', include('api.library.image.urls', namespace='music')),
url(r'^news/', include('api.library.news.urls', namespace='news')),
)
1 change: 1 addition & 0 deletions wechat_platform/config/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ class Common(Configuration):
'admin.official_account',
'admin.library.music',
'admin.library.news',
'admin.library.image',
)

# Wechat Plugin App
Expand Down
10 changes: 10 additions & 0 deletions wechat_platform/system/library/image/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ class LibraryImageManager(models.Manager):
"""
素材库 - 图片库 Manager
"""
def get_list(self, official_account):
"""
获取单个公众号的所有图片列表
:param official_account: 所属公众号
:return: 列表, 每个元素为一个 LibraryImage 实例
"""
return super(LibraryImageManager, self).get_queryset().filter(
official_account=official_account
)

def get(self, official_account, plugin_iden, image_id):
"""
获取一张图片
Expand Down

0 comments on commit dde4271

Please sign in to comment.