fix: add command to install mysql triggers for CORE office_op DB

for use with datasync.  this also adds datasync support for
ProductCost preference
This commit is contained in:
Lance Edgar 2024-07-03 18:25:18 -05:00
parent 2f22be6e7e
commit dca2c1bfe2
4 changed files with 435 additions and 28 deletions
rattail_corepos/datasync

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2023 Lance Edgar
# Copyright © 2010-2024 Lance Edgar
#
# This file is part of Rattail.
#
@ -26,12 +26,19 @@ DataSync for CORE POS
import sqlalchemy as sa
from corepos.db.office_op import Session as CoreSession, model as corepos
from rattail.db import model
from rattail.datasync import DataSyncWatcher, DataSyncImportConsumer
def make_changes_table(table_name, metadata):
return sa.Table(
table_name, metadata,
sa.Column('id', sa.Integer(), nullable=False, primary_key=True),
sa.Column('object_type', sa.String(length=255), nullable=False),
sa.Column('object_key', sa.String(length=255), nullable=False),
sa.Column('deleted', sa.Boolean(), nullable=False, default=False),
)
class CoreOfficeOpWatcher(DataSyncWatcher):
"""
DataSync watcher for the CORE ``office_op`` database.
@ -39,21 +46,19 @@ class CoreOfficeOpWatcher(DataSyncWatcher):
prunes_changes = True
def __init__(self, *args, **kwargs):
super(CoreOfficeOpWatcher, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
self.changes_table_name = kwargs.get('changes_table_name',
'datasync_changes')
self.corepos_metadata = sa.MetaData()
self.corepos_changes = sa.Table(
self.changes_table_name, self.corepos_metadata,
sa.Column('id', sa.Integer(), nullable=False, primary_key=True),
sa.Column('object_type', sa.String(length=255), nullable=False),
sa.Column('object_key', sa.String(length=255), nullable=False),
sa.Column('deleted', sa.Boolean(), nullable=False, default=False))
self.corepos_changes = make_changes_table(self.changes_table_name,
self.corepos_metadata)
def get_changes(self, lastrun):
session = CoreSession()
model = self.model
corepos = self.app.get_corepos_handler()
session = corepos.make_session_office_op()
result = session.execute(self.corepos_changes.select())
changes = result.fetchall()
session.close()
@ -67,8 +72,9 @@ class CoreOfficeOpWatcher(DataSyncWatcher):
for c in changes]
def prune_changes(self, keys):
corepos = self.app.get_corepos_handler()
session = corepos.make_session_office_op()
deleted = 0
session = CoreSession()
for key in keys:
result = session.execute(self.corepos_changes.select()\
.where(self.corepos_changes.c.id == key))
@ -90,13 +96,17 @@ class COREPOSProductWatcher(DataSyncWatcher):
if not lastrun:
return
model = self.model
corepos = self.app.get_corepos_handler()
op_model = corepos.get_model_office_op()
changes = []
session = CoreSession()
session = corepos.make_session_office_op()
lastrun = self.localize_lastrun(session, lastrun)
# Department
departments = session.query(corepos.Department)\
.filter(corepos.Department.modified >= lastrun)\
departments = session.query(op_model.Department)\
.filter(op_model.Department.modified >= lastrun)\
.all()
if departments:
changes.extend([
@ -133,8 +143,8 @@ class COREPOSProductWatcher(DataSyncWatcher):
# for vendor in vendors])
# Product
products = session.query(corepos.Product)\
.filter(corepos.Product.modified >= lastrun)\
products = session.query(op_model.Product)\
.filter(op_model.Product.modified >= lastrun)\
.all()
if products:
changes.extend([
@ -236,9 +246,11 @@ class FromRattailToCore(DataSyncImportConsumer):
self.invoke_importer(session, change)
def get_host_object(self, session, change):
model = self.model
return session.get(getattr(model, change.payload_type), change.payload_key)
def get_customers(self, session, change):
model = self.model
clientele = self.app.get_clientele_handler()
if change.payload_type == 'Customer':
@ -284,6 +296,7 @@ class FromRattailToCore(DataSyncImportConsumer):
return []
def get_vendor(self, session, change):
model = self.model
if change.payload_type == 'Vendor':
return session.get(model.Vendor, change.payload_key)
@ -299,6 +312,7 @@ class FromRattailToCore(DataSyncImportConsumer):
return email.vendor
def get_product(self, session, change):
model = self.model
if change.payload_type == 'Product':
return session.get(model.Product, change.payload_key)