Skip to content
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

Improve municipality search box #556

Merged
merged 2 commits into from
May 22, 2024
Merged
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
2 changes: 1 addition & 1 deletion atlas/atlasAPI.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def searchCommuneAPI():
session = db.session
search = request.args.get("search", "")
limit = request.args.get("limit", 50)
results = vmCommunesRepository.getCommunesSearch(session, search, limit)
results = vmCommunesRepository.searchMunicipalities(session, search, limit)
session.close()
return jsonify(results)

Expand Down
149 changes: 75 additions & 74 deletions atlas/modeles/repositories/vmCommunesRepository.py
Original file line number Diff line number Diff line change
@@ -1,74 +1,75 @@
# -*- coding:utf-8 -*-

import ast

from flask import current_app
from sqlalchemy import distinct
from sqlalchemy.sql import text
from sqlalchemy.sql.expression import func

from atlas.modeles.entities.vmCommunes import VmCommunes


def getAllCommunes(session):
req = session.query(distinct(VmCommunes.commune_maj), VmCommunes.insee).all()
communeList = list()
for r in req:
temp = {"label": r[0], "value": r[1]}
communeList.append(temp)
return communeList


def getCommunesSearch(session, search, limit=50):
req = session.query(
distinct(VmCommunes.commune_maj), VmCommunes.insee, func.length(VmCommunes.commune_maj)
).filter(VmCommunes.commune_maj.ilike("%" + search + "%"))

req = req.order_by(VmCommunes.commune_maj)

req = req.limit(limit).all()

communeList = list()
for r in req:
temp = {"label": r[0], "value": r[1]}
communeList.append(temp)
return communeList


def getCommuneFromInsee(connection, insee):
sql = """
SELECT c.commune_maj,
c.insee,
c.commune_geojson
FROM atlas.vm_communes c
WHERE c.insee = :thisInsee
"""
req = connection.execute(text(sql), thisInsee=insee)
communeObj = dict()
for r in req:
communeObj = {
"areaName": r.commune_maj,
"areaCode": str(r.insee),
"areaGeoJson": ast.literal_eval(r.commune_geojson),
}
return communeObj


def getCommunesObservationsChilds(connection, cd_ref):
sql = """
SELECT DISTINCT (com.insee) AS insee, com.commune_maj
FROM atlas.vm_communes com
JOIN atlas.vm_observations obs
ON obs.insee = com.insee
WHERE obs.cd_ref IN (
SELECT * FROM atlas.find_all_taxons_childs(:thiscdref)
)
OR obs.cd_ref = :thiscdref
ORDER BY com.commune_maj ASC
"""
req = connection.execute(text(sql), thiscdref=cd_ref)
listCommunes = list()
for r in req:
temp = {"insee": r.insee, "commune_maj": r.commune_maj}
listCommunes.append(temp)
return listCommunes
# -*- coding:utf-8 -*-

import ast

from sqlalchemy import distinct
from sqlalchemy.sql import text
from sqlalchemy.sql.expression import func

from atlas.modeles.entities.vmCommunes import VmCommunes


def getAllCommunes(session):
req = session.query(distinct(VmCommunes.commune_maj), VmCommunes.insee).all()
communeList = list()
for r in req:
temp = {"label": r[0], "value": r[1]}
communeList.append(temp)
return communeList


def searchMunicipalities(session, search, limit=50):
like_search = "%" + search.replace(" ", "%") + "%"

query = (
session.query(
distinct(VmCommunes.commune_maj),
VmCommunes.insee,
func.length(VmCommunes.commune_maj),
)
.filter(func.unaccent(VmCommunes.commune_maj).ilike(func.unaccent(like_search)))
.order_by(VmCommunes.commune_maj)
.limit(limit)
)
results = query.all()

return [{"label": r[0], "value": r[1]} for r in results]


def getCommuneFromInsee(connection, insee):
sql = """
SELECT c.commune_maj,
c.insee,
c.commune_geojson
FROM atlas.vm_communes c
WHERE c.insee = :thisInsee
"""
req = connection.execute(text(sql), thisInsee=insee)
communeObj = dict()
for r in req:
communeObj = {
"areaName": r.commune_maj,
"areaCode": str(r.insee),
"areaGeoJson": ast.literal_eval(r.commune_geojson),
}
return communeObj


def getCommunesObservationsChilds(connection, cd_ref):
sql = """
SELECT DISTINCT (com.insee) AS insee, com.commune_maj
FROM atlas.vm_communes com
JOIN atlas.vm_observations obs
ON obs.insee = com.insee
WHERE obs.cd_ref IN (
SELECT * FROM atlas.find_all_taxons_childs(:thiscdref)
)
OR obs.cd_ref = :thiscdref
ORDER BY com.commune_maj ASC
"""
req = connection.execute(text(sql), thiscdref=cd_ref)
listCommunes = list()
for r in req:
temp = {"insee": r.insee, "commune_maj": r.commune_maj}
listCommunes.append(temp)
return listCommunes
5 changes: 5 additions & 0 deletions data/update/update_1.6.1to1.6.2.sql
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,8 @@ CREATE INDEX ON atlas.vm_observations_mailles

CREATE INDEX ON atlas.vm_observations_mailles
USING btree (id_maille, cd_ref);


-- ISSUE #531 & #532
CREATE EXTENSION IF NOT EXISTS unaccent SCHEMA "public";

10 changes: 10 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@ CHANGELOG

- Correction et amélioration de l'affichage de la fenêtre listant les sous-taxons aggrégés (#558 par @jpm-cbna)

🐛 **Optimisations**

- Amélioration de la "recherche par commune": mots tronqués, sans accent (#531 par @jpm-cbna)

⚠️ **Notes de version**

Si vous mettez à jour GeoNature-atlas :

- Exécutez le script SQL de mise à jour de la BDD : https://github.com/PnX-SI/GeoNature-atlas/blob/master/data/update/update_1.6.1to1.6.2.sql


1.6.1 (2023-10-16)
------------------
Expand Down
Loading