Skip to content

Instantly share code, notes, and snippets.

@danigosa
Forked from akoumjian/gist:1625633
Last active December 15, 2015 13:49
Show Gist options
  • Save danigosa/5270334 to your computer and use it in GitHub Desktop.
Save danigosa/5270334 to your computer and use it in GitHub Desktop.
Tastypie Resource as Celery Task
class TempResource(Resource):
class Meta:
resource_name = 'temp_resource'
object_class = temp_resource.delay
authorization = Authorization()
allowed_methods = ['post', 'get']
always_return_data = True
def get_resource_uri(self, bundle_or_obj):
"""
We use the celery task id in the uri
"""
kwargs = {
'resource_name': self._meta.resource_name,
}
if isinstance(bundle_or_obj, Bundle):
kwargs['pk'] = bundle_or_obj.obj.task_id
else:
kwargs['pk'] = bundle_or_obj.task_id
if self._meta.api_name is not None:
kwargs['api_name'] = self._meta.api_name
return self._build_reverse_url("api_dispatch_detail", kwargs=kwargs)
def obj_get_list(self, request=None, **kwargs):
# Filtering disabled for brevity...
return self.get_object_list(request)
def obj_get(self, request=None, **kwargs):
result = temp_resource.AsyncResult(kwargs['pk'])
return result
def obj_create(self, bundle, request=None, **kwargs):
bundle.obj = temp_resource.delay(kwargs['foo'], kwargs['bar'])
return bundle
def full_dehydrate(self, bundle):
"""
Add fields from temp_resource during dehydration
"""
temp_resource_info = bundle.obj.get()
for field, value in temp_resource_info.items():
bundle.data[field] = value
return super(TempResource, self).full_dehydrate(bundle)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment