Ajout du JSON-LD #66
This commit is contained in:
+60
-1
@@ -1,3 +1,4 @@
|
|||||||
|
import json
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
import dash_bootstrap_components as dbc
|
import dash_bootstrap_components as dbc
|
||||||
@@ -5,7 +6,14 @@ import polars as pl
|
|||||||
from dash import Input, Output, callback, dcc, html, register_page
|
from dash import Input, Output, callback, dcc, html, register_page
|
||||||
from polars import selectors as cs
|
from polars import selectors as cs
|
||||||
|
|
||||||
from src.utils import data_schema, df, format_values, meta_content
|
from src.utils import (
|
||||||
|
data_schema,
|
||||||
|
df,
|
||||||
|
format_values,
|
||||||
|
make_org_jsonld,
|
||||||
|
meta_content,
|
||||||
|
unformat_montant,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_title(uid: str = None) -> str:
|
def get_title(uid: str = None) -> str:
|
||||||
@@ -26,6 +34,9 @@ layout = [
|
|||||||
dcc.Store(id="marche_data"),
|
dcc.Store(id="marche_data"),
|
||||||
dcc.Store(id="titulaires_data"),
|
dcc.Store(id="titulaires_data"),
|
||||||
dcc.Location(id="marche_url", refresh="callback-nav"),
|
dcc.Location(id="marche_url", refresh="callback-nav"),
|
||||||
|
html.Script(
|
||||||
|
type="application/ld+json", id="marche_jsonld", children=['{"test": "1"}']
|
||||||
|
),
|
||||||
dbc.Container(
|
dbc.Container(
|
||||||
className="marche_infos",
|
className="marche_infos",
|
||||||
children=[
|
children=[
|
||||||
@@ -208,3 +219,51 @@ def update_marche_info(marche, titulaires):
|
|||||||
titulaires_lines.append(content)
|
titulaires_lines.append(content)
|
||||||
|
|
||||||
return marche_objet, marche_infos[:half], marche_infos[half:], titulaires_lines
|
return marche_objet, marche_infos[:half], marche_infos[half:], titulaires_lines
|
||||||
|
|
||||||
|
|
||||||
|
@callback(
|
||||||
|
Output(component_id="marche_jsonld", component_property="children"),
|
||||||
|
Input("marche_data", "data"),
|
||||||
|
Input("titulaires_data", "data"),
|
||||||
|
)
|
||||||
|
def get_marche_jsonld(marche, titulaires) -> str:
|
||||||
|
acheteur_id = marche.get("acheteur_id")
|
||||||
|
type_order = (
|
||||||
|
"Service" if marche.get("categorie") in ["Services", "Travaux"] else "Product"
|
||||||
|
)
|
||||||
|
result = []
|
||||||
|
|
||||||
|
for titulaire in titulaires:
|
||||||
|
jsonld = {
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "Order",
|
||||||
|
"@id": f"https://decp.info/marches/{marche.get('uid')}",
|
||||||
|
"name": f"{marche.get('nature')} conclu par {marche.get('acheteur_nom')} le {marche.get('dateNotification')}",
|
||||||
|
"description": marche.get("objet"),
|
||||||
|
"orderNumber": marche.get("uid"),
|
||||||
|
"orderDate": marche.get("dateNotification"),
|
||||||
|
"price": unformat_montant(marche.get("montant")),
|
||||||
|
"priceCurrency": "EUR",
|
||||||
|
"customer": make_org_jsonld(
|
||||||
|
acheteur_id, org_name=marche.get("acheteur_nom"), org_type="acheteur"
|
||||||
|
),
|
||||||
|
"seller": make_org_jsonld(
|
||||||
|
titulaire.get("titulaire_id"),
|
||||||
|
org_name=titulaire.get("titulaire_nom"),
|
||||||
|
org_type="titulaire",
|
||||||
|
type_org_id=titulaire.get("titulaire_typeIdentifiant"),
|
||||||
|
),
|
||||||
|
"orderedItem": {
|
||||||
|
"@type": type_order,
|
||||||
|
"name": marche.get("objet"),
|
||||||
|
"category": {
|
||||||
|
"@type": "CategoryCode",
|
||||||
|
"propertyID": "cpv",
|
||||||
|
"codeValue": marche.get("codeCPV"),
|
||||||
|
# "description": "Description du code CPV"
|
||||||
|
},
|
||||||
|
# "serviceType": "Description du code CPV"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
result.append(jsonld)
|
||||||
|
return json.dumps(result, indent=2)
|
||||||
|
|||||||
@@ -145,6 +145,13 @@ def format_number(number) -> str:
|
|||||||
return number
|
return number
|
||||||
|
|
||||||
|
|
||||||
|
def unformat_montant(number: str) -> int:
|
||||||
|
number = number.replace(" €", "")
|
||||||
|
number = number.replace(" €", "").replace(" ", "")
|
||||||
|
number = number.strip()
|
||||||
|
return int(number)
|
||||||
|
|
||||||
|
|
||||||
def format_values(dff: pl.DataFrame) -> pl.DataFrame:
|
def format_values(dff: pl.DataFrame) -> pl.DataFrame:
|
||||||
def format_montant(expr, scale=None):
|
def format_montant(expr, scale=None):
|
||||||
# https://stackoverflow.com/a/78636786
|
# https://stackoverflow.com/a/78636786
|
||||||
@@ -713,3 +720,42 @@ meta_content = {
|
|||||||
),
|
),
|
||||||
}
|
}
|
||||||
data_schema = get_data_schema()
|
data_schema = get_data_schema()
|
||||||
|
|
||||||
|
|
||||||
|
def make_org_jsonld(org_id, org_type, org_name=None, type_org_id="SIRET") -> dict:
|
||||||
|
org_types = {"acheteur": "GovernmentOrganization", "titulaire": "Organization"}
|
||||||
|
address = None
|
||||||
|
if type_org_id.lower() == "siret" and len(org_id) == 14:
|
||||||
|
annuaire_data = get_annuaire_data(org_id)
|
||||||
|
annuaire_address = annuaire_data["matching_etablissements"][0]
|
||||||
|
code_postal = annuaire_address["code_postal"]
|
||||||
|
commune = annuaire_address["libelle_commune"]
|
||||||
|
|
||||||
|
address = (
|
||||||
|
{
|
||||||
|
"@type": "PostalAddress",
|
||||||
|
"streetAddress": annuaire_address.get("adresse", "")
|
||||||
|
.replace(code_postal, "")
|
||||||
|
.replace(commune, "")
|
||||||
|
.strip(),
|
||||||
|
"addressLocality": commune,
|
||||||
|
"postalCode": code_postal,
|
||||||
|
"addressCountry": "FR",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
jsonld = {
|
||||||
|
"@type": org_types[org_type],
|
||||||
|
"name": org_name,
|
||||||
|
"url": f"https://decp.info/titulaires/{org_id}",
|
||||||
|
"identifier": {
|
||||||
|
"@type": "PropertyValue",
|
||||||
|
"propertyID": type_org_id.lower(),
|
||||||
|
"value": org_id,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if address:
|
||||||
|
jsonld["address"] = address
|
||||||
|
|
||||||
|
return jsonld
|
||||||
|
|||||||
Reference in New Issue
Block a user