From 609544ad4d2734922a82d8177cbb51019f986c07 Mon Sep 17 00:00:00 2001 From: FLacombe Date: Thu, 3 Jul 2025 16:41:38 +0200 Subject: [PATCH 1/3] Add full tags to 0.3 issues API JSON response --- api/issues.py | 115 +++++++++++++++++------------------------------ docker/README.md | 4 +- 2 files changed, 44 insertions(+), 75 deletions(-) diff --git a/api/issues.py b/api/issues.py index 98e24a96..d989ad2f 100644 --- a/api/issues.py +++ b/api/issues.py @@ -57,54 +57,49 @@ async def issues( db: Connection = Depends(database.db), langs: LangsNegociation = Depends(langs.langs), params=Depends(commons_params.params), + i18n: i18n.Translator = Depends(i18n.i18n), ) -> Dict[Literal["issues"], List[Dict[str, Any]]]: - params.limit = min(params.limit, 100000) - results = await query._gets(db, params) - out = [] - for res in results: - i = { - "lat": float(res["lat"]), - "lon": float(res["lon"]), - "id": res["uuid"], - "item": str(res["item"]), - } + title, issues = await _issues(db, langs, params, i18n) + + outprops = {"lat", "lon", "id", "item"} + if params.full: + outprops = None + + #Left here for retrocompat + for issue in issues: + issue["id"]: issue["uuid"] + + issue.pop("uuid", None) + if params.full: - i.update( - { - "lat": float(res["lat"]), - "lon": float(res["lon"]), - "id": res["uuid"], - "item": str(res["item"]), - "source": res["source_id"], - "class": res["class"], - "subtitle": utils.i10n_select(res["subtitle"], langs), - "title": utils.i10n_select(res["title"], langs), - "level": res["level"], - "update": str(res["timestamp"]), - "usernames": list( - map( - lambda elem: "username" in elem and elem["username"] or "", - res["elems"] or [], - ) + issue["update"]: str(issue["timestamp"]) + issue["usernames"]: list( + map( + lambda elem: "username" in elem and elem["username"] or "", + issue["elems"] or [], + ) + ) + issue["osm_ids"]: dict( + map( + lambda k_g: ( + {"N": "nodes", "W": "ways", "R": "relations"}[k_g[0]], + list(map(lambda g: g["id"], k_g[1])), ), - "osm_ids": dict( - map( - lambda k_g: ( - {"N": "nodes", "W": "ways", "R": "relations"}[k_g[0]], - list(map(lambda g: g["id"], k_g[1])), - ), - groupby( - sorted(res["elems"] or [], key=lambda e: e["type"]), - lambda e: e["type"], - ), - ) + groupby( + sorted(issue["elems"] or [], key=lambda e: e["type"]), + lambda e: e["type"], ), - } + ) ) - out.append(i) + issue.pop("timestamp", None) - return {"issues": out} + return {"issues":[ + { + k: v for k, v in issue.items() if outprops==None or k in outprops + } + for issue in issues + ]} @router.get("/0.3/issues.josm", tags=["issues"]) @@ -135,38 +130,6 @@ async def issues_josm( ) -async def _issues( - db: Connection, - langs: LangsNegociation, - params: commons_params.Params, - _: i18n.Translator, -) -> Tuple[str, List[Any]]: - if params.status == "false": - title = _("False positives") - elif params.status == "done": - title = _("Fixed issues") - else: - title = _("Open issues") - - items = await query_meta._items_menu(db, langs) - for res in items: - if params.item == str(res["item"]): - menu_auto = i10n_select_auto(res["menu"], langs) - if menu_auto: - title += " - " + menu_auto - - params.full = True - params.limit = min(params.limit, 100000) - issues = await query._gets(db, params) - - for issue in issues: - issue["subtitle"] = i10n_select_auto(issue["subtitle"], langs) - issue["title"] = i10n_select_auto(issue["title"], langs) - issue["menu"] = i10n_select_auto(issue["menu"], langs) - - return (title, issues) - - @router.get("/0.3/issues.rss", response_class=RSSResponse, tags=["issues"]) async def issues_rss( request: Request, @@ -175,6 +138,7 @@ async def issues_rss( params=Depends(commons_params.params), i18n: i18n.Translator = Depends(i18n.i18n), ) -> RSSResponse: + params.full = True title, issues = await _issues(db, langs, params, i18n) return RSSResponse( rss( @@ -199,6 +163,7 @@ async def issues_gpx( params=Depends(commons_params.params), i18n: i18n.Translator = Depends(i18n.i18n), ) -> GPXResponse: + params.full = True title, issues = await _issues(db, langs, params, i18n) return GPXResponse( gpx( @@ -223,6 +188,7 @@ async def issues_kml( params=Depends(commons_params.params), i18n: i18n.Translator = Depends(i18n.i18n), ) -> KMLResponse: + params.full = True title, issues = await _issues(db, langs, params, i18n) return KMLResponse( kml( @@ -247,6 +213,7 @@ async def issues_csv( params=Depends(commons_params.params), i18n: i18n.Translator = Depends(i18n.i18n), ) -> str: + params.full = True title, issues = await _issues(db, langs, params, i18n) return csv( title=title, @@ -268,6 +235,7 @@ async def issues_geojson( params=Depends(commons_params.params), i18n: i18n.Translator = Depends(i18n.i18n), ) -> GeoJSONFeatureCollection: + params.full = True title, issues = await _issues(db, langs, params, i18n) return { "type": "FeatureCollection", @@ -301,6 +269,7 @@ async def issues_maproulette_jsonl( i18n: i18n.Translator = Depends(i18n.i18n), ) -> List[Any]: params.limit = 100000 + params.full = True title, issues = await _issues(db, langs, params, i18n) type_map = {"N": "node", "W": "way", "R": "relation"} return [ diff --git a/docker/README.md b/docker/README.md index 607cab21..863867c9 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,10 +1,10 @@ # Docker -Copy `.env.template` as `.env` and adjustcontent, only required to enable loggin from osm.org. +Copy `.env.template` as `.env` and adjust content, only required to enable loggin from osm.org. Build the Docker image, within the docker directory: ``` -curl http://osmose.openstreetmap.fr/export/osmose-menu.sql.bz2 | bzcat > osmose-menu.sql +curl https://osmose.openstreetmap.fr/export/osmose-menu.sql.bz2 | bzcat > osmose-menu.sql docker compose build ``` From ca77cbee60661086af95f41d96ed19046230b052 Mon Sep 17 00:00:00 2001 From: FLacombe Date: Wed, 17 Dec 2025 12:35:39 +0100 Subject: [PATCH 2/3] Fix lint --- api/issues.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/api/issues.py b/api/issues.py index d989ad2f..9349e9f1 100644 --- a/api/issues.py +++ b/api/issues.py @@ -59,14 +59,13 @@ async def issues( params=Depends(commons_params.params), i18n: i18n.Translator = Depends(i18n.i18n), ) -> Dict[Literal["issues"], List[Dict[str, Any]]]: - title, issues = await _issues(db, langs, params, i18n) outprops = {"lat", "lon", "id", "item"} if params.full: outprops = None - - #Left here for retrocompat + + # Left here for retrocompat for issue in issues: issue["id"]: issue["uuid"] @@ -94,12 +93,12 @@ async def issues( ) issue.pop("timestamp", None) - return {"issues":[ - { - k: v for k, v in issue.items() if outprops==None or k in outprops - } - for issue in issues - ]} + return { + "issues": [ + {k: v for k, v in issue.items() if outprops == None or k in outprops} + for issue in issues + ] + } @router.get("/0.3/issues.josm", tags=["issues"]) From 0dc63dd20ea33b1108e43c15d40b8684386850ca Mon Sep 17 00:00:00 2001 From: FLacombe Date: Wed, 17 Dec 2025 12:59:13 +0100 Subject: [PATCH 3/3] Fix issues --- api/issues.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/api/issues.py b/api/issues.py index 9349e9f1..f7d9da06 100644 --- a/api/issues.py +++ b/api/issues.py @@ -50,6 +50,38 @@ def render(self, content: Any) -> bytes: ) +async def _issues( + db: Connection, + langs: LangsNegociation, + params: commons_params.Params, + _: i18n.Translator, +) -> Tuple[str, List[Any]]: + if params.status == "false": + title = _("False positives") + elif params.status == "done": + title = _("Fixed issues") + else: + title = _("Open issues") + + items = await query_meta._items_menu(db, langs) + for res in items: + if params.item == str(res["item"]): + menu_auto = i10n_select_auto(res["menu"], langs) + if menu_auto: + title += " - " + menu_auto + + params.full = True + params.limit = min(params.limit, 100000) + issues = await query._gets(db, params) + + for issue in issues: + issue["subtitle"] = i10n_select_auto(issue["subtitle"], langs) + issue["title"] = i10n_select_auto(issue["title"], langs) + issue["menu"] = i10n_select_auto(issue["menu"], langs) + + return (title, issues) + + @router.get("/0.3/issues", tags=["issues"]) @router.get("/0.3/issues.json", tags=["issues"]) async def issues( @@ -95,7 +127,7 @@ async def issues( return { "issues": [ - {k: v for k, v in issue.items() if outprops == None or k in outprops} + {k: v for k, v in issue.items() if outprops is None or k in outprops} for issue in issues ] }