mirror of
				https://github.com/peeringdb/peeringdb.git
				synced 2024-05-11 05:55:09 +00:00 
			
		
		
		
	* remove warning for missing information for fields: aka, looking glass server url, route server url (#616) remove warning for missing information for fields: ipv4 prefixes, ipv6 prefixes if either of them is set (#616) * Use autocomplete fields in the admincom controlpanel to speed up loading times (#597) * Better error reporting for POSTs and PUTs (#610) * Add operation to API to look for covering prefixes given an IP (#25)
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
###############################################################################
 | 
						|
# RENDERERS
 | 
						|
 | 
						|
from rest_framework import renderers
 | 
						|
from rest_framework.utils import encoders
 | 
						|
import json
 | 
						|
 | 
						|
 | 
						|
class JSONEncoder(encoders.JSONEncoder):
 | 
						|
    """
 | 
						|
    Im defining our own json encoder here in order to be able to encode
 | 
						|
    datatime and django countryfields.
 | 
						|
 | 
						|
    Im making the munge renderer use this encoder to encode json, this approach
 | 
						|
    may need to be tidied up a bit.
 | 
						|
    """
 | 
						|
 | 
						|
    def default(self, obj):
 | 
						|
        """Default JSON serializer."""
 | 
						|
        import datetime
 | 
						|
        import django_countries.fields
 | 
						|
 | 
						|
        if isinstance(obj, datetime.datetime):
 | 
						|
            return obj.isoformat()
 | 
						|
 | 
						|
        if isinstance(obj, django_countries.fields.Country):
 | 
						|
            return str(obj)
 | 
						|
 | 
						|
        return encoders.JSONEncoder.default(self, obj)
 | 
						|
 | 
						|
 | 
						|
class MungeRenderer(renderers.BaseRenderer):
 | 
						|
    media_type = "text/plain"
 | 
						|
    format = "txt"
 | 
						|
    charset = "iso-8859-1"
 | 
						|
 | 
						|
    def render(self, data, media_type=None, renderer_context=None):
 | 
						|
        # TODO use munge:
 | 
						|
        indent = None
 | 
						|
        if "request" in renderer_context:
 | 
						|
            request = renderer_context.get("request")
 | 
						|
            if "pretty" in request.GET:
 | 
						|
                indent = 2
 | 
						|
        return json.dumps(data, cls=JSONEncoder, indent=indent)
 | 
						|
 | 
						|
 | 
						|
class MetaJSONRenderer(MungeRenderer):
 | 
						|
    """
 | 
						|
    Renderer which serializes to JSON.
 | 
						|
    Does *not* apply JSON's character escaping for non-ascii characters.
 | 
						|
    """
 | 
						|
 | 
						|
    ensure_ascii = False
 | 
						|
 | 
						|
    media_type = "application/json"
 | 
						|
    format = "json"
 | 
						|
 | 
						|
    def render(self, data, accepted_media_type=None, renderer_context=None):
 | 
						|
        """
 | 
						|
        Tweak output rendering and pass to parent
 | 
						|
        """
 | 
						|
 | 
						|
        if data is None:
 | 
						|
            return bytes()
 | 
						|
 | 
						|
        result = {}
 | 
						|
 | 
						|
        if "__meta" in data:
 | 
						|
            meta = data.pop("__meta")
 | 
						|
        else:
 | 
						|
            meta = dict()
 | 
						|
 | 
						|
        if "request" in renderer_context:
 | 
						|
            request = renderer_context.get("request")
 | 
						|
            meta.update(getattr(request, "meta_response", {}))
 | 
						|
 | 
						|
        res = renderer_context["response"]
 | 
						|
        if res.status_code < 400:
 | 
						|
            if "results" in data:
 | 
						|
                result["data"] = data.pop("results")
 | 
						|
            elif data:
 | 
						|
                if isinstance(data, dict):
 | 
						|
                    result["data"] = [data]
 | 
						|
                else:
 | 
						|
                    result["data"] = [r for r in data if r is not None]
 | 
						|
            else:
 | 
						|
                result["data"] = []
 | 
						|
 | 
						|
        elif res.status_code < 500:
 | 
						|
            meta["error"] = data.pop("detail", res.reason_phrase)
 | 
						|
 | 
						|
            result.update(**data)
 | 
						|
 | 
						|
        result["meta"] = meta
 | 
						|
 | 
						|
        return super(self.__class__, self).render(
 | 
						|
            result, accepted_media_type, renderer_context
 | 
						|
        )
 |