diff --git a/bonobo/contrib/__init__.py b/bonobo/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/bonobo/contrib/django/__init__.py b/bonobo/contrib/django/__init__.py new file mode 100644 index 0000000..d8bd00a --- /dev/null +++ b/bonobo/contrib/django/__init__.py @@ -0,0 +1,7 @@ +from .utils import create_or_update +from .commands import ETLCommand + +__all__ = [ + 'ETLCommand', + 'create_or_update', +] diff --git a/bonobo/ext/django.py b/bonobo/contrib/django/commands.py similarity index 65% rename from bonobo/ext/django.py rename to bonobo/contrib/django/commands.py index 797df01..11ec680 100644 --- a/bonobo/ext/django.py +++ b/bonobo/contrib/django/commands.py @@ -1,54 +1,16 @@ from logging import getLogger import bonobo -import bonobo.util from bonobo.plugins.console import ConsoleOutputPlugin from bonobo.util.term import CLEAR_EOL from colorama import Fore, Back, Style -from django.core.management.base import BaseCommand, OutputWrapper +from django.core.management import BaseCommand +from django.core.management.base import OutputWrapper + +from .utils import create_or_update class ETLCommand(BaseCommand): - GraphType = bonobo.Graph - - def create_parser(self, prog_name, subcommand): - return bonobo.get_argument_parser( - super().create_parser(prog_name, subcommand) - ) - - def create_or_update(self, model, *, defaults=None, save=True, **kwargs): - """ - Create or update a django model instance. - - :param model: - :param defaults: - :param kwargs: - :return: object, created, updated - - """ - obj, created = model._default_manager.get_or_create(defaults=defaults, **kwargs) - - updated = False - if not created: - for k, v in defaults.items(): - if getattr(obj, k) != v: - setattr(obj, k, v) - updated = True - - if updated and save: - obj.save() - - return obj, created, updated - - def get_graph(self, *args, **options): - def not_implemented(): - raise NotImplementedError('You must implement {}.get_graph() method.'.format(self)) - - return self.GraphType(not_implemented) - - def get_services(self): - return {} - @property def logger(self): try: @@ -57,6 +19,22 @@ class ETLCommand(BaseCommand): self._logger = getLogger(type(self).__module__) return self._logger + create_or_update = staticmethod(create_or_update) + + def create_parser(self, prog_name, subcommand): + return bonobo.get_argument_parser( + super().create_parser(prog_name, subcommand) + ) + + def get_graph(self, *args, **options): + def not_implemented(): + raise NotImplementedError('You must implement {}.get_graph() method.'.format(self)) + + return bonobo.Graph(not_implemented) + + def get_services(self): + return {} + def info(self, *args, **kwargs): self.logger.info(*args, **kwargs) diff --git a/bonobo/contrib/django/utils.py b/bonobo/contrib/django/utils.py new file mode 100644 index 0000000..56f1201 --- /dev/null +++ b/bonobo/contrib/django/utils.py @@ -0,0 +1,23 @@ +def create_or_update(model, *, defaults=None, save=True, **kwargs): + """ + Create or update a django model instance. + + :param model: + :param defaults: + :param kwargs: + :return: object, created, updated + + """ + obj, created = model._default_manager.get_or_create(defaults=defaults, **kwargs) + + updated = False + if not created: + for k, v in defaults.items(): + if getattr(obj, k) != v: + setattr(obj, k, v) + updated = True + + if updated and save: + obj.save() + + return obj, created, updated