Initial commit
This commit is contained in:
commit
351d98c523
36 changed files with 1836 additions and 0 deletions
68
pyjeeves/process.py
Normal file
68
pyjeeves/process.py
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
pyjeeves.process
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Jeeves data process
|
||||
"""
|
||||
|
||||
|
||||
from models import Articles, Customers, InvoiceRows, OrderRows
|
||||
|
||||
from sqlalchemy import desc
|
||||
from sqlalchemy.inspection import inspect
|
||||
|
||||
import logging
|
||||
|
||||
|
||||
class Process():
|
||||
"""docstring for Process"""
|
||||
def __init__(self, jvs_query, db_session):
|
||||
super(Process, self).__init__()
|
||||
self.query = jvs_query
|
||||
self.session = db_session
|
||||
self.logger = logging.getLogger("PyJeeves.process")
|
||||
|
||||
def _update_model(self, model, kwargs):
|
||||
for k, v in kwargs.items():
|
||||
if getattr(model, k) != v:
|
||||
if type(getattr(model, k)) is bool:
|
||||
setattr(model, k, bool(int(v)))
|
||||
else:
|
||||
setattr(model, k, v)
|
||||
|
||||
def _get_last_dates(self, model):
|
||||
_last_update = self.session.query(model).\
|
||||
order_by(desc(model.RowUpdatedDt)).first()
|
||||
_last_create = self.session.query(model).\
|
||||
order_by(desc(model.RowCreatedDt)).first()
|
||||
|
||||
return (_last_update.RowUpdatedDt if _last_update else None,
|
||||
_last_create.RowCreatedDt if _last_create else None)
|
||||
|
||||
def _sync_model(self, model, jvs_tbl='companies'):
|
||||
_p_keys = [key.name for key in inspect(model).primary_key]
|
||||
_last_update, _last_create = self._get_last_dates(model)
|
||||
_data = self.query.get(jvs_tbl, _last_update, _last_create)
|
||||
|
||||
if _data:
|
||||
self.logger.info("Syncing %s" % jvs_tbl)
|
||||
for item in _data:
|
||||
_filter_kwargs = {k: item.get(k) for k in _p_keys}
|
||||
_existing = self.session.query(model).\
|
||||
filter_by(**_filter_kwargs).first()
|
||||
|
||||
if _existing:
|
||||
self._update_model(_existing, item)
|
||||
else:
|
||||
_new = model(**item)
|
||||
self.session.add(_new)
|
||||
else:
|
||||
self.logger.info("No sync made for %s" % jvs_tbl)
|
||||
|
||||
def sync_data(self):
|
||||
self._sync_model(Customers, 'Customers')
|
||||
self._sync_model(Articles, 'Articles')
|
||||
self._sync_model(InvoiceRows, 'InvoiceRows')
|
||||
self._sync_model(OrderRows, 'OrderRows')
|
||||
self.session.commit()
|
||||
Loading…
Add table
Add a link
Reference in a new issue