diff --git a/database.py b/database.py index eb74b085eeab9c3b5e3b477476d65cae14f419d5..65fe3b0d01960bbbad1421dc51f8e7ec687a2b2a 100644 --- a/database.py +++ b/database.py @@ -69,7 +69,12 @@ def lookup_address(address: str): def set_address_latlong(address: str, latlong: Tuple[float, float]): with Connection() as conn: latlong_str = f"{ repr(latlong[0]) },{ repr(latlong[1]) }" - conn.execute("INSERT INTO AddressToLatLong (address, latlong) VALUES (?, ?)", (address, latlong_str)) + if latlong == None: + conn.execute("DELETE FROM AddressToLatLong WHERE address = ?", (address)) + else: + conn.execute("UPDATE AddressToLatLong SET latlong = ? WHERE address = ?", (latlong_str, address)) + if conn.cursor.rowcount == 0: + conn.execute("INSERT INTO AddressToLatLong (address, latlong) VALUES (?, ?)", (address, latlong_str)) conn.commit() class Workspace: diff --git a/main.py b/main.py index 19c7226f08ee8c3d0caa815927633888c337ab17..ba0929a8df91ec28a896861d9fca36027d9cca24 100644 --- a/main.py +++ b/main.py @@ -83,6 +83,44 @@ def add_workspace(): return render_template("add-workspace-result.html", messages = messages) +@app.route("/admin/set-latlong", methods = ["GET", "POST"]) +def set_latlong(): + if request.method == "GET": + address = request.args.get("address") + addresses = [] + if address == None: + workspaces = database.get_workspaces() + for workspace in workspaces: + if workspace.address not in addresses: + addresses.append(workspace.address) + + addresses = [address for address in addresses if database.lookup_address(address) == None] + return render_template("set-latlong.html", address = address, addresses = addresses) + + if request.method == "POST": + address = request.form["address"] + errors = [] + if len(address.strip()) <= 0: + errors.append("Address must not be empty") + + try: + latitude = float(request.form["latitude"]) + except ValueError: + errors.append("Latitude must be a number") + try: + longitude = float(request.form["longitude"]) + except ValueError: + errors.append("Longitude must be a number") + + if len(errors) > 0: + messages = ["Errors were found:"] + messages.extend(errors) + else: + database.set_address_latlong(address, (latitude, longitude)) + messages = ["Address set successfully"] + + return render_template("set-latlong-result.html", messages = messages) + @app.route("/admin/import-workspaces", methods = ["GET", "POST"]) def import_workspaces(): if request.method == "GET": diff --git a/templates/set-latlong-result.html b/templates/set-latlong-result.html new file mode 100644 index 0000000000000000000000000000000000000000..3b88aefaccb7e76723dfe433f4320890d74476b2 --- /dev/null +++ b/templates/set-latlong-result.html @@ -0,0 +1,7 @@ +{% extends "main.html" %} +{% block title %}Set Latitude and Longitude of Address{% endblock %} +{% block mainBlock %} +{% for message in messages %} +<div>{{ message }}</div> +{% endfor %} +{% endblock %} \ No newline at end of file diff --git a/templates/set-latlong.html b/templates/set-latlong.html new file mode 100644 index 0000000000000000000000000000000000000000..58932b18397ed5ee97772a3bb4fe8fa7463ae6c1 --- /dev/null +++ b/templates/set-latlong.html @@ -0,0 +1,28 @@ +{% extends "main.html" %} +{% block title %}Set Latitude and Longitude of Address{% endblock %} +{% block mainBlock %} +{% if address == None %} +<h1>Addresses without latitude and longitude</h1> +{% for address in addresses %} +<div><a href="/admin/set-latlong?address={{ address|urlencode }}">{{ address }}</a></div> +{% endfor %} +{% else %} +<form action="/admin/set-latlong" method="POST"> + <table> + <tr> + <td><label for="address">Address:</label></td> + <td><input id="address" type="text" name="address" readonly value="{{ address }}"></td> + </tr> + <tr> + <td><label for="latitude">Latitude:</label></td> + <td><input id="latitude" type="text" name="latitude"></td> + </tr> + <tr> + <td><label for="longitude">Longitude:</label></td> + <td><input id="longitude" type="text" name="longitude"></td> + </tr> + </table> + <input type="submit"> +</form> +{% endif %} +{% endblock %} \ No newline at end of file