From dbf7960b9183c73d04bdfba438d5abee23d98918 Mon Sep 17 00:00:00 2001 From: Victor Perron Date: Thu, 12 Sep 2024 11:06:23 +0200 Subject: [PATCH] feat(api) : Switch from using COG to decoupage_administratif --- api/requirements/dev-requirements.txt | 20 ---- api/requirements/requirements.txt | 20 ---- api/requirements/test-requirements.txt | 20 ---- api/setup.py | 1 - api/src/alembic/env.py | 2 +- ...9_9f9a66546e3a_add_fk_structure_commune.py | 25 ----- ...854_e3f3dfa4ad01_modified_api__communes.py | 78 ++++++++++++++ api/src/data_inclusion/api/cli.py | 14 +-- .../api/code_officiel_geo/commands.py | 99 ------------------ .../api/code_officiel_geo/models.py | 85 --------------- .../__init__.py | 0 .../api/decoupage_administratif/commands.py | 80 ++++++++++++++ .../constants.py | 67 ------------ .../api/decoupage_administratif/models.py | 21 ++++ .../utils.py | 2 +- .../api/inclusion_data/commands.py | 13 --- .../api/inclusion_data/models.py | 2 +- .../api/inclusion_data/routes.py | 14 +-- .../api/inclusion_data/services.py | 29 ++--- api/tests/communes.parquet.gzip | Bin 111771 -> 6715 bytes api/tests/conftest.py | 4 +- api/tests/e2e/api/test_inclusion_data.py | 12 ++- 22 files changed, 209 insertions(+), 399 deletions(-) create mode 100644 api/src/alembic/versions/20240830_175854_e3f3dfa4ad01_modified_api__communes.py delete mode 100644 api/src/data_inclusion/api/code_officiel_geo/commands.py delete mode 100644 api/src/data_inclusion/api/code_officiel_geo/models.py rename api/src/data_inclusion/api/{code_officiel_geo => decoupage_administratif}/__init__.py (100%) create mode 100644 api/src/data_inclusion/api/decoupage_administratif/commands.py rename api/src/data_inclusion/api/{code_officiel_geo => decoupage_administratif}/constants.py (84%) create mode 100644 api/src/data_inclusion/api/decoupage_administratif/models.py rename api/src/data_inclusion/api/{code_officiel_geo => decoupage_administratif}/utils.py (91%) diff --git a/api/requirements/dev-requirements.txt b/api/requirements/dev-requirements.txt index ae2c5c15..ccf511ff 100644 --- a/api/requirements/dev-requirements.txt +++ b/api/requirements/dev-requirements.txt @@ -14,8 +14,6 @@ argon2-cffi==23.1.0 # via minio argon2-cffi-bindings==21.2.0 # via argon2-cffi -brotli==1.1.0 - # via py7zr cachetools==5.5.0 # via tox certifi==2024.8.30 @@ -101,8 +99,6 @@ idna==3.8 # email-validator # httpx # requests -inflate64==1.0.0 - # via py7zr jinja2==3.1.4 # via # data-inclusion-api (setup.py) @@ -115,8 +111,6 @@ markupsafe==2.1.5 # mako minio==7.2.8 # via data-inclusion-api (setup.py) -multivolumefile==0.2.3 - # via py7zr nodeenv==1.9.1 # via pre-commit numpy==2.1.1 @@ -149,26 +143,18 @@ pluggy==1.5.0 # via tox pre-commit==3.8.0 # via data-inclusion-api (setup.py) -psutil==6.0.0 - # via py7zr psycopg2==2.9.9 # via data-inclusion-api (setup.py) -py7zr==0.22.0 - # via data-inclusion-api (setup.py) pyarrow==17.0.0 # via data-inclusion-api (setup.py) pyasn1==0.6.1 # via # python-jose # rsa -pybcj==1.0.2 - # via py7zr pycparser==2.22 # via cffi pycryptodome==3.20.0 # via minio -pycryptodomex==3.20.0 - # via py7zr pydantic==2.9.1 # via # data-inclusion-api (setup.py) @@ -190,8 +176,6 @@ pyinstrument==4.7.3 # via fastapi-debug-toolbar pyogrio==0.9.0 # via geopandas -pyppmd==1.1.0 - # via py7zr pyproj==3.6.1 # via geopandas pyproject-api==1.7.1 @@ -215,8 +199,6 @@ pyyaml==6.0.2 # via # pre-commit # uvicorn -pyzstd==0.16.1 - # via py7zr requests==2.32.3 # via data-inclusion-api (setup.py) rsa==4.9 @@ -246,8 +228,6 @@ sqlparse==0.5.1 # via fastapi-debug-toolbar starlette==0.38.5 # via fastapi -texttable==1.7.0 - # via py7zr tox==4.18.1 # via data-inclusion-api (setup.py) tqdm==4.66.5 diff --git a/api/requirements/requirements.txt b/api/requirements/requirements.txt index 7a2aaca9..43cf156c 100644 --- a/api/requirements/requirements.txt +++ b/api/requirements/requirements.txt @@ -13,8 +13,6 @@ argon2-cffi==23.1.0 # via minio argon2-cffi-bindings==21.2.0 # via argon2-cffi -brotli==1.1.0 - # via py7zr certifi==2024.8.30 # via # data-inclusion-api (setup.py) @@ -81,8 +79,6 @@ idna==3.8 # email-validator # httpx # requests -inflate64==1.0.0 - # via py7zr jinja2==3.1.4 # via data-inclusion-api (setup.py) mako==1.3.5 @@ -93,8 +89,6 @@ markupsafe==2.1.5 # mako minio==7.2.8 # via data-inclusion-api (setup.py) -multivolumefile==0.2.3 - # via py7zr numpy==2.1.1 # via # data-inclusion-api (setup.py) @@ -115,26 +109,18 @@ pandas==2.2.2 # via # data-inclusion-api (setup.py) # geopandas -psutil==6.0.0 - # via py7zr psycopg2==2.9.9 # via data-inclusion-api (setup.py) -py7zr==0.22.0 - # via data-inclusion-api (setup.py) pyarrow==17.0.0 # via data-inclusion-api (setup.py) pyasn1==0.6.1 # via # python-jose # rsa -pybcj==1.0.2 - # via py7zr pycparser==2.22 # via cffi pycryptodome==3.20.0 # via minio -pycryptodomex==3.20.0 - # via py7zr pydantic==2.9.1 # via # data-inclusion-api (setup.py) @@ -148,8 +134,6 @@ pydantic-settings==2.5.2 # via data-inclusion-api (setup.py) pyogrio==0.9.0 # via geopandas -pyppmd==1.1.0 - # via py7zr pyproj==3.6.1 # via geopandas python-dateutil==2.9.0.post0 @@ -169,8 +153,6 @@ pytz==2024.2 # pandas pyyaml==6.0.2 # via uvicorn -pyzstd==0.16.1 - # via py7zr requests==2.32.3 # via data-inclusion-api (setup.py) rsa==4.9 @@ -196,8 +178,6 @@ sqlalchemy==2.0.34 # geoalchemy2 starlette==0.38.5 # via fastapi -texttable==1.7.0 - # via py7zr tqdm==4.66.5 # via data-inclusion-api (setup.py) typing-extensions==4.12.2 diff --git a/api/requirements/test-requirements.txt b/api/requirements/test-requirements.txt index f6d43ea0..ef8e8174 100644 --- a/api/requirements/test-requirements.txt +++ b/api/requirements/test-requirements.txt @@ -14,8 +14,6 @@ argon2-cffi==23.1.0 # via minio argon2-cffi-bindings==21.2.0 # via argon2-cffi -brotli==1.1.0 - # via py7zr certifi==2024.8.30 # via # data-inclusion-api (setup.py) @@ -89,8 +87,6 @@ idna==3.8 # email-validator # httpx # requests -inflate64==1.0.0 - # via py7zr iniconfig==2.0.0 # via pytest jinja2==3.1.4 @@ -105,8 +101,6 @@ markupsafe==2.1.5 # mako minio==7.2.8 # via data-inclusion-api (setup.py) -multivolumefile==0.2.3 - # via py7zr numpy==2.1.1 # via # data-inclusion-api (setup.py) @@ -130,26 +124,18 @@ pandas==2.2.2 # geopandas pluggy==1.5.0 # via pytest -psutil==6.0.0 - # via py7zr psycopg2==2.9.9 # via data-inclusion-api (setup.py) -py7zr==0.22.0 - # via data-inclusion-api (setup.py) pyarrow==17.0.0 # via data-inclusion-api (setup.py) pyasn1==0.6.1 # via # python-jose # rsa -pybcj==1.0.2 - # via py7zr pycparser==2.22 # via cffi pycryptodome==3.20.0 # via minio -pycryptodomex==3.20.0 - # via py7zr pydantic==2.9.1 # via # data-inclusion-api (setup.py) @@ -171,8 +157,6 @@ pyinstrument==4.7.3 # via fastapi-debug-toolbar pyogrio==0.9.0 # via geopandas -pyppmd==1.1.0 - # via py7zr pyproj==3.6.1 # via geopandas pytest==8.3.3 @@ -200,8 +184,6 @@ pytz==2024.2 # pandas pyyaml==6.0.2 # via uvicorn -pyzstd==0.16.1 - # via py7zr requests==2.32.3 # via data-inclusion-api (setup.py) rsa==4.9 @@ -231,8 +213,6 @@ starlette==0.38.5 # via fastapi syrupy==4.7.1 # via data-inclusion-api (setup.py) -texttable==1.7.0 - # via py7zr tqdm==4.66.5 # via data-inclusion-api (setup.py) typing-extensions==4.12.2 diff --git a/api/setup.py b/api/setup.py index 0bb275f9..627f32de 100644 --- a/api/setup.py +++ b/api/setup.py @@ -27,7 +27,6 @@ "numpy", "pandas", "psycopg2", - "py7zr", "pyarrow", "pydantic[email]>=2.5.0", "pydantic-settings", diff --git a/api/src/alembic/env.py b/api/src/alembic/env.py index 825098d4..427cb41b 100644 --- a/api/src/alembic/env.py +++ b/api/src/alembic/env.py @@ -3,9 +3,9 @@ from alembic import context from sqlalchemy import engine_from_config, pool -from data_inclusion.api.code_officiel_geo import models as _ # noqa: F401 F811 from data_inclusion.api.config import settings from data_inclusion.api.core import db +from data_inclusion.api.decoupage_administratif import models as _ # noqa: F401 F811 from data_inclusion.api.inclusion_data import models as _ # noqa: F401 F811 from data_inclusion.api.request import models as _ # noqa: F401 F811 diff --git a/api/src/alembic/versions/20240527_130609_9f9a66546e3a_add_fk_structure_commune.py b/api/src/alembic/versions/20240527_130609_9f9a66546e3a_add_fk_structure_commune.py index 314cfb87..fc879363 100644 --- a/api/src/alembic/versions/20240527_130609_9f9a66546e3a_add_fk_structure_commune.py +++ b/api/src/alembic/versions/20240527_130609_9f9a66546e3a_add_fk_structure_commune.py @@ -6,13 +6,8 @@ """ -import sqlalchemy as sa from alembic import op -from data_inclusion.api.code_officiel_geo import constants -from data_inclusion.api.code_officiel_geo.models import Commune -from data_inclusion.api.inclusion_data.models import Service, Structure - # revision identifiers, used by Alembic. revision = "9f9a66546e3a" down_revision = "170af30febde" @@ -21,26 +16,6 @@ def upgrade() -> None: - conn = op.get_bind() - - # must clean up the data before adding the foreign key - for model in [Structure, Service]: - # remove district codes - for k, v in constants._DISTRICTS_BY_CITY.items(): - conn.execute( - sa.update(model) - .where(model.code_insee.startswith(v[0][:3])) - .values({model.code_insee: k}) - .returning(1) - ) - - # remove invalid codes - conn.execute( - sa.update(model) - .where(model.code_insee.not_in(sa.select(Commune.code))) - .values({model.code_insee: None}) - ) - op.create_foreign_key( op.f("fk_api__structures__code_insee__api__communes"), "api__structures", diff --git a/api/src/alembic/versions/20240830_175854_e3f3dfa4ad01_modified_api__communes.py b/api/src/alembic/versions/20240830_175854_e3f3dfa4ad01_modified_api__communes.py new file mode 100644 index 00000000..b20db25f --- /dev/null +++ b/api/src/alembic/versions/20240830_175854_e3f3dfa4ad01_modified_api__communes.py @@ -0,0 +1,78 @@ +"""Modified api__communes + +Revision ID: e3f3dfa4ad01 +Revises: 517603187775 +Create Date: 2024-08-30 17:58:54.747630 + +""" + +import geoalchemy2 +import sqlalchemy as sa +from alembic import op + +from data_inclusion.api.core.db import SortedTextArray + +# revision identifiers, used by Alembic. +revision = "e3f3dfa4ad01" +down_revision = "517603187775" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.alter_column( + "api__communes", "siren_epci", existing_type=sa.VARCHAR(), nullable=True + ) + op.add_column( + "api__communes", + sa.Column( + "codes_postaux", + SortedTextArray(sa.Text()), + nullable=True, + ), + ) + op.add_column( + "api__communes", + sa.Column( + "centre", + geoalchemy2.types.Geometry( + srid=4326, from_text="ST_GeomFromEWKT", name="geometry" + ), + nullable=True, + ), + ) + op.drop_index("ix_api__communes__geography", table_name="api__communes") + op.drop_column("api__communes", "geom") + + +def downgrade() -> None: + op.add_column( + "api__communes", + sa.Column( + "geom", + geoalchemy2.types.Geometry( + srid=4326, + spatial_index=False, + from_text="ST_GeomFromEWKT", + name="geometry", + _spatial_index_reflected=True, + ), + autoincrement=False, + nullable=True, + ), + ) + op.create_index( + "ix_api__communes__geography", + "api__communes", + [ + sa.text( + "(st_simplify(geom, 0.01::double precision)::geography(Geometry,4326))" + ) + ], + unique=False, + ) + op.drop_column("api__communes", "centre") + op.drop_column("api__communes", "codes_postaux") + op.alter_column( + "api__communes", "siren_epci", existing_type=sa.VARCHAR(), nullable=False + ) diff --git a/api/src/data_inclusion/api/cli.py b/api/src/data_inclusion/api/cli.py index da48e401..9e239d64 100644 --- a/api/src/data_inclusion/api/cli.py +++ b/api/src/data_inclusion/api/cli.py @@ -3,7 +3,7 @@ import click from data_inclusion.api import auth -from data_inclusion.api.code_officiel_geo.commands import import_admin_express +from data_inclusion.api.decoupage_administratif.commands import import_communes from data_inclusion.api.inclusion_data.commands import load_inclusion_data logger = logging.getLogger(__name__) @@ -34,17 +34,17 @@ def _generate_token_for_user( click.echo(auth.create_access_token(subject=email, admin=admin)) -@cli.command(name="import_admin_express") -def _import_admin_express(): - """Import the latest Admin Express COG database""" - click.echo(import_admin_express()) - - @cli.command(name="load_inclusion_data") def _load_inclusion_data(): """Load the latest inclusion data""" click.echo(load_inclusion_data()) +@cli.command(name="import_communes") +def _import_communes(): + """Import the communes from the Decoupage Administratif API""" + click.echo(import_communes()) + + if __name__ == "__main__": cli() diff --git a/api/src/data_inclusion/api/code_officiel_geo/commands.py b/api/src/data_inclusion/api/code_officiel_geo/commands.py deleted file mode 100644 index 09eb9f5c..00000000 --- a/api/src/data_inclusion/api/code_officiel_geo/commands.py +++ /dev/null @@ -1,99 +0,0 @@ -import logging -import pathlib -import tempfile - -import geopandas -import httpx -import py7zr -from sqlalchemy.dialects.postgresql import insert -from tqdm import tqdm - -from data_inclusion.api.code_officiel_geo import models -from data_inclusion.api.core import db - -logger = logging.getLogger(__name__) - -IGN_ADMIN_EXPRESS_FILE_URL = "http://files.opendatarchives.fr/professionnels.ign.fr/adminexpress/ADMIN-EXPRESS_3-1__SHP__FRA_WM_2022-09-20.7z" - - -# TODO(vmttn): use https://geo.api.gouv.fr/ - - -def download(url: str, output_path: pathlib.Path): - with httpx.stream("GET", url) as response: - total = int(response.headers["Content-Length"]) - - response.raise_for_status() - - with output_path.open("wb") as fp: - with tqdm( - total=total, unit_scale=True, unit_divisor=1024, unit="B" - ) as progress: - num_bytes_downloaded = response.num_bytes_downloaded - for chunck in response.iter_bytes(chunk_size=32768): - fp.write(chunck) - progress.update( - response.num_bytes_downloaded - num_bytes_downloaded - ) - num_bytes_downloaded = response.num_bytes_downloaded - - -def load_communes(file_path: pathlib.Path): - for i in tqdm(range(100)): - chunck_df = geopandas.read_file(file_path, rows=slice(1000 * i, 1000 * (i + 1))) - - if len(chunck_df) == 0: - break - - chunck_df = chunck_df.rename( - columns={ - "INSEE_COM": "code", - "NOM": "nom", - "INSEE_DEP": "departement", - "INSEE_REG": "region", - "SIREN_EPCI": "siren_epci", - } - ) - - chunck_df = chunck_df.rename_geometry("geom") - - column_names = ["code", "nom", "departement", "region", "siren_epci", "geom"] - chunck_df = chunck_df[column_names] - - chunck_df = chunck_df.to_wkt() - - # optimize future lookups - chunck_df = chunck_df.sort_values(by="code") - - commune_data_list = chunck_df.to_dict(orient="records") - - stmt = insert(models.Commune).values(commune_data_list) - - stmt = stmt.on_conflict_do_update( - index_elements=[models.Commune.code], - set_={col: getattr(stmt.excluded, col) for col in column_names}, - ) - - with db.SessionLocal() as session: - session.execute(stmt) - session.commit() - - -def import_admin_express(): - with tempfile.TemporaryDirectory() as tmp_dir_name: - tmp_dir_path = pathlib.Path(tmp_dir_name) - archive_path = tmp_dir_path / "ign_admin_express.7z" - extract_dir_path = tmp_dir_path - logger.info(f"Downloading to {archive_path}") - - download(IGN_ADMIN_EXPRESS_FILE_URL, archive_path) - - logger.info(f"Extracting to {extract_dir_path}") - - with py7zr.SevenZipFile(archive_path, "r") as archive: - archive.extractall(extract_dir_path) - - logger.info("Loading communes") - - communes_file_path = next(tmp_dir_path.glob("**/COMMUNE.shp")) - load_communes(communes_file_path) diff --git a/api/src/data_inclusion/api/code_officiel_geo/models.py b/api/src/data_inclusion/api/code_officiel_geo/models.py deleted file mode 100644 index 58154e46..00000000 --- a/api/src/data_inclusion/api/code_officiel_geo/models.py +++ /dev/null @@ -1,85 +0,0 @@ -import geoalchemy2 -import sqlalchemy as sqla -from sqlalchemy.orm import Mapped, mapped_column - -from data_inclusion.api.core.db import Base - -# all fields are nullable or have a default value. These models will only be used to -# query valid data coming from the data pipeline. - - -class Commune(Base): - code: Mapped[str] = mapped_column(primary_key=True) - nom: Mapped[str] - departement: Mapped[str] - region: Mapped[str] - siren_epci: Mapped[str] - geom = mapped_column( - geoalchemy2.Geometry("Geometry", srid=4326, spatial_index=False) - ) - - __table_args__ = ( - sqla.Index( - "ix_api__communes__geography", - sqla.text("CAST(ST_Simplify(geom, 0.01) AS geography(geometry, 4326))"), - ), - ) - - def __repr__(self) -> str: - return f"" - - -class EPCI(Base): - code: Mapped[str] = mapped_column(primary_key=True) - nom: Mapped[str] - nature: Mapped[str] - geom = mapped_column( - geoalchemy2.Geometry("Geometry", srid=4326, spatial_index=False) - ) - - __table_args__ = ( - sqla.Index( - "ix_api__epcis__geography", - sqla.text("CAST(ST_Simplify(geom, 0.01) AS geography(geometry, 4326))"), - ), - ) - - def __repr__(self) -> str: - return f"" - - -class Departement(Base): - code: Mapped[str] = mapped_column(primary_key=True) - nom: Mapped[str] - insee_reg: Mapped[str] - geom = mapped_column( - geoalchemy2.Geometry("Geometry", srid=4326, spatial_index=False) - ) - - __table_args__ = ( - sqla.Index( - "ix_api__departements__geography", - sqla.text("CAST(ST_Simplify(geom, 0.01) AS geography(geometry, 4326))"), - ), - ) - - def __repr__(self) -> str: - return f"" - - -class Region(Base): - code: Mapped[str] = mapped_column(primary_key=True) - nom: Mapped[str] - geom = mapped_column( - geoalchemy2.Geometry("Geometry", srid=4326, spatial_index=False) - ) - - __table_args__ = ( - sqla.Index( - "ix_api__regions__geography", - sqla.text("CAST(ST_Simplify(geom, 0.01) AS geography(geometry, 4326))"), - ), - ) - - def __repr__(self) -> str: - return f"" diff --git a/api/src/data_inclusion/api/code_officiel_geo/__init__.py b/api/src/data_inclusion/api/decoupage_administratif/__init__.py similarity index 100% rename from api/src/data_inclusion/api/code_officiel_geo/__init__.py rename to api/src/data_inclusion/api/decoupage_administratif/__init__.py diff --git a/api/src/data_inclusion/api/decoupage_administratif/commands.py b/api/src/data_inclusion/api/decoupage_administratif/commands.py new file mode 100644 index 00000000..5e968ad6 --- /dev/null +++ b/api/src/data_inclusion/api/decoupage_administratif/commands.py @@ -0,0 +1,80 @@ +import logging + +import numpy as np +import pandas as pd +from furl import furl +from sqlalchemy import types +from sqlalchemy.dialects.postgresql import insert + +from data_inclusion.api.core import db +from data_inclusion.api.inclusion_data import models + +logger = logging.getLogger(__name__) + + +def import_communes(): + query_params = { + "fields": ("nom,code,codesPostaux,codeDepartement,codeRegion,codeEpci,centre"), + "format": "json", + } + dtypes = { + "code": types.TEXT, + "codeEpci": types.TEXT, + "departement": types.TEXT, + "region": types.TEXT, + "centre": types.JSON, + "codesPostaux": types.ARRAY(types.TEXT), + } + + communes_url = ( + furl("https://geo.api.gouv.fr/communes").set(query_params=query_params).url + ) + communes_df = pd.read_json(communes_url, dtype=dtypes) + + districts_url = ( + furl("https://geo.api.gouv.fr/communes") + .set(query_params=query_params | {"type": "arrondissement-municipal"}) + .url + ) + districts_df = pd.read_json(districts_url, dtype=dtypes) + + df = pd.concat([communes_df, districts_df]) + + df = df.rename( + columns={ + "codesPostaux": "codes_postaux", + "codeDepartement": "departement", + "codeRegion": "region", + "codeEpci": "siren_epci", + } + ) + + def create_point(geom): + return f"POINT({geom['coordinates'][0]} {geom['coordinates'][1]})" + + df["centre"] = df["centre"].apply(create_point) + + df = df.replace({np.nan: None}) + + df = df.sort_values(by="code") + + commune_data_list = df.to_dict(orient="records") + stmt = insert(models.Commune).values(commune_data_list) + + column_names = [ + "code", + "nom", + "departement", + "region", + "siren_epci", + "centre", + "codes_postaux", + ] + stmt = stmt.on_conflict_do_update( + index_elements=[models.Commune.code], + set_={col: getattr(stmt.excluded, col) for col in column_names}, + ) + + with db.SessionLocal() as session: + session.execute(stmt) + session.commit() diff --git a/api/src/data_inclusion/api/code_officiel_geo/constants.py b/api/src/data_inclusion/api/decoupage_administratif/constants.py similarity index 84% rename from api/src/data_inclusion/api/code_officiel_geo/constants.py rename to api/src/data_inclusion/api/decoupage_administratif/constants.py index c50f2078..8bdbe8a1 100644 --- a/api/src/data_inclusion/api/code_officiel_geo/constants.py +++ b/api/src/data_inclusion/api/decoupage_administratif/constants.py @@ -162,70 +162,3 @@ class RegionEnum(Enum): "RegionCodeEnum", {member.name: member.value.code for member in RegionEnum}, ) - - -# based on -# https://github.com/gip-inclusion/dora-back/blob/main/dora/admin_express/utils.py - -_DISTRICTS_BY_CITY = { - # Paris - "75056": [ - "75101", - "75102", - "75103", - "75104", - "75105", - "75106", - "75107", - "75108", - "75109", - "75110", - "75111", - "75112", - "75113", - "75114", - "75115", - "75116", - "75117", - "75118", - "75119", - "75120", - ], - # Lyon - "69123": [ - "69381", - "69382", - "69383", - "69384", - "69385", - "69386", - "69387", - "69388", - "69389", - ], - # Marseille - "13055": [ - "13201", - "13202", - "13203", - "13204", - "13205", - "13206", - "13207", - "13208", - "13209", - "13210", - "13211", - "13212", - "13213", - "13214", - "13215", - "13216", - ], -} - -CODE_COMMUNE_BY_CODE_ARRONDISSEMENT = { - code_arrondissement: code_commune - for code_commune, codes_arrondissements in _DISTRICTS_BY_CITY.items() - for code_arrondissement in codes_arrondissements -} diff --git a/api/src/data_inclusion/api/decoupage_administratif/models.py b/api/src/data_inclusion/api/decoupage_administratif/models.py new file mode 100644 index 00000000..425dcd39 --- /dev/null +++ b/api/src/data_inclusion/api/decoupage_administratif/models.py @@ -0,0 +1,21 @@ +import geoalchemy2 +from sqlalchemy.orm import Mapped, mapped_column + +from data_inclusion.api.core.db import Base + + +class Commune(Base): + code: Mapped[str] = mapped_column(primary_key=True) + nom: Mapped[str] + departement: Mapped[str] + region: Mapped[str] + siren_epci: Mapped[str | None] + # FIXME(vperron) : This column should have an index (spatial_index=True) + # but let's do it in a future migration + centre = mapped_column(geoalchemy2.Geometry("Geometry", srid=4326)) + # FIXME(vperron) : This should not be nullable but at the time of migration + # it's necessary as the info is not there yet. Let's clean up later. + codes_postaux: Mapped[list[str] | None] + + def __repr__(self) -> str: + return f"" diff --git a/api/src/data_inclusion/api/code_officiel_geo/utils.py b/api/src/data_inclusion/api/decoupage_administratif/utils.py similarity index 91% rename from api/src/data_inclusion/api/code_officiel_geo/utils.py rename to api/src/data_inclusion/api/decoupage_administratif/utils.py index 64ac2ff0..eff0ffe2 100644 --- a/api/src/data_inclusion/api/code_officiel_geo/utils.py +++ b/api/src/data_inclusion/api/decoupage_administratif/utils.py @@ -1,4 +1,4 @@ -from data_inclusion.api.code_officiel_geo import constants +from data_inclusion.api.decoupage_administratif import constants def get_departement_by_code_or_slug( diff --git a/api/src/data_inclusion/api/inclusion_data/commands.py b/api/src/data_inclusion/api/inclusion_data/commands.py index 0e89635a..b0c047b0 100644 --- a/api/src/data_inclusion/api/inclusion_data/commands.py +++ b/api/src/data_inclusion/api/inclusion_data/commands.py @@ -11,7 +11,6 @@ from tqdm import tqdm from data_inclusion import schema -from data_inclusion.api.code_officiel_geo import constants from data_inclusion.api.config import settings from data_inclusion.api.core import db from data_inclusion.api.inclusion_data import models @@ -124,14 +123,6 @@ def load_inclusion_data(): structures_df = structures_df.replace({np.nan: None}) services_df = services_df.replace({np.nan: None}) - # TODO(vperron) : To remove when we handle the city districts - structures_df = structures_df.assign( - code_insee=structures_df.code_insee.apply(clean_up_code_insee), - ) - services_df = services_df.assign( - code_insee=services_df.code_insee.apply(clean_up_code_insee), - ) - structures_df = structures_df.drop(columns=["_di_geocodage_score"]) services_df = services_df.drop(columns=["_di_geocodage_score"]) @@ -196,10 +187,6 @@ def load_inclusion_data(): connection.execute(sqla.text("VACUUM ANALYZE api__services")) -def clean_up_code_insee(v) -> str | None: - return constants.CODE_COMMUNE_BY_CODE_ARRONDISSEMENT.get(v, v) - - def validate_data(model_schema, data): try: model_schema(**data) diff --git a/api/src/data_inclusion/api/inclusion_data/models.py b/api/src/data_inclusion/api/inclusion_data/models.py index 9d49fa36..bf975841 100644 --- a/api/src/data_inclusion/api/inclusion_data/models.py +++ b/api/src/data_inclusion/api/inclusion_data/models.py @@ -3,8 +3,8 @@ import sqlalchemy as sqla from sqlalchemy.orm import Mapped, mapped_column, relationship -from data_inclusion.api.code_officiel_geo.models import Commune from data_inclusion.api.core.db import Base +from data_inclusion.api.decoupage_administratif.models import Commune # all fields are nullable or have a default value. These models will only be used to # query valid data coming from the data pipeline. diff --git a/api/src/data_inclusion/api/inclusion_data/routes.py b/api/src/data_inclusion/api/inclusion_data/routes.py index d833944a..c97c27ad 100644 --- a/api/src/data_inclusion/api/inclusion_data/routes.py +++ b/api/src/data_inclusion/api/inclusion_data/routes.py @@ -6,20 +6,19 @@ from data_inclusion import schema as di_schema from data_inclusion.api import auth -from data_inclusion.api.code_officiel_geo.constants import ( - CODE_COMMUNE_BY_CODE_ARRONDISSEMENT, +from data_inclusion.api.config import settings +from data_inclusion.api.core import db +from data_inclusion.api.decoupage_administratif.constants import ( DepartementCodeEnum, DepartementSlugEnum, RegionCodeEnum, RegionSlugEnum, ) -from data_inclusion.api.code_officiel_geo.models import Commune -from data_inclusion.api.code_officiel_geo.utils import ( +from data_inclusion.api.decoupage_administratif.models import Commune +from data_inclusion.api.decoupage_administratif.utils import ( get_departement_by_code_or_slug, get_region_by_code_or_slug, ) -from data_inclusion.api.config import settings -from data_inclusion.api.core import db from data_inclusion.api.inclusion_data import schemas, services from data_inclusion.api.utils import pagination, soliguide @@ -412,9 +411,6 @@ def search_services_endpoint( commune_instance = None search_point = None if code_commune is not None: - code_commune = CODE_COMMUNE_BY_CODE_ARRONDISSEMENT.get( - code_commune, code_commune - ) commune_instance = db_session.get(Commune, code_commune) if commune_instance is None: raise fastapi.HTTPException( diff --git a/api/src/data_inclusion/api/inclusion_data/services.py b/api/src/data_inclusion/api/inclusion_data/services.py index fa5419d4..2c91b660 100644 --- a/api/src/data_inclusion/api/inclusion_data/services.py +++ b/api/src/data_inclusion/api/inclusion_data/services.py @@ -15,12 +15,11 @@ from fastapi_pagination.ext.sqlalchemy import paginate from data_inclusion import schema as di_schema -from data_inclusion.api.code_officiel_geo.constants import ( - CODE_COMMUNE_BY_CODE_ARRONDISSEMENT, +from data_inclusion.api.decoupage_administratif.constants import ( Departement, Region, ) -from data_inclusion.api.code_officiel_geo.models import Commune +from data_inclusion.api.decoupage_administratif.models import Commune from data_inclusion.api.inclusion_data import models logger = logging.getLogger(__name__) @@ -198,9 +197,6 @@ def list_structures( query = query.filter_by(id=id_) if commune_code is not None: - commune_code = CODE_COMMUNE_BY_CODE_ARRONDISSEMENT.get( - commune_code, commune_code - ) query = query.filter(models.Structure.code_insee == commune_code) if departement is not None: @@ -328,10 +324,6 @@ def list_services( query = query.filter(Commune.region == region.code) if code_commune is not None: - code_commune = CODE_COMMUNE_BY_CODE_ARRONDISSEMENT.get( - code_commune, code_commune - ) - query = query.filter(models.Service.code_insee == code_commune) query = filter_services( @@ -415,16 +407,7 @@ def search_services( if search_point is not None: dest_geometry = search_point else: - dest_geometry = ( - sqla.select( - sqla.cast( - geoalchemy2.functions.ST_Simplify(Commune.geom, 0.01), - geoalchemy2.Geography(geometry_type="GEOMETRY", srid=4326), - ) - ) - .filter(Commune.code == commune_instance.code) - .scalar_subquery() - ) + dest_geometry = commune_instance.centre query = query.filter( sqla.or_( @@ -432,7 +415,7 @@ def search_services( geoalchemy2.functions.ST_DWithin( src_geometry, dest_geometry, - 50_000, # meters or 50km + 50_000, # meters ), # or `a-distance` models.Service.modes_accueil.contains( @@ -454,8 +437,8 @@ def search_services( src_geometry, dest_geometry, ) - / 1000 - ).cast(sqla.Integer), # conversion to kms + / 1000 # conversion to kms + ).cast(sqla.Integer), ), else_=sqla.null().cast(sqla.Integer), ) diff --git a/api/tests/communes.parquet.gzip b/api/tests/communes.parquet.gzip index 1df74eb012dd204835d742141ad9e4c4e4d36b59..24c86ead850cc722201958779e5535855ca4742c 100644 GIT binary patch literal 6715 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 literal 111771 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%0D-1TRDJMwqT~%L@n>Ihe@nMuF9Mj{$A#=v7 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 y9}xK#4=rO0@Tnm9>`b!~Y-AOP|F6 diff --git a/api/tests/conftest.py b/api/tests/conftest.py index 3201d2ad..6ef12bed 100644 --- a/api/tests/conftest.py +++ b/api/tests/conftest.py @@ -10,9 +10,9 @@ from fastapi.testclient import TestClient from data_inclusion.api.app import create_app -from data_inclusion.api.code_officiel_geo import models from data_inclusion.api.config import settings from data_inclusion.api.core import db +from data_inclusion.api.decoupage_administratif.models import Commune from . import factories @@ -121,7 +121,7 @@ def communes(db_connection): df = df.to_wkt() commune_data_list = df.to_dict(orient="records") - db_connection.execute(sqla.insert(models.Commune).values(commune_data_list)) + db_connection.execute(sqla.insert(Commune).values(commune_data_list)) db_connection.commit() diff --git a/api/tests/e2e/api/test_inclusion_data.py b/api/tests/e2e/api/test_inclusion_data.py index eb83ac02..28ca6c2f 100644 --- a/api/tests/e2e/api/test_inclusion_data.py +++ b/api/tests/e2e/api/test_inclusion_data.py @@ -5,7 +5,7 @@ import pytest from data_inclusion import schema -from data_inclusion.api.code_officiel_geo.constants import RegionEnum +from data_inclusion.api.decoupage_administratif.constants import RegionEnum from data_inclusion.api.utils import soliguide from ... import factories @@ -15,6 +15,7 @@ LILLE = {"code_insee": "59350", "latitude": 50.633333, "longitude": 3.066667} MAUBEUGE = {"code_insee": "59392"} PARIS = {"code_insee": "75056", "latitude": 48.866667, "longitude": 2.333333} +PARIS_11 = {"code_insee": "75111", "latitude": 48.86010, "longitude": 2.38160} ROUBAIX = {"code_insee": "59512"} @@ -614,7 +615,8 @@ def test_can_filter_resources_by_slug_region(api_client, url, factory): (None, DUNKERQUE["code_insee"], False), (DUNKERQUE["code_insee"], DUNKERQUE["code_insee"], True), (DUNKERQUE["code_insee"], "62041", False), - (PARIS["code_insee"], "75101", True), + (PARIS["code_insee"], "75056", True), + (PARIS_11["code_insee"], "75111", True), ], ) def test_can_filter_resources_by_code_commune( @@ -837,8 +839,8 @@ def test_can_filter_resources_by_sources(api_client, url, factory): (None, DUNKERQUE["code_insee"], False), (DUNKERQUE, DUNKERQUE["code_insee"], True), (DUNKERQUE, MAUBEUGE["code_insee"], False), - (PARIS, "75101", True), - pytest.param(PARIS, PARIS["code_insee"], True, marks=pytest.mark.xfail), + (PARIS, "75056", True), + (PARIS_11, "75111", True), ], ) @pytest.mark.with_token @@ -1224,7 +1226,7 @@ def test_search_services_with_code_commune_sample_distance(api_client): resp_data = response.json() assert_paginated_response_data(resp_data, total=1) assert resp_data["items"][0]["service"]["id"] == service_1.id - assert resp_data["items"][0]["distance"] == 35 + assert resp_data["items"][0]["distance"] == 39 @pytest.mark.with_token