remove duplicates communes

This commit is contained in:
Johan Le Baut 2022-01-26 21:36:28 +01:00
parent 50dd783b57
commit 2d4b428093
4 changed files with 58 additions and 53 deletions

View file

@ -1,25 +1,27 @@
import sqlite3 import sqlite3
import sys import sys
import json import json
from .model import Commune,FantoirVoie from .model import Commune, FantoirVoie
import re import re
# DB with addresses info # DB with addresses info
DB_ADDRESSES_PATH_ENV="DB_ADDRESSES_PATH" DB_ADDRESSES_PATH_ENV = "DB_ADDRESSES_PATH"
DB_ADDRESSES_DEFAULT_PATH="/etc/fantoir.sqlite" DB_ADDRESSES_DEFAULT_PATH = "/etc/fantoir.sqlite"
# Table for insee codes # Table for insee codes
DB_TABLE_INSEE_NAME="insee" DB_TABLE_INSEE_NAME = "insee"
DB_COL_COMMUNE_INSEE="Code_commune_INSEE" DB_COL_COMMUNE_INSEE = "Code_commune_INSEE"
DB_COL_COMMUNE_NAME="Nom_commune" DB_COL_COMMUNE_NAME = "Nom_commune"
DB_COL_COMMUNE_POSTE="Code_postal" DB_COL_COMMUNE_POSTE = "Code_postal"
# Table for Fantoir voies (code Rivoli) # Table for Fantoir voies (code Rivoli)
DB_TABLE_FANTOIR_NAME="keyv" DB_TABLE_FANTOIR_NAME = "keyv"
DB_COL_FANTOIR_INSEE="key" DB_COL_FANTOIR_INSEE = "key"
DB_FANTOIR_INSEE_KEY_SUFFIX="keyv:" DB_FANTOIR_INSEE_KEY_SUFFIX = "keyv:"
# Utility to find an address # Utility to find an address
class AddressFinder: class AddressFinder:
def __init__(self, db_addresses_sqlite_path: str): def __init__(self, db_addresses_sqlite_path: str):
@ -32,63 +34,67 @@ class AddressFinder:
cur = con.cursor() cur = con.cursor()
communes: list[Commune] = [] communes: list[Commune] = []
communeSearch = communeNameOrZip
zipSearch = communeNameOrZip
searchOpertor = "OR"
regexCommuneAndZip = r"[0-9]{5} .+" # For example: '33000 BO'
if re.match(regexCommuneAndZip, communeNameOrZip):
print("MATCH")
splitSearch = communeNameOrZip.split(' ')
zipSearch = splitSearch[0]
communeSearch = ' '.join(splitSearch[1:])
searchOpertor = "AND"
try: try:
if communeNameOrZip is None: if communeNameOrZip is None:
cur.execute(f"SELECT * from \"{DB_TABLE_INSEE_NAME}\"") cur.execute(f"SELECT * from \"{DB_TABLE_INSEE_NAME}\"")
else: else:
cur.execute(f"SELECT * from \"{DB_TABLE_INSEE_NAME}\" WHERE {DB_COL_COMMUNE_NAME} LIKE \"%{communeSearch}%\" COLLATE nocase {searchOpertor} {DB_COL_COMMUNE_POSTE} LIKE \"{zipSearch}%\"") communeSearch = communeNameOrZip
zipSearch = communeNameOrZip
searchOpertor = "OR"
regexCommuneAndZip = r"[0-9]{5} .+" # For example: '33000 BO'
if re.match(regexCommuneAndZip, communeNameOrZip):
splitSearch = communeNameOrZip.split(' ')
zipSearch = splitSearch[0]
communeSearch = ' '.join(splitSearch[1:])
searchOpertor = "AND"
cur.execute(
f"SELECT * from \"{DB_TABLE_INSEE_NAME}\" WHERE {DB_COL_COMMUNE_NAME} LIKE \"%{communeSearch}%\" COLLATE nocase {searchOpertor} {DB_COL_COMMUNE_POSTE} LIKE \"{zipSearch}%\"")
except sqlite3.OperationalError as err: except sqlite3.OperationalError as err:
print("Error querying DB : {0}".format(err), file=sys.stderr) print("Error querying DB : {0}".format(err), file=sys.stderr)
return [] return []
rows = [dict(row) for row in cur.fetchall()]
print(rows) communesMap=dict()
for row in cur.fetchall():
row_obj = dict(row)
commune = Commune(
codeInsee=row_obj[DB_COL_COMMUNE_INSEE],
nom=row_obj[DB_COL_COMMUNE_NAME],
codeZip=row_obj[DB_COL_COMMUNE_POSTE])
# This way we avoid duplicates
communesMap[commune["codeInsee"]]= commune
con.close() con.close()
for row in rows: return list(communesMap.values())
commune=Commune(
codeInsee=row[DB_COL_COMMUNE_INSEE],
nom=row[DB_COL_COMMUNE_NAME],
codeZip=row[DB_COL_COMMUNE_POSTE])
communes.append(commune)
return communes
def getCommuneFantoirVoies(self, communeInseeCode: str) -> list[FantoirVoie]: def getCommuneFantoirVoies(self, communeInseeCode: str) -> list[FantoirVoie]:
# Extract data from DB # Extract data from DB
con = sqlite3.connect(self.dbPath) con = sqlite3.connect(self.dbPath)
con.row_factory = sqlite3.Row con.row_factory = sqlite3.Row
cur = con.cursor() cur = con.cursor()
try: try:
cur.execute(f"SELECT value from \"{DB_TABLE_FANTOIR_NAME}\" WHERE {DB_COL_FANTOIR_INSEE}=\"{DB_FANTOIR_INSEE_KEY_SUFFIX}{communeInseeCode}\"") cur.execute(
f"SELECT value from \"{DB_TABLE_FANTOIR_NAME}\" WHERE {DB_COL_FANTOIR_INSEE}=\"{DB_FANTOIR_INSEE_KEY_SUFFIX}{communeInseeCode}\"")
except sqlite3.OperationalError as err: except sqlite3.OperationalError as err:
print("Error querying DB : {0}".format(err), file=sys.stderr) print("Error querying DB : {0}".format(err), file=sys.stderr)
return [] return []
data_raw = cur.fetchone() data_raw = cur.fetchone()
con.close() con.close()
## Get JSON payload # Get JSON payload
fantoir_dict = [] fantoir_dict = []
# Check if data where found # Check if data where found
if data_raw is not None: if data_raw is not None:
data = dict(data_raw) data = dict(data_raw)
# Extract the data behind "value" which is a JSON structure # Extract the data behind "value" which is a JSON structure
data_dict=json.loads(data.get("value")) data_dict = json.loads(data.get("value"))
# In extracted JSON data, the interesting payload is behind "value" key # In extracted JSON data, the interesting payload is behind "value" key
fantoir_dict = data_dict.get("value") fantoir_dict = data_dict.get("value")
else: else:
print("Did not found any data matching Insee code " + str(communeInseeCode)) print("Did not found any data matching Insee code " +
str(communeInseeCode))
# Return the json dump # Return the json dump
return fantoir_dict return fantoir_dict

