diff --git a/wsme/restjson.py b/wsme/restjson.py index 771c790..1deecfb 100644 --- a/wsme/restjson.py +++ b/wsme/restjson.py @@ -1,4 +1,7 @@ import base64 +import datetime + +from simplegeneric import generic from wsme.rest import RestProtocol from wsme.controller import register_protocol @@ -10,18 +13,33 @@ except ImportError: import json -def prepare_encode(value, datatype): - if datatype in wsme.types.pod_types: - return value +@generic +def tojson(datatype, value): if wsme.types.isstructured(datatype): d = dict() for name, attr in wsme.types.list_attributes(datatype): - d[name] = prepare_encode(getattr(value, name), attr.datatype) + d[name] = tojson(attr.datatype, getattr(value, name)) return d - if datatype in wsme.types.dt_types: - return value.isoformat() - if datatype is wsme.types.binary: - return base64.encode() + return value + + +@tojson.when_object(datetime.date) +def date_tojson(datatype, value): + return value.isoformat() + + +@tojson.when_object(datetime.time) +def time_tojson(datatype, value): + return value.isoformat() + +@tojson.when_object(datetime.datetime) +def datetime_tojson(datatype, value): + return value.isoformat() + + +@tojson.when_object(wsme.types.binary) +def datetime_tojson(datatype, value): + return base64.encode(value) class RestJsonProtocol(RestProtocol): @@ -34,7 +52,7 @@ class RestJsonProtocol(RestProtocol): return kw def encode_result(self, result, return_type): - return json.dumps({'result': prepare_encode(result, return_type)}) + return json.dumps({'result': tojson(return_type, result)}) def encode_error(self, errordetail): return json.dumps(errordetail)