# -*- coding: utf-8 -*- # Copyright 2010 - 2017 RhodeCode GmbH and the AppEnlight project authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import json from datetime import datetime, date, timedelta DATE_FORMAT = "%Y-%m-%dT%H:%M:%S.%f" class DateEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return {"__type__": "__datetime__", "iso": obj.strftime(DATE_FORMAT)} elif isinstance(obj, date): return {"__type__": "__date__", "iso": obj.strftime(DATE_FORMAT)} elif isinstance(obj, timedelta): return {"__type__": "__timedelta__", "seconds": obj.total_seconds()} else: return json.JSONEncoder.default(self, obj) def date_decoder(dct): if "__type__" in dct: if dct["__type__"] == "__datetime__": return datetime.strptime(dct["iso"], DATE_FORMAT) elif dct["__type__"] == "__date__": return datetime.strptime(dct["iso"], DATE_FORMAT).date() elif dct["__type__"] == "__timedelta__": return timedelta(seconds=dct["seconds"]) return dct def json_dumps(obj): return json.dumps(obj, cls=DateEncoder) def json_loads(obj): return json.loads(obj.decode("utf8"), object_hook=date_decoder)