2019-03-18 04:45:33 +00:00
|
|
|
#!/usr/bin/env python
|
2019-03-19 04:36:23 +00:00
|
|
|
# Scan the osm-vector directory, update the osm-vector-idx.json, add menu-defs
|
2019-03-18 04:45:33 +00:00
|
|
|
|
|
|
|
from geojson import Feature, Point, FeatureCollection, Polygon
|
|
|
|
import geojson
|
|
|
|
import json
|
|
|
|
import os
|
2019-03-19 04:36:23 +00:00
|
|
|
import sys
|
|
|
|
import fnmatch
|
2019-03-25 18:09:13 +00:00
|
|
|
import re
|
2019-03-18 04:45:33 +00:00
|
|
|
|
2019-03-25 18:09:13 +00:00
|
|
|
#IIAB_PATH='{{ iiab_dir }}'
|
2019-03-19 04:36:23 +00:00
|
|
|
IIAB_PATH='/etc/iiab'
|
|
|
|
if not IIAB_PATH in sys.path:
|
|
|
|
sys.path.append(IIAB_PATH)
|
|
|
|
from iiab_env import get_iiab_env
|
2019-03-18 04:45:33 +00:00
|
|
|
|
2019-03-25 18:09:13 +00:00
|
|
|
SCRIPT_DIR = '/opt/admin/cmdsrv/scripts'
|
|
|
|
if not SCRIPT_DIR in sys.path:
|
|
|
|
sys.path.append(SCRIPT_DIR)
|
2019-03-26 01:35:54 +00:00
|
|
|
import iiab_update_menus as menus
|
2019-03-25 18:09:13 +00:00
|
|
|
|
2019-03-19 04:36:23 +00:00
|
|
|
doc_root = get_iiab_env('WWWROOT')
|
|
|
|
menuDefs = doc_root + "/js-menu/menu-files/menu-defs/"
|
2019-03-25 18:09:13 +00:00
|
|
|
osm_vector_idx_dir = doc_root + "/common/assets/"
|
|
|
|
map_doc_root = '/library/osm-vector'
|
|
|
|
# map_catalog will be global, assumed always available
|
2019-03-19 04:36:23 +00:00
|
|
|
map_catalog = {}
|
|
|
|
map_menu_defs ={}
|
2019-03-25 18:09:13 +00:00
|
|
|
|
2019-03-18 04:45:33 +00:00
|
|
|
def main():
|
2019-03-19 04:36:23 +00:00
|
|
|
global map_menu_defs
|
|
|
|
get_map_catalog()
|
2019-03-25 18:09:13 +00:00
|
|
|
#print(json.dumps(map_catalog,indent=2))
|
2019-03-19 04:36:23 +00:00
|
|
|
map_menu_defs = get_menu_def_names()
|
2019-03-25 18:09:13 +00:00
|
|
|
#print(json.dumps(map_menu_defs,indent=2))
|
2019-03-26 00:34:04 +00:00
|
|
|
installed_maps = get_installed_regions()
|
|
|
|
#print(installed_maps)
|
2019-03-25 18:09:13 +00:00
|
|
|
write_osm_vector_idx(installed_maps)
|
2019-03-26 00:34:04 +00:00
|
|
|
for region in installed_maps:
|
2019-03-26 01:35:54 +00:00
|
|
|
#print('checking for %s region'%region)
|
|
|
|
item = map_catalog['regions'][region]
|
2019-03-26 00:34:04 +00:00
|
|
|
if not region in map_menu_defs:
|
2019-03-26 01:35:54 +00:00
|
|
|
create_menu_def(region,item['perma_ref'] + '.json')
|
|
|
|
# add this new menu def to home page
|
|
|
|
print('calling to insert %s.json'%item['perma_ref'])
|
|
|
|
menus.update_menu_json(item['perma_ref'])
|
2019-03-19 04:36:23 +00:00
|
|
|
|
|
|
|
def get_map_catalog():
|
|
|
|
global map_catalog
|
|
|
|
#input_json = "{{ iiab_dir }}" + '/regions.json'
|
|
|
|
input_json = "/etc/iiab" + '/regions.json'
|
2019-03-18 04:45:33 +00:00
|
|
|
with open(input_json,'r') as regions:
|
|
|
|
reg_str = regions.read()
|
2019-03-19 04:36:23 +00:00
|
|
|
map_catalog = json.loads(reg_str)
|
|
|
|
#print(json.dumps(map_catalog,indent=2))
|
|
|
|
|
|
|
|
def get_menu_def_names(intended_use='map'):
|
|
|
|
menu_def_dict = {}
|
|
|
|
os.chdir(menuDefs)
|
|
|
|
for filename in os.listdir('.'):
|
|
|
|
if fnmatch.fnmatch(filename, '*.json'):
|
|
|
|
try:
|
|
|
|
with open(filename,'r') as json_file:
|
|
|
|
readstr = json_file.read()
|
|
|
|
data = json.loads(readstr)
|
|
|
|
except:
|
|
|
|
print("failed to parse %s"%filename)
|
|
|
|
print(readstr)
|
|
|
|
if data.get('intended_use','') != intended_use:
|
|
|
|
continue
|
2019-03-25 18:09:13 +00:00
|
|
|
map_name = data.get('name','')
|
|
|
|
if map_name != '':
|
|
|
|
menu_def_dict[data['name']] = menuDefs + filename
|
2019-03-19 04:36:23 +00:00
|
|
|
return menu_def_dict
|
2019-03-18 04:45:33 +00:00
|
|
|
|
2019-03-26 00:34:04 +00:00
|
|
|
def get_installed_regions():
|
2019-03-25 18:09:13 +00:00
|
|
|
installed = []
|
|
|
|
os.chdir(map_doc_root)
|
|
|
|
for filename in os.listdir('.'):
|
|
|
|
if fnmatch.fnmatch(filename, '??-osm-omt*'):
|
|
|
|
region = re.sub(r'^..-osm-omt_(.*)',r'\1',filename)
|
|
|
|
installed.append(region)
|
|
|
|
return installed
|
|
|
|
|
|
|
|
def write_osm_vector_idx(installed_maps):
|
2019-03-26 00:34:04 +00:00
|
|
|
map_dict ={}
|
|
|
|
map_dict['regions'] = {}
|
2019-03-25 18:09:13 +00:00
|
|
|
for map in installed_maps:
|
|
|
|
data_dict = map_catalog['regions'].get(map,'')
|
2019-03-26 00:34:04 +00:00
|
|
|
map_dict['regions'][map] = data_dict
|
|
|
|
with open(osm_vector_idx_dir + '/osm-vector-idx.json','w') as idx:
|
|
|
|
idx.write(json.dumps(map_dict,indent=2))
|
2019-03-25 18:09:13 +00:00
|
|
|
|
2019-03-26 00:34:04 +00:00
|
|
|
def create_menu_def(region,default_name,intended_use='map'):
|
|
|
|
item = map_catalog['regions'][region]
|
2019-03-25 18:09:13 +00:00
|
|
|
if len(item.get('language','')) > 2:
|
|
|
|
lang = item['language'][:2]
|
|
|
|
else: # default to english
|
|
|
|
lang = 'en'
|
2019-03-26 00:34:04 +00:00
|
|
|
filename = lang + '-' + item['perma_ref'] + '.json'
|
2019-03-25 18:09:13 +00:00
|
|
|
# create a stub for this zim
|
|
|
|
menuDef = {}
|
2019-03-26 00:34:04 +00:00
|
|
|
default_logo = 'osm.jpg'
|
2019-03-25 18:09:13 +00:00
|
|
|
menuDef["intended_use"] = "map"
|
|
|
|
menuDef["lang"] = lang
|
|
|
|
menuDef["logo_url"] = default_logo
|
2019-03-26 00:34:04 +00:00
|
|
|
menuitem = lang + '-' + item['perma_ref']
|
|
|
|
menuDef["menu_item_name"] = default_name
|
2019-03-25 18:09:13 +00:00
|
|
|
menuDef["title"] = item.get('title','')
|
2019-03-26 00:34:04 +00:00
|
|
|
menuDef["map_name"] = item['perma_ref']
|
2019-03-25 18:09:13 +00:00
|
|
|
menuDef["start_url"] = ''
|
2019-03-26 00:34:04 +00:00
|
|
|
menuDef["description"] = '<p>Open Street Map of ' + item.get('title','') + '</p>'
|
2019-03-25 18:09:13 +00:00
|
|
|
menuDef["extra_html"] = ""
|
|
|
|
menuDef["automatically_generated"] = "true"
|
|
|
|
if not os.path.isfile(menuDefs + default_name): # logic to here can still overwrite existing menu def
|
|
|
|
print("creating %s"%menuDefs + default_name)
|
2019-03-26 00:34:04 +00:00
|
|
|
with open(menuDefs + default_name + '.json','w') as menufile:
|
2019-03-25 18:09:13 +00:00
|
|
|
menufile.write(json.dumps(menuDef,indent=2))
|
|
|
|
return default_name[:-5]
|
|
|
|
|
2019-03-19 04:36:23 +00:00
|
|
|
def human_readable(num):
|
|
|
|
# return 3 significant digits and unit specifier
|
|
|
|
num = float(num)
|
|
|
|
units = [ '','K','M','G']
|
|
|
|
for i in range(4):
|
|
|
|
if num<10.0:
|
|
|
|
return "%.2f%s"%(num,units[i])
|
|
|
|
if num<100.0:
|
|
|
|
return "%.1f%s"%(num,units[i])
|
|
|
|
if num < 1000.0:
|
|
|
|
return "%.0f%s"%(num,units[i])
|
|
|
|
num /= 1000.0
|
2019-03-18 04:45:33 +00:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|