diff --git a/bonobo/ext/django.py b/bonobo/ext/django.py index 232fd5a..8d73428 100644 --- a/bonobo/ext/django.py +++ b/bonobo/ext/django.py @@ -9,9 +9,34 @@ from bonobo.commands.run import get_default_services from bonobo.ext.console import ConsoleOutputPlugin from bonobo.util.term import CLEAR_EOL + class ETLCommand(BaseCommand): GraphType = bonobo.Graph + 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)) diff --git a/bonobo/util/objects.py b/bonobo/util/objects.py index 34fc6e7..acae2ad 100644 --- a/bonobo/util/objects.py +++ b/bonobo/util/objects.py @@ -1,7 +1,3 @@ -import functools -from functools import partial - - def get_name(mixed): try: return mixed.__name__ @@ -146,10 +142,10 @@ class ValueHolder: return divmod(other, self._value) def __pow__(self, other): - return self._value**other + return self._value ** other def __rpow__(self, other): - return other**self._value + return other ** self._value def __ipow__(self, other): self._value **= other @@ -220,6 +216,15 @@ class ValueHolder: def __len__(self): return len(self._value) + def __contains__(self, item): + return item in self._value + + def __getitem__(self, item): + return self._value[item] + + def __setitem__(self, key, value): + self._value[key] = value + def get_attribute_or_create(obj, attr, default): try: