diff --git a/create_db.py b/create_db.py new file mode 100755 index 0000000..2c1c6f9 --- /dev/null +++ b/create_db.py @@ -0,0 +1,35 @@ +#!/usr/bin/python3 + +from sqlalchemy.schema import CreateIndex, CreateTable + +from matcher import database, model + +DB_URL = "postgresql:///matcher" +database.init_db(DB_URL) + + +def create_db(): + model.Base.metadata.create_all(database.session.get_bind()) + + +def print_create_table(classes): + database.init_db(DB_URL) + + engine = database.session.get_bind() + + for cls in classes: + sql = str(CreateTable(cls.__table__).compile(engine)) + print(sql.strip() + ";") + + for index in cls.__table__.indexes: + sql = str(CreateIndex(index).compile(engine)) + print(sql.strip() + ";") + + +# print_create_table([model.ItemIsA]) +# print_create_table([model.EditSession]) +# print_create_table([model.Changeset, model.ChangesetEdit, model.SkipIsA]) +# print_create_table([model.User]) +# print_create_table([model.Extract]) + +create_db() diff --git a/matcher/nominatim.py b/matcher/nominatim.py index f065625..4717139 100644 --- a/matcher/nominatim.py +++ b/matcher/nominatim.py @@ -31,6 +31,8 @@ def lookup_with_params(**kwargs: str) -> list[Hit]: r = requests.get(url, params=params, headers=user_agent_headers()) if r.status_code == 500: raise SearchError + if r.status_code == 403: + raise SearchError("Nominatim returned 403 Forbidden") try: reply: list[Hit] = json.loads(r.text, object_pairs_hook=OrderedDict) diff --git a/requirements.txt b/requirements.txt index 35585c9..1a601c3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,14 +1,13 @@ -flask==3.0.3 --e git+https://github.com/maxcountryman/flask-login.git@26d12eaa99a18fc91e662ef0c8466245b8865c1c#egg=Flask-Login -GeoIP==1.3.2 -lxml==5.3.0 -maxminddb==2.6.2 -requests==2.32.3 -sqlalchemy==2.0.32 -requests_oauthlib==2.0.0 -geoalchemy2==0.15.2 -simplejson==3.19.3 -user_agents==2.2.0 -num2words==0.5.13 -psycopg2==2.9.9 - +flask +-e git+https://github.com/maxcountryman/flask-login.git#egg=Flask-Login +GeoIP +lxml +maxminddb +requests +sqlalchemy +requests_oauthlib +geoalchemy2 +simplejson +user_agents +num2words +psycopg2 diff --git a/web_view.py b/web_view.py index 16049b3..f8147d8 100755 --- a/web_view.py +++ b/web_view.py @@ -653,7 +653,10 @@ def api_missing_wikidata_items(): @app.route("/api/1/search") def api_search(): q = flask.request.args["q"] - hits = nominatim.lookup(q) + try: + hits = nominatim.lookup(q) + except nominatim.SearchError as e: + return cors_jsonify({"success": False, "error": str(e)}, 503) for hit in hits: hit["name"] = nominatim.get_hit_name(hit) hit["label"] = nominatim.get_hit_label(hit)