Skip to content

Commit

Permalink
feat(location): store OSM tag key & value (#294)
Browse files Browse the repository at this point in the history
  • Loading branch information
raphodn committed May 20, 2024
1 parent 6f60843 commit 3eeccbd
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""Add Location osm_tag_key & osm_tag_value fields
Revision ID: dd4776351212
Revises: 3e6064e45f9a
Create Date: 2024-05-20 16:04:30.068721
"""
from typing import Sequence, Union

import sqlalchemy as sa

from alembic import op

# revision identifiers, used by Alembic.
revision: str = "dd4776351212"
down_revision: Union[str, None] = "3e6064e45f9a"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column("locations", sa.Column("osm_tag_key", sa.String(), nullable=True))
op.add_column("locations", sa.Column("osm_tag_value", sa.String(), nullable=True))
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column("locations", "osm_tag_value")
op.drop_column("locations", "osm_tag_key")
# ### end Alembic commands ###
2 changes: 2 additions & 0 deletions app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ class Location(Base):
osm_type: Mapped[LocationOSMEnum] = mapped_column(ChoiceType(LocationOSMEnum))
osm_name = mapped_column(String)
osm_display_name = mapped_column(String)
osm_tag_key = mapped_column(String)
osm_tag_value = mapped_column(String)
osm_address_postcode = mapped_column(String)
osm_address_city = mapped_column(String)
osm_address_country = mapped_column(String)
Expand Down
6 changes: 6 additions & 0 deletions app/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,12 @@ class LocationFull(LocationCreate):
id: int
osm_name: str | None = None
osm_display_name: str | None = None
osm_tag_key: str | None = Field(
description="OSM tag key", examples=["shop", "amenity"], default=None
)
osm_tag_value: str | None = Field(
description="OSM tag value", examples=["supermarket", "cafe"], default=None
)
osm_address_postcode: str | None = None
osm_address_city: str | None = None
osm_address_country: str | None = None
Expand Down
6 changes: 6 additions & 0 deletions app/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ def fetch_product_openfoodfacts_details(
# OpenStreetMap
# ------------------------------------------------------------------------------
OSM_FIELDS = ["name", "display_name", "lat", "lon"]
OSM_TAG_FIELDS_MAPPING = {"class": "tag_key", "type": "tag_value"}
OSM_ADDRESS_FIELDS = ["postcode", "country"] # 'city" is managed seperately
# https://wiki.openstreetmap.org/wiki/Key:place
OSM_ADDRESS_PLACE_FIELDS = ["village", "town", "city", "municipality"]
Expand All @@ -172,6 +173,11 @@ def fetch_location_openstreetmap_details(
location_openstreetmap_details[f"osm_{osm_field}"] = response[0][
osm_field
]
for osm_field in list(OSM_TAG_FIELDS_MAPPING.keys()):
if osm_field in response[0]:
location_openstreetmap_details[
f"osm_{OSM_TAG_FIELDS_MAPPING[osm_field]}"
] = response[0][osm_field]
if "address" in response[0]:
for osm_address_field in OSM_ADDRESS_FIELDS:
if osm_address_field in response[0]["address"]:
Expand Down
8 changes: 6 additions & 2 deletions tests/integration/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,12 @@ def override_get_db():
osm_id=652825274,
osm_type="NODE",
osm_name="Monoprix",
osm_display_name="Monoprix, Boulevard Joseph Vallier, Secteur 1, Grenoble, Isère, Auvergne-Rhône-Alpes, France métropolitaine, 38000, France",
osm_tag_key="shop",
osm_tag_value="supermarket",
osm_address_postcode="38000",
osm_address_city="Grenoble",
osm_address_country="France",
osm_display_name="MMonoprix, Boulevard Joseph Vallier, Secteur 1, Grenoble, Isère, Auvergne-Rhône-Alpes, France métropolitaine, 38000, France",
osm_lat=45.1805534,
osm_lon=5.7153387,
created=datetime.datetime.now(),
Expand All @@ -110,10 +112,12 @@ def override_get_db():
osm_id=6509705997,
osm_type="NODE",
osm_name="Carrefour",
osm_display_name="Carrefour à Bruxelles",
osm_tag_key="amenity",
osm_tag_value="vending_machine",
osm_address_postcode="1000",
osm_address_city="Bruxelles - Brussel",
osm_address_country="België / Belgique / Belgien",
osm_display_name="Carrefour à Bruxelles",
osm_lat=1,
osm_lon=2,
created=datetime.datetime.now(),
Expand Down

0 comments on commit 3eeccbd

Please sign in to comment.