Use our own json encoder to deal with datetime

This commit is contained in:
Yohan Boniface 2016-05-17 16:03:13 +02:00
parent a9af21418b
commit 06a40638db

View file

@ -1,6 +1,7 @@
# backend.py # backend.py
# openeventdatabase # openeventdatabase
from datetime import datetime
import json import json
import os import os
@ -17,6 +18,20 @@ def db_connect():
user=os.getenv("DB_USER", None)) 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: class HeaderMiddleware:
def process_response(self, req, resp, resource): def process_response(self, req, resp, resource):
@ -34,7 +49,7 @@ class StatsResource(object):
cur.close() cur.close()
db.close() db.close()
resp.body = json.dumps(dict(stat)) resp.body = dumps(dict(stat))
resp.status = falcon.HTTP_200 resp.status = falcon.HTTP_200
@ -43,8 +58,8 @@ class BaseEvent:
def row_to_feature(self, row): def row_to_feature(self, row):
properties = dict(row['events_tags']) properties = dict(row['events_tags'])
properties.update({ properties.update({
'createdate': str(row['createdate']), 'createdate': row['createdate'],
'last_updated': str(row['lastupdate']) 'last_updated': row['lastupdate']
}) })
if "distance" in row: if "distance" in row:
properties['distance'] = row['distance'] properties['distance'] = row['distance']
@ -68,7 +83,7 @@ class EventsResource(BaseEvent):
db = db_connect() db = db_connect()
cur = db.cursor(cursor_factory=psycopg2.extras.DictCursor) 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)") 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 resp.status = falcon.HTTP_200
@ -145,7 +160,7 @@ class EventResource(BaseEvent):
event_bbox=event_bbox, event_what=event_what, event_bbox=event_bbox, event_what=event_what,
event_when=event_when, event_type=event_type) event_when=event_when, event_type=event_type)
cur.execute(sql) 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 resp.status = falcon.HTTP_200
else: else:
# Get single event geojson Feature by id. # Get single event geojson Feature by id.
@ -153,7 +168,7 @@ class EventResource(BaseEvent):
e = cur.fetchone() e = cur.fetchone()
if e is not None: 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 resp.status = falcon.HTTP_200
else: else:
resp.status = falcon.HTTP_404 resp.status = falcon.HTTP_404
@ -183,9 +198,9 @@ class EventResource(BaseEvent):
db = db_connect() db = db_connect()
cur = db.cursor() cur = db.cursor()
# get the geometry part # get the geometry part
geometry=json.dumps(j['geometry']) geometry=dumps(j['geometry'])
h = self.maybe_insert_geometry(geometry,cur) 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: if id:
params = params + (id,) params = params + (id,)
cur.execute(query, params) cur.execute(query, params)