-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathflask_server.py
More file actions
executable file
·185 lines (156 loc) · 6.47 KB
/
flask_server.py
File metadata and controls
executable file
·185 lines (156 loc) · 6.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Web interface for updating rivers
#
from config import keysnpwds,config
import sys
import json
import datetime
import copy
from flask import Flask,render_template,send_file,Response,flash,request,redirect,session,abort
from flask_babel import Babel,gettext
if config["data_source"]=="file":
from serialize_filedump import load_rivers,save_rivers
## Rivers cache
rivers_cache = load_rivers()
def rivers(name):
return rivers_cache[name]
elif config["data_source"]=="mongo":
import pymongo
client = pymongo.MongoClient()
def rivers(name):
try:
river = client.wwsupdb.rivers_merged2.find_one({"_id":name})
except pymongo.errors.ServerSelectionTimeoutError:
abort(504,"MongoDB server not responding")
if river==None:
paths = []
names = set([])
for river_osm in client.wwsupdb.osm.find({"names":name}):
paths.extend(river_osm["paths"])
names.update(river_osm["names"])
#river_osm = client.wwsupdb.osm.find_one({"_id":name})
#river = {"osm":river_osm}
river = {"osm":{"paths":paths}}#,"names":names}}
return river
def save_river(river):
client.wwsupdb.rivers_merged2.update({"_id":river['_id']},{"$set":river},upsert=True)
def save_transform(t):
client.wwsupdb.transforms.insert({"when":datetime.datetime.now(),"t":t})
# Create flask application
application = Flask(__name__)
application.config['UPLOAD_FOLDER'] = 'uploads'
application.secret_key = keysnpwds['secret_key']
## Internationalization (i18n)
babel = Babel(application)
## Map
@application.route('/',defaults={'map_type':'GMaps'})
@application.route('/<map_type>')
def index(map_type):
return render_template('map.html',map_type=map_type,GMapsApiKey=keysnpwds['GMapsApiKey'],GeoPortalApiKey=keysnpwds['GeoPortalApiKey'])
@application.route('/river/<name>')
def river(name):
river = rivers(name)
if river==None:
abort(404,"River %s not found"%repr(name))
else:
return Response(json.dumps(river), mimetype='application/json')
@application.route('/remove_paths/<river_id>/<pathidlist>')
def remove_paths(river_id,pathidlist):
# Get data and check inputs
try:
pathids = map(int,pathidlist.split(','))
except:
abort(400,'Cannot parse pathid list')
river = rivers(river_id)
if river==None:
abort(404,'Cannot find river')
# Save transform: first and last points of paths to remove
t = {'op':'remove_paths','river_id':river_id,'paths':map(lambda pathid:{'firstpt':river['osm']['paths'][pathid][0],'lastpt':river['osm']['paths'][pathid][-1]},pathids)}
# Path ids have to be sorted from greater to lower in order to not shift indexes
pathids.sort(reverse=True)
# Perform transform
for pathid in pathids:
del river['osm']['paths'][pathid]
# Save
save_river(river)
save_transform(t)
# Returns transformed data
return Response(json.dumps(river), mimetype='application/json')
@application.route('/merge_paths_a_after_b/<river_id>/<int:path_id_a>/<int:path_id_b>')
def merge_paths_a_after_b(river_id,path_id_a,path_id_b):
# Get data and check inputs
river = rivers(river_id)
if river==None:
abort(404,'Cannot find river')
if path_id_a<0 or path_id_a>=len(river['osm']['paths']) or path_id_b<0 or path_id_b>=len(river['osm']['paths']):
abort(400,'Invalid path ids given')
# Save transform: first and last points of paths to merge
t = {'op':'merge_paths_a_after_b','river_id':river_id,'a':{'firstpt':river['osm']['paths'][path_id_a][0],'lastpt':river['osm']['paths'][path_id_a][-1]},'b':{'firstpt':river['osm']['paths'][path_id_b][0],'lastpt':river['osm']['paths'][path_id_b][-1]}}
# Perfom transform
river['osm']['paths'][path_id_b].extend(river['osm']['paths'][path_id_a])
del river['osm']['paths'][path_id_a]
# Save
save_river(river)
save_transform(t)
# Returns transformed data
return Response(json.dumps(river), mimetype='application/json')
@application.route('/split_paths/<river_id>/<pathnameslist>')
def split_paths(river_id,pathnameslist):
# Get data and parse inputs
try:
pathnames = pathnameslist.split('^')
except:
abort(400,'Cannot parse pathnameslist list')
river = rivers(river_id)
if river==None:
abort(404,'Cannot find river')
if len(pathnames)!=len(river['osm']['paths']):
abort(400,"Number of names does't match number of paths")
splits = []
# Perform split
i = 0
for pathname in pathnames:
print pathnames,pathname,i
splits.append({'name':pathname,'firstpt':river['osm']['paths'][i][0],'lastpt':river['osm']['paths'][i][-1]})
new_river = copy.deepcopy(river)
new_river['osm']['paths'] = [river['osm']['paths'][i]]
new_river['_id'] = pathname
save_river(new_river)
i += 1
save_transform({'op':'split_paths','splits':splits})
return Response('OK')
@application.route('/river/<river_name>/parcours/<int:parcours_id>/<element>/point/<float:lat>/<float:lon>')
def set_river_element_point(river_name,parcours_id,element,lat,lon):
rivers(river_name)['parcours'][parcours_id][element+'_point']=(lat,lon)
return Response('OK')
@application.route('/river/<river_name>/parcours/<int:parcours_id>/<element>/point')
def get_river_element_point(river_name,parcours_id,element):
if rivers(river_name)['parcours'][parcours_id].has_key(element+'_point'):
return rivers(river_name)['parcours'][parcours_id][element+'_point']
else:
abort(404)
@application.route('/boxsearch/<float:minlat>,<float:maxlat>,<float:minlon>,<float:maxlon>')
def box_search(minlat,maxlat,minlon,maxlon):
out = []
qry = {"osm.bounds.0":{"$lte":maxlat},"osm.bounds.1":{"$gte":minlat},"osm.bounds.2":{"$lte":maxlon},"osm.bounds.3":{"$gte":minlon}}
print qry
for river in client.wwsupdb.rivers_merged2.find(qry):
out.append(river['_id'])
return Response(json.dumps(out), mimetype='application/json')
@application.route('/flush')
def flush():
save_rivers(rivers)
## Program entry point
if __name__ == '__main__':
# Start web server
if len(sys.argv)==2:
if sys.argv[1] in ('-h','--help'):
print 'Usage: %s [bindingip]' % sys.argv[0]
exit()
else:
host = sys.argv[1]
else:
host = "127.0.0.1"
application.run(port=8080,debug=True,host=host)