Django

Code

root/django/branches/newforms-admin/django/utils/maxlength.py

Revision 6955, 2.4 kB (checked in by jkocherhans, 1 year ago)

newforms-admin: Merged from trunk up to [6952].

  • Property svn:eol-style set to native
Line 
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)
Note: See TracBrowser for help on using the browser.