diff --git a/rattail/commands/importing.py b/rattail/commands/importing.py index 57a4182a..10c9d9ac 100644 --- a/rattail/commands/importing.py +++ b/rattail/commands/importing.py @@ -194,6 +194,32 @@ class ImportSubcommand(Subcommand): log.info("transaction was committed") +class ExportRattail(ImportSubcommand): + """ + Export data to another Rattail database + """ + name = 'export-rattail' + description = __doc__.strip() + default_handler_spec = 'rattail.importing.rattail:FromRattailToRattailExport' + + def get_handler_factory(self): + spec = self.config.get('rattail.exporting', 'rattail.handler', + default=self.default_handler_spec) + return load_object(spec) + + def add_parser_args(self, parser): + super(ExportRattail, self).add_parser_args(parser) + parser.add_argument('--dbkey', metavar='KEY', default='host', + help="Config key for database engine to be used as the \"target\" " + "Rattail system, i.e. where data will be exported. This key must " + "be defined in the [rattail.db] section of your config file.") + + def get_handler_kwargs(self, **kwargs): + if 'args' in kwargs: + kwargs['dbkey'] = kwargs['args'].dbkey + return kwargs + + class ImportToRattail(ImportSubcommand): """ Generic base class for commands which import *to* a Rattail system. @@ -215,7 +241,7 @@ class ImportRattail(ImportToRattail): name = 'import-rattail' description = __doc__.strip() handler_key = 'rattail' - default_handler_spec = 'rattail.importing.rattail:FromRattailToRattail' + default_handler_spec = 'rattail.importing.rattail:FromRattailToRattailImport' def add_parser_args(self, parser): super(ImportRattail, self).add_parser_args(parser) diff --git a/rattail/importing/rattail.py b/rattail/importing/rattail.py index 7ee16adf..fc985ba0 100644 --- a/rattail/importing/rattail.py +++ b/rattail/importing/rattail.py @@ -53,19 +53,10 @@ class ToRattailHandler(ToSQLAlchemyHandler): return Session() -class FromRattailToRattail(FromRattailHandler, ToRattailHandler): +class FromRattailToRattailBase(object): """ - Handler for Rattail -> Rattail data import. + Common base class for Rattail -> Rattail data import/export handlers. """ - local_title = "Rattail (local)" - dbkey = 'host' - - @property - def host_title(self): - return "Rattail ({})".format(self.dbkey) - - def make_host_session(self): - return Session(bind=self.config.rattail_engines[self.dbkey]) def get_importers(self): importers = OrderedDict() @@ -108,15 +99,49 @@ class FromRattailToRattail(FromRattailHandler, ToRattailHandler): importers['ProductCode'] = ProductCodeImporter importers['ProductCost'] = ProductCostImporter importers['ProductPrice'] = ProductPriceImporter + importers['ProductImage'] = ProductImageImporter return importers def get_default_keys(self): keys = self.get_importer_keys() if 'AdminUser' in keys: keys.remove('AdminUser') + keys.remove('ProductImage') return keys +class FromRattailToRattailImport(FromRattailToRattailBase, FromRattailHandler, ToRattailHandler): + """ + Handler for Rattail -> Rattail data import. + """ + local_title = "Rattail (local)" + dbkey = 'host' + + @property + def host_title(self): + return "Rattail ({})".format(self.dbkey) + + def make_host_session(self): + return Session(bind=self.config.rattail_engines[self.dbkey]) + +# TODO: deprecate/remove this? +FromRattailToRattail = FromRattailToRattailImport + + +class FromRattailToRattailExport(FromRattailToRattailBase, FromRattailHandler, ToRattailHandler): + """ + Handler for Rattail -> Rattail data import. + """ + host_title = "Rattail (default)" + + @property + def local_title(self): + return "Rattail ({})".format(self.dbkey) + + def make_session(self): + return Session(bind=self.config.rattail_engines[self.dbkey]) + + class FromRattail(FromSQLAlchemy): """ Base class for Rattail -> Rattail data importers. @@ -272,7 +297,16 @@ class BrandImporter(FromRattail, model.BrandImporter): pass class ProductImporter(FromRattail, model.ProductImporter): - pass + + # TODO... + @property + def simple_fields(self): + fields = super(ProductImporter, self).simple_fields + fields.remove('unit_uuid') + fields.remove('regular_price_uuid') + fields.remove('current_price_uuid') + return fields + class ProductCodeImporter(FromRattail, model.ProductCodeImporter): pass @@ -282,3 +316,6 @@ class ProductCostImporter(FromRattail, model.ProductCostImporter): class ProductPriceImporter(FromRattail, model.ProductPriceImporter): pass + +class ProductImageImporter(FromRattail, model.ProductImageImporter): + pass diff --git a/setup.py b/setup.py index dafa1fb9..b70afaef 100644 --- a/setup.py +++ b/setup.py @@ -218,6 +218,7 @@ datasync = rattail.commands.core:DataSync date-organize = rattail.commands.core:DateOrganize dbsync = rattail.commands.core:DatabaseSyncCommand dump = rattail.commands.core:Dump +export-rattail = rattail.commands.importing:ExportRattail filemon = rattail.commands.core:FileMonitorCommand import-csv = rattail.commands.core:ImportCSV import-rattail = rattail.commands.importing:ImportRattail