Skip to content

Commit

Permalink
Merge pull request #556 from PnX-SI/feat/municipalities-search
Browse files Browse the repository at this point in the history
Improve municipality search box
  • Loading branch information
TheoLechemia authored May 22, 2024
2 parents d13d535 + 61cc0f3 commit d2334f1
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 75 deletions.
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

0 comments on commit d2334f1

Please sign in to comment.