75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
# -*- 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')
|