from __future__ import unicode_literals

from rest_framework.renderers import JSONRenderer


class JSONPRenderer(JSONRenderer):
    """
    Renderer which serializes to json,
    wrapping the json output in a callback function.
    """

    media_type = 'application/javascript'
    format = 'jsonp'
    callback_parameter = 'callback'
    default_callback = 'callback'
    charset = 'utf-8'

    def get_callback(self, renderer_context):
        """
        Determine the name of the callback to wrap around the json output.
        """
        request = renderer_context.get('request', None)
        params = request and request.QUERY_PARAMS or {}
        return params.get(self.callback_parameter, self.default_callback)

    def render(self, data, accepted_media_type=None, renderer_context=None):
        """
        Renders into jsonp, wrapping the json output in a callback function.

        Clients may set the callback function name using a query parameter
        on the URL, for example: ?callback=exampleCallbackName
        """
        renderer_context = renderer_context or {}
        callback = self.get_callback(renderer_context)
        json = super(JSONPRenderer, self).render(data, accepted_media_type,
                                                 renderer_context)
        return callback.encode(self.charset) + b'(' + json + b');'

from __future__ import unicode_literals

from rest_framework.renderers import JSONRenderer


class JSONPRenderer(JSONRenderer):
    """
    Renderer which serializes to json,
    wrapping the json output in a callback function.
    """

    media_type = 'application/javascript'
    format = 'jsonp'
    callback_parameter = 'callback'
    default_callback = 'callback'
    charset = 'utf-8'

    def get_callback(self, renderer_context):
        """
        Determine the name of the callback to wrap around the json output.
        """
        request = renderer_context.get('request', None)
        params = request and request.query_params or {}
        return params.get(self.callback_parameter, self.default_callback)

    def render(self, data, accepted_media_type=None, renderer_context=None):
        """
        Renders into jsonp, wrapping the json output in a callback function.

        Clients may set the callback function name using a query parameter
        on the URL, for example: ?callback=exampleCallbackName
        """
        renderer_context = renderer_context or {}
        callback = self.get_callback(renderer_context)
        json = super(JSONPRenderer, self).render(data, accepted_media_type,
                                                 renderer_context)
        return callback.encode(self.charset) + b'(' + json + b');'

Update for compat w/ djangorestframework 3.2
Update for compat w/ djangorestframework 3.2

Change request.QUERY_PARAMS to request.query_params
  from __future__ import unicode_literals
  
  from rest_framework.renderers import JSONRenderer
  
  
  class JSONPRenderer(JSONRenderer):
      """
      Renderer which serializes to json,
      wrapping the json output in a callback function.
      """
  
      media_type = 'application/javascript'
      format = 'jsonp'
      callback_parameter = 'callback'
      default_callback = 'callback'
      charset = 'utf-8'
  
      def get_callback(self, renderer_context):
          """
          Determine the name of the callback to wrap around the json output.
          """
          request = renderer_context.get('request', None)
-         params = request and request.QUERY_PARAMS or {}
+         params = request and request.query_params or {}
          return params.get(self.callback_parameter, self.default_callback)
  
      def render(self, data, accepted_media_type=None, renderer_context=None):
          """
          Renders into jsonp, wrapping the json output in a callback function.
  
          Clients may set the callback function name using a query parameter
          on the URL, for example: ?callback=exampleCallbackName
          """
          renderer_context = renderer_context or {}
          callback = self.get_callback(renderer_context)
          json = super(JSONPRenderer, self).render(data, accepted_media_type,
                                                   renderer_context)
          return callback.encode(self.charset) + b'(' + json + b');'
  
Update for compat w/ djangorestframework 3.2
## Code Before:
from __future__ import unicode_literals

from rest_framework.renderers import JSONRenderer


class JSONPRenderer(JSONRenderer):
    """
    Renderer which serializes to json,
    wrapping the json output in a callback function.
    """

    media_type = 'application/javascript'
    format = 'jsonp'
    callback_parameter = 'callback'
    default_callback = 'callback'
    charset = 'utf-8'

    def get_callback(self, renderer_context):
        """
        Determine the name of the callback to wrap around the json output.
        """
        request = renderer_context.get('request', None)
        params = request and request.QUERY_PARAMS or {}
        return params.get(self.callback_parameter, self.default_callback)

    def render(self, data, accepted_media_type=None, renderer_context=None):
        """
        Renders into jsonp, wrapping the json output in a callback function.

        Clients may set the callback function name using a query parameter
        on the URL, for example: ?callback=exampleCallbackName
        """
        renderer_context = renderer_context or {}
        callback = self.get_callback(renderer_context)
        json = super(JSONPRenderer, self).render(data, accepted_media_type,
                                                 renderer_context)
        return callback.encode(self.charset) + b'(' + json + b');'

## Instruction:
Update for compat w/ djangorestframework 3.2
## Code After:
from __future__ import unicode_literals

from rest_framework.renderers import JSONRenderer


class JSONPRenderer(JSONRenderer):
    """
    Renderer which serializes to json,
    wrapping the json output in a callback function.
    """

    media_type = 'application/javascript'
    format = 'jsonp'
    callback_parameter = 'callback'
    default_callback = 'callback'
    charset = 'utf-8'

    def get_callback(self, renderer_context):
        """
        Determine the name of the callback to wrap around the json output.
        """
        request = renderer_context.get('request', None)
        params = request and request.query_params or {}
        return params.get(self.callback_parameter, self.default_callback)

    def render(self, data, accepted_media_type=None, renderer_context=None):
        """
        Renders into jsonp, wrapping the json output in a callback function.

        Clients may set the callback function name using a query parameter
        on the URL, for example: ?callback=exampleCallbackName
        """
        renderer_context = renderer_context or {}
        callback = self.get_callback(renderer_context)
        json = super(JSONPRenderer, self).render(data, accepted_media_type,
                                                 renderer_context)
        return callback.encode(self.charset) + b'(' + json + b');'
