Commit 693dcd90 authored by Luke Plant's avatar Luke Plant
Browse files

[1.1.X] Fixed #12048 - MultiWidget does not define `__deepcopy__`

  
Thanks to powderflask for report, test case and initial patch.

Backport of [12739] from trunk


git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12740 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 0a7ec91d
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -745,6 +745,11 @@ class MultiWidget(Widget):
        return 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):
    """
    A Widget that splits datetime input into two <input type="text"> boxes.
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ from widgets import tests as widgets_tests
from formsets import tests as formset_tests
from media import media_tests

from widgets import WidgetTests

__test__ = {
    'extra_tests': extra_tests,
    'fields_tests': fields_tests,
+40 −0
Original line number Diff line number Diff line
@@ -1234,3 +1234,43 @@ u'<input type="hidden" name="date_0" value="2007-09-17" /><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])