Skip to content

Add full tags to 0.3 issues API JSON response #536

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 71 additions & 73 deletions api/issues.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,35 @@ async def errors(

return out

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.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"])
Expand All @@ -144,54 +173,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"])
Expand Down Expand Up @@ -222,38 +246,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,
Expand All @@ -262,6 +254,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(
Expand All @@ -286,6 +279,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(
Expand All @@ -310,6 +304,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(
Expand All @@ -334,6 +329,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,
Expand All @@ -355,6 +351,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",
Expand Down Expand Up @@ -388,6 +385,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 [
Expand Down
4 changes: 2 additions & 2 deletions docker/README.md
Original file line number Diff line number Diff line change
@@ -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
```

Expand Down