Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: UTF-8 -*-
- from functools import wraps
- from django.core import serializers
- from django.core.serializers.json import DjangoJSONEncoder
- from django.db.models.query import QuerySet
- from django.http import HttpResponse
- from django.utils import simplejson
- class AjaxException(Exception):
- message = u'Ajax error'
- ajax_error_response = {'status': 'error', 'message': ''}
- ajax_success_response = {'status': 'ok'}
- def ajax_json_response(require_params=[], method=None):
- def decorator(func):
- @wraps(func)
- def inner_ajax(request, *args, **kwargs):
- if request.is_ajax():
- if method:
- if request.method != method:
- ajax_error_response['message'] = 'Ajax Error. Only %s' % method
- return HttpResponse(simplejson.dumps(ajax_error_response))
- if require_params:
- if not hasattr(request, 'params'):
- setattr(request, 'params', dict())
- for param in require_params:
- request_param = request.GET.get(param) or request.POST.get(param)
- if not request_param:
- ajax_error_response['message'] = u'Ajax error. Missing %s param' % param
- return HttpResponse(simplejson.dumps(ajax_error_response))
- request.params[param] = request_param
- try:
- response = func(request, *args, **kwargs)
- except AjaxException, e:
- ajax_error_response['message'] = e.message
- return HttpResponse(simplejson.dumps(ajax_error_response))
- assert isinstance(response, dict), 'ajax decorated view must to return the dict'
- for key, data in response.iteritems():
- if isinstance(data, QuerySet):
- response[key] = serializers.serialize('json', data)
- elif hasattr(data, '_meta'):
- response[key] = serializers.serialize('json', [data])[1:-1]
- response.update(ajax_success_response)
- return HttpResponse(simplejson.dumps(ajax_success_response, cls=DjangoJSONEncoder), mimetype='application/json')
- else:
- ajax_error_response['message'] = u'Ajax error. XMLHttpRequest not found'
- return HttpResponse(simplejson.dumps(ajax_error_response))
- return inner_ajax
- return decorator
Add Comment
Please, Sign In to add comment