app/soc/logic/no_overwrite_sorted_dict.py
author Pawel Solyga <Pawel.Solyga@gmail.com>
Fri, 07 Nov 2008 22:24:01 +0000
changeset 448 075360be6743
parent 275 78fd8c2ed80a
permissions -rw-r--r--
Fix not working former_ids. Add support for "Invalid accounts". Now when id from former_ids tries to create a profile "This account is invalid." error message is displayed. Compare emails in lower cases to prevent changing User email to the same email with different character casing (needs some more testing). Patch by: Pawel Solyga
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
275
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     1
#!/usr/bin/python2.5
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     2
#
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     3
# Copyright 2008 the Melange authors.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     4
#
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     5
# Licensed under the Apache License, Version 2.0 (the "License");
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     6
# you may not use this file except in compliance with the License.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     7
# You may obtain a copy of the License at
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     8
#
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
     9
#   http://www.apache.org/licenses/LICENSE-2.0
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    10
#
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    11
# Unless required by applicable law or agreed to in writing, software
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    12
# distributed under the License is distributed on an "AS IS" BASIS,
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    13
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    14
# See the License for the specific language governing permissions and
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    15
# limitations under the License.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    16
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    17
"""Like Django SortedDict, but no repeated assignments to the same key.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    18
"""
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    19
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    20
__authors__ = [
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    21
  '"Todd Larsen" <tlarsen@google.com>',
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    22
  ]
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    23
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    24
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    25
from django.utils import datastructures
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    26
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    27
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    28
class NoOverwriteSortedDict(datastructures.SortedDict):
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    29
  """SortedDict where each key can be given a value only once.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    30
  
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    31
  The purpose of this data structure is to be able to detect when
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    32
  an attempt is made to overwrite the value of an existing key
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    33
  in the SortedDict.  This is to catch, for example, cases such as
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    34
  a registry where two different callers attempt to register the
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    35
  same view, handler, etc.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    36
 
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    37
  It is still possible to pop or del a key out of the dict and then
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    38
  add it back to the dict.
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    39
  """
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    40
  
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    41
  KEY_ALREADY_PRESENT_ERROR_FMT = \
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    42
    '%s already present, value cannot be overwritten'
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    43
  
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    44
  def __init__(self, data=None):
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    45
    if data is None:
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    46
      data = {}
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    47
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    48
    # call SortedDict's parent __init__()
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    49
    # (bypassing the __init__() of SortedDict itself, since it will not
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    50
    # enforce our no-overwrite requirement)
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    51
    super(datastructures.SortedDict, self).__init__(data)
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    52
    
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    53
    if isinstance(data, dict):
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    54
      self.keyOrder = data.keys()
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    55
    else:
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    56
      self.keyOrder = []
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    57
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    58
      for key, value in data:
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    59
        if key in self.keyOrder:
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    60
          # key has already been given a value, and that value is not
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    61
          # permitted to be overwritten, so raise an error
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    62
          raise KeyError(self.KEY_ALREADY_PRESENT_ERROR_FMT % key)
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    63
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    64
        self.keyOrder.append(key)
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    65
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    66
  def __setitem__(self, key, value):
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    67
    if key in self.keyOrder:
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    68
      # key has already been given a value, and that value is not permitted
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    69
      # to be overwritten, so raise an error
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    70
      raise KeyError(self.KEY_ALREADY_PRESENT_ERROR_FMT % key)
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    71
78fd8c2ed80a A specialized SortedDict used by soc/logic/site/page.py.
Todd Larsen <tlarsen@google.com>
parents:
diff changeset
    72
    super(NoOverwriteSortedDict, self).__setitem__(key, value)