Django

Code

Changeset 2487

Show
Ignore:
Timestamp:
03/04/06 06:13:41 (3 years ago)
Author:
russellm
Message:

magic-removal: Fixed problem with delete where dependent objects would be deleted in the incorrect order due to a fragile sort algorithm. Thanks to Luke Plant and Malcolm Tredinnick for helping to track this one down.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/magic-removal/django/db/models/base.py

    r2457 r2487  
    1111from django.dispatch import dispatcher 
    1212from django.core.exceptions import ObjectDoesNotExist 
     13from django.utils.datastructures import SortedDict 
    1314from django.utils.functional import curry 
    1415from django.conf import settings 
     
    221222 
    222223        # Find all the objects than need to be deleted 
    223         seen_objs = {} 
     224        seen_objs = SortedDict() 
    224225        self._collect_sub_objects(seen_objs) 
    225226 
  • django/branches/magic-removal/django/db/models/query.py

    r2485 r2487  
    235235        # Collect all the objects to be deleted, and all the objects that are related to 
    236236        # the objects that are to be deleted 
    237         seen_objs = {} 
     237        seen_objs = SortedDict() 
    238238        for object in del_query: 
    239239            object._collect_sub_objects(seen_objs) 
     
    816816    return tables, joins, where, params 
    817817 
    818 def compare_models(x, y): 
    819     "Comparator for Models that puts models in an order where dependencies are easily resolved." 
    820     for field in x._meta.fields: 
    821         if field.rel and not field.null and field.rel.to == y: 
    822             return -1 
    823     for field in y._meta.fields: 
    824         if field.rel and not field.null and field.rel.to == x: 
    825             return 1 
    826     return 0 
    827  
    828818def delete_objects(seen_objs): 
    829819    "Iterate through a list of seen classes, and remove any instances that are referred to" 
    830     seen_classes = set(seen_objs.keys()) 
    831     ordered_classes = list(seen_classes) 
    832     ordered_classes.sort(compare_models) 
    833  
     820    ordered_classes = seen_objs.keys() 
     821    ordered_classes.reverse() 
     822     
    834823    cursor = connection.cursor() 
    835824 
     
    856845                pk_list) 
    857846        for field in cls._meta.fields: 
    858             if field.rel and field.null and field.rel.to in seen_classes: 
     847            if field.rel and field.null and field.rel.to in seen_objs: 
    859848                cursor.execute("UPDATE %s SET %s=NULL WHERE %s IN (%s)" % \ 
    860849                    (backend.quote_name(cls._meta.db_table), 
     
    878867        for pk_val, instance in seen_objs[cls]: 
    879868            for field in cls._meta.fields: 
    880                 if field.rel and field.null and field.rel.to in seen_classes: 
     869                if field.rel and field.null and field.rel.to in seen_objs: 
    881870                    setattr(instance, field.attname, None) 
    882871 
  • django/branches/magic-removal/django/utils/datastructures.py

    r2105 r2487  
    6161 
    6262    def items(self): 
    63         for k in self.keyOrder: 
    64             yield k, dict.__getitem__(self, k) 
     63        return zip(self.keyOrder, self.values()) 
    6564 
    6665    def keys(self): 
    67         for k in self.keyOrder: 
    68             yield k 
     66        return self.keyOrder[:] 
    6967 
    7068    def values(self): 
    71         for k in self.keyOrder: 
    72             yield dict.__getitem__(self, k) 
     69        return [dict.__getitem__(self,k) for k in self.keyOrder] 
    7370 
    7471    def update(self, dict): 
    7572        for k, v in dict.items(): 
    7673            self.__setitem__(k, v) 
     74 
     75    def setdefault(self, key, default): 
     76        if key not in self.keyOrder: 
     77            self.keyOrder.append(key) 
     78        return dict.setdefault(self, key, default) 
    7779 
    7880class MultiValueDictKeyError(KeyError):