View file

@ -52,7 +52,7 @@
<form> <form>
<div class="form-group" id="communeForm"> <div class="form-group" id="communeForm">
<label class="form-label" for="communeInput">Commune</label> <label class="form-label" for="communeInput">Commune</label>
<input type="text" list="communes" class="form-control" id="communeInput" aria-describedby="communeHelp" placeholder="Nom de la commune ou code postal"> <input type="text" list="communes" class="form-control" id="communeInput" ondblclick="this.focus();this.select()" aria-describedby="communeHelp" placeholder="Nom de la commune ou code postal">
<datalist id="communes"> <datalist id="communes">
</datalist> </datalist>
</div> </div>
@ -113,7 +113,6 @@
}); });
$('#communeInput').on('keyup', function () { $('#communeInput').on('keyup', function () {
console.log("call ",$(this).val() )
fillCommunes($(this).val()); fillCommunes($(this).val());
}); });
$('#communeInput').on('input', function() { $('#communeInput').on('input', function() {

View file

@ -27,6 +27,7 @@ body {
} }
#ptoHelp { #ptoHelp {
color: rgb(192, 192, 192); color: rgb(192, 192, 192);
text-decoration: underline;
} }
.sable .btn-ciel, .ciel .btn-sable{ .sable .btn-ciel, .ciel .btn-sable{

View file

@ -44,7 +44,6 @@ def get_communes():
response=json.dumps(communes), response=json.dumps(communes),
mimetype='application/json' mimetype='application/json'
) )
print(response)
return response return response
@app.route("/addresses/fantoirvoies/<codeInsee>", methods=['GET']) @app.route("/addresses/fantoirvoies/<codeInsee>", methods=['GET'])