Skip to content

Commit

Permalink
feat(location): store OSM address country_code (#296)
Browse files Browse the repository at this point in the history
  • Loading branch information
raphodn committed May 20, 2024
1 parent 3eeccbd commit 43485ed
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""Add Location osm_address_country_code field
Revision ID: 2737db183adb
Revises: dd4776351212
Create Date: 2024-05-20 17:04:40.347002
"""
from typing import Sequence, Union

import sqlalchemy as sa

from alembic import op

# revision identifiers, used by Alembic.
revision: str = "2737db183adb"
down_revision: Union[str, None] = "dd4776351212"
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_address_country_code", sa.String(), nullable=True)
)
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column("locations", "osm_address_country_code")
# ### end Alembic commands ###
1 change: 1 addition & 0 deletions app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ class Location(Base):
osm_address_postcode = mapped_column(String)
osm_address_city = mapped_column(String)
osm_address_country = mapped_column(String)
osm_address_country_code = mapped_column(String)
osm_lat = mapped_column(Numeric(precision=11, scale=7))
osm_lon = mapped_column(Numeric(precision=11, scale=7))

Expand Down
8 changes: 8 additions & 0 deletions app/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,14 @@ class LocationFull(LocationCreate):
osm_address_postcode: str | None = None
osm_address_city: str | None = None
osm_address_country: str | None = None
osm_address_country_code: str | None = Field(
default=None,
min_length=2,
max_length=2,
pattern=r"^[A-Z]{2}$",
description="OSM country code (ISO 3166-1 alpha-2)",
examples=["FR", "US"],
)
osm_lat: float | None = None
osm_lon: float | None = None
created: datetime.datetime = Field(description="datetime of the creation.")
Expand Down
32 changes: 19 additions & 13 deletions app/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,11 @@ def fetch_product_openfoodfacts_details(
# ------------------------------------------------------------------------------
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
OSM_ADDRESS_FIELDS = [
"postcode",
"country",
"country_code",
] # 'city" is managed seperately
# https://wiki.openstreetmap.org/wiki/Key:place
OSM_ADDRESS_PLACE_FIELDS = ["village", "town", "city", "municipality"]

Expand All @@ -170,28 +174,30 @@ def fetch_location_openstreetmap_details(
if len(response):
for osm_field in OSM_FIELDS:
if osm_field in response[0]:
location_openstreetmap_details[f"osm_{osm_field}"] = response[0][
osm_field
]
key = f"osm_{osm_field}"
value = response[0][osm_field]
location_openstreetmap_details[key] = value
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]
key = f"osm_{OSM_TAG_FIELDS_MAPPING[osm_field]}"
value = response[0][osm_field]
location_openstreetmap_details[key] = value
if "address" in response[0]:
for osm_address_field in OSM_ADDRESS_FIELDS:
if osm_address_field in response[0]["address"]:
location_openstreetmap_details[
f"osm_address_{osm_address_field}"
] = response[0]["address"][osm_address_field]
key = f"osm_address_{osm_address_field}"
value = response[0]["address"][osm_address_field]
if osm_address_field == "country_code": # "fr" -> "FR"
value = value.upper()
location_openstreetmap_details[key] = value
# manage city
location_openstreetmap_details["osm_address_city"] = None
for osm_address_place_field in OSM_ADDRESS_PLACE_FIELDS:
if osm_address_place_field in response[0]["address"]:
if not location_openstreetmap_details["osm_address_city"]:
location_openstreetmap_details[
"osm_address_city"
] = response[0]["address"][osm_address_place_field]
key = "osm_address_city"
value = response[0]["address"][osm_address_place_field]
location_openstreetmap_details[key] = value

return location_openstreetmap_details
except Exception:
Expand Down
2 changes: 2 additions & 0 deletions tests/integration/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ def override_get_db():
osm_address_postcode="38000",
osm_address_city="Grenoble",
osm_address_country="France",
osm_address_country_code="FR",
osm_lat=45.1805534,
osm_lon=5.7153387,
created=datetime.datetime.now(),
Expand All @@ -118,6 +119,7 @@ def override_get_db():
osm_address_postcode="1000",
osm_address_city="Bruxelles - Brussel",
osm_address_country="België / Belgique / Belgien",
osm_address_country_code="BE",
osm_lat=1,
osm_lon=2,
created=datetime.datetime.now(),
Expand Down

0 comments on commit 43485ed

Please sign in to comment.