Source code for rest_api_framework.views
"""
The minimum needed to take a response and render a response
- url mapper utility
- wsgiwrapper
"""
import json
from werkzeug.wrappers import Response
def add_ressource_uri(response, obj):
obj["ressource_uri"] = "/{0}/{1}/".format(
response.ressource_name,
obj[response.model.pk_field.name])
return obj
[docs]class JsonResponse(object):
"""
A werkzeug Response rendering a json representation of the object(s)
This class is callable. you should do :
.. code-block:: python:
view = JsonResponse(model, ressource_name, formaters=formaters,
**options)
return view(objects)
"""
render_format = "json"
def __init__(self, model, ressource_name,
formaters=["add_ressource_uri"], **options):
self.model = model
self.ressource_name = ressource_name
self.formaters = formaters
def __call__(self, *args, **kwargs):
"""
Return a response object
"""
meta = None
if "meta" in kwargs:
meta = kwargs.pop("meta")
if "objs" in kwargs:
objs = self.format(kwargs.pop('objs'))
if meta:
response = {"meta": meta,
"object_list": objs}
else:
response = objs
return Response(json.dumps(response),
mimetype="application/json",
**kwargs)
else:
response = ""
if args:
response = json.dumps(*args)
return Response(response,
mimetype="application/json",
**kwargs)
[docs] def format(self, objs):
"""
Format the output using formaters listed in self.formaters
"""
if isinstance(objs, list):
for elem in objs:
for formater in self.formaters:
if hasattr(formater, '__call__'):
elem = formater(self, elem)
else:
elem = globals()[formater](self, elem)
if isinstance(objs, dict):
for formater in self.formaters:
if hasattr(formater, '__call__'):
objs = formater(self, objs)
else:
objs = globals()[formater](self, objs)
return objs