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