from django.db.models import Count from django.conf.urls import url from tastypie.authentication import SessionAuthentication, Authentication from tastypie.authorization import DjangoAuthorization, Authorization from tastypie import fields from tastypie.exceptions import ImmediateHttpResponse from tastypie.http import HttpUnauthorized from tastypie.utils import trailing_slash from spa.api.v1.BaseResource import BaseResource from spa.models import Playlist, Mix, UserProfile class PlaylistResource(BaseResource): user = fields.ToOneField('spa.api.v1.UserResource.UserResource', 'user') mixes = fields.ManyToManyField('spa.api.v1.MixResource.MixResource', 'mixes', full=True, null=True) class Meta: queryset = Playlist.objects.all().annotate(mix_count=Count('mixes')).order_by('-mix_count') always_return_data = True excludes = ['public'] authentication = Authentication() authorization = Authorization() def authorized_read_list(self, object_list, bundle): if bundle.request.user.is_authenticated(): return object_list.filter(user=bundle.request.user) raise ImmediateHttpResponse( HttpUnauthorized("Git tae fuck") ) def prepend_urls(self): return [ url(r"^(?P%s)/(?P[\d]+)%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('dispatch_detail'), name="api_dispatch_detail"), url(r"^(?P%s)/(?P[\w\d-]+)%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('dispatch_detail'), name="api_dispatch_detail"), ] def hydrate(self, bundle): bundle.obj.user = bundle.request.user.get_profile() return bundle def dehydrate(self, bundle): bundle.data['playlist_image'] = bundle.obj.get_image_url() bundle.data['item_url'] = '/playlist/%s' % bundle.obj.slug return bundle def obj_update(self, bundle, skip_errors=False, **kwargs): if 'playlist_image' in kwargs: del kwargs['playlist_image'] if 'item_url' in kwargs: del kwargs['item_url'] mixes = bundle.data['mixes'] bundle.data.pop('mixes') result = super(PlaylistResource, self).obj_update(bundle, **kwargs) if mixes: for mix_item in mixes: result.obj.mixes.add(Mix.objects.get(pk=mix_item['id'])) result.obj.save() return result def obj_create(self, bundle, **kwargs): try: mixes = bundle.data['mixes'] bundle.data.pop('mixes') result = super(PlaylistResource, self).obj_create(bundle, **kwargs) if mixes: for mix_item in mixes: result.obj.mixes.add(Mix.objects.get(pk=mix_item['id'])) result.obj.save() return result except Exception, ex: print ex