summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJulien Phalip <jphalip@gmail.com>2012-02-19 16:42:12 +0000
committerJulien Phalip <jphalip@gmail.com>2012-02-19 16:42:12 +0000
commitf0c2228709b0481eac09c860d7a4a30d3987cc19 (patch)
tree53bc1d2563ab08ad7fddec73ef4aa5173580e3c6 /tests
parentcfd0cb00647ac5ccf48c775605eafbade07217d7 (diff)
Fixed #13068 (again) -- Corrected the admin stacked inline template to allow prepopulated fields to work (Thanks Stanislas Guerra for the report). Also fixed a regression introduced in [16953] where prepopulated fields wouldn't be recognized any more due to the additional "field-" CSS class name prefix.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17562 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
-rw-r--r--tests/regressiontests/admin_views/admin.py35
-rw-r--r--tests/regressiontests/admin_views/models.py22
-rwxr-xr-xtests/regressiontests/admin_views/tests.py109
3 files changed, 163 insertions, 3 deletions
diff --git a/tests/regressiontests/admin_views/admin.py b/tests/regressiontests/admin_views/admin.py
index 62228663fe..b10d178640 100644
--- a/tests/regressiontests/admin_views/admin.py
+++ b/tests/regressiontests/admin_views/admin.py
@@ -26,7 +26,7 @@ from .models import (Article, Chapter, Account, Media, Child, Parent, Picture,
CoverLetter, Story, OtherStory, Book, Promo, ChapterXtra1, Pizza, Topping,
Album, Question, Answer, ComplexSortedPerson, PrePopulatedPostLargeSlug,
AdminOrderedField, AdminOrderedModelMethod, AdminOrderedAdminMethod,
- AdminOrderedCallable, Report, Color2)
+ AdminOrderedCallable, Report, Color2, MainPrepopulated, RelatedPrepopulated)
def callable_year(dt_value):
@@ -532,6 +532,38 @@ class CustomTemplateBooleanFieldListFilter(BooleanFieldListFilter):
class CustomTemplateFilterColorAdmin(admin.ModelAdmin):
list_filter = (('warm', CustomTemplateBooleanFieldListFilter),)
+
+# For Selenium Prepopulated tests -------------------------------------
+class RelatedPrepopulatedInline1(admin.StackedInline):
+ fieldsets = (
+ (None, {
+ 'fields': (('pubdate', 'status'), ('name', 'slug1', 'slug2',),)
+ }),
+ )
+ model = RelatedPrepopulated
+ extra = 1
+ prepopulated_fields = {'slug1': ['name', 'pubdate'],
+ 'slug2': ['status', 'name']}
+
+class RelatedPrepopulatedInline2(admin.TabularInline):
+ model = RelatedPrepopulated
+ extra = 1
+ prepopulated_fields = {'slug1': ['name', 'pubdate'],
+ 'slug2': ['status', 'name']}
+
+class MainPrepopulatedAdmin(admin.ModelAdmin):
+ inlines = [RelatedPrepopulatedInline1, RelatedPrepopulatedInline2]
+ fieldsets = (
+ (None, {
+ 'fields': (('pubdate', 'status'), ('name', 'slug1', 'slug2',),)
+ }),
+ )
+ prepopulated_fields = {'slug1': ['name', 'pubdate'],
+ 'slug2': ['status', 'name']}
+
+
+
+
site = admin.AdminSite(name="admin")
site.register(Article, ArticleAdmin)
site.register(CustomArticle, CustomArticleAdmin)
@@ -576,6 +608,7 @@ site.register(CoverLetter, CoverLetterAdmin)
site.register(Story, StoryAdmin)
site.register(OtherStory, OtherStoryAdmin)
site.register(Report, ReportAdmin)
+site.register(MainPrepopulated, MainPrepopulatedAdmin)
# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
# That way we cover all four cases:
diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py
index 7d58952b87..cf2896f60a 100644
--- a/tests/regressiontests/admin_views/models.py
+++ b/tests/regressiontests/admin_views/models.py
@@ -575,3 +575,25 @@ class Report(models.Model):
def __unicode__(self):
return self.title
+
+
+class MainPrepopulated(models.Model):
+ name = models.CharField(max_length=100)
+ pubdate = models.DateField()
+ status = models.CharField(
+ max_length=20,
+ choices=(('option one', 'Option One'),
+ ('option two', 'Option Two')))
+ slug1 = models.SlugField()
+ slug2 = models.SlugField()
+
+class RelatedPrepopulated(models.Model):
+ parent = models.ForeignKey(MainPrepopulated)
+ name = models.CharField(max_length=75)
+ pubdate = models.DateField()
+ status = models.CharField(
+ max_length=20,
+ choices=(('option one', 'Option One'),
+ ('option two', 'Option Two')))
+ slug1 = models.SlugField(max_length=50)
+ slug2 = models.SlugField(max_length=60) \ No newline at end of file
diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py
index fa189203a2..7349dec947 100755
--- a/tests/regressiontests/admin_views/tests.py
+++ b/tests/regressiontests/admin_views/tests.py
@@ -17,7 +17,8 @@ from django.contrib.admin.models import LogEntry, DELETION
from django.contrib.admin.sites import LOGIN_FORM_KEY
from django.contrib.admin.util import quote
from django.contrib.admin.views.main import IS_POPUP_VAR
-from django.contrib.auth import REDIRECT_FIELD_NAME, admin
+from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase
+from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.models import Group, User, Permission, UNUSABLE_PASSWORD
from django.contrib.contenttypes.models import ContentType
from django.forms.util import ErrorList
@@ -40,7 +41,7 @@ from .models import (Article, BarAccount, CustomArticle, EmptyModel, FooAccount,
FoodDelivery, RowLevelChangePermissionModel, Paper, CoverLetter, Story,
OtherStory, ComplexSortedPerson, Parent, Child, AdminOrderedField,
AdminOrderedModelMethod, AdminOrderedAdminMethod, AdminOrderedCallable,
- Report)
+ Report, MainPrepopulated, RelatedPrepopulated)
ERROR_MESSAGE = "Please enter the correct username and password \
@@ -2892,6 +2893,110 @@ class PrePopulatedTest(TestCase):
response = self.client.get('/test_admin/admin/admin_views/prepopulatedpostlargeslug/add/')
self.assertContains(response, "maxLength: 1000") # instead of 1,000
+
+class SeleniumPrePopulatedTests(AdminSeleniumWebDriverTestCase):
+ urls = "regressiontests.admin_views.urls"
+ fixtures = ['admin-views-users.xml']
+
+ def test_basic(self):
+ """
+ Ensure that the Javascript-automated prepopulated fields work with the
+ main form and with stacked and tabular inlines.
+ Refs #13068, #9264, #9983, #9784.
+ """
+ self.admin_login(username='super', password='secret', login_url='/test_admin/admin/')
+ self.selenium.get('%s%s' % (self.live_server_url,
+ '/test_admin/admin/admin_views/mainprepopulated/add/'))
+
+ # Main form ----------------------------------------------------------
+ self.selenium.find_element_by_css_selector('#id_pubdate').send_keys('2012-02-18')
+ self.select_option('#id_status', 'option two')
+ self.selenium.find_element_by_css_selector('#id_name').send_keys(u' this is the mAin nÀMë and it\'s awεšome')
+ slug1 = self.selenium.find_element_by_css_selector('#id_slug1').get_attribute('value')
+ slug2 = self.selenium.find_element_by_css_selector('#id_slug2').get_attribute('value')
+ self.assertEqual(slug1, 'main-name-and-its-awesome-2012-02-18')
+ self.assertEqual(slug2, 'option-two-main-name-and-its-awesome')
+
+ # Stacked inlines ----------------------------------------------------
+ # Initial inline
+ self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-0-pubdate').send_keys('2011-12-17')
+ self.select_option('#id_relatedprepopulated_set-0-status', 'option one')
+ self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-0-name').send_keys(u' here is a sŤāÇkeð inline ! ')
+ slug1 = self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-0-slug1').get_attribute('value')
+ slug2 = self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-0-slug2').get_attribute('value')
+ self.assertEqual(slug1, 'here-stacked-inline-2011-12-17')
+ self.assertEqual(slug2, 'option-one-here-stacked-inline')
+
+ # Add an inline
+ self.selenium.find_element_by_css_selector('#relatedprepopulated_set-group .add-row a').click()
+ self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-1-pubdate').send_keys('1999-01-25')
+ self.select_option('#id_relatedprepopulated_set-1-status', 'option two')
+ self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-1-name').send_keys(u' now you haVe anöther sŤāÇkeð inline with a very ... loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooog text... ')
+ slug1 = self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-1-slug1').get_attribute('value')
+ slug2 = self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-1-slug2').get_attribute('value')
+ self.assertEqual(slug1, 'now-you-have-another-stacked-inline-very-loooooooo') # 50 characters maximum for slug1 field
+ self.assertEqual(slug2, 'option-two-now-you-have-another-stacked-inline-very-looooooo') # 60 characters maximum for slug2 field
+
+ # Tabular inlines ----------------------------------------------------
+ # Initial inline
+ self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-2-0-pubdate').send_keys('1234-12-07')
+ self.select_option('#id_relatedprepopulated_set-2-0-status', 'option two')
+ self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-2-0-name').send_keys(u'And now, with a tÃbűlaŘ inline !!!')
+ slug1 = self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-2-0-slug1').get_attribute('value')
+ slug2 = self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-2-0-slug2').get_attribute('value')
+ self.assertEqual(slug1, 'and-now-tabular-inline-1234-12-07')
+ self.assertEqual(slug2, 'option-two-and-now-tabular-inline')
+
+ # Add an inline
+ self.selenium.find_element_by_css_selector('#relatedprepopulated_set-2-group .add-row a').click()
+ self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-2-1-pubdate').send_keys('1981-08-22')
+ self.select_option('#id_relatedprepopulated_set-2-1-status', 'option one')
+ self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-2-1-name').send_keys(u'a tÃbűlaŘ inline with ignored ;"&*^\%$#@-/`~ characters')
+ slug1 = self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-2-1-slug1').get_attribute('value')
+ slug2 = self.selenium.find_element_by_css_selector('#id_relatedprepopulated_set-2-1-slug2').get_attribute('value')
+ self.assertEqual(slug1, 'tabular-inline-ignored-characters-1981-08-22')
+ self.assertEqual(slug2, 'option-one-tabular-inline-ignored-characters')
+
+ # Save and check that everything is properly stored in the database
+ self.selenium.find_element_by_xpath('//input[@value="Save"]').click()
+ self.assertEqual(MainPrepopulated.objects.all().count(), 1)
+ MainPrepopulated.objects.get(
+ name=u' this is the mAin nÀMë and it\'s awεšome',
+ pubdate='2012-02-18',
+ status='option two',
+ slug1='main-name-and-its-awesome-2012-02-18',
+ slug2='option-two-main-name-and-its-awesome',
+ )
+ self.assertEqual(RelatedPrepopulated.objects.all().count(), 4)
+ RelatedPrepopulated.objects.get(
+ name=u' here is a sŤāÇkeð inline ! ',
+ pubdate='2011-12-17',
+ status='option one',
+ slug1='here-stacked-inline-2011-12-17',
+ slug2='option-one-here-stacked-inline',
+ )
+ RelatedPrepopulated.objects.get(
+ name=u' now you haVe anöther sŤāÇkeð inline with a very ... loooooooooooooooooo', # 75 characters in name field
+ pubdate='1999-01-25',
+ status='option two',
+ slug1='now-you-have-another-stacked-inline-very-loooooooo',
+ slug2='option-two-now-you-have-another-stacked-inline-very-looooooo',
+ )
+ RelatedPrepopulated.objects.get(
+ name=u'And now, with a tÃbűlaŘ inline !!!',
+ pubdate='1234-12-07',
+ status='option two',
+ slug1='and-now-tabular-inline-1234-12-07',
+ slug2='option-two-and-now-tabular-inline',
+ )
+ RelatedPrepopulated.objects.get(
+ name=u'a tÃbűlaŘ inline with ignored ;"&*^\%$#@-/`~ characters',
+ pubdate='1981-08-22',
+ status='option one',
+ slug1='tabular-inline-ignored-characters-1981-08-22',
+ slug2='option-one-tabular-inline-ignored-characters',
+ )
+
class ReadonlyTest(TestCase):
urls = "regressiontests.admin_views.urls"
fixtures = ['admin-views-users.xml']