From d24744bc290517f002951e1f7de7109f91f6f902 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Fri, 13 Oct 2023 16:50:27 +0100 Subject: [PATCH] Various improvements --- .gitignore | 1 + geocode/py.typed | 0 geocode/wikidata.py | 3 ++- lookup.py | 21 ++++++++++++++------- templates/base.html | 22 ++++++++++++++++++++++ templates/detail.html | 37 +++++++++++++++++++++++++------------ templates/index.html | 16 +++++++--------- 7 files changed, 71 insertions(+), 29 deletions(-) create mode 100644 geocode/py.typed create mode 100644 templates/base.html diff --git a/.gitignore b/.gitignore index 6a7802f..62ca108 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __pycache__ .mypy_cache/ +config/default.py diff --git a/geocode/py.typed b/geocode/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/geocode/wikidata.py b/geocode/wikidata.py index 08f4c91..09a6cd8 100644 --- a/geocode/wikidata.py +++ b/geocode/wikidata.py @@ -153,7 +153,7 @@ def unescape_title(t: str) -> str: return urllib.parse.unquote(t.replace("_", " ")) -Hit = dict[str, str | None] +Hit = dict[str, str | int | None] def commons_from_rows(rows: list[Row]) -> Hit | None: @@ -188,6 +188,7 @@ def build_dict(hit: Hit | None, lat: str | float, lon: str | float) -> WikidataD "coords": coords, "admin_level": hit.get("admin_level"), "wikidata": hit["wikidata"], + "element": hit.get("element"), } if not commons_cat: return ret diff --git a/lookup.py b/lookup.py index ece7b2c..35335e4 100755 --- a/lookup.py +++ b/lookup.py @@ -28,7 +28,7 @@ def get_random_lat_lon() -> tuple[float, float]: return lat, lon -Elements = sqlalchemy.orm.query.Query[model.Polygon] +Elements = sqlalchemy.orm.query.Query def do_lookup( @@ -80,7 +80,7 @@ def lat_lon_to_wikidata(lat: str | float, lon: str | float) -> dict[str, typing. def osm_lookup( - elements: Elements, lat: str | float, lon: str | float + elements: Elements, lat: str | float, lon: str | float # type:ignore ) -> wikidata.Hit | None: """OSM lookup.""" ret: wikidata.Hit | None @@ -104,12 +104,14 @@ def osm_lookup( "wikidata": qid, "commons_cat": commons, "admin_level": admin_level, + "element": e.osm_id, } gss = tags.get("ref:gss") if gss: ret = wikidata.get_commons_cat_from_gss(gss) if ret: ret["admin_level"] = admin_level + ret["element"] = e.osm_id return ret name = tags.get("name") @@ -123,11 +125,10 @@ def osm_lookup( ret = wikidata.commons_from_rows(rows) if ret: ret["admin_level"] = admin_level + ret["element"] = e.osm_id return ret - has_wikidata_tag = [ - e.tags for e in elements if e.tags.get("wikidata") # type: ignore - ] + has_wikidata_tag = [e.tags for e in elements if e.tags.get("wikidata")] if len(has_wikidata_tag) != 1: return None @@ -159,7 +160,9 @@ def index() -> str | Response: lat, lon = request.args.get("lat"), request.args.get("lon") if lat is not None and lon is not None: - return jsonify(lat_lon_to_wikidata(lat, lon)["result"]) + result = lat_lon_to_wikidata(lat, lon)["result"] + result.pop("element", None) + return jsonify(result) samples = sorted(geocode.samples, key=lambda row: row[2]) return render_template("index.html", samples=samples) @@ -215,7 +218,11 @@ def detail_page() -> Response | str: query, r = e.args return render_template("query_error.html", lat=lat, lon=lon, query=query, r=r) - return render_template("detail.html", lat=lat, lon=lon, **reply) + element = reply["result"].pop("element", None) + + return render_template( + "detail.html", lat=lat, lon=lon, str=str, element_id=element, **reply + ) if __name__ == "__main__": diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..f3fd3e5 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,22 @@ + + + + + + + + + {% block link %}{% endblock %} + + + {% block title %}{% endblock %} + + + {% block style %}{% endblock %} + + + + {% block content %}{% endblock %} + {% block script %}{% endblock %} + + diff --git a/templates/detail.html b/templates/detail.html index 941d8bf..3a37550 100644 --- a/templates/detail.html +++ b/templates/detail.html @@ -1,11 +1,9 @@ - - - - - Geocode to commons - +{% extends "base.html" %} - +{% block title %}Geocode to Commons{% endblock %} + +{% block content %} +

Geocode coordinates to Commons Category

visit endpoint @@ -24,17 +22,32 @@

-
{{ result | pprint }}
+

API returns

+
{{ result | tojson(indent=2) }}
+ +{% if result.wikidata %} +

Wikidata item: {{ result.wikidata }}

+{% endif %} {% if result.commons_cat %} -

({{ lat }}, {{ lon }}, {{result.commons_cat.title | pprint }}),

+

Commons category: {{result.commons_cat.title }}

+{% endif %} + +{% if elements %} +

{{ elements.count() }} surrounding elements found

+{% else %} +

No elements found

{% endif %} {% for element in elements %} {% set tags = element.tags %} -
{{ element.tags | pprint }}
+
+ {% for key, value in element.tags.items() if not (key == "way_area" or "name:" in key or key.startswith("source")) %} +
{{ key }}: {{ value }}
+ {% endfor %} +
{% endfor %} - - +
+{% endblock %} diff --git a/templates/index.html b/templates/index.html index 05c5e2a..79e7c44 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,11 +1,9 @@ - - - - - Geocode to commons - +{% extends "base.html" %} - +{% block title %}Geocode to Commons{% endblock %} + +{% block content %} +

Geocode coordinates to Commons Category

    @@ -33,6 +31,6 @@ Latitude/Longitude: (e.g. 54.375, -2.999)

    source code: https://github.com/EdwardBetts/uk-geocode

    +
- - +{% endblock %}