diff options
| author | Brian Rosner <brosner@gmail.com> | 2008-03-17 15:43:04 +0000 |
|---|---|---|
| committer | Brian Rosner <brosner@gmail.com> | 2008-03-17 15:43:04 +0000 |
| commit | 40d55238b86ce88d6fa392c931ad3726dd5c66eb (patch) | |
| tree | c0257b327c75ef58135faea292e51db8a6cb125b | |
| parent | bfc5660c472ac2e52cc4fdec78315c87b01357de (diff) | |
newforms-admin: Fixed #6731 -- ManyToManyRawIdWidget no longer allows wrong data being sent to the database. Admin widgets tests are now in regressiontests.
git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@7262 bcc190cf-cafb-0310-a4f2-bffc1f526a37
| -rw-r--r-- | django/contrib/admin/tests/__init__.py | 5 | ||||
| -rw-r--r-- | django/contrib/admin/tests/widgets.py | 47 | ||||
| -rw-r--r-- | django/contrib/admin/widgets.py | 10 | ||||
| -rw-r--r-- | tests/regressiontests/admin_widgets/__init__.py | 0 | ||||
| -rw-r--r-- | tests/regressiontests/admin_widgets/models.py | 73 |
5 files changed, 81 insertions, 54 deletions
diff --git a/django/contrib/admin/tests/__init__.py b/django/contrib/admin/tests/__init__.py deleted file mode 100644 index ba00426123..0000000000 --- a/django/contrib/admin/tests/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.contrib.admin.tests.widgets import WIDGET_TESTS - -__test__ = { - 'WIDGET_TESTS': WIDGET_TESTS, -} diff --git a/django/contrib/admin/tests/widgets.py b/django/contrib/admin/tests/widgets.py deleted file mode 100644 index 3b87c8aa5a..0000000000 --- a/django/contrib/admin/tests/widgets.py +++ /dev/null @@ -1,47 +0,0 @@ -from django.conf import settings - -WIDGET_TESTS = """ ->>> from datetime import datetime ->>> from django.utils.html import escape, conditional_escape ->>> from django.contrib.admin.widgets import FilteredSelectMultiple, AdminSplitDateTime ->>> from django.contrib.admin.widgets import AdminFileWidget, ForeignKeyRawIdWidget ->>> from django.contrib.admin.widgets import RelatedFieldWidgetWrapper ->>> from django.contrib.admin.models import LogEntry ->>> from django.contrib.auth.models import User - -Calling conditional_escape on the output of widget.render will simulate what -happens in the template. This is easier than setting up a template and context -for each test. - -Make sure that the Admin widgets render properly, that is, without their extra -HTML escaped. - ->>> w = FilteredSelectMultiple('test', False) ->>> print conditional_escape(w.render('test', 'test')) -<select multiple="multiple" name="test"> -</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 0, "%(ADMIN_MEDIA_PREFIX)s"); });</script> -<BLANKLINE> - ->>> w = AdminSplitDateTime() ->>> print conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))) -<p class="datetime">Date: <input value="2007-12-01" type="text" class="vDateField" name="test_0" size="10" /><br />Time: <input value="09:30:00" type="text" class="vTimeField" name="test_1" size="8" /></p> - ->>> w = AdminFileWidget() ->>> print conditional_escape(w.render('test', 'test')) -Currently: <a target="_blank" href="%(MEDIA_URL)stest">test</a> <br />Change: <input type="file" name="test" /> - -To test ForeignKeyRawIdWidget a user object must be created. Its pk is -explicitly set to 100 to avoid having to potentially overmatch in the test. - ->>> user = User.objects.create(pk=100, username='jdoe') ->>> entry = LogEntry(action_flag=1, user=user) ->>> entry.save() ->>> rel = LogEntry._meta.get_field('user').rel ->>> w = ForeignKeyRawIdWidget(rel) ->>> print conditional_escape(w.render('test', entry.user.pk, attrs={})) -<input type="text" name="test" value="100" class="vForeignKeyRawIdAdminField" /><a href="../../../auth/user/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a> <strong>jdoe</strong> - -""" % { - 'ADMIN_MEDIA_PREFIX': settings.ADMIN_MEDIA_PREFIX, - 'MEDIA_URL': settings.MEDIA_URL -} diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py index 9072a961fd..9464107c7e 100644 --- a/django/contrib/admin/widgets.py +++ b/django/contrib/admin/widgets.py @@ -102,9 +102,12 @@ class ForeignKeyRawIdWidget(forms.TextInput): (related_url, url, name)) output.append('<img src="%simg/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a>' % settings.ADMIN_MEDIA_PREFIX) if value: - output.append(' <strong>%s</strong>' % \ - truncate_words(self.rel.to.objects.get(pk=value), 14)) + output.append(self.label_for_value(value)) return mark_safe(u''.join(output)) + + def label_for_value(self, value): + return ' <strong>%s</strong>' % \ + truncate_words(self.rel.to.objects.get(pk=value), 14) class ManyToManyRawIdWidget(ForeignKeyRawIdWidget): """ @@ -121,6 +124,9 @@ class ManyToManyRawIdWidget(ForeignKeyRawIdWidget): else: value = '' return super(ManyToManyRawIdWidget, self).render(name, value, attrs) + + def label_for_value(self, value): + return '' def value_from_datadict(self, data, files, name): value = data.get(name, None) diff --git a/tests/regressiontests/admin_widgets/__init__.py b/tests/regressiontests/admin_widgets/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/regressiontests/admin_widgets/__init__.py diff --git a/tests/regressiontests/admin_widgets/models.py b/tests/regressiontests/admin_widgets/models.py new file mode 100644 index 0000000000..7207e8edd4 --- /dev/null +++ b/tests/regressiontests/admin_widgets/models.py @@ -0,0 +1,73 @@ + +from django.conf import settings +from django.db import models + +class Member(models.Model): + name = models.CharField(max_length=100) + + def __unicode__(self): + return self.name + +class Band(models.Model): + name = models.CharField(max_length=100) + members = models.ManyToManyField(Member) + + def __unicode__(self): + return self.name + +class Album(models.Model): + band = models.ForeignKey(Band) + name = models.CharField(max_length=100) + + def __unicode__(self): + return self.name + +__test__ = {'WIDGETS_TESTS': """ +>>> from datetime import datetime +>>> from django.utils.html import escape, conditional_escape +>>> from django.contrib.admin.widgets import FilteredSelectMultiple, AdminSplitDateTime +>>> from django.contrib.admin.widgets import AdminFileWidget, ForeignKeyRawIdWidget, ManyToManyRawIdWidget +>>> from django.contrib.admin.widgets import RelatedFieldWidgetWrapper + +Calling conditional_escape on the output of widget.render will simulate what +happens in the template. This is easier than setting up a template and context +for each test. + +Make sure that the Admin widgets render properly, that is, without their extra +HTML escaped. + +>>> w = FilteredSelectMultiple('test', False) +>>> print conditional_escape(w.render('test', 'test')) +<select multiple="multiple" name="test"> +</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 0, "%(ADMIN_MEDIA_PREFIX)s"); });</script> +<BLANKLINE> + +>>> w = AdminSplitDateTime() +>>> print conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))) +<p class="datetime">Date: <input value="2007-12-01" type="text" class="vDateField" name="test_0" size="10" /><br />Time: <input value="09:30:00" type="text" class="vTimeField" name="test_1" size="8" /></p> + +>>> w = AdminFileWidget() +>>> print conditional_escape(w.render('test', 'test')) +Currently: <a target="_blank" href="%(MEDIA_URL)stest">test</a> <br />Change: <input type="file" name="test" /> + +>>> band = Band.objects.create(pk=1, name='Linkin Park') +>>> album = band.album_set.create(name='Hybrid Theory') + +>>> rel = Album._meta.get_field('band').rel +>>> w = ForeignKeyRawIdWidget(rel) +>>> print conditional_escape(w.render('test', band.pk, attrs={})) +<input type="text" name="test" value="1" class="vForeignKeyRawIdAdminField" /><a href="../../../admin_widgets/band/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a> <strong>Linkin Park</strong> + +>>> m1 = Member.objects.create(pk=1, name='Chester') +>>> m2 = Member.objects.create(pk=2, name='Mike') +>>> band.members.add(m1, m2) + +>>> rel = Band._meta.get_field('members').rel +>>> w = ManyToManyRawIdWidget(rel) +>>> print conditional_escape(w.render('test', [m1.pk, m2.pk], attrs={})) +<input type="text" name="test" value="1,2" class="vManyToManyRawIdAdminField" /><a href="../../../admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a> + +""" % { + 'ADMIN_MEDIA_PREFIX': settings.ADMIN_MEDIA_PREFIX, + 'MEDIA_URL': settings.MEDIA_URL, +}} |
