''' Script d'export des données de configuration des applcations SuiviDesActivtes et SuiviActivitePC Les données d'origine sont issues de la base \\h2o\LOCAL\4-transversal\BDD\mdb\PDA\db_PDA.mdb Les fichiers résultats sont les fichiers *.xml du répertoire \\h2o\LOCAL\4-transversal\BDD\mdb\PDA\Fichiers_PDA\ ''' import logging from lxml import builder # @UnresolvedImport from lxml import etree # @UnresolvedImport from path import Path # @UnusedImport from core import logconf from core.pde import PdaDb, PDA_FILES_DEST logger = logging.getLogger("pda2suiviactivite") logconf.start("pda2suiviactivite", logging.DEBUG) logger.info("Initialization") # # POUR TESTER, décommenter les lignes suivantes ##----------------------------------------------- # PDA_FILES_DEST = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\PDA\Fichiers_PDA") # PdaDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\PDA\db_PDA.mdb") # logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)] # logger.warning("Mode TEST") ##----------------------------------------------- # Connect to db_PDA.mdb pda_db = PdaDb(autocommit=True) # Explication du mapping ci dessous: # ( # nom de la table, # {champ: noeud), # nom des nodes contenant chaque enregistrement, # nom du fichier cible # Order by # ) mapping = [ ("pdaEngin", {"strEnginId": "Id", "strEnginLibelleLong": "Nom"}, "Attelage", "attelages.xml", ["strEnginLibelleLong"] ), ("pdaorigine", {"lngorigine": "Id", "strorigine": "Nom"}, "Depart", "depart.xml", ["strorigine"] ), ("pdaHeures", {"annee": "annee", "mois": "mois", "heures": "heures"}, "pdaHeures", "heures.xml", ["annee", "mois"] ), ("pdaEquip", {"strEquipesId": "Id", "strEquipesLibelle": "Nom"}, "Equipe", "equipes.xml", ["strEquipesLibelle"] ), ("pdalocalisation", {"lngTiersId": "Id", "strTiersMnemo": "Nom"}, "Localisation", "localisation.xml", ["strTiersMnemo"] ), ("pdaNatInterv", {"strCategorieInterventioinId": "Id", "strCategorieInterventioinLibelle": "Nom"}, "NatureRealisation", "naturesinterventions.xml", ["strCategorieInterventioinLibelle"] ) ] for tablename, fieldmapping, eltname, filename, order in mapping: maker = builder.ElementMaker(nsmap={'xsd': "http://www.w3.org/2001/XMLSchema", 'xsi': "http://www.w3.org/2001/XMLSchema-instance"}) nodes = [] sql = "SELECT {mapping} FROM {tbl} ORDER BY {order}".format( mapping=",".join(["[{}].[{}] as {}".format(tablename, key, val) for key, val in fieldmapping.items()]), tbl=tablename, order=",".join(order) ) logger.debug(sql) data = [record._asdict() for record in pda_db.read_all(sql)] for record in data: node = maker.__call__(eltname, *[maker.__call__(field, str(value)) for field, value in record.items()]) nodes.append(node) root = maker.__call__("ArrayOf" + eltname, *nodes) if not filename[-4:] == ".xml": filename += ".xml" with open(PDA_FILES_DEST / filename, "wb") as f: f.write(etree.tostring(root, xml_declaration=True, encoding='utf-8', pretty_print=True)) logger.info("> Exporte: {}".format(filename)) logger.info("Export termine")