OMG a ridiculous commit to overhaul import handler config etc.

- register all import/export handlers via setup.py and config
- use "handler key" lookup for all import/export commands
- fix logic bugs w/ CORE -> Trainwreck importer
This commit is contained in:
Lance Edgar 2021-12-06 20:07:42 -06:00
parent 0e28a6ee2b
commit 3140245857
9 changed files with 122 additions and 97 deletions

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2019 Lance Edgar
# Copyright © 2010-2021 Lance Edgar
#
# This file is part of Rattail.
#
@ -60,18 +60,6 @@ class ImportToCore(commands.ImportSubcommand):
"""
Generic base class for commands which import *to* a CORE DB.
"""
# subclass must set these!
handler_key = None
default_handler_spec = None
def get_handler_factory(self, **kwargs):
if self.config:
spec = self.config.get('rattail.corepos.importing', '{}.handler'.format(self.handler_key),
default=self.default_handler_spec)
else:
# just use default, for sake of cmd line help
spec = self.default_handler_spec
return load_object(spec)
class ExportCore(commands.ImportSubcommand):
@ -80,18 +68,9 @@ class ExportCore(commands.ImportSubcommand):
"""
name = 'export-core'
description = __doc__.strip()
default_handler_spec = 'rattail_corepos.corepos.importing.db.corepos:FromCoreToCoreExport'
handler_key = 'to_corepos_db_office_op.from_corepos_db_office_op.export'
default_dbkey = 'host'
def get_handler_factory(self, **kwargs):
if self.config:
spec = self.config.get('rattail_corepos.exporting', 'corepos.handler',
default=self.default_handler_spec)
else:
# just use default, for sake of cmd line help
spec = self.default_handler_spec
return load_object(spec)
def add_parser_args(self, parser):
super(ExportCore, self).add_parser_args(parser)
parser.add_argument('--dbkey', metavar='KEY', default=self.default_dbkey,
@ -111,16 +90,7 @@ class ExportCSV(commands.ExportFileSubcommand):
"""
name = 'export-csv'
description = __doc__.strip()
default_handler_spec = 'rattail_corepos.corepos.importing.db.exporters.csv:FromCoreToCSV'
def get_handler_factory(self, **kwargs):
if self.config:
spec = self.config.get('rattail_corepos.exporting', 'csv.handler',
default=self.default_handler_spec)
else:
# just use default, for sake of cmd line help
spec = self.default_handler_spec
return load_object(spec)
handler_key = 'to_csv.from_corepos_db_office_op.export'
class ImportCore(ImportToCore):
@ -129,8 +99,7 @@ class ImportCore(ImportToCore):
"""
name = 'import-core'
description = __doc__.strip()
handler_key = 'corepos'
default_handler_spec = 'rattail_corepos.corepos.importing.db.corepos:FromCoreToCoreImport'
handler_key = 'to_corepos_db_office_op.from_corepos_db_office_op.import'
accepts_dbkey_param = True
def add_parser_args(self, parser):
@ -155,7 +124,7 @@ class ImportCSV(commands.ImportFileSubcommand):
"""
name = 'import-csv'
description = __doc__.strip()
default_handler_spec = 'rattail_corepos.corepos.importing.db.csv:FromCSVToCore'
handler_key = 'to_corepos_db_office_op.from_csv.import'
def add_parser_args(self, parser):
super(ImportCSV, self).add_parser_args(parser)
@ -170,12 +139,3 @@ class ImportCSV(commands.ImportFileSubcommand):
args = kwargs['args']
kwargs['dbkey'] = args.dbkey
return kwargs
def get_handler_factory(self, **kwargs):
if self.config:
spec = self.config.get('rattail_corepos.importing', 'csv.handler',
default=self.default_handler_spec)
else:
# just use default, for sake of cmd line help
spec = self.default_handler_spec
return load_object(spec)

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2020 Lance Edgar
# Copyright © 2010-2021 Lance Edgar
#
# This file is part of Rattail.
#
@ -37,6 +37,7 @@ class FromCoreHandler(FromSQLAlchemyHandler):
Base class for import handlers which use a CORE database as the host / source.
"""
host_title = "CORE"
host_key = 'corepos_db_office_op'
def make_host_session(self):
return CoreSession()
@ -47,6 +48,7 @@ class ToCoreHandler(ToSQLAlchemyHandler):
Base class for import handlers which target a CORE database on the local side.
"""
local_title = "CORE"
local_key = 'corepos_db_office_op'
def make_session(self):
return CoreSession()

View file

@ -39,12 +39,22 @@ from rattail_corepos.corepos.util import get_max_existing_vendor_id
log = logging.getLogger(__name__)
class FromRattailToCore(importing.FromRattailHandler):
class ToCOREAPIHandler(importing.ImportHandler):
"""
Rattail -> CORE-POS export handler
Base class for handlers targeting the CORE API.
"""
local_key = 'corepos_api'
generic_local_title = "CORE Office (API)"
@property
def local_title(self):
return "CORE-POS (API)"
class FromRattailToCore(importing.FromRattailHandler, ToCOREAPIHandler):
"""
Rattail -> CORE-POS export handler
"""
direction = 'export'
def get_importers(self):

View file

@ -60,18 +60,9 @@ class ExportLaneOp(commands.ImportSubcommand):
"""
name = 'export-lane-op'
description = __doc__.strip()
default_handler_spec = 'rattail_corepos.corepos.lane.importing.op.office:FromCoreOfficeToCoreLane'
handler_key = 'to_corepos_db_lane_op.from_corepos_db_office_op.export'
default_dbkey = 'default'
def get_handler_factory(self, **kwargs):
if self.config:
spec = self.config.get('corepos.lane.importing', 'office.handler',
default=self.default_handler_spec)
else:
# just use default, for sake of cmd line help
spec = self.default_handler_spec
return load_object(spec)
def add_parser_args(self, parser):
super(ExportLaneOp, self).add_parser_args(parser)
parser.add_argument('--dbkey', metavar='KEY', default=self.default_dbkey,