Ajout du frontend et branchement sur l'API axione #9
4 changed files with 58 additions and 53 deletions
|
@ -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
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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{
|
||||||
|
|
|
@ -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'])
|
||||||
|
|
Loading…
Reference in a new issue