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:
parent
2f22be6e7e
commit
dca2c1bfe2
4 changed files with 435 additions and 28 deletions
rattail_corepos/datasync
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue