# -*- coding: utf-8 -*- """ pyjeeves.process ~~~~~~~~~~~~~~~~~~~~~~ Jeeves data process """ from models.meta 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__() # Refactor code to use RawSession instead of raw jvs queries self.query = jvs_query self.session = db_session self.logger = logging.getLogger("PyJeeves." + __name__) 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) nth_item = 0 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) if nth_item % 1000 == 0 and nth_item != 0: self.session.commit() nth_item += 1 self.session.commit() 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')