diff options
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/data_importer.py | 15 | ||||
| -rw-r--r-- | ishtar_common/forms_common.py | 2 | ||||
| -rw-r--r-- | ishtar_common/model_merging.py | 35 | ||||
| -rw-r--r-- | ishtar_common/models.py | 15 | 
4 files changed, 41 insertions, 26 deletions
diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 19746315a..16d9ce8d8 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -408,18 +408,11 @@ class StrToBoolean(Formater, ChoiceChecker):          self.missings = set()          if self.db_target:              for target_key in self.db_target.keys.filter(is_set=True).all(): -                value = target_key.value -                value = self.prepare(value) -                if value in self.dct: +                key = self.prepare(target_key.key) +                if key in self.dct:                      continue -                v = target_key.key -                if v in ('False', '0'): -                    v = False -                elif v: -                    v = True -                else: -                    v = None -                self.dct[value] = v +                v = target_key.format() +                self.dct[key] = v          self.new_keys = {}      def prepare(self, value): diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index b2aa565bb..7ac3a2579 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -479,7 +479,7 @@ class MergeFormSet(BaseModelFormSet):              # Set initial values for extra forms              try:                  kwargs['initial'] = \ -                    self.initial_extra[i-self.initial_form_count()] +                    self.initial_extra[i - self.initial_form_count()]              except IndexError:                  pass          return super(BaseModelFormSet, self)._construct_form(i, **kwargs) diff --git a/ishtar_common/model_merging.py b/ishtar_common/model_merging.py index b8c145fcb..c577a8cf1 100644 --- a/ishtar_common/model_merging.py +++ b/ishtar_common/model_merging.py @@ -4,6 +4,7 @@ from django.db import transaction  from django.db.models import get_models, Model  from django.contrib.contenttypes.generic import GenericForeignKey +  @transaction.commit_on_success  def merge_model_objects(primary_object, alias_objects=[], keep_old=False):      """ @@ -34,14 +35,13 @@ def merge_model_objects(primary_object, alias_objects=[], keep_old=False):              raise TypeError('Only models of same class can be merged')      # Get a list of all GenericForeignKeys in all models -    # TODO: this is a bit of a hack, since the generics framework should provide -    # a similar +    # TODO: this is a bit of a hack, since the generics framework should +    # provide a similar      # method to the ForeignKey field for accessing the generic related fields.      generic_fields = []      for model in get_models(): -        for field_name, field in filter(lambda x: isinstance(x[1], -                                                             GenericForeignKey), -                                        model.__dict__.iteritems()): +        for field_name, field in filter(lambda x: isinstance( +                x[1], GenericForeignKey), model.__dict__.iteritems()):              generic_fields.append(field)      blank_local_fields = set() @@ -53,9 +53,11 @@ def merge_model_objects(primary_object, alias_objects=[], keep_old=False):          if value in [None, '']:              blank_local_fields.add(field.attname) -    # Loop through all alias objects and migrate their data to the primary object. +    # Loop through all alias objects and migrate their data to the primary +    # object.      for alias_object in alias_objects: -        # Migrate all foreign key references from alias object to primary object. +        # Migrate all foreign key references from alias object to primary +        # object.          for related_object in alias_object._meta.get_all_related_objects():              # The variable name on the alias_object model.              alias_varname = related_object.get_accessor_name() @@ -66,9 +68,10 @@ def merge_model_objects(primary_object, alias_objects=[], keep_old=False):                  setattr(obj, obj_varname, primary_object)                  obj.save() -        # Migrate all many to many references from alias object to primary object. +        # Migrate all many to many references from alias object to primary +        # object.          related_many_objects = \ -                       alias_object._meta.get_all_related_many_to_many_objects() +            alias_object._meta.get_all_related_many_to_many_objects()          related_many_object_names = set()          for related_many_object in related_many_objects:              alias_varname = related_many_object.get_accessor_name() @@ -78,7 +81,8 @@ def merge_model_objects(primary_object, alias_objects=[], keep_old=False):              if alias_varname is not None:                  # standard case -                related_many_objects = getattr(alias_object, alias_varname).all() +                related_many_objects = getattr( +                    alias_object, alias_varname).all()                  related_many_object_names.add(alias_varname)              else:                  # special case, symmetrical relation, no reverse accessor @@ -88,7 +92,8 @@ def merge_model_objects(primary_object, alias_objects=[], keep_old=False):                  getattr(obj, obj_varname).remove(alias_object)                  getattr(obj, obj_varname).add(primary_object) -        # Migrate local many to many references from alias object to primary object. +        # Migrate local many to many references from alias object to primary +        # object.          for many_to_many_object in alias_object._meta.many_to_many:              alias_varname = many_to_many_object.get_attname()              if alias_varname in related_many_object_names or \ @@ -107,13 +112,15 @@ def merge_model_objects(primary_object, alias_objects=[], keep_old=False):          for field in generic_fields:              filter_kwargs = {}              filter_kwargs[field.fk_field] = alias_object._get_pk_val() -            filter_kwargs[field.ct_field] = field.get_content_type(alias_object) +            filter_kwargs[field.ct_field] = field.get_content_type( +                alias_object)              for generic_related_object in field.model.objects.filter( -                                                               **filter_kwargs): +                    **filter_kwargs):                  setattr(generic_related_object, field.name, primary_object)                  generic_related_object.save() -        # Try to fill all missing values in primary object by values of duplicates +        # Try to fill all missing values in primary object by values of +        # duplicates          filled_up = set()          for field_name in blank_local_fields:              val = getattr(alias_object, field_name) diff --git a/ishtar_common/models.py b/ishtar_common/models.py index da6eefbfb..e0f09dc1b 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1340,6 +1340,10 @@ class ImportTarget(models.Model):              self.target.split('__'))      def get_choices(self): +        if self.formater_type.formater_type == 'StrToBoolean': +            return [('', '--' * 8), +                    ('True', _(u"True")), +                    ('False', _(u"False"))]          if not self.associated_model or not hasattr(self.associated_model,                                                      'get_types'):              return [] @@ -1371,6 +1375,17 @@ class TargetKey(models.Model):      def __unicode__(self):          return u" - ".join([unicode(self.target), self.key[:50]]) +    def format(self): +        if not self.is_set: +            return None +        if self.target.formater_type.formater_type == 'StrToBoolean': +            if self.key in ('False', '0'): +                return False +            elif self.key: +                return True +            return +        return self.key +      def save(self, *args, **kwargs):          obj = super(TargetKey, self).save(*args, **kwargs)          if not self.value:  | 
