1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303 |
- from __future__ import unicode_literals
- import gettext
- import os
- from datetime import datetime, timedelta
- from importlib import import_module
- from unittest import skipIf
- from django import forms
- from django.conf import settings
- from django.contrib import admin
- from django.contrib.admin import widgets
- from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase
- from django.contrib.auth.models import User
- from django.core.files.storage import default_storage
- from django.core.files.uploadedfile import SimpleUploadedFile
- from django.core.urlresolvers import reverse
- from django.db.models import CharField, DateField
- from django.test import SimpleTestCase, TestCase, override_settings
- from django.utils import six, translation
- from . import models
- from .widgetadmin import site as widget_admin_site
- try:
- import pytz
- except ImportError:
- pytz = None
- class TestDataMixin(object):
- @classmethod
- def setUpTestData(cls):
- cls.u1 = User.objects.create(
- pk=100, username='super', first_name='Super', last_name='User', email='super@example.com',
- password='sha1$995a3$6011485ea3834267d719b4c801409b8b1ddd0158', is_active=True, is_superuser=True,
- is_staff=True, last_login=datetime(2007, 5, 30, 13, 20, 10),
- date_joined=datetime(2007, 5, 30, 13, 20, 10)
- )
- cls.u2 = User.objects.create(
- pk=101, username='testser', first_name='Add', last_name='User', email='auser@example.com',
- password='sha1$995a3$6011485ea3834267d719b4c801409b8b1ddd0158', is_active=True, is_superuser=False,
- is_staff=True, last_login=datetime(2007, 5, 30, 13, 20, 10),
- date_joined=datetime(2007, 5, 30, 13, 20, 10)
- )
- models.Car.objects.create(id=1, owner=cls.u1, make='Volkswagen', model='Passat')
- models.Car.objects.create(id=2, owner=cls.u2, make='BMW', model='M3')
- class SeleniumDataMixin(object):
- def setUp(self):
- self.u1 = User.objects.create(
- pk=100, username='super', first_name='Super', last_name='User', email='super@example.com',
- password='sha1$995a3$6011485ea3834267d719b4c801409b8b1ddd0158', is_active=True, is_superuser=True,
- is_staff=True, last_login=datetime(2007, 5, 30, 13, 20, 10),
- date_joined=datetime(2007, 5, 30, 13, 20, 10)
- )
- class AdminFormfieldForDBFieldTests(SimpleTestCase):
- """
- Tests for correct behavior of ModelAdmin.formfield_for_dbfield
- """
- def assertFormfield(self, model, fieldname, widgetclass, **admin_overrides):
- """
- Helper to call formfield_for_dbfield for a given model and field name
- and verify that the returned formfield is appropriate.
- """
-
- class MyModelAdmin(admin.ModelAdmin):
- pass
- for k in admin_overrides:
- setattr(MyModelAdmin, k, admin_overrides[k])
-
- ma = MyModelAdmin(model, admin.site)
- ff = ma.formfield_for_dbfield(model._meta.get_field(fieldname), request=None)
-
- if isinstance(ff.widget, widgets.RelatedFieldWidgetWrapper):
- widget = ff.widget.widget
- else:
- widget = ff.widget
-
- self.assertTrue(
- isinstance(widget, widgetclass),
- "Wrong widget for %s.%s: expected %s, got %s" % (
- model.__class__.__name__,
- fieldname,
- widgetclass,
- type(widget),
- )
- )
-
- return ff
- def test_DateField(self):
- self.assertFormfield(models.Event, 'start_date', widgets.AdminDateWidget)
- def test_DateTimeField(self):
- self.assertFormfield(models.Member, 'birthdate', widgets.AdminSplitDateTime)
- def test_TimeField(self):
- self.assertFormfield(models.Event, 'start_time', widgets.AdminTimeWidget)
- def test_TextField(self):
- self.assertFormfield(models.Event, 'description', widgets.AdminTextareaWidget)
- def test_URLField(self):
- self.assertFormfield(models.Event, 'link', widgets.AdminURLFieldWidget)
- def test_IntegerField(self):
- self.assertFormfield(models.Event, 'min_age', widgets.AdminIntegerFieldWidget)
- def test_CharField(self):
- self.assertFormfield(models.Member, 'name', widgets.AdminTextInputWidget)
- def test_EmailField(self):
- self.assertFormfield(models.Member, 'email', widgets.AdminEmailInputWidget)
- def test_FileField(self):
- self.assertFormfield(models.Album, 'cover_art', widgets.AdminFileWidget)
- def test_ForeignKey(self):
- self.assertFormfield(models.Event, 'main_band', forms.Select)
- def test_raw_id_ForeignKey(self):
- self.assertFormfield(models.Event, 'main_band', widgets.ForeignKeyRawIdWidget,
- raw_id_fields=['main_band'])
- def test_radio_fields_ForeignKey(self):
- ff = self.assertFormfield(models.Event, 'main_band', widgets.AdminRadioSelect,
- radio_fields={'main_band': admin.VERTICAL})
- self.assertEqual(ff.empty_label, None)
- def test_many_to_many(self):
- self.assertFormfield(models.Band, 'members', forms.SelectMultiple)
- def test_raw_id_many_to_many(self):
- self.assertFormfield(models.Band, 'members', widgets.ManyToManyRawIdWidget,
- raw_id_fields=['members'])
- def test_filtered_many_to_many(self):
- self.assertFormfield(models.Band, 'members', widgets.FilteredSelectMultiple,
- filter_vertical=['members'])
- def test_formfield_overrides(self):
- self.assertFormfield(models.Event, 'start_date', forms.TextInput,
- formfield_overrides={DateField: {'widget': forms.TextInput}})
- def test_formfield_overrides_widget_instances(self):
- """
- Test that widget instances in formfield_overrides are not shared between
- different fields. (#19423)
- """
- class BandAdmin(admin.ModelAdmin):
- formfield_overrides = {
- CharField: {'widget': forms.TextInput(attrs={'size': '10'})}
- }
- ma = BandAdmin(models.Band, admin.site)
- f1 = ma.formfield_for_dbfield(models.Band._meta.get_field('name'), request=None)
- f2 = ma.formfield_for_dbfield(models.Band._meta.get_field('style'), request=None)
- self.assertNotEqual(f1.widget, f2.widget)
- self.assertEqual(f1.widget.attrs['maxlength'], '100')
- self.assertEqual(f2.widget.attrs['maxlength'], '20')
- self.assertEqual(f2.widget.attrs['size'], '10')
- def test_field_with_choices(self):
- self.assertFormfield(models.Member, 'gender', forms.Select)
- def test_choices_with_radio_fields(self):
- self.assertFormfield(models.Member, 'gender', widgets.AdminRadioSelect,
- radio_fields={'gender': admin.VERTICAL})
- def test_inheritance(self):
- self.assertFormfield(models.Album, 'backside_art', widgets.AdminFileWidget)
- def test_m2m_widgets(self):
- """m2m fields help text as it applies to admin app (#9321)."""
- class AdvisorAdmin(admin.ModelAdmin):
- filter_vertical = ['companies']
- self.assertFormfield(models.Advisor, 'companies', widgets.FilteredSelectMultiple,
- filter_vertical=['companies'])
- ma = AdvisorAdmin(models.Advisor, admin.site)
- f = ma.formfield_for_dbfield(models.Advisor._meta.get_field('companies'), request=None)
- self.assertEqual(
- six.text_type(f.help_text),
- 'Hold down "Control", or "Command" on a Mac, to select more than one.'
- )
- @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
- ROOT_URLCONF='admin_widgets.urls')
- class AdminFormfieldForDBFieldWithRequestTests(TestDataMixin, TestCase):
- def test_filter_choices_by_request_user(self):
- """
- Ensure the user can only see their own cars in the foreign key dropdown.
- """
- self.client.login(username="super", password="secret")
- response = self.client.get(reverse('admin:admin_widgets_cartire_add'))
- self.assertNotContains(response, "BMW M3")
- self.assertContains(response, "Volkswagen Passat")
- @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
- ROOT_URLCONF='admin_widgets.urls')
- class AdminForeignKeyWidgetChangeList(TestDataMixin, TestCase):
- def setUp(self):
- self.client.login(username="super", password="secret")
- def test_changelist_ForeignKey(self):
- response = self.client.get(reverse('admin:admin_widgets_car_changelist'))
- self.assertContains(response, '/auth/user/add/')
- @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
- ROOT_URLCONF='admin_widgets.urls')
- class AdminForeignKeyRawIdWidget(TestDataMixin, TestCase):
- def setUp(self):
- self.client.login(username="super", password="secret")
- def test_nonexistent_target_id(self):
- band = models.Band.objects.create(name='Bogey Blues')
- pk = band.pk
- band.delete()
- post_data = {
- "main_band": '%s' % pk,
- }
-
-
- response = self.client.post(reverse('admin:admin_widgets_event_add'), post_data)
- self.assertContains(response,
- 'Select a valid choice. That choice is not one of the available choices.')
- def test_invalid_target_id(self):
- for test_str in ('Iñtërnâtiônàlizætiøn', "1234'", -1234):
-
- response = self.client.post(reverse('admin:admin_widgets_event_add'),
- {"main_band": test_str})
- self.assertContains(response,
- 'Select a valid choice. That choice is not one of the available choices.')
- def test_url_params_from_lookup_dict_any_iterable(self):
- lookup1 = widgets.url_params_from_lookup_dict({'color__in': ('red', 'blue')})
- lookup2 = widgets.url_params_from_lookup_dict({'color__in': ['red', 'blue']})
- self.assertEqual(lookup1, {'color__in': 'red,blue'})
- self.assertEqual(lookup1, lookup2)
- def test_url_params_from_lookup_dict_callable(self):
- def my_callable():
- return 'works'
- lookup1 = widgets.url_params_from_lookup_dict({'myfield': my_callable})
- lookup2 = widgets.url_params_from_lookup_dict({'myfield': my_callable()})
- self.assertEqual(lookup1, lookup2)
- class FilteredSelectMultipleWidgetTest(SimpleTestCase):
- def test_render(self):
-
- w = widgets.FilteredSelectMultiple('test\\', False)
- self.assertHTMLEqual(
- w.render('test', 'test'),
- '<select multiple="multiple" name="test" class="selectfilter" '
- 'data-field-name="test\\" data-is-stacked="0">\n</select>'
- )
- def test_stacked_render(self):
-
- w = widgets.FilteredSelectMultiple('test\\', True)
- self.assertHTMLEqual(
- w.render('test', 'test'),
- '<select multiple="multiple" name="test" class="selectfilterstacked" '
- 'data-field-name="test\\" data-is-stacked="1">\n</select>'
- )
- class AdminDateWidgetTest(SimpleTestCase):
- def test_attrs(self):
- """
- Ensure that user-supplied attrs are used.
- Refs #12073.
- """
- w = widgets.AdminDateWidget()
- self.assertHTMLEqual(
- w.render('test', datetime(2007, 12, 1, 9, 30)),
- '<input value="2007-12-01" type="text" class="vDateField" name="test" size="10" />',
- )
-
- w = widgets.AdminDateWidget(attrs={'size': 20, 'class': 'myDateField'})
- self.assertHTMLEqual(
- w.render('test', datetime(2007, 12, 1, 9, 30)),
- '<input value="2007-12-01" type="text" class="myDateField" name="test" size="20" />',
- )
- class AdminTimeWidgetTest(SimpleTestCase):
- def test_attrs(self):
- """
- Ensure that user-supplied attrs are used.
- Refs #12073.
- """
- w = widgets.AdminTimeWidget()
- self.assertHTMLEqual(
- w.render('test', datetime(2007, 12, 1, 9, 30)),
- '<input value="09:30:00" type="text" class="vTimeField" name="test" size="8" />',
- )
-
- w = widgets.AdminTimeWidget(attrs={'size': 20, 'class': 'myTimeField'})
- self.assertHTMLEqual(
- w.render('test', datetime(2007, 12, 1, 9, 30)),
- '<input value="09:30:00" type="text" class="myTimeField" name="test" size="20" />',
- )
- class AdminSplitDateTimeWidgetTest(SimpleTestCase):
- def test_render(self):
- w = widgets.AdminSplitDateTime()
- self.assertHTMLEqual(
- 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>'
- )
- def test_localization(self):
- w = widgets.AdminSplitDateTime()
- with self.settings(USE_L10N=True), translation.override('de-at'):
- w.is_localized = True
- self.assertHTMLEqual(
- w.render('test', datetime(2007, 12, 1, 9, 30)),
- '<p class="datetime">'
- 'Datum: <input value="01.12.2007" type="text" '
- 'class="vDateField" name="test_0"size="10" /><br />'
- 'Zeit: <input value="09:30:00" type="text" class="vTimeField" '
- 'name="test_1" size="8" /></p>'
- )
- class AdminURLWidgetTest(SimpleTestCase):
- def test_render(self):
- w = widgets.AdminURLFieldWidget()
- self.assertHTMLEqual(
- w.render('test', ''),
- '<input class="vURLField" name="test" type="url" />'
- )
- self.assertHTMLEqual(
- w.render('test', 'http://example.com'),
- '<p class="url">Currently:<a href="http://example.com">'
- 'http://example.com</a><br />'
- 'Change:<input class="vURLField" name="test" type="url" '
- 'value="http://example.com" /></p>'
- )
- def test_render_idn(self):
- w = widgets.AdminURLFieldWidget()
- self.assertHTMLEqual(
- w.render('test', 'http://example-äüö.com'),
- '<p class="url">Currently: <a href="http://xn--example--7za4pnc.com">'
- 'http://example-äüö.com</a><br />'
- 'Change:<input class="vURLField" name="test" type="url" '
- 'value="http://example-äüö.com" /></p>'
- )
- def test_render_quoting(self):
-
-
- w = widgets.AdminURLFieldWidget()
- self.assertEqual(
- w.render('test', 'http://example.com/<sometag>some text</sometag>'),
- '<p class="url">Currently: '
- '<a href="http://example.com/%3Csometag%3Esome%20text%3C/sometag%3E">'
- 'http://example.com/<sometag>some text</sometag></a><br />'
- 'Change: <input class="vURLField" name="test" type="url" '
- 'value="http://example.com/<sometag>some text</sometag>" /></p>'
- )
- self.assertEqual(
- w.render('test', 'http://example-äüö.com/<sometag>some text</sometag>'),
- '<p class="url">Currently: '
- '<a href="http://xn--example--7za4pnc.com/%3Csometag%3Esome%20text%3C/sometag%3E">'
- 'http://example-äüö.com/<sometag>some text</sometag></a><br />'
- 'Change: <input class="vURLField" name="test" type="url" '
- 'value="http://example-äüö.com/<sometag>some text</sometag>" /></p>'
- )
- self.assertEqual(
- w.render('test', 'http://www.example.com/%C3%A4"><script>alert("XSS!")</script>"'),
- '<p class="url">Currently: '
- '<a href="http://www.example.com/%C3%A4%22%3E%3Cscript%3Ealert(%22XSS!%22)%3C/script%3E%22">'
- 'http://www.example.com/%C3%A4"><script>'
- 'alert("XSS!")</script>"</a><br />'
- 'Change: <input class="vURLField" name="test" type="url" '
- 'value="http://www.example.com/%C3%A4"><script>'
- 'alert("XSS!")</script>"" /></p>'
- )
- @override_settings(
- PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
- ROOT_URLCONF='admin_widgets.urls',
- )
- class AdminFileWidgetTests(TestDataMixin, TestCase):
- @classmethod
- def setUpTestData(cls):
- super(AdminFileWidgetTests, cls).setUpTestData()
- band = models.Band.objects.create(name='Linkin Park')
- cls.album = band.album_set.create(
- name='Hybrid Theory', cover_art=r'albums\hybrid_theory.jpg'
- )
- def test_render(self):
- w = widgets.AdminFileWidget()
- self.assertHTMLEqual(
- w.render('test', self.album.cover_art),
- '<p class="file-upload">Currently: <a href="%(STORAGE_URL)salbums/'
- 'hybrid_theory.jpg">albums\hybrid_theory.jpg</a> '
- '<span class="clearable-file-input">'
- '<input type="checkbox" name="test-clear" id="test-clear_id" /> '
- '<label for="test-clear_id">Clear</label></span><br />'
- 'Change: <input type="file" name="test" /></p>' % {
- 'STORAGE_URL': default_storage.url(''),
- },
- )
- self.assertHTMLEqual(
- w.render('test', SimpleUploadedFile('test', b'content')),
- '<input type="file" name="test" />',
- )
- def test_readonly_fields(self):
- """
- File widgets should render as a link when they're marked "read only."
- """
- self.client.login(username="super", password="secret")
- response = self.client.get(reverse('admin:admin_widgets_album_change', args=(self.album.id,)))
- self.assertContains(
- response,
- '<p><a href="%(STORAGE_URL)salbums/hybrid_theory.jpg">'
- 'albums\hybrid_theory.jpg</a></p>' % {'STORAGE_URL': default_storage.url('')},
- html=True,
- )
- self.assertNotContains(
- response,
- '<input type="file" name="cover_art" id="id_cover_art" />',
- html=True,
- )
- response = self.client.get(reverse('admin:admin_widgets_album_add'))
- self.assertContains(
- response,
- '<p></p>',
- html=True,
- )
- @override_settings(ROOT_URLCONF='admin_widgets.urls')
- class ForeignKeyRawIdWidgetTest(TestCase):
- def test_render(self):
- band = models.Band.objects.create(name='Linkin Park')
- band.album_set.create(
- name='Hybrid Theory', cover_art=r'albums\hybrid_theory.jpg'
- )
- rel = models.Album._meta.get_field('band').remote_field
- w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
- self.assertHTMLEqual(
- w.render('test', band.pk, attrs={}),
- '<input type="text" name="test" value="%(bandpk)s" '
- 'class="vForeignKeyRawIdAdminField" />'
- '<a href="/admin_widgets/band/?_to_field=id" class="related-lookup" '
- 'id="lookup_id_test" title="Lookup"></a> <strong>Linkin Park</strong>'
- % {'bandpk': band.pk}
- )
- def test_relations_to_non_primary_key(self):
-
-
- apple = models.Inventory.objects.create(barcode=86, name='Apple')
- models.Inventory.objects.create(barcode=22, name='Pear')
- core = models.Inventory.objects.create(
- barcode=87, name='Core', parent=apple
- )
- rel = models.Inventory._meta.get_field('parent').remote_field
- w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
- self.assertHTMLEqual(
- w.render('test', core.parent_id, attrs={}),
- '<input type="text" name="test" value="86" '
- 'class="vForeignKeyRawIdAdminField" />'
- '<a href="/admin_widgets/inventory/?_to_field=barcode" '
- 'class="related-lookup" id="lookup_id_test" title="Lookup"></a>'
- ' <strong>Apple</strong>'
- )
- def test_fk_related_model_not_in_admin(self):
-
-
- big_honeycomb = models.Honeycomb.objects.create(location='Old tree')
- big_honeycomb.bee_set.create()
- rel = models.Bee._meta.get_field('honeycomb').remote_field
- w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
- self.assertHTMLEqual(
- w.render('honeycomb_widget', big_honeycomb.pk, attrs={}),
- '<input type="text" name="honeycomb_widget" value="%(hcombpk)s" />'
- ' <strong>Honeycomb object</strong>'
- % {'hcombpk': big_honeycomb.pk}
- )
- def test_fk_to_self_model_not_in_admin(self):
-
-
- subject1 = models.Individual.objects.create(name='Subject #1')
- models.Individual.objects.create(name='Child', parent=subject1)
- rel = models.Individual._meta.get_field('parent').remote_field
- w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
- self.assertHTMLEqual(
- w.render('individual_widget', subject1.pk, attrs={}),
- '<input type="text" name="individual_widget" value="%(subj1pk)s" />'
- ' <strong>Individual object</strong>'
- % {'subj1pk': subject1.pk}
- )
- def test_proper_manager_for_label_lookup(self):
-
- rel = models.Inventory._meta.get_field('parent').remote_field
- w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
- hidden = models.Inventory.objects.create(
- barcode=93, name='Hidden', hidden=True
- )
- child_of_hidden = models.Inventory.objects.create(
- barcode=94, name='Child of hidden', parent=hidden
- )
- self.assertHTMLEqual(
- w.render('test', child_of_hidden.parent_id, attrs={}),
- '<input type="text" name="test" value="93" class="vForeignKeyRawIdAdminField" />'
- '<a href="/admin_widgets/inventory/?_to_field=barcode" '
- 'class="related-lookup" id="lookup_id_test" title="Lookup"></a>'
- ' <strong>Hidden</strong>'
- )
- @override_settings(ROOT_URLCONF='admin_widgets.urls')
- class ManyToManyRawIdWidgetTest(TestCase):
- def test_render(self):
- band = models.Band.objects.create(name='Linkin Park')
- m1 = models.Member.objects.create(name='Chester')
- m2 = models.Member.objects.create(name='Mike')
- band.members.add(m1, m2)
- rel = models.Band._meta.get_field('members').remote_field
- w = widgets.ManyToManyRawIdWidget(rel, widget_admin_site)
- self.assertHTMLEqual(
- w.render('test', [m1.pk, m2.pk], attrs={}), (
- '<input type="text" name="test" value="%(m1pk)s,%(m2pk)s" class="vManyToManyRawIdAdminField" />'
- '<a href="/admin_widgets/member/" class="related-lookup" id="lookup_id_test" title="Lookup"></a>'
- ) % dict(m1pk=m1.pk, m2pk=m2.pk)
- )
- self.assertHTMLEqual(
- w.render('test', [m1.pk]), (
- '<input type="text" name="test" value="%(m1pk)s" class="vManyToManyRawIdAdminField">'
- '<a href="/admin_widgets/member/" class="related-lookup" id="lookup_id_test" title="Lookup"></a>'
- ) % dict(m1pk=m1.pk)
- )
- def test_m2m_related_model_not_in_admin(self):
-
-
- consultor1 = models.Advisor.objects.create(name='Rockstar Techie')
- c1 = models.Company.objects.create(name='Doodle')
- c2 = models.Company.objects.create(name='Pear')
- consultor1.companies.add(c1, c2)
- rel = models.Advisor._meta.get_field('companies').remote_field
- w = widgets.ManyToManyRawIdWidget(rel, widget_admin_site)
- self.assertHTMLEqual(
- w.render('company_widget1', [c1.pk, c2.pk], attrs={}),
- '<input type="text" name="company_widget1" value="%(c1pk)s,%(c2pk)s" />' % {'c1pk': c1.pk, 'c2pk': c2.pk}
- )
- self.assertHTMLEqual(
- w.render('company_widget2', [c1.pk]),
- '<input type="text" name="company_widget2" value="%(c1pk)s" />' % {'c1pk': c1.pk}
- )
- class RelatedFieldWidgetWrapperTests(SimpleTestCase):
- def test_no_can_add_related(self):
- rel = models.Individual._meta.get_field('parent').remote_field
- w = widgets.AdminRadioSelect()
-
- w = widgets.RelatedFieldWidgetWrapper(w, rel, widget_admin_site)
- self.assertFalse(w.can_add_related)
- def test_select_multiple_widget_cant_change_delete_related(self):
- rel = models.Individual._meta.get_field('parent').remote_field
- widget = forms.SelectMultiple()
- wrapper = widgets.RelatedFieldWidgetWrapper(
- widget, rel, widget_admin_site,
- can_add_related=True,
- can_change_related=True,
- can_delete_related=True,
- )
- self.assertTrue(wrapper.can_add_related)
- self.assertFalse(wrapper.can_change_related)
- self.assertFalse(wrapper.can_delete_related)
- def test_on_delete_cascade_rel_cant_delete_related(self):
- rel = models.Individual._meta.get_field('soulmate').remote_field
- widget = forms.Select()
- wrapper = widgets.RelatedFieldWidgetWrapper(
- widget, rel, widget_admin_site,
- can_add_related=True,
- can_change_related=True,
- can_delete_related=True,
- )
- self.assertTrue(wrapper.can_add_related)
- self.assertTrue(wrapper.can_change_related)
- self.assertFalse(wrapper.can_delete_related)
- @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
- ROOT_URLCONF='admin_widgets.urls')
- class DateTimePickerSeleniumFirefoxTests(SeleniumDataMixin, AdminSeleniumWebDriverTestCase):
- available_apps = ['admin_widgets'] + AdminSeleniumWebDriverTestCase.available_apps
- webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver'
- def test_show_hide_date_time_picker_widgets(self):
- """
- Ensure that pressing the ESC key closes the date and time picker
- widgets.
- Refs #17064.
- """
- from selenium.webdriver.common.keys import Keys
- self.admin_login(username='super', password='secret', login_url='/')
-
- self.selenium.get('%s%s' % (self.live_server_url,
- reverse('admin:admin_widgets_member_add')))
-
-
- self.assertEqual(
- self.get_css_value('#calendarbox0', 'display'), 'none')
-
- self.selenium.find_element_by_id('calendarlink0').click()
-
- self.assertEqual(
- self.get_css_value('#calendarbox0', 'display'), 'block')
-
- self.selenium.find_element_by_tag_name('body').send_keys([Keys.ESCAPE])
-
- self.assertEqual(
- self.get_css_value('#calendarbox0', 'display'), 'none')
-
-
- self.assertEqual(
- self.get_css_value('#clockbox0', 'display'), 'none')
-
- self.selenium.find_element_by_id('clocklink0').click()
-
- self.assertEqual(
- self.get_css_value('#clockbox0', 'display'), 'block')
- self.assertEqual(
- [
- x.text for x in
- self.selenium.find_elements_by_xpath("//ul[@class='timelist']/li/a")
- ],
- ['Now', 'Midnight', '6 a.m.', 'Noon', '6 p.m.']
- )
-
- self.selenium.find_element_by_tag_name('body').send_keys([Keys.ESCAPE])
-
- self.assertEqual(
- self.get_css_value('#clockbox0', 'display'), 'none')
- def test_calendar_nonday_class(self):
- """
- Ensure cells that are not days of the month have the `nonday` CSS class.
- Refs #4574.
- """
- self.admin_login(username='super', password='secret', login_url='/')
-
- self.selenium.get('%s%s' % (self.live_server_url,
- reverse('admin:admin_widgets_member_add')))
-
- self.selenium.find_element_by_id('id_birthdate_0').send_keys('2013-06-01')
-
- self.selenium.find_element_by_id('calendarlink0').click()
-
- calendar0 = self.selenium.find_element_by_id('calendarin0')
- tds = calendar0.find_elements_by_tag_name('td')
-
- for td in tds[:6] + tds[-6:]:
- self.assertEqual(td.get_attribute('class'), 'nonday')
- def test_calendar_selected_class(self):
- """
- Ensure cell for the day in the input has the `selected` CSS class.
- Refs #4574.
- """
- self.admin_login(username='super', password='secret', login_url='/')
-
- self.selenium.get('%s%s' % (self.live_server_url,
- reverse('admin:admin_widgets_member_add')))
-
- self.selenium.find_element_by_id('id_birthdate_0').send_keys('2013-06-01')
-
- self.selenium.find_element_by_id('calendarlink0').click()
-
- calendar0 = self.selenium.find_element_by_id('calendarin0')
- tds = calendar0.find_elements_by_tag_name('td')
-
- selected = tds[6]
- self.assertEqual(selected.get_attribute('class'), 'selected')
- self.assertEqual(selected.text, '1')
- def test_calendar_no_selected_class(self):
- """
- Ensure no cells are given the selected class when the field is empty.
- Refs #4574.
- """
- self.admin_login(username='super', password='secret', login_url='/')
-
- self.selenium.get('%s%s' % (self.live_server_url,
- reverse('admin:admin_widgets_member_add')))
-
- self.selenium.find_element_by_id('calendarlink0').click()
-
- calendar0 = self.selenium.find_element_by_id('calendarin0')
- tds = calendar0.find_elements_by_tag_name('td')
-
- selected = [td for td in tds if td.get_attribute('class') == 'selected']
- self.assertEqual(len(selected), 0)
- def test_calendar_show_date_from_input(self):
- """
- Ensure that the calendar show the date from the input field for every
- locale supported by django.
- """
- self.admin_login(username='super', password='secret', login_url='/')
-
- member = models.Member.objects.create(name='Bob', birthdate=datetime(1984, 5, 15), gender='M')
-
- month_string = 'May'
- path = os.path.join(os.path.dirname(import_module('django.contrib.admin').__file__), 'locale')
- for language_code, language_name in settings.LANGUAGES:
- try:
- catalog = gettext.translation('djangojs', path, [language_code])
- except IOError:
- continue
- if month_string in catalog._catalog:
- month_name = catalog._catalog[month_string]
- else:
- month_name = month_string
-
- may_translation = month_name
- expected_caption = '{0:s} {1:d}'.format(may_translation.upper(), 1984)
-
- with override_settings(LANGUAGE_CODE=language_code, USE_L10N=True):
-
- self.selenium.get('{}{}'.format(self.live_server_url,
- reverse('admin:admin_widgets_member_change', args=(member.pk,))))
-
- self.selenium.find_element_by_id('calendarlink0').click()
-
- self.wait_for_text('#calendarin0 caption', expected_caption)
- class DateTimePickerSeleniumChromeTests(DateTimePickerSeleniumFirefoxTests):
- webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver'
- class DateTimePickerSeleniumIETests(DateTimePickerSeleniumFirefoxTests):
- webdriver_class = 'selenium.webdriver.ie.webdriver.WebDriver'
- @skipIf(pytz is None, "this test requires pytz")
- @override_settings(TIME_ZONE='Asia/Singapore')
- @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
- ROOT_URLCONF='admin_widgets.urls')
- class DateTimePickerShortcutsSeleniumFirefoxTests(SeleniumDataMixin, AdminSeleniumWebDriverTestCase):
- available_apps = ['admin_widgets'] + AdminSeleniumWebDriverTestCase.available_apps
- webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver'
- def test_date_time_picker_shortcuts(self):
- """
- Ensure that date/time/datetime picker shortcuts work in the current time zone.
- Refs #20663.
- This test case is fairly tricky, it relies on selenium still running the browser
- in the default time zone "America/Chicago" despite `override_settings` changing
- the time zone to "Asia/Singapore".
- """
- self.admin_login(username='super', password='secret', login_url='/')
- error_margin = timedelta(seconds=10)
-
- tz = pytz.timezone('America/Chicago')
- utc_now = datetime.now(pytz.utc)
- tz_yesterday = (utc_now - timedelta(days=1)).astimezone(tz).tzname()
- tz_tomorrow = (utc_now + timedelta(days=1)).astimezone(tz).tzname()
- if tz_yesterday != tz_tomorrow:
- error_margin += timedelta(hours=1)
- now = datetime.now()
- self.selenium.get('%s%s' % (self.live_server_url,
- reverse('admin:admin_widgets_member_add')))
- self.selenium.find_element_by_id('id_name').send_keys('test')
-
- shortcuts = self.selenium.find_elements_by_css_selector(
- '.field-birthdate .datetimeshortcuts')
- for shortcut in shortcuts:
- shortcut.find_element_by_tag_name('a').click()
-
-
-
-
- self.selenium.find_elements_by_css_selector(
- '.field-birthdate .timezonewarning')
-
- self.selenium.find_element_by_tag_name('form').submit()
- self.wait_page_loaded()
-
-
- member = models.Member.objects.get(name='test')
- self.assertGreater(member.birthdate, now - error_margin)
- self.assertLess(member.birthdate, now + error_margin)
- class DateTimePickerShortcutsSeleniumChromeTests(DateTimePickerShortcutsSeleniumFirefoxTests):
- webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver'
- class DateTimePickerShortcutsSeleniumIETests(DateTimePickerShortcutsSeleniumFirefoxTests):
- webdriver_class = 'selenium.webdriver.ie.webdriver.WebDriver'
- @override_settings(TIME_ZONE='US/Eastern')
- class DateTimePickerAltTimezoneSeleniumFirefoxTests(DateTimePickerShortcutsSeleniumFirefoxTests):
- pass
- class DateTimePickerAltTimezoneSeleniumChromeTests(DateTimePickerAltTimezoneSeleniumFirefoxTests):
- webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver'
- class DateTimePickerAltTimezoneSeleniumIETests(DateTimePickerAltTimezoneSeleniumFirefoxTests):
- webdriver_class = 'selenium.webdriver.ie.webdriver.WebDriver'
- @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
- ROOT_URLCONF='admin_widgets.urls')
- class HorizontalVerticalFilterSeleniumFirefoxTests(SeleniumDataMixin, AdminSeleniumWebDriverTestCase):
- available_apps = ['admin_widgets'] + AdminSeleniumWebDriverTestCase.available_apps
- webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver'
- def setUp(self):
- super(HorizontalVerticalFilterSeleniumFirefoxTests, self).setUp()
- self.lisa = models.Student.objects.create(name='Lisa')
- self.john = models.Student.objects.create(name='John')
- self.bob = models.Student.objects.create(name='Bob')
- self.peter = models.Student.objects.create(name='Peter')
- self.jenny = models.Student.objects.create(name='Jenny')
- self.jason = models.Student.objects.create(name='Jason')
- self.cliff = models.Student.objects.create(name='Cliff')
- self.arthur = models.Student.objects.create(name='Arthur')
- self.school = models.School.objects.create(name='School of Awesome')
- def assertActiveButtons(self, mode, field_name, choose, remove,
- choose_all=None, remove_all=None):
- choose_link = '#id_%s_add_link' % field_name
- choose_all_link = '#id_%s_add_all_link' % field_name
- remove_link = '#id_%s_remove_link' % field_name
- remove_all_link = '#id_%s_remove_all_link' % field_name
- self.assertEqual(self.has_css_class(choose_link, 'active'), choose)
- self.assertEqual(self.has_css_class(remove_link, 'active'), remove)
- if mode == 'horizontal':
- self.assertEqual(self.has_css_class(choose_all_link, 'active'), choose_all)
- self.assertEqual(self.has_css_class(remove_all_link, 'active'), remove_all)
- def execute_basic_operations(self, mode, field_name):
- from_box = '#id_%s_from' % field_name
- to_box = '#id_%s_to' % field_name
- choose_link = 'id_%s_add_link' % field_name
- choose_all_link = 'id_%s_add_all_link' % field_name
- remove_link = 'id_%s_remove_link' % field_name
- remove_all_link = 'id_%s_remove_all_link' % field_name
-
- self.assertSelectOptions(from_box,
- [str(self.arthur.id), str(self.bob.id),
- str(self.cliff.id), str(self.jason.id),
- str(self.jenny.id), str(self.john.id)])
- self.assertSelectOptions(to_box,
- [str(self.lisa.id), str(self.peter.id)])
- self.assertActiveButtons(mode, field_name, False, False, True, True)
-
- if mode == 'horizontal':
- self.selenium.find_element_by_id(choose_all_link).click()
- elif mode == 'vertical':
-
-
- for option in self.selenium.find_elements_by_css_selector(from_box + ' > option'):
- option.click()
- self.selenium.find_element_by_id(choose_link).click()
- self.assertSelectOptions(from_box, [])
- self.assertSelectOptions(to_box,
- [str(self.lisa.id), str(self.peter.id),
- str(self.arthur.id), str(self.bob.id),
- str(self.cliff.id), str(self.jason.id),
- str(self.jenny.id), str(self.john.id)])
- self.assertActiveButtons(mode, field_name, False, False, False, True)
-
- if mode == 'horizontal':
- self.selenium.find_element_by_id(remove_all_link).click()
- elif mode == 'vertical':
-
-
- for option in self.selenium.find_elements_by_css_selector(to_box + ' > option'):
- option.click()
- self.selenium.find_element_by_id(remove_link).click()
- self.assertSelectOptions(from_box,
- [str(self.lisa.id), str(self.peter.id),
- str(self.arthur.id), str(self.bob.id),
- str(self.cliff.id), str(self.jason.id),
- str(self.jenny.id), str(self.john.id)])
- self.assertSelectOptions(to_box, [])
- self.assertActiveButtons(mode, field_name, False, False, True, False)
-
- from_lisa_select_option = self.get_select_option(from_box, str(self.lisa.id))
-
- self.assertEqual(from_lisa_select_option.get_attribute('title'), from_lisa_select_option.get_attribute('text'))
- from_lisa_select_option.click()
- self.get_select_option(from_box, str(self.jason.id)).click()
- self.get_select_option(from_box, str(self.bob.id)).click()
- self.get_select_option(from_box, str(self.john.id)).click()
- self.assertActiveButtons(mode, field_name, True, False, True, False)
- self.selenium.find_element_by_id(choose_link).click()
- self.assertActiveButtons(mode, field_name, False, False, True, True)
- self.assertSelectOptions(from_box,
- [str(self.peter.id), str(self.arthur.id),
- str(self.cliff.id), str(self.jenny.id)])
- self.assertSelectOptions(to_box,
- [str(self.lisa.id), str(self.bob.id),
- str(self.jason.id), str(self.john.id)])
-
- to_lisa_select_option = self.get_select_option(to_box, str(self.lisa.id))
- self.assertEqual(to_lisa_select_option.get_attribute('title'), to_lisa_select_option.get_attribute('text'))
-
- self.get_select_option(to_box, str(self.lisa.id)).click()
- self.get_select_option(to_box, str(self.bob.id)).click()
- self.assertActiveButtons(mode, field_name, False, True, True, True)
- self.selenium.find_element_by_id(remove_link).click()
- self.assertActiveButtons(mode, field_name, False, False, True, True)
- self.assertSelectOptions(from_box,
- [str(self.peter.id), str(self.arthur.id),
- str(self.cliff.id), str(self.jenny.id),
- str(self.lisa.id), str(self.bob.id)])
- self.assertSelectOptions(to_box,
- [str(self.jason.id), str(self.john.id)])
-
- self.get_select_option(from_box, str(self.arthur.id)).click()
- self.get_select_option(from_box, str(self.cliff.id)).click()
- self.selenium.find_element_by_id(choose_link).click()
- self.assertSelectOptions(from_box,
- [str(self.peter.id), str(self.jenny.id),
- str(self.lisa.id), str(self.bob.id)])
- self.assertSelectOptions(to_box,
- [str(self.jason.id), str(self.john.id),
- str(self.arthur.id), str(self.cliff.id)])
- def test_basic(self):
- self.school.students.set([self.lisa, self.peter])
- self.school.alumni.set([self.lisa, self.peter])
- self.admin_login(username='super', password='secret', login_url='/')
- self.selenium.get('%s%s' % (
- self.live_server_url, reverse('admin:admin_widgets_school_change', args=(self.school.id,))))
- self.wait_page_loaded()
- self.execute_basic_operations('vertical', 'students')
- self.execute_basic_operations('horizontal', 'alumni')
-
- self.selenium.find_element_by_xpath('//input[@value="Save"]').click()
- self.wait_page_loaded()
- self.school = models.School.objects.get(id=self.school.id)
- self.assertEqual(list(self.school.students.all()),
- [self.arthur, self.cliff, self.jason, self.john])
- self.assertEqual(list(self.school.alumni.all()),
- [self.arthur, self.cliff, self.jason, self.john])
- def test_filter(self):
- """
- Ensure that typing in the search box filters out options displayed in
- the 'from' box.
- """
- from selenium.webdriver.common.keys import Keys
- self.school.students.set([self.lisa, self.peter])
- self.school.alumni.set([self.lisa, self.peter])
- self.admin_login(username='super', password='secret', login_url='/')
- self.selenium.get(
- '%s%s' % (self.live_server_url, reverse('admin:admin_widgets_school_change', args=(self.school.id,))))
- for field_name in ['students', 'alumni']:
- from_box = '#id_%s_from' % field_name
- to_box = '#id_%s_to' % field_name
- choose_link = '#id_%s_add_link' % field_name
- remove_link = '#id_%s_remove_link' % field_name
- input = self.selenium.find_element_by_css_selector('#id_%s_input' % field_name)
-
- self.assertSelectOptions(from_box,
- [str(self.arthur.id), str(self.bob.id),
- str(self.cliff.id), str(self.jason.id),
- str(self.jenny.id), str(self.john.id)])
-
- input.send_keys('a')
- self.assertSelectOptions(from_box, [str(self.arthur.id), str(self.jason.id)])
- input.send_keys('R')
- self.assertSelectOptions(from_box, [str(self.arthur.id)])
-
- input.send_keys([Keys.BACK_SPACE])
- self.assertSelectOptions(from_box, [str(self.arthur.id), str(self.jason.id)])
- input.send_keys([Keys.BACK_SPACE])
- self.assertSelectOptions(from_box,
- [str(self.arthur.id), str(self.bob.id),
- str(self.cliff.id), str(self.jason.id),
- str(self.jenny.id), str(self.john.id)])
-
-
-
- input.send_keys('a')
- self.assertSelectOptions(from_box, [str(self.arthur.id), str(self.jason.id)])
- self.get_select_option(from_box, str(self.jason.id)).click()
- self.selenium.find_element_by_css_selector(choose_link).click()
- self.assertSelectOptions(from_box, [str(self.arthur.id)])
- self.assertSelectOptions(to_box,
- [str(self.lisa.id), str(self.peter.id),
- str(self.jason.id)])
- self.get_select_option(to_box, str(self.lisa.id)).click()
- self.selenium.find_element_by_css_selector(remove_link).click()
- self.assertSelectOptions(from_box,
- [str(self.arthur.id), str(self.lisa.id)])
- self.assertSelectOptions(to_box,
- [str(self.peter.id), str(self.jason.id)])
- input.send_keys([Keys.BACK_SPACE])
- self.assertSelectOptions(from_box,
- [str(self.arthur.id), str(self.bob.id),
- str(self.cliff.id), str(self.jenny.id),
- str(self.john.id), str(self.lisa.id)])
- self.assertSelectOptions(to_box,
- [str(self.peter.id), str(self.jason.id)])
-
-
-
- self.get_select_option(to_box, str(self.jason.id)).click()
- self.selenium.find_element_by_css_selector(remove_link).click()
- input.send_keys('ja')
- self.assertSelectOptions(from_box, [str(self.jason.id)])
- input.send_keys([Keys.ENTER])
- self.assertSelectOptions(to_box, [str(self.peter.id), str(self.jason.id)])
- input.send_keys([Keys.BACK_SPACE, Keys.BACK_SPACE])
-
- self.selenium.find_element_by_xpath('//input[@value="Save"]').click()
- self.wait_page_loaded()
- self.school = models.School.objects.get(id=self.school.id)
- self.assertEqual(list(self.school.students.all()),
- [self.jason, self.peter])
- self.assertEqual(list(self.school.alumni.all()),
- [self.jason, self.peter])
- class HorizontalVerticalFilterSeleniumChromeTests(HorizontalVerticalFilterSeleniumFirefoxTests):
- webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver'
- class HorizontalVerticalFilterSeleniumIETests(HorizontalVerticalFilterSeleniumFirefoxTests):
- webdriver_class = 'selenium.webdriver.ie.webdriver.WebDriver'
- @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
- ROOT_URLCONF='admin_widgets.urls')
- class AdminRawIdWidgetSeleniumFirefoxTests(SeleniumDataMixin, AdminSeleniumWebDriverTestCase):
- available_apps = ['admin_widgets'] + AdminSeleniumWebDriverTestCase.available_apps
- webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver'
- def setUp(self):
- super(AdminRawIdWidgetSeleniumFirefoxTests, self).setUp()
- models.Band.objects.create(id=42, name='Bogey Blues')
- models.Band.objects.create(id=98, name='Green Potatoes')
- def test_ForeignKey(self):
- self.admin_login(username='super', password='secret', login_url='/')
- self.selenium.get(
- '%s%s' % (self.live_server_url, reverse('admin:admin_widgets_event_add')))
- main_window = self.selenium.current_window_handle
-
- self.assertEqual(
- self.selenium.find_element_by_id('id_main_band').get_attribute('value'),
- '')
-
- self.selenium.find_element_by_id('lookup_id_main_band').click()
- self.wait_for_popup()
- self.selenium.switch_to.window('id_main_band')
- link = self.selenium.find_element_by_link_text('Bogey Blues')
- self.assertIn('/band/42/', link.get_attribute('href'))
- link.click()
-
- self.selenium.switch_to.window(main_window)
- self.wait_for_value('#id_main_band', '42')
-
- self.selenium.find_element_by_id('lookup_id_main_band').click()
- self.wait_for_popup()
- self.selenium.switch_to.window('id_main_band')
- link = self.selenium.find_element_by_link_text('Green Potatoes')
- self.assertIn('/band/98/', link.get_attribute('href'))
- link.click()
-
- self.selenium.switch_to.window(main_window)
- self.wait_for_value('#id_main_band', '98')
- def test_many_to_many(self):
- self.admin_login(username='super', password='secret', login_url='/')
- self.selenium.get(
- '%s%s' % (self.live_server_url, reverse('admin:admin_widgets_event_add')))
- main_window = self.selenium.current_window_handle
-
- self.assertEqual(
- self.selenium.find_element_by_id('id_supporting_bands').get_attribute('value'),
- '')
-
- self.selenium.find_element_by_id('lookup_id_supporting_bands').click()
- self.wait_for_popup()
- self.selenium.switch_to.window('id_supporting_bands')
- link = self.selenium.find_element_by_link_text('Bogey Blues')
- self.assertIn('/band/42/', link.get_attribute('href'))
- link.click()
-
- self.selenium.switch_to.window(main_window)
- self.wait_for_value('#id_supporting_bands', '42')
-
- self.selenium.find_element_by_id('lookup_id_supporting_bands').click()
- self.wait_for_popup()
- self.selenium.switch_to.window('id_supporting_bands')
- link = self.selenium.find_element_by_link_text('Green Potatoes')
- self.assertIn('/band/98/', link.get_attribute('href'))
- link.click()
-
- self.selenium.switch_to.window(main_window)
- self.wait_for_value('#id_supporting_bands', '42,98')
- class AdminRawIdWidgetSeleniumChromeTests(AdminRawIdWidgetSeleniumFirefoxTests):
- webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver'
- class AdminRawIdWidgetSeleniumIETests(AdminRawIdWidgetSeleniumFirefoxTests):
- webdriver_class = 'selenium.webdriver.ie.webdriver.WebDriver'
- @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
- ROOT_URLCONF='admin_widgets.urls')
- class RelatedFieldWidgetSeleniumFirefoxTests(SeleniumDataMixin, AdminSeleniumWebDriverTestCase):
- available_apps = ['admin_widgets'] + AdminSeleniumWebDriverTestCase.available_apps
- webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver'
- def test_ForeignKey_using_to_field(self):
- self.admin_login(username='super', password='secret', login_url='/')
- self.selenium.get('%s%s' % (
- self.live_server_url,
- reverse('admin:admin_widgets_profile_add')))
- main_window = self.selenium.current_window_handle
-
- self.selenium.find_element_by_id('add_id_user').click()
- self.wait_for_popup()
- self.selenium.switch_to.window('id_user')
- 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)
-
- self.wait_for('#id_user option[value="newuser"]')
-
- self.selenium.find_element_by_id('change_id_user').click()
- self.wait_for_popup()
- self.selenium.switch_to.window('id_user')
- username_field = self.selenium.find_element_by_id('id_username')
- username_value = 'changednewuser'
- username_field.clear()
- 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)
-
- self.selenium.implicitly_wait(2)
- self.selenium.find_element_by_css_selector('#id_user option[value=changednewuser]')
- self.selenium.implicitly_wait(0)
-
- self.selenium.find_element_by_css_selector(save_button_css_selector).click()
- self.wait_for_text('li.success', 'The profile "changednewuser" was added successfully.')
- 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'
|