From fafc0685a465c81619d888730a2511550f7d2735 Mon Sep 17 00:00:00 2001 From: Nick Sergeant Date: Thu, 22 Dec 2011 23:36:06 -0500 Subject: [PATCH] Setting up stuff for private API --- snipt/snipts/api.py | 80 ++++++++++++++++++++++++++++++++++++++++++++- snipt/urls.py | 14 +++++--- 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/snipt/snipts/api.py b/snipt/snipts/api.py index 08da498..10aae7c 100644 --- a/snipt/snipts/api.py +++ b/snipt/snipts/api.py @@ -1,4 +1,4 @@ -from tastypie.resources import ModelResource, ALL_WITH_RELATIONS +from tastypie.resources import ModelResource from django.contrib.auth.models import User from snipts.models import Comment, Snipt from tastypie.cache import SimpleCache @@ -82,3 +82,81 @@ class PublicSniptResource(ModelResource): orm_filters['pk__in'] = [i.object_id for i in tagged_items] return orm_filters + + +class PrivateUserResource(ModelResource): + class Meta: + queryset = User.objects.all() + resource_name = 'user' + fields = ['username',] + include_absolute_url = True + allowed_methods = ['get'] + list_allowed_methods = [] + cache = SimpleCache() + + def dehydrate(self, bundle): + bundle.data['snipts'] = '/api/public/snipt/?user=%d' % bundle.obj.id + return bundle + +class PrivateTagResource(ModelResource): + class Meta: + queryset = Tag.objects.filter(snipt__public=True) + queryset = queryset.annotate(count=Count('taggit_taggeditem_items__id')) + queryset = queryset.order_by('-count') + resource_name = 'tag' + fields = ['name',] + allowed_methods = ['get'] + cache = SimpleCache() + + def dehydrate(self, bundle): + bundle.data['absolute_url'] = '/public/tag/%s/' % bundle.obj.slug + bundle.data['snipts'] = '/api/public/snipt/?tag=%d' % bundle.obj.id + bundle.data['count'] = bundle.obj.taggit_taggeditem_items.filter( + snipt__public=True).count() + return bundle + +class PrivateCommentResource(ModelResource): + user = fields.ForeignKey(PrivateUserResource, 'user') + snipt = fields.ForeignKey('snipts.api.PrivateSniptResource', 'snipt') + + class Meta: + queryset = Comment.objects.filter(snipt__public=True).order_by('-created') + resource_name = 'comment' + fields = ['user', 'snipt', 'comment', 'created', 'modified',] + include_absolute_url = True + allowed_methods = ['get'] + cache = SimpleCache() + +class PrivateSniptResource(ModelResource): + user = fields.ForeignKey(PrivateUserResource, 'user', full=True) + tags = fields.ToManyField(PrivateTagResource, 'tags', related_name='tag', full=True) + comments = fields.ToManyField(PrivateCommentResource, 'comment_set', + related_name='comment', full=True) + + class Meta: + queryset = Snipt.objects.filter(public=True).order_by('-created') + resource_name = 'snipt' + fields = ['title', 'slug', 'lexer', 'code', 'created', 'modified',] + include_absolute_url = True + allowed_methods = ['get'] + filtering = { 'user': 'exact', } + cache = SimpleCache() + + def dehydrate(self, bundle): + bundle.data['embed_url'] = bundle.obj.get_embed_url() + bundle.data['stylized'] = bundle.obj.get_stylized() + return bundle + + def build_filters(self, filters=None): + if filters is None: + filters = {} + + orm_filters = super(PrivateSniptResource, self).build_filters(filters) + + if 'tag' in filters: + tag = Tag.objects.get(pk=filters['tag']) + tagged_items = tag.taggit_taggeditem_items.all() + orm_filters['pk__in'] = [i.object_id for i in tagged_items] + + return orm_filters + diff --git a/snipt/urls.py b/snipt/urls.py index eb18418..325a193 100644 --- a/snipt/urls.py +++ b/snipt/urls.py @@ -1,18 +1,23 @@ -from snipts.api import PublicCommentResource, PublicSniptResource, PublicUserResource, PublicTagResource from django.views.generic.simple import direct_to_template -from django.conf.urls.static import static from django.conf.urls.defaults import * from django.contrib import admin from django.conf import settings from tastypie.api import Api +from snipts.api import * admin.autodiscover() public_api = Api(api_name='public') -public_api.register(PublicCommentResource()) public_api.register(PublicUserResource()) -public_api.register(PublicSniptResource()) public_api.register(PublicTagResource()) +public_api.register(PublicCommentResource()) +public_api.register(PublicSniptResource()) + +private_api = Api(api_name='private') +private_api.register(PrivateUserResource()) +private_api.register(PrivateTagResource()) +private_api.register(PrivateCommentResource()) +private_api.register(PrivateSniptResource()) urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), @@ -22,6 +27,7 @@ urlpatterns = patterns('', url(r'^500/$', direct_to_template, {'template': '500.html'}), url(r'^api/', include(public_api.urls)), + url(r'^api/', include(private_api.urls)), url(r'^', include('snipts.urls')),