app/django/utils/maxlength.py
changeset 54 03e267d67478
equal deleted inserted replaced
53:57b4279d8c4e 54:03e267d67478
       
     1 """
       
     2 Utilities for providing backwards compatibility for the maxlength argument,
       
     3 which has been replaced by max_length. See ticket #2101.
       
     4 """
       
     5 
       
     6 from warnings import warn
       
     7 
       
     8 def get_maxlength(self):
       
     9     return self.max_length
       
    10 
       
    11 def set_maxlength(self, value):
       
    12     self.max_length = value
       
    13 
       
    14 def legacy_maxlength(max_length, maxlength):
       
    15     """
       
    16     Consolidates max_length and maxlength, providing backwards compatibilty
       
    17     for the legacy "maxlength" argument.
       
    18 
       
    19     If one of max_length or maxlength is given, then that value is returned.
       
    20     If both are given, a TypeError is raised. If maxlength is used at all, a
       
    21     deprecation warning is issued.
       
    22     """
       
    23     if maxlength is not None:
       
    24         warn("maxlength is deprecated. Use max_length instead.", DeprecationWarning, stacklevel=3)
       
    25         if max_length is not None:
       
    26             raise TypeError("Field cannot take both the max_length argument and the legacy maxlength argument.")
       
    27         max_length = maxlength
       
    28     return max_length
       
    29 
       
    30 def remove_maxlength(func):
       
    31     """
       
    32     A decorator to be used on a class's __init__ that provides backwards
       
    33     compatibilty for the legacy "maxlength" keyword argument, i.e.
       
    34         name = models.CharField(maxlength=20)
       
    35 
       
    36     It does this by changing the passed "maxlength" keyword argument
       
    37     (if it exists) into a "max_length" keyword argument.
       
    38     """
       
    39     def inner(self, *args, **kwargs):
       
    40         max_length = kwargs.get('max_length', None)
       
    41         # pop maxlength because we don't want this going to __init__.
       
    42         maxlength = kwargs.pop('maxlength', None)
       
    43         max_length = legacy_maxlength(max_length, maxlength)
       
    44         # Only set the max_length keyword argument if we got a value back.
       
    45         if max_length is not None:
       
    46             kwargs['max_length'] = max_length
       
    47         func(self, *args, **kwargs)
       
    48     return inner
       
    49 
       
    50 # This metaclass is used in two places, and should be removed when legacy
       
    51 # support for maxlength is dropped.
       
    52 #   * oldforms.FormField
       
    53 #   * db.models.fields.Field
       
    54 
       
    55 class LegacyMaxlength(type):
       
    56     """
       
    57     Metaclass for providing backwards compatibility support for the
       
    58     "maxlength" keyword argument.
       
    59     """
       
    60     def __init__(cls, name, bases, attrs):
       
    61         super(LegacyMaxlength, cls).__init__(name, bases, attrs)
       
    62         # Decorate the class's __init__ to remove any maxlength keyword.
       
    63         cls.__init__ = remove_maxlength(cls.__init__)
       
    64         # Support accessing and setting to the legacy maxlength attribute.
       
    65         cls.maxlength = property(get_maxlength, set_maxlength)