Working on private API

master
Nick Sergeant 2011-12-25 16:00:41 -05:00
parent 0e5fdb6e2d
commit 2754f48d40
4 changed files with 62 additions and 30 deletions

View File

@ -52,12 +52,12 @@ USE_L10N = True
# Absolute filesystem path to the directory that will hold user-uploaded files. # Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/" # Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = os.path.join(BASE_PATH, 'media') MEDIA_ROOT = os.path.join(BASE_PATH, 'media/uploads')
# URL that handles the media served from MEDIA_ROOT. Make sure to use a # URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash. # trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/" # Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '/media/' MEDIA_URL = '/media/uploads/'
# Absolute path to the directory static files should be collected to. # Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files # Don't put anything in this directory yourself; store your static files

View File

@ -2,7 +2,7 @@ from tastypie.authentication import BasicAuthentication
from tastypie.authorization import DjangoAuthorization from tastypie.authorization import DjangoAuthorization
from tastypie.resources import ModelResource from tastypie.resources import ModelResource
from django.contrib.auth.models import User from django.contrib.auth.models import User
from snipts.models import Comment, Snipt from snipts.models import Snipt
from tastypie.cache import SimpleCache from tastypie.cache import SimpleCache
from django.db.models import Count from django.db.models import Count
from tastypie import fields from tastypie import fields
@ -40,23 +40,9 @@ class PublicTagResource(ModelResource):
snipt__public=True).count() snipt__public=True).count()
return bundle return bundle
class PublicCommentResource(ModelResource):
user = fields.ForeignKey(PublicUserResource, 'user')
snipt = fields.ForeignKey('snipts.api.PublicSniptResource', '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 PublicSniptResource(ModelResource): class PublicSniptResource(ModelResource):
user = fields.ForeignKey(PublicUserResource, 'user', full=True) user = fields.ForeignKey(PublicUserResource, 'user', full=True)
tags = fields.ToManyField(PublicTagResource, 'tags', related_name='tag', full=True) tags = fields.ToManyField(PublicTagResource, 'tags', related_name='tag', full=True)
comments = fields.ToManyField(PublicCommentResource, 'comment_set',
related_name='comment', full=True)
class Meta: class Meta:
queryset = Snipt.objects.filter(public=True).order_by('-created') queryset = Snipt.objects.filter(public=True).order_by('-created')
@ -87,14 +73,55 @@ class PublicSniptResource(ModelResource):
return orm_filters return orm_filters
class PrivateUserResource(ModelResource):
class Meta:
queryset = User.objects.all()
resource_name = 'user'
fields = ['username', 'email',]
include_absolute_url = True
allowed_methods = ['get']
list_allowed_methods = []
authentication = BasicAuthentication()
authorization = DjangoAuthorization()
cache = SimpleCache()
def apply_authorization_limits(self, request, object_list):
return object_list.filter(username=request.user.username)
class PrivateTagResource(ModelResource):
class Meta:
queryset = Tag.objects.all()
resource_name = 'tag'
fields = ['name',]
allowed_methods = ['get']
authentication = BasicAuthentication()
authorization = DjangoAuthorization()
cache = SimpleCache()
def dehydrate(self, bundle):
bundle.data['absolute_url'] = '/%s/tag/%s/' % (bundle.request.user.username,
bundle.obj.slug)
bundle.data['snipts'] = '/api/private/snipt/?tag=%d' % bundle.obj.id
bundle.data['count'] = bundle.obj.taggit_taggeditem_items.filter(
snipt__user=bundle.request.user).count()
return bundle
def apply_authorization_limits(self, request, object_list):
return object_list.filter(snipt__user=request.user)
class PrivateSniptResource(ModelResource): class PrivateSniptResource(ModelResource):
user = fields.ForeignKey(PrivateUserResource, 'user', full=True)
tags = fields.ToManyField(PrivateTagResource, 'tags', related_name='tag', full=True)
class Meta: class Meta:
queryset = Snipt.objects.all().order_by('-created') queryset = Snipt.objects.all().order_by('-created')
resource_name = 'snipt' resource_name = 'snipt'
fields = ['title', 'description', 'slug', 'lexer', 'code', 'line_count', fields = ['title', 'description', 'slug', 'lexer', 'code', 'line_count',
'key', 'public', 'created', 'modified',] 'key', 'public', 'created', 'modified',]
include_absolute_url = True include_absolute_url = True
allowed_methods = ['delete', 'get', 'post', 'put',] allowed_methods = ['get',]
authentication = BasicAuthentication() authentication = BasicAuthentication()
authorization = DjangoAuthorization() authorization = DjangoAuthorization()
cache = SimpleCache() cache = SimpleCache()
@ -108,5 +135,18 @@ class PrivateSniptResource(ModelResource):
return super(PrivateSniptResource, self).obj_create(bundle, request, return super(PrivateSniptResource, self).obj_create(bundle, request,
user=request.user) user=request.user)
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
def apply_authorization_limits(self, request, object_list): def apply_authorization_limits(self, request, object_list):
return object_list.filter(user=request.user) return object_list.filter(user=request.user)

View File

@ -56,15 +56,6 @@
<ul class="attrs"> <ul class="attrs">
<li class="author"><a href="{{ snipt.user.get_absolute_url }}">{{ snipt.user.username }}</a></li> <li class="author"><a href="{{ snipt.user.get_absolute_url }}">{{ snipt.user.username }}</a></li>
<li class="created">{{ snipt.created|naturalday }}</li> <li class="created">{{ snipt.created|naturalday }}</li>
<li class="comments">
<a href="{{ snipt.get_absolute_url }}#comments">
{% if snipt.comment_set.all|length > 0 %}
{{ snipt.comment_set.all|length }} Comment{{ snipt.comment_set.all|pluralize }}
{% else %}
No comments
{% endif %}
</a>
</li>
</ul> </ul>
</footer> </footer>
</article> </article>

View File

@ -8,13 +8,14 @@ from snipts.api import *
admin.autodiscover() admin.autodiscover()
public_api = Api(api_name='public') public_api = Api(api_name='public')
public_api.register(PublicUserResource())
public_api.register(PublicTagResource())
public_api.register(PublicCommentResource())
public_api.register(PublicSniptResource()) public_api.register(PublicSniptResource())
public_api.register(PublicTagResource())
public_api.register(PublicUserResource())
private_api = Api(api_name='private') private_api = Api(api_name='private')
private_api.register(PrivateSniptResource()) private_api.register(PrivateSniptResource())
private_api.register(PrivateTagResource())
private_api.register(PrivateUserResource())
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)), url(r'^admin/', include(admin.site.urls)),