Guest User

Untitled

a guest
Jan 17th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.52 KB | None | 0 0
  1. # -*- coding: UTF-8 -*-
  2. from functools import wraps
  3. from django.core import serializers
  4. from django.core.serializers.json import DjangoJSONEncoder
  5. from django.db.models.query import QuerySet
  6. from django.http import HttpResponse
  7. from django.utils import simplejson
  8.  
  9. class AjaxException(Exception):
  10.     message = u'Ajax error'
  11.  
  12.  
  13. ajax_error_response = {'status': 'error', 'message': ''}
  14. ajax_success_response = {'status': 'ok'}
  15.  
  16.  
  17. def ajax_json_response(require_params=[], method=None):
  18.     def decorator(func):
  19.         @wraps(func)
  20.         def inner_ajax(request, *args, **kwargs):
  21.             if request.is_ajax():
  22.                 if method:
  23.                     if request.method != method:
  24.                         ajax_error_response['message'] = 'Ajax Error. Only %s' % method
  25.                         return HttpResponse(simplejson.dumps(ajax_error_response))
  26.                 if require_params:
  27.                     if not hasattr(request, 'params'):
  28.                         setattr(request, 'params', dict())
  29.                     for param in require_params:
  30.                         request_param = request.GET.get(param) or request.POST.get(param)
  31.                         if not request_param:
  32.                             ajax_error_response['message'] = u'Ajax error. Missing %s param' % param
  33.                             return HttpResponse(simplejson.dumps(ajax_error_response))
  34.                         request.params[param] = request_param
  35.                 try:
  36.                     response = func(request, *args, **kwargs)
  37.                 except AjaxException, e:
  38.                     ajax_error_response['message'] = e.message
  39.                     return HttpResponse(simplejson.dumps(ajax_error_response))
  40.                 assert isinstance(response, dict), 'ajax decorated view must to return the dict'
  41.                 for key, data in response.iteritems():
  42.                     if isinstance(data, QuerySet):
  43.                         response[key] = serializers.serialize('json', data)
  44.                     elif hasattr(data, '_meta'):
  45.                         response[key] = serializers.serialize('json', [data])[1:-1]
  46.                 response.update(ajax_success_response)
  47.                 return HttpResponse(simplejson.dumps(ajax_success_response, cls=DjangoJSONEncoder), mimetype='application/json')
  48.             else:
  49.                 ajax_error_response['message'] = u'Ajax error. XMLHttpRequest not found'
  50.                 return HttpResponse(simplejson.dumps(ajax_error_response))
  51.         return inner_ajax
  52.     return decorator
Add Comment
Please, Sign In to add comment