Fixed #12048 - MultiWidget does not define `__deepcopy__`

Thanks to powderflask for report, test case and initial patch



git-svn-id: http://code.djangoproject.com/svn/django/trunk@12739 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Luke Plant 2010-03-09 22:52:04 +00:00
parent ea288f14e0
commit e316b8b981
3 changed files with 46 additions and 0 deletions

View File

@ -738,6 +738,11 @@ class MultiWidget(Widget):
media = media + w.media media = media + w.media
return media return media
media = property(_get_media) media = property(_get_media)
def __deepcopy__(self, memo):
obj = super(MultiWidget, self).__deepcopy__(memo)
obj.widgets = copy.deepcopy(self.widgets)
return obj
class SplitDateTimeWidget(MultiWidget): class SplitDateTimeWidget(MultiWidget):
""" """

View File

@ -39,6 +39,7 @@ from media import media_tests
from fields import FieldsTests from fields import FieldsTests
from validators import TestFieldWithValidators from validators import TestFieldWithValidators
from widgets import WidgetTests
__test__ = { __test__ = {
'extra_tests': extra_tests, 'extra_tests': extra_tests,

View File

@ -1269,3 +1269,43 @@ u'<input type="hidden" name="date_0" value="17.09.2007" /><input type="hidden" n
""" """
from django.utils import copycompat as copy
from unittest import TestCase
from django import forms
class SelectAndTextWidget(forms.MultiWidget):
"""
MultiWidget subclass
"""
def __init__(self, choices=[]):
widgets = [
forms.RadioSelect(choices=choices),
forms.TextInput
]
super(SelectAndTextWidget, self).__init__(widgets)
def _set_choices(self, choices):
"""
When choices are set for this widget, we want to pass those along to the Select widget
"""
self.widgets[0].choices = choices
def _get_choices(self):
"""
The choices for this widget are the Select widget's choices
"""
return self.widgets[0].choices
choices = property(_get_choices, _set_choices)
class WidgetTests(TestCase):
def test_12048(self):
# See ticket #12048.
w1 = SelectAndTextWidget(choices=[1,2,3])
w2 = copy.deepcopy(w1)
w2.choices = [4,5,6]
# w2 ought to be independent of w1, since MultiWidget ought
# to make a copy of its sub-widgets when it is copied.
self.assertEqual(w1.choices, [1,2,3])