diff --git a/main.py b/main.py index f071097..59a8449 100644 --- a/main.py +++ b/main.py @@ -62,6 +62,8 @@ def application(env, re): cur.execute(sql, (timestr, device, str(latitude), str(longitude), str(altitude) if altitude != None else None)) conn.commit() + cur.close() + conn.close() re("200 OK", []) yield "OK".encode() @@ -81,6 +83,9 @@ def application(env, re): cur.execute("SELECT * FROM tracker WHERE device = %s ORDER BY ts DESC LIMIT 1;", device) row = cur.fetchone() + cur.close() + conn.close() + re("200 OK", [["Content-Type", "text/html"]]) yield (""" @@ -108,3 +113,84 @@ def application(env, re): """ % (row["ts"], row["lat"], row["lon"], row["lat"], row["lon"])).encode() return + + if env["PATH_INFO"] in ("/access", "/access.php", "/export", "/export.php"): + try: + device = args["device"][0] + except: + re("400 Bad Request", []) + yield "

400 Bad Request

".encode() + yield "device is required.".encode() + return + + on = args["on"] if "on" in args else None + frm = on if on else args["from"] if "from" in args else None + to = on if on else args["to"] if "to" in args else None + + frm = frm or datetime.datetime.now().strftime('%Y-%m-%d') + to = to or datetime.datetime.now().strftime('%Y-%m-%d') + + for time in frm, to: + try: + datetime.strptime(time, "%Y-%m-%d") + except: + re("400 Bad Request", []) + yield "

400 Bad Request

".encode() + yield "Dates must be in YYYY-MM-DD format.".encode() + return + + conn, cur = getDatabase() + + sql = "SELECT ts, lat, lon FROM tracker WHERE device=%s AND DATE(ts)>=%s and DATE(ts)<=%s ORDER BY ts ASC;"; + cur.execute(sql, (device, frm, to)) + + re("200 OK", [["Content-Type", "application/vnd.geo+json"], ['Content-Disposition', 'attachment; filename="export.geojson"']]) + + output = """{ + "type": "FeatureCollection", + "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, + "features": [ + { "type": "Feature", + "properties": { + "Name": null, + "description": null, + "timestamp": null, + "begin": null, + "end": null, + "altitudeMode": null, + "tessellate": -1, + "extrude": 0, + "visibility": -1, + "drawOrder": null, + "icon": null, + "styleUrl": "#style", + "styleHash": "1a1ac94e", + "stroke": "#ffff00", + "stroke_opacity": "0.4980392156862745", + "stroke_width": "4", + "fill": "#00ff00", + "fill_opacity": "0.4980392156862745" + }, + "geometry": { + "type": "LineString", + "coordinates": [ +""" + + for row in cur.fetchall(): + output += " [ %s, %s ],\n" % (lat, lon) + + output = "".join(output.rsplit(",", 1)) + + output += """ ] + } + } + ] +}""" + + + cur.close() + conn.close() + + yield output.encode() + return +