Ajout du frontend et branchement sur l'API axione #9

Merged
felix.baylac merged 21 commits from johan/frontend into master 2022-02-13 19:39:12 +01:00
8 changed files with 142 additions and 19 deletions
Showing only changes of commit 68434bf446 - Show all commits

3
.gitignore vendored
View file

@ -1,2 +1,3 @@
__pycache__ __pycache__
/elig-test.ini /elig-test.ini
.vscode

View file

@ -90,7 +90,6 @@ def query_axione(cfg, body):
print(headers) print(headers)
print("BODY: ") print("BODY: ")
print(body) print(body)
print("===================")
with open("./fixtures/dummy-data-1.xml", "r") as f: with open("./fixtures/dummy-data-1.xml", "r") as f:
dummyData = f.read() dummyData = f.read()
return dummyData return dummyData
@ -121,17 +120,45 @@ class BatimentResult(TypedDict):
referenceBatiment: str referenceBatiment: str
etages: list[EtageResult] etages: list[EtageResult]
class AxioneErreur(TypedDict):
codeErreur: str
libelleErreur: str
def parse_response(resp_str) -> list[BatimentResult]: class AxioneResult(TypedDict):
codeRetour: int
axioneErreur: AxioneErreur
batiments: list[BatimentResult]
def parse_response(resp_str) -> AxioneResult:
root = ET.fromstring(resp_str) root = ET.fromstring(resp_str)
parsedBatiments = [ codeRetourXml = root.find(
parse_batiment(b) ".//{http://structureadresseftth.axione.fr/model/commun}codeRetour"
for b in root.findall( )
".//{http://structureadresseftth.axione.fr/model/commun}batiment" codeRetour = int(codeRetourXml.text.strip())
) axioneErreur = None
] parsedBatiments = []
return parsedBatiments if codeRetour == 0:
parsedBatiments = [
parse_batiment(b)
for b in root.findall(
".//{http://structureadresseftth.axione.fr/model/commun}batiment"
)
]
else:
axioneErreur = AxioneErreur(
codeErreur = root.find(
".//{http://structureadresseftth.axione.fr/model/commun}codeErreur"
).text.strip(),
libelleErreur = root.find(
".//{http://structureadresseftth.axione.fr/model/commun}libelleErreur"
).text.strip()
)
return AxioneResult(
codeRetour=codeRetour,
axioneErreur=axioneErreur,
batiments=parsedBatiments
)
def parse_batiment(batiment) -> BatimentResult: def parse_batiment(batiment) -> BatimentResult:
etatBatiment = batiment.get("etatBatiment", None) etatBatiment = batiment.get("etatBatiment", None)

46
fixtures/dummy-data-2.xml Normal file
View file

@ -0,0 +1,46 @@
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>
<ns3:obtentionStructureAdresseReponseSoap xmlns:ns2="http://structureadresseftth.axione.fr/model/commun" xmlns:ns3="http://structureadresseftth.axione.fr/model/entreprise">
<ns3:entete horodatageReponse="2022-02-13T00:57:50.773+01:00" horodatageRequete="2022-02-12T23:57:48.974060Z" identifiantReponse="1644710270773" versionWS="3.0">
<ns2:operateurCommercial identifiant="" nom="AQUILENET" />
</ns3:entete>
<ns3:codeRetour>
<ns2:codeRetour>0</ns2:codeRetour>
</ns3:codeRetour>
<ns3:codeOI>BEFO</ns3:codeOI>
<ns3:etatImmeuble>true</ns3:etatImmeuble>
<ns3:structureDetaillee>
<ns2:adresse referenceHexacle="361992226N">
<ns2:referenceRivoli codeInsee="36199" codeRivoli="0031" numeroVoie="48" />
</ns2:adresse>
<ns2:batiment conditionsSyndic="false" dateDebutAcceptationCmdAcces="2021-09-14T00:00:00.000+02:00" dateDebutFournitureCRCmdAcces="2021-09-14T00:00:00.000+02:00" etatBatiment="COMMERCIALISABLE" identifiantImmeuble="BAT36-7C32FE6AD11F4A6797E4F29E" nombreLogementsImmeuble="1" referenceBatiment="NA">
<ns2:referenceGeographique coordonneeImmeubleX="2.027143270510003" coordonneeImmeubleY="47.01243491007431" typeProjection="WGS84" />
<ns2:escalier reference="NA">
<ns2:etage nombreLignesActives="0" nombreLignesExistantes="0" nombreLocauxFTTH="1" refPriseCommandeObligatoire="false" reference="RDC">
<ns2:listePbo>
<ns2:pbo referencePBO="PBO36_ISS1_139" typePbo="AERIEN" />
</ns2:listePbo>
<ns2:listeLignesFTTH>
<ns2:ligneFTTH>
<ns2:prise etiquetteAPoser="Non" referencePBO="PBO36_ISS1_139">
<ns2:referencePTO>BF-ISS1-0110</ns2:referencePTO>
<ns2:referencePrisePromoteur />
<ns2:statutLigneFTTH actif="false" commercialisable="true" existant="false" raccordable="true" rompu="false" />
</ns2:prise>
</ns2:ligneFTTH>
<ns2:ligneFTTH>
<ns2:local localisationLocalOC="" localisationLocalOI="" />
</ns2:ligneFTTH>
</ns2:listeLignesFTTH>
<ns2:pm referencePM="ADR_36199_ISS1" referencePMT="PMT_36199_ISS1">
<ns2:typeEmplacementPM>PME</ns2:typeEmplacementPM>
<ns2:responsableBrassage>OC</ns2:responsableBrassage>
</ns2:pm>
</ns2:etage>
</ns2:escalier>
</ns2:batiment>
</ns3:structureDetaillee>
</ns3:obtentionStructureAdresseReponseSoap>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

