Django

Code

Changeset 2577

Show
Ignore:
Timestamp:
03/28/06 11:29:56 (3 years ago)
Author:
adrian
Message:

magic-removal: Fixed #1539: Fixed multithreading problem in QueryDict?. Thanks, Eugene and Alex Brown

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/magic-removal/django/http/__init__.py

    r1987 r2577  
    7070    """A specialized MultiValueDict that takes a query string when initialized. 
    7171    This is immutable unless you create a copy of it.""" 
    72     def __init__(self, query_string): 
     72    def __init__(self, query_string, mutable=False): 
    7373        MultiValueDict.__init__(self) 
    7474        self._mutable = True 
    7575        for key, value in parse_qsl((query_string or ''), True): # keep_blank_values=True 
    7676            self.appendlist(key, value) 
    77         self._mutable = Fals
     77        self._mutable = mutabl
    7878 
    7979    def _assert_mutable(self): 
     
    8181            raise AttributeError, "This QueryDict instance is immutable" 
    8282 
    83     def _setitem_if_mutable(self, key, value): 
     83    def __setitem__(self, key, value): 
    8484        self._assert_mutable() 
    8585        MultiValueDict.__setitem__(self, key, value) 
    86     __setitem__ = _setitem_if_mutable 
     86 
     87    def __copy__(self): 
     88        result = self.__class__('', mutable=True) 
     89        for key, value in dict.items(self): 
     90            dict.__setitem__(result, key, value) 
     91        return result 
     92 
     93    def __deepcopy__(self, memo={}): 
     94        import copy 
     95        result = self.__class__('', mutable=True) 
     96        memo[id(self)] = result 
     97        for key, value in dict.items(self): 
     98            dict.__setitem__(result, copy.deepcopy(key, memo), copy.deepcopy(value, memo)) 
     99        return result 
    87100 
    88101    def setlist(self, key, list_): 
     
    116129    def copy(self): 
    117130        "Returns a mutable copy of this object." 
    118         import copy 
    119         # Our custom __setitem__ must be disabled for copying machinery. 
    120         QueryDict.__setitem__ = dict.__setitem__ 
    121         cp = copy.deepcopy(self) 
    122         QueryDict.__setitem__ = QueryDict._setitem_if_mutable 
    123         cp._mutable = True 
    124         return cp 
     131        return self.__deepcopy__() 
    125132 
    126133    def urlencode(self): 
  • django/branches/magic-removal/django/utils/datastructures.py

    r2487 r2577  
    118118            return [] 
    119119 
    120     def _setitem_list(self, key, value): 
     120    def __setitem__(self, key, value): 
    121121        dict.__setitem__(self, key, [value]) 
    122     __setitem__ = _setitem_list 
     122 
     123    def __copy__(self): 
     124        return self.__class__(dict.items(self)) 
     125 
     126    def __deepcopy__(self, memo={}): 
     127        import copy 
     128        result = self.__class__() 
     129        memo[id(self)] = result 
     130        for key, value in dict.items(self): 
     131            dict.__setitem__(result, copy.deepcopy(key, memo), copy.deepcopy(value, memo)) 
     132        return result 
    123133 
    124134    def get(self, key, default=None): 
     
    174184    def copy(self): 
    175185        "Returns a copy of this object." 
    176         import copy 
    177         # Our custom __setitem__ must be disabled for copying machinery. 
    178         MultiValueDict.__setitem__ = dict.__setitem__ 
    179         cp = copy.deepcopy(self) 
    180         MultiValueDict.__setitem__ = MultiValueDict._setitem_list 
    181         return cp 
     186        return self.__deepcopy__() 
    182187 
    183188    def update(self, other_dict):