PageRenderTime 56ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/regressiontests/admin_widgets/tests.py

https://github.com/khameli/django
Python | 165 lines | 108 code | 38 blank | 19 comment | 4 complexity | ea25d10618d27937f49f403acb69a6d9 MD5 | raw file
  1. # encoding: utf-8
  2. from django import forms
  3. from django.contrib import admin
  4. from django.contrib.admin import widgets
  5. from unittest import TestCase
  6. from django.test import TestCase as DjangoTestCase
  7. from django.db.models import DateField
  8. import models
  9. class AdminFormfieldForDBFieldTests(TestCase):
  10. """
  11. Tests for correct behavior of ModelAdmin.formfield_for_dbfield
  12. """
  13. def assertFormfield(self, model, fieldname, widgetclass, **admin_overrides):
  14. """
  15. Helper to call formfield_for_dbfield for a given model and field name
  16. and verify that the returned formfield is appropriate.
  17. """
  18. # Override any settings on the model admin
  19. class MyModelAdmin(admin.ModelAdmin): pass
  20. for k in admin_overrides:
  21. setattr(MyModelAdmin, k, admin_overrides[k])
  22. # Construct the admin, and ask it for a formfield
  23. ma = MyModelAdmin(model, admin.site)
  24. ff = ma.formfield_for_dbfield(model._meta.get_field(fieldname), request=None)
  25. # "unwrap" the widget wrapper, if needed
  26. if isinstance(ff.widget, widgets.RelatedFieldWidgetWrapper):
  27. widget = ff.widget.widget
  28. else:
  29. widget = ff.widget
  30. # Check that we got a field of the right type
  31. self.assert_(
  32. isinstance(widget, widgetclass),
  33. "Wrong widget for %s.%s: expected %s, got %s" % \
  34. (model.__class__.__name__, fieldname, widgetclass, type(widget))
  35. )
  36. # Return the formfield so that other tests can continue
  37. return ff
  38. def testDateField(self):
  39. self.assertFormfield(models.Event, 'start_date', widgets.AdminDateWidget)
  40. def testDateTimeField(self):
  41. self.assertFormfield(models.Member, 'birthdate', widgets.AdminSplitDateTime)
  42. def testTimeField(self):
  43. self.assertFormfield(models.Event, 'start_time', widgets.AdminTimeWidget)
  44. def testTextField(self):
  45. self.assertFormfield(models.Event, 'description', widgets.AdminTextareaWidget)
  46. def testURLField(self):
  47. self.assertFormfield(models.Event, 'link', widgets.AdminURLFieldWidget)
  48. def testIntegerField(self):
  49. self.assertFormfield(models.Event, 'min_age', widgets.AdminIntegerFieldWidget)
  50. def testCharField(self):
  51. self.assertFormfield(models.Member, 'name', widgets.AdminTextInputWidget)
  52. def testFileField(self):
  53. self.assertFormfield(models.Album, 'cover_art', widgets.AdminFileWidget)
  54. def testForeignKey(self):
  55. self.assertFormfield(models.Event, 'band', forms.Select)
  56. def testRawIDForeignKey(self):
  57. self.assertFormfield(models.Event, 'band', widgets.ForeignKeyRawIdWidget,
  58. raw_id_fields=['band'])
  59. def testRadioFieldsForeignKey(self):
  60. ff = self.assertFormfield(models.Event, 'band', widgets.AdminRadioSelect,
  61. radio_fields={'band':admin.VERTICAL})
  62. self.assertEqual(ff.empty_label, None)
  63. def testManyToMany(self):
  64. self.assertFormfield(models.Band, 'members', forms.SelectMultiple)
  65. def testRawIDManyTOMany(self):
  66. self.assertFormfield(models.Band, 'members', widgets.ManyToManyRawIdWidget,
  67. raw_id_fields=['members'])
  68. def testFilteredManyToMany(self):
  69. self.assertFormfield(models.Band, 'members', widgets.FilteredSelectMultiple,
  70. filter_vertical=['members'])
  71. def testFormfieldOverrides(self):
  72. self.assertFormfield(models.Event, 'start_date', forms.TextInput,
  73. formfield_overrides={DateField: {'widget': forms.TextInput}})
  74. def testFieldWithChoices(self):
  75. self.assertFormfield(models.Member, 'gender', forms.Select)
  76. def testChoicesWithRadioFields(self):
  77. self.assertFormfield(models.Member, 'gender', widgets.AdminRadioSelect,
  78. radio_fields={'gender':admin.VERTICAL})
  79. def testInheritance(self):
  80. self.assertFormfield(models.Album, 'backside_art', widgets.AdminFileWidget)
  81. class AdminFormfieldForDBFieldWithRequestTests(DjangoTestCase):
  82. fixtures = ["admin-widgets-users.xml"]
  83. def testFilterChoicesByRequestUser(self):
  84. """
  85. Ensure the user can only see their own cars in the foreign key dropdown.
  86. """
  87. self.client.login(username="super", password="secret")
  88. response = self.client.get("/widget_admin/admin_widgets/cartire/add/")
  89. self.assert_("BMW M3" not in response.content)
  90. self.assert_("Volkswagon Passat" in response.content)
  91. class AdminForeignKeyWidgetChangeList(DjangoTestCase):
  92. fixtures = ["admin-widgets-users.xml"]
  93. admin_root = '/widget_admin'
  94. def setUp(self):
  95. self.client.login(username="super", password="secret")
  96. def tearDown(self):
  97. self.client.logout()
  98. def test_changelist_foreignkey(self):
  99. response = self.client.get('%s/admin_widgets/car/' % self.admin_root)
  100. self.failUnless('%s/auth/user/add/' % self.admin_root in response.content)
  101. class AdminForeignKeyRawIdWidget(DjangoTestCase):
  102. fixtures = ["admin-widgets-users.xml"]
  103. admin_root = '/widget_admin'
  104. def setUp(self):
  105. self.client.login(username="super", password="secret")
  106. def tearDown(self):
  107. self.client.logout()
  108. def test_nonexistent_target_id(self):
  109. band = models.Band.objects.create(name='Bogey Blues')
  110. pk = band.pk
  111. band.delete()
  112. post_data = {
  113. "band": u'%s' % pk,
  114. }
  115. # Try posting with a non-existent pk in a raw id field: this
  116. # should result in an error message, not a server exception.
  117. response = self.client.post('%s/admin_widgets/event/add/' % self.admin_root,
  118. post_data)
  119. self.assertContains(response,
  120. 'Select a valid choice. That choice is not one of the available choices.')
  121. def test_invalid_target_id(self):
  122. for test_str in ('Iñtërnâtiônàlizætiøn', "1234'", -1234):
  123. # This should result in an error message, not a server exception.
  124. response = self.client.post('%s/admin_widgets/event/add/' % self.admin_root,
  125. {"band": test_str})
  126. self.assertContains(response,
  127. 'Select a valid choice. That choice is not one of the available choices.')