diff options
Diffstat (limited to 'ishtar_common/model_merging.py')
| -rw-r--r-- | ishtar_common/model_merging.py | 28 | 
1 files changed, 26 insertions, 2 deletions
diff --git a/ishtar_common/model_merging.py b/ishtar_common/model_merging.py index 06f65378d..6b839a143 100644 --- a/ishtar_common/model_merging.py +++ b/ishtar_common/model_merging.py @@ -20,7 +20,8 @@ def get_models():  @transaction.atomic -def merge_model_objects(primary_object, alias_objects=None, keep_old=False): +def merge_model_objects(primary_object, alias_objects=None, keep_old=False, +                        exclude_fields=None):      """      Use this function to merge model objects (i.e. Users, Organizations,      etc.) and migrate all of the related fields from the alias objects to the @@ -34,9 +35,15 @@ def merge_model_objects(primary_object, alias_objects=None, keep_old=False):      """      if not alias_objects:          alias_objects = [] +    if not exclude_fields: +        exclude_fields = []      MERGE_FIELDS = ('merge_candidate', 'merge_exclusion') +    MERGE_STRING_FIELDS = [] +    if getattr(primary_object, "MERGE_STRING_FIELDS", None): +        MERGE_STRING_FIELDS = primary_object.MERGE_STRING_FIELDS +      if not isinstance(alias_objects, list):          alias_objects = [alias_objects] @@ -80,6 +87,11 @@ def merge_model_objects(primary_object, alias_objects=None, keep_old=False):              alias_varname = related_object.get_accessor_name()              # The variable name on the related model.              obj_varname = related_object.field.name +            if obj_varname in exclude_fields: +                continue +            if getattr(related_object.field, "related_model", None) and \ +                    not related_object.related_model._meta.managed: +                continue              try:                  related_objects = getattr(alias_object, alias_varname)              except ObjectDoesNotExist: @@ -128,7 +140,7 @@ def merge_model_objects(primary_object, alias_objects=None, keep_old=False):              many_to_many_objects = getattr(alias_object, alias_varname).all()              if alias_varname in blank_local_fields: -                blank_local_fields.pop(alias_varname) +                blank_local_fields.remove(alias_varname)              for obj in many_to_many_objects.all():                  getattr(alias_object, alias_varname).remove(obj)                  getattr(primary_object, alias_varname).add(obj) @@ -142,9 +154,21 @@ def merge_model_objects(primary_object, alias_objects=None, keep_old=False):                  alias_object)              for generic_related_object in field.model.objects.filter(                      **filter_kwargs): +                if field.name in exclude_fields: +                    continue                  setattr(generic_related_object, field.name, primary_object)                  generic_related_object.save() +        for field_name in MERGE_STRING_FIELDS: +            if getattr(primary_object, field_name) and \ +                    getattr(alias_object, field_name): +                val = "{} ; {}".format( +                    getattr(primary_object, field_name), +                    getattr(alias_object, field_name)) +                if field_name in exclude_fields: +                    continue +                setattr(primary_object, field_name, val) +          # Try to fill all missing values in primary object by values of          # duplicates          filled_up = set()  | 