36
fixtures/dummy-data-3.xml Normal file
View file

@ -0,0 +1,36 @@
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>
<ns3:obtentionStructureAdresseReponseSoap xmlns:ns2="http://structureadresseftth.axione.fr/model/commun" xmlns:ns3="http://structureadresseftth.axione.fr/model/entreprise">
<ns3:entete horodatageReponse="2022-02-13T00:55:44.339+01:00" horodatageRequete="2022-02-12T23:55:42.382844Z" identifiantReponse="1644710144339" versionWS="3.0">
<ns2:operateurCommercial identifiant="" nom="AQUILENET" />
</ns3:entete>
<ns3:codeRetour>
<ns2:codeRetour>1</ns2:codeRetour>
<ns2:codeErreur>I01</ns2:codeErreur>
<ns2:libelleErreur>Code Rivoli introuvable, manquant ou incomplet</ns2:libelleErreur>
</ns3:codeRetour>
<ns3:codeOI />
<ns3:structureDetaillee>
<ns2:adresse />
<ns2:batiment referenceBatiment="">
<ns2:referenceGeographique coordonneeImmeubleX="" coordonneeImmeubleY="" typeProjection="" />
<ns2:escalier reference="">
<ns2:etage refPriseCommandeObligatoire="false" reference="">
<ns2:listePbo>
<ns2:pbo referencePBO="" typePbo="" typeRaccoPbPTO="" />
</ns2:listePbo>
<ns2:listeLignesFTTH>
<ns2:ligneFTTH />
</ns2:listeLignesFTTH>
<ns2:pm referencePM="" referencePMT="">
<ns2:typeEmplacementPM>PME</ns2:typeEmplacementPM>
<ns2:responsableBrassage>OI</ns2:responsableBrassage>
</ns2:pm>
</ns2:etage>
</ns2:escalier>
</ns2:batiment>
</ns3:structureDetaillee>
</ns3:obtentionStructureAdresseReponseSoap>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

View file

@ -7,8 +7,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
crossorigin="anonymous"></script> crossorigin="anonymous"></script>

View file

@ -11,11 +11,12 @@
</head> </head>
<body> <body>
<h1 id="aquilenet-title">Aquilenet</h1> <h1 class="text-center" id="aquilenet-title">Aquilenet</h1>
<div id="container"> {% if result['codeRetour'] == 0 %}
<div id="containerResults" class="container">
<h1 id="main-title">Test d'Éligibilité FTTH Aquilenet: Résultats</h1> <h1 id="main-title">Test d'Éligibilité FTTH Aquilenet: Résultats</h1>
<p>Résultat pour le PTO: {{ pto }}</p> <p>Résultat pour le PTO: {{ pto }}</p>
{% for batiment in result %} {% for batiment in result['batiments'] %}
<table> <table>
<thead> <thead>
<tr> <tr>
@ -58,5 +59,12 @@
</table> </table>
{% endfor %} {% endfor %}
</div> </div>
{% else %}
<div id="containerResults" class="container">
<h1 id="main-title">Erreur</h1>
<p>Code d'erreur: {{ result['axioneErreur']['codeErreur'] }}</p>
<p>Description de l'erreur: {{ result['axioneErreur']['libelleErreur'] }}</p>
</div>
{% endif %}
</body> </body>
</html> </html>

View file

@ -93,7 +93,7 @@ form {
align-self: center; align-self: center;
margin-bottom: 2em; margin-bottom: 2em;
} }
*/
table,td { table,td {
border: 2px solid #333; border: 2px solid #333;
border-collapse: collapse; border-collapse: collapse;
@ -107,4 +107,4 @@ thead, tfoot {
td { td {
padding-left: 1em; padding-left: 1em;
padding-right: 1em; padding-right: 1em;
} */ }

View file

@ -58,7 +58,12 @@ def test_address():
numeroVoie = escape(request.form['numeroVoie']) numeroVoie = escape(request.form['numeroVoie'])
# Trimming rivoli's key # Trimming rivoli's key
codeRivoli = escape(request.form['codeRivoli'])[:-1] codeRivoli = escape(request.form['codeRivoli'])[:-1]
result = query_axione_fantoir(cfg, codeInsee, codeRivoli, numeroVoie) result = parse_response(query_axione_fantoir(cfg, codeInsee, codeRivoli, numeroVoie))
if cfg.debug:
print("===================")
print("Dummy response: ")
print(result)
print("===================")
return render_template("result.html", pto="", result=result) return render_template("result.html", pto="", result=result)