From 55a11683f7b094ae4fd0b9fa030d18a12657ba98 Mon Sep 17 00:00:00 2001 From: Julien Phalip Date: Sat, 7 Sep 2013 11:52:14 -0500 Subject: Fixed #20836 -- Ensure that the ForeignKey's to_field attribute is properly considered by the admin's interface when creating related objects. Many thanks to Collin Anderson for the report and patch and to Peter Sheats for the test. --- tests/admin_widgets/models.py | 8 ++++++ tests/admin_widgets/tests.py | 53 +++++++++++++++++++++++++++++++++++--- tests/admin_widgets/widgetadmin.py | 2 ++ 3 files changed, 59 insertions(+), 4 deletions(-) (limited to 'tests/admin_widgets') diff --git a/tests/admin_widgets/models.py b/tests/admin_widgets/models.py index b111a7a517..c8e29dab8a 100644 --- a/tests/admin_widgets/models.py +++ b/tests/admin_widgets/models.py @@ -130,3 +130,11 @@ class School(models.Model): def __str__(self): return self.name + + +@python_2_unicode_compatible +class Profile(models.Model): + user = models.ForeignKey('auth.User', 'username') + + def __str__(self): + return self.user.username diff --git a/tests/admin_widgets/tests.py b/tests/admin_widgets/tests.py index 0aa6129295..95449ff47c 100644 --- a/tests/admin_widgets/tests.py +++ b/tests/admin_widgets/tests.py @@ -387,7 +387,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) self.assertHTMLEqual( w.render('test', band.pk, attrs={}), - ' Lookup Linkin Park' % dict(admin_static_prefix(), bandpk=band.pk) + ' Lookup Linkin Park' % dict(admin_static_prefix(), bandpk=band.pk) ) def test_relations_to_non_primary_key(self): @@ -402,7 +402,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) self.assertHTMLEqual( w.render('test', core.parent_id, attrs={}), - ' Lookup Apple' % admin_static_prefix() + ' Lookup Apple' % admin_static_prefix() ) def test_fk_related_model_not_in_admin(self): @@ -444,7 +444,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): ) self.assertHTMLEqual( w.render('test', child_of_hidden.parent_id, attrs={}), - ' Lookup Hidden' % admin_static_prefix() + ' Lookup Hidden' % admin_static_prefix() ) @@ -498,7 +498,6 @@ class RelatedFieldWidgetWrapperTests(DjangoTestCase): self.assertFalse(w.can_add_related) - @override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): @@ -953,3 +952,49 @@ class AdminRawIdWidgetSeleniumChromeTests(AdminRawIdWidgetSeleniumFirefoxTests): class AdminRawIdWidgetSeleniumIETests(AdminRawIdWidgetSeleniumFirefoxTests): webdriver_class = 'selenium.webdriver.ie.webdriver.WebDriver' + + +@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) +class RelatedFieldWidgetSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): + available_apps = ['admin_widgets'] + AdminSeleniumWebDriverTestCase.available_apps + fixtures = ['admin-widgets-users.xml'] + urls = "admin_widgets.urls" + webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver' + + def test_foreign_key_using_to_field(self): + self.admin_login(username='super', password='secret', login_url='/') + self.selenium.get('%s%s' % ( + self.live_server_url, + '/admin_widgets/profile/add/')) + + main_window = self.selenium.current_window_handle + # Click the Add User button to add new + self.selenium.find_element_by_id('add_id_user').click() + self.selenium.switch_to_window('id_user') + self.wait_page_loaded() + password_field = self.selenium.find_element_by_id('id_password') + password_field.send_keys('password') + + username_field = self.selenium.find_element_by_id('id_username') + username_value = 'newuser' + username_field.send_keys(username_value) + + save_button_css_selector = '.submit-row > input[type=submit]' + self.selenium.find_element_by_css_selector(save_button_css_selector).click() + self.selenium.switch_to_window(main_window) + user_select = self.selenium.find_element_by_id('id_user') + new_option = user_select.find_elements_by_tag_name('option')[-1] + self.assertEqual(username_value, new_option.get_attribute('value')) + + # Go ahead and submit the form to make sure it works + self.selenium.find_element_by_css_selector(save_button_css_selector).click() + self.wait_page_loaded() + profiles = models.Profile.objects.all() + self.assertEqual(len(profiles), 1) + self.assertEqual(profiles[0].user.username, username_value) + +class RelatedFieldWidgetSeleniumChromeTests(RelatedFieldWidgetSeleniumFirefoxTests): + webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver' + +class RelatedFieldWidgetSeleniumIETests(RelatedFieldWidgetSeleniumFirefoxTests): + webdriver_class = 'selenium.webdriver.ie.webdriver.WebDriver' \ No newline at end of file diff --git a/tests/admin_widgets/widgetadmin.py b/tests/admin_widgets/widgetadmin.py index 4894f92afb..5eea29654b 100644 --- a/tests/admin_widgets/widgetadmin.py +++ b/tests/admin_widgets/widgetadmin.py @@ -43,3 +43,5 @@ site.register(models.Bee) site.register(models.Advisor) site.register(models.School, SchoolAdmin) + +site.register(models.Profile) \ No newline at end of file -- cgit v1.3