diff --git a/backend.py b/backend.py index 06c4d1a..b95abb9 100644 --- a/backend.py +++ b/backend.py @@ -1,6 +1,7 @@ # backend.py # openeventdatabase +from datetime import datetime import json import os @@ -17,6 +18,20 @@ def db_connect(): user=os.getenv("DB_USER", None)) +class EventEncoder(json.JSONEncoder): + def default(self, o): + if isinstance(o, datetime): + return o.isoformat() + try: + return super().default(o) + except TypeError: + return str(o) + + +def dumps(data): + return json.dumps(data, cls=EventEncoder) + + class HeaderMiddleware: def process_response(self, req, resp, resource): @@ -34,7 +49,7 @@ class StatsResource(object): cur.close() db.close() - resp.body = json.dumps(dict(stat)) + resp.body = dumps(dict(stat)) resp.status = falcon.HTTP_200 @@ -43,8 +58,8 @@ class BaseEvent: def row_to_feature(self, row): properties = dict(row['events_tags']) properties.update({ - 'createdate': str(row['createdate']), - 'last_updated': str(row['lastupdate']) + 'createdate': row['createdate'], + 'last_updated': row['lastupdate'] }) if "distance" in row: properties['distance'] = row['distance'] @@ -68,7 +83,7 @@ class EventsResource(BaseEvent): db = db_connect() cur = db.cursor(cursor_factory=psycopg2.extras.DictCursor) cur.execute("SELECT events_id, events_tags, createdate, lastupdate, st_asgeojson(geom) as geometry FROM events JOIN geo ON (hash=events_geo)") - resp.body = json.dumps(self.rows_to_collection(cur.fetchall())) + resp.body = dumps(self.rows_to_collection(cur.fetchall())) resp.status = falcon.HTTP_200 @@ -145,7 +160,7 @@ class EventResource(BaseEvent): event_bbox=event_bbox, event_what=event_what, event_when=event_when, event_type=event_type) cur.execute(sql) - resp.body = json.dumps(self.rows_to_collection(cur.fetchall())) + resp.body = dumps(self.rows_to_collection(cur.fetchall())) resp.status = falcon.HTTP_200 else: # Get single event geojson Feature by id. @@ -153,7 +168,7 @@ class EventResource(BaseEvent): e = cur.fetchone() if e is not None: - resp.body = json.dumps(self.row_to_feature(e)) + resp.body = dumps(self.row_to_feature(e)) resp.status = falcon.HTTP_200 else: resp.status = falcon.HTTP_404 @@ -183,9 +198,9 @@ class EventResource(BaseEvent): db = db_connect() cur = db.cursor() # get the geometry part - geometry=json.dumps(j['geometry']) + geometry=dumps(j['geometry']) h = self.maybe_insert_geometry(geometry,cur) - params = (j['properties']['type'], j['properties']['what'], event_start, event_stop, bounds, json.dumps(j['properties']), h[0]) + params = (j['properties']['type'], j['properties']['what'], event_start, event_stop, bounds, dumps(j['properties']), h[0]) if id: params = params + (id,) cur.execute(query, params)