ソースを参照

Script factures ok

olivier.massot 8 年 前
コミット
c40465f405
4 ファイル変更104 行追加11 行削除
  1. 12 1
      core/db.py
  2. 4 3
      core/pde.py
  3. 33 0
      core/webservice.py
  4. 55 7
      factures.py

+ 12 - 1
core/db.py

@@ -1,8 +1,12 @@
 '''
     Convenient access to various databases
 '''
+import logging
+
 from pypyodbc import Connection
 
+logger = logging.getLogger("database")
+
 class CustomDb(Connection):
     """ Connexion to a database """
     _cache = {}
@@ -22,6 +26,7 @@ class CustomDb(Connection):
 
     def connect(self, *args, **kwargs):
         """ Establish the connexion to the database"""
+        logger.info("Connection to %s: %s", self.__class__.__name__, self.connectString)
         super(CustomDb, self).connect(*args, **kwargs)
 
     def read(self, sql, *args):
@@ -29,7 +34,7 @@ class CustomDb(Connection):
         cursor = self.execute(sql)
         row = cursor.fetchone()
         while row:
-            yield row
+            yield dict(zip([column[0] for column in cursor.description], row))
             row = cursor.fetchone()
         cursor.close()
 
@@ -40,6 +45,12 @@ class CustomDb(Connection):
         cursor.close()
         return data
 
+    def first(self, sql, *args):
+        try:
+            return next(self.read(sql, *args))
+        except StopIteration:
+            return None
+
     def execute(self, sql, *args):
         cursor = self.cursor()
         args = [sql, tuple(args)] if args else [sql]

+ 4 - 3
core/pde.py

@@ -1,9 +1,9 @@
 '''
-
+    Connections to parc databases
 '''
 from path import Path
 
-from core.db import AccessSDb, AccessDb
+from core.db import AccessSDb
 
 
 # Web url of the WsPde web service
@@ -14,7 +14,8 @@ MDW_PATH = r"\\h2o\local\4-transversal\BDD\mda\cg67Parc.mdw"
 UID = "olivier"
 PWD = "massot"
 
-DB_DIRPATH = Path(r"\\h2o\local\4-transversal\BDD\mdb")
+# DB_DIRPATH = Path(r"\\h2o\local\4-transversal\BDD\mdb")
+DB_DIRPATH = Path(r"C:\wrktmp\mdb")
 
 FACTURES_DB_PATH = DB_DIRPATH / "Facture_data.mdb"
 CONTROLES_DB_PATH = DB_DIRPATH / "cg67Parc_data.mdb"

+ 33 - 0
core/webservice.py

@@ -0,0 +1,33 @@
+'''
+    Connections to parc web-services
+'''
+from _io import BytesIO
+import logging
+import urllib.request
+
+from lxml import etree  # @UnresolvedImport
+
+
+logger = logging.getLogger("webservice")
+
+PDE_WS_URL = 'http://localhost:2890/public/WsPDE.asmx'
+
+class GfWebservice():
+    """ Parser for the pde's web service """
+    def __init__(self, name):
+        self._url = "{}/{}".format(PDE_WS_URL, name)
+        self._data = None
+
+    @property
+    def url(self):
+        return self._url
+
+    def parse(self):
+        logger.info("Request data from %s", self._url)
+        self._data = urllib.request.urlopen(self._url).read()
+
+    def __iter__(self):
+        if self._data is None:
+            self.parse()
+        return (elt.attrib for _, elt in etree.iterparse(BytesIO(self._data)))
+

+ 55 - 7
factures.py

@@ -3,14 +3,62 @@ Created on 27 juin 2017
 
 @author: olivier.massot
 '''
-from _io import BytesIO
-import urllib.request
-from lxml import etree  # @UnresolvedImport
+from datetime import datetime
+import logging
 
+from core.pde import FacturesDb
+from core.webservice import GfWebservice
+
+
+logger = logging.getLogger("factures")
+logging.basicConfig(filename=r'log\factures_{:%Y%m%d_%H%M}.log'.format(datetime.now()),
+                    level=logging.INFO)
+
+
+logger.info("Initialization")
+
+# Connect to factures.mdb
+factures_db = FacturesDb(autocommit=True)
+
+# Connect to the astre gf webservice
+ws = GfWebservice("GetPDETitres")
+
+analysed = 0
+updated = 0
+
+for titre in ws:
+    if not titre:
+        continue
+
+    analysed += 1
+
+    strfilter = "[lngDocId]={} AND [bytTypeDocumentId]=50".format(titre["docId"])
+
+    record = factures_db.first("SELECT * FROM tblPieceEntete WHERE {}".format(strfilter))
+    if not record:
+        logger.warning("(!) no record found where '{}'".format(strfilter))
+        continue
+
+    memobs = record.get("memobsinterne", "")
+
+    if "Titre n° : {}".format(titre["titreId"]) in memobs:
+        # already imported
+        continue
+
+    logger.info("import: {}".format(titre["docId"]))
+
+    if memobs:
+        memobs += "\r\n"
+
+    dt = datetime.strptime(titre["dateTitre"][:10], "%Y-%m-%d").strftime("%d/%m/%Y")
+
+    memobs += r"Titre n° : {} le {}".format(titre["titreId"], dt)
+
+    factures_db.execute("UPDATE tblPieceEntete SET [memObsInterne]='{}' WHERE {}".format(memobs, strfilter))
+
+    updated += 1
+
+logger.info("Operation ended: {} lines analysed, {} updated".format(analysed, updated))
 
-URL = 'http://localhost:2890/public/WsPDE.asmx/GetPDETitres'
 
-data = urllib.request.urlopen(URL).read()
 
-for _, element in etree.iterparse(BytesIO(data)):
-    print(element.attrib)