JSONPResponse.__init__()   A
last analyzed

Complexity

Conditions 4

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
c 1
b 0
f 0
dl 0
loc 10
rs 9.2
1
from __future__ import absolute_import
2
import json
3
4
from django.core.serializers.json import DjangoJSONEncoder
5
from django.http import HttpResponse
6
from django.http.response import HttpResponseBadRequest
7
8
from .utils import APPLICATION_JS, JSONP_TEMPLATE
9
10
11
class JSONPResponse(HttpResponse):
12
    def __init__(self, data, callback, encoder=DjangoJSONEncoder, safe=True, *args, **kwargs):
13
        if safe and not isinstance(data, dict):
14
            raise TypeError('In order to allow non-dict objects to be '
15
                            'serialized set the safe parameter to False')
16
        kwargs.setdefault('content_type', APPLICATION_JS)
17
        wrapped_payload = JSONP_TEMPLATE.format(
18
            callback=callback,
19
            # in case we got a string, for example when converting an HttpResponse instance
20
            payload=json.dumps(data, cls=encoder) if isinstance(data, dict) else data)
21
        super(JSONPResponse, self).__init__(content=wrapped_payload, **kwargs)
22
23
    @classmethod
24
    def from_http_response(cls, http_response, callback, *args, **kwargs):
25
        return cls(http_response.content, callback, safe=False, *args, **kwargs)
26
27
28
def get_jsonp_response(data, callback=None):
29
    if not callback:
30
        return HttpResponseBadRequest('No callback supplied')
31
    if isinstance(data, dict):
32
        return JSONPResponse(data, callback)
33
    elif isinstance(data, HttpResponse):
34
        return JSONPResponse.from_http_response(data, callback)
35
    else:
36
        raise NotImplementedError('Not supported response type')
37