PyJeeves/pyjeeves/process.py
2017-10-18 16:35:10 +02:00

68 lines
2.2 KiB
Python

# -*- 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()