picard/picard/renderers.py

53 lines
1.5 KiB
Python

__author__ = 'tanshu'
import csv
from decimal import Decimal
from io import StringIO
import uuid
from pyramid.renderers import JSON
__author__ = 'tanshu'
class CSVRenderer(object):
def __init__(self, info):
pass
def __call__(self, value, system):
csv_data = StringIO()
writer = csv.writer(csv_data, delimiter=',', quoting=csv.QUOTE_MINIMAL)
if 'header' in value:
writer.writerow(value['header'])
if 'rows' in value:
writer.writerows(value['rows'])
if 'footer' in value:
writer.writerows(value['footer'])
request = system.get('request')
if request is not None:
response = request.response
ct = response.content_type
if ct == response.default_content_type:
response.content_type = 'text/csv'
filename = value['filename'] if 'filename' in value else 'report.csv'
response.content_disposition = 'attachment;filename="{0}"'.format(filename)
return csv_data.getvalue()
json_renderer = JSON()
class DecimalAsFloatHack(float):
def __init__(self, d):
self.d = d
def __repr__(self):
# return format(self.d, '.5f')
return str(self.d)
def decimal_adaptor(obj, request):
return DecimalAsFloatHack(obj)
def uuid_adaptor(obj, request):
return str(obj)
json_renderer.add_adapter(Decimal, decimal_adaptor)
json_renderer.add_adapter(uuid.UUID, uuid_adaptor)