pda2suiviactivite.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. '''
  2. Script d'export des données de configuration des applcations SuiviDesActivtes et SuiviActivitePC
  3. Les données d'origine sont issues de la base \\h2o\LOCAL\4-transversal\BDD\mdb\PDA\db_PDA.mdb
  4. Les fichiers résultats sont les fichiers *.xml du répertoire \\h2o\LOCAL\4-transversal\BDD\mdb\PDA\Fichiers_PDA\
  5. '''
  6. import logging
  7. from lxml import builder # @UnresolvedImport
  8. from lxml import etree # @UnresolvedImport
  9. from path import Path # @UnusedImport
  10. from core import logconf
  11. from core.pde import PdaDb, PDA_FILES_DEST
  12. logger = logging.getLogger("pda2suiviactivite")
  13. logconf.start("pda2suiviactivite", logging.DEBUG)
  14. logger.info("Initialization")
  15. # # POUR TESTER, décommenter les lignes suivantes
  16. ##-----------------------------------------------
  17. # PDA_FILES_DEST = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\PDA\Fichiers_PDA")
  18. # PdaDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\PDA\db_PDA.mdb")
  19. # logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
  20. # logger.warning("Mode TEST")
  21. ##-----------------------------------------------
  22. # Connect to db_PDA.mdb
  23. pda_db = PdaDb(autocommit=True)
  24. # Explication du mapping ci dessous:
  25. # (
  26. # nom de la table,
  27. # {champ: noeud),
  28. # nom des nodes contenant chaque enregistrement,
  29. # nom du fichier cible
  30. # Order by
  31. # )
  32. mapping = [
  33. ("pdaEngin",
  34. {"strEnginId": "Id", "strEnginLibelleLong": "Nom"},
  35. "Attelage",
  36. "attelages.xml",
  37. ["strEnginLibelleLong"]
  38. ),
  39. ("pdaorigine",
  40. {"lngorigine": "Id", "strorigine": "Nom"},
  41. "Depart",
  42. "depart.xml",
  43. ["strorigine"]
  44. ),
  45. ("pdaHeures",
  46. {"annee": "annee", "mois": "mois", "heures": "heures"},
  47. "pdaHeures",
  48. "heures.xml",
  49. ["annee", "mois"]
  50. ),
  51. ("pdaEquip",
  52. {"strEquipesId": "Id", "strEquipesLibelle": "Nom"},
  53. "Equipe",
  54. "equipes.xml",
  55. ["strEquipesLibelle"]
  56. ),
  57. ("pdalocalisation",
  58. {"lngTiersId": "Id", "strTiersMnemo": "Nom"},
  59. "Localisation",
  60. "localisation.xml",
  61. ["strTiersMnemo"]
  62. ),
  63. ("pdaNatInterv",
  64. {"strCategorieInterventioinId": "Id", "strCategorieInterventioinLibelle": "Nom"},
  65. "NatureRealisation",
  66. "naturesinterventions.xml",
  67. ["strCategorieInterventioinLibelle"]
  68. )
  69. ]
  70. for tablename, fieldmapping, eltname, filename, order in mapping:
  71. maker = builder.ElementMaker(nsmap={'xsd': "http://www.w3.org/2001/XMLSchema",
  72. 'xsi': "http://www.w3.org/2001/XMLSchema-instance"})
  73. nodes = []
  74. sql = "SELECT {mapping} FROM {tbl} ORDER BY {order}".format(
  75. mapping=",".join(["[{}].[{}] as {}".format(tablename, key, val) for key, val in fieldmapping.items()]),
  76. tbl=tablename,
  77. order=",".join(order)
  78. )
  79. logger.debug(sql)
  80. data = [record._asdict() for record in pda_db.read_all(sql)]
  81. for record in data:
  82. node = maker.__call__(eltname, *[maker.__call__(field, str(value)) for field, value in record.items()])
  83. nodes.append(node)
  84. root = maker.__call__("ArrayOf" + eltname, *nodes)
  85. if not filename[-4:] == ".xml":
  86. filename += ".xml"
  87. with open(PDA_FILES_DEST / filename, "wb") as f:
  88. f.write(etree.tostring(root, xml_declaration=True, encoding='utf-8', pretty_print=True))
  89. logger.info("> Exporte: {}".format(filename))
  90. logger.info("Export termine")