improved web interface, JS download option missing, no storage of files on host system necessary anymore

This commit is contained in:
fordprefect
2020-03-27 20:25:59 +01:00
parent dba6ed4b0b
commit afb5cc3336

View File

@@ -11,6 +11,9 @@ print("Content-type: text/html\n") # makes sure the http connection does not die
import cgi import cgi
import pathvalidate import pathvalidate
import osmsearch import osmsearch
import datetime
import random
import os
import sys import sys
assert sys.version_info >= (3, 6), "At least Python 3.8 required due to fStrings. Replace all f\"\" and comment this line to enable running in lower versions (but really, you should just update your Python version…)." assert sys.version_info >= (3, 6), "At least Python 3.8 required due to fStrings. Replace all f\"\" and comment this line to enable running in lower versions (but really, you should just update your Python version…)."
@@ -25,37 +28,106 @@ args = {
"limit": 50, "limit": 50,
"use_boundingbox": False, "use_boundingbox": False,
"boundingbox": [], "boundingbox": [],
"outputfilename": None,
"ignore_ids": [], "ignore_ids": [],
"maxsearchnums": 10, "maxsearchnums": 10,
"url": "https://nominatim.openstreetmap.org/search/", "url": "https://nominatim.openstreetmap.org/search/",
"output": "return",
} }
immutable_args = ["format", "outputfilename", "url",] immutable_args = ["format", "url", "ouput"]
outputfolder = "downloads"
DEBUG = False
##################################### #####################################
######## end of configuration ######## end of configuration
##################################### #####################################
def get_arguments():
"""Wrapper for cgi-environment.
Takes no options, returns dict of arguments
"""
args = cgi.FieldStorage()
return {i: args.getvalue(i) for i in args}
# get cgi args and sanitize # get cgi args sanitize, and update default args
cgi_args = get_arguments() rawargs = cgi.FieldStorage()
cgi_args = {i: rawargs.getvalue(i) for i in rawargs}
del(rawargs)
parsed_args = {} parsed_args = {}
try: try:
cgi_args["q"] = pathvalidate.sanitize_filename(cgi_args["query"]) cgi_args["q"] = pathvalidate.sanitize_filename(cgi_args["query"])
except KeyError: except KeyError:
# no key called "query" found, abort if DEBUG:
# local testing
cgi_args["q"] = "Camping"
else:
# we don't need to exit gracefully, whoever is arriving here has fiddled with the request manually
exit() exit()
for arg in cgi_args: for arg in cgi_args:
if arg not in immutable_args and arg in args: if arg not in immutable_args and arg in args:
parsed_args[arg] = cgi_args[arg] parsed_args[arg] = cgi_args[arg]
print(parsed_args, " parsed") if DEBUG: print("Parsed argument dict: ", parsed_args)
args.update(cgi_args) args.update(cgi_args)
#status = osmsearch.conduct_search(args) # generate output file name from query
# outputfolder/date-randomnumber.gpx
if not os.path.isdir(outputfolder):
os.makedirs(outputfolder)
outputfilename = f"{outputfolder}/{str(datetime.date.today())}-{str(random.random()).replace('0.', '')}.gpx"
args["outputfilename"] = outputfilename
searchresult = osmsearch.OSMSearch(args)
gpxcontent = searchresult.gpxfile.to_xml()
gpxcontent_escaped = searchresult.gpxfile.to_xml().replace("\\", "\\\\").replace("'", "\\'").replace('"', '\\"')
print("""
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css">
<meta name="robots" content="noindex,nofollow" />
<title>OSM search to GPX</title>
<script type='text/javascript'>
function download_file(filename, text) {
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
</script>
</head>
<body class=body>
<div class=head>
<h3>Export OSM search to GPX file</h3>
</div>
<div class=box>
<h4>Success</h4>
Copy file content from here:
<br>
<textarea rows=10 cols=80 style="font-family: monospace;">"""
+ gpxcontent +
"""</textarea>
<br><br>
<a href=index.html>Return to search page</a>
</div>
<div class=foot>
OSMsearchToGPX - ein Service von <a href=https://dukun.de>dukun.de</a>
</div>
</body>
</html>
""")
# TODO download button does not work this way!
#"""</textarea>
#<br>
#or <button onclick="download_file('OSMsearch.gpx', '{gpxcontent}')">dowload here</button> (requires enabled JavaScript).
#
#<br><br>
#<a href=index.html>Return to search page</a>
#
#</div>
#<div class=foot>
#OSMsearchToGPX - ein Service von <a href=https://dukun.de>dukun.de</a>
#</div>
#</body>
#</html>
#""".format(gpxcontent=gpxcontent_escaped))