mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #18035 -- Removed deprecated AdminMediaHandler, as per official deprecation timeline. Thanks Jannis Leidel and Ramiro Morales for the review.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17879 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -13,7 +13,7 @@ function findForm(node) { | |||||||
| } | } | ||||||
|  |  | ||||||
| window.SelectFilter = { | window.SelectFilter = { | ||||||
|     init: function(field_id, field_name, is_stacked, admin_media_prefix) { |     init: function(field_id, field_name, is_stacked, admin_static_prefix) { | ||||||
|         if (field_id.match(/__prefix__/)){ |         if (field_id.match(/__prefix__/)){ | ||||||
|             // Don't intialize on empty forms. |             // Don't intialize on empty forms. | ||||||
|             return; |             return; | ||||||
| @@ -43,14 +43,14 @@ window.SelectFilter = { | |||||||
|         var selector_available = quickElement('div', selector_div, ''); |         var selector_available = quickElement('div', selector_div, ''); | ||||||
|         selector_available.className = 'selector-available'; |         selector_available.className = 'selector-available'; | ||||||
|         var title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name])); |         var title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name])); | ||||||
|         quickElement('img', title_available, '', 'src', admin_media_prefix + 'img/icon-unknown.gif', 'width', '10', 'height', '10', 'class', 'help help-tooltip', 'title', interpolate(gettext('This is the list of available %s. You may choose some by selecting them in the box below and then clicking the "Choose" arrow between the two boxes.'), [field_name])); |         quickElement('img', title_available, '', 'src', admin_static_prefix + 'img/icon-unknown.gif', 'width', '10', 'height', '10', 'class', 'help help-tooltip', 'title', interpolate(gettext('This is the list of available %s. You may choose some by selecting them in the box below and then clicking the "Choose" arrow between the two boxes.'), [field_name])); | ||||||
|  |  | ||||||
|         var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); |         var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); | ||||||
|         filter_p.className = 'selector-filter'; |         filter_p.className = 'selector-filter'; | ||||||
|  |  | ||||||
|         var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + "_input"); |         var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + "_input"); | ||||||
|  |  | ||||||
|         var search_selector_img = quickElement('img', search_filter_label, '', 'src', admin_media_prefix + 'img/selector-search.gif', 'class', 'help-tooltip', 'alt', '', 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name])); |         var search_selector_img = quickElement('img', search_filter_label, '', 'src', admin_static_prefix + 'img/selector-search.gif', 'class', 'help-tooltip', 'alt', '', 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name])); | ||||||
|  |  | ||||||
|         filter_p.appendChild(document.createTextNode(' ')); |         filter_p.appendChild(document.createTextNode(' ')); | ||||||
|  |  | ||||||
| @@ -73,7 +73,7 @@ window.SelectFilter = { | |||||||
|         var selector_chosen = quickElement('div', selector_div, ''); |         var selector_chosen = quickElement('div', selector_div, ''); | ||||||
|         selector_chosen.className = 'selector-chosen'; |         selector_chosen.className = 'selector-chosen'; | ||||||
|         var title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name])); |         var title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name])); | ||||||
|         quickElement('img', title_chosen, '', 'src', admin_media_prefix + 'img/icon-unknown.gif', 'width', '10', 'height', '10', 'class', 'help help-tooltip', 'title', interpolate(gettext('This is the list of chosen %s. You may remove some by selecting them in the box below and then clicking the "Remove" arrow between the two boxes.'), [field_name])); |         quickElement('img', title_chosen, '', 'src', admin_static_prefix + 'img/icon-unknown.gif', 'width', '10', 'height', '10', 'class', 'help help-tooltip', 'title', interpolate(gettext('This is the list of chosen %s. You may remove some by selecting them in the box below and then clicking the "Remove" arrow between the two boxes.'), [field_name])); | ||||||
|  |  | ||||||
|         var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name')); |         var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name')); | ||||||
|         to_box.className = 'filtered'; |         to_box.className = 'filtered'; | ||||||
|   | |||||||
| @@ -8,8 +8,7 @@ from django.contrib.gis.geos import GEOSGeometry, GEOSException | |||||||
|  |  | ||||||
| # Creating a template context that contains Django settings | # Creating a template context that contains Django settings | ||||||
| # values needed by admin map templates. | # values needed by admin map templates. | ||||||
| geo_context = Context({'ADMIN_MEDIA_PREFIX' : static('admin/'), | geo_context = Context({'LANGUAGE_BIDI' : translation.get_language_bidi()}) | ||||||
|                        'LANGUAGE_BIDI' : translation.get_language_bidi()}) |  | ||||||
|  |  | ||||||
| class OpenLayersWidget(Textarea): | class OpenLayersWidget(Textarea): | ||||||
|     """ |     """ | ||||||
|   | |||||||
| @@ -1,12 +1,12 @@ | |||||||
| from optparse import make_option | from optparse import make_option | ||||||
|  |  | ||||||
| from django.conf import settings | from django.conf import settings | ||||||
| from django.core.management.commands.runserver import BaseRunserverCommand | from django.core.management.commands.runserver import Command as RunserverCommand | ||||||
|  |  | ||||||
| from django.contrib.staticfiles.handlers import StaticFilesHandler | from django.contrib.staticfiles.handlers import StaticFilesHandler | ||||||
|  |  | ||||||
| class Command(BaseRunserverCommand): | class Command(RunserverCommand): | ||||||
|     option_list = BaseRunserverCommand.option_list + ( |     option_list = RunserverCommand.option_list + ( | ||||||
|         make_option('--nostatic', action="store_false", dest='use_static_handler', default=True, |         make_option('--nostatic', action="store_false", dest='use_static_handler', default=True, | ||||||
|             help='Tells Django to NOT automatically serve static files at STATIC_URL.'), |             help='Tells Django to NOT automatically serve static files at STATIC_URL.'), | ||||||
|         make_option('--insecure', action="store_true", dest='insecure_serving', default=False, |         make_option('--insecure', action="store_true", dest='insecure_serving', default=False, | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ import sys | |||||||
| import socket | import socket | ||||||
|  |  | ||||||
| from django.core.management.base import BaseCommand, CommandError | from django.core.management.base import BaseCommand, CommandError | ||||||
| from django.core.servers.basehttp import AdminMediaHandler, run, WSGIServerException, get_internal_wsgi_application | from django.core.servers.basehttp import run, WSGIServerException, get_internal_wsgi_application | ||||||
| from django.utils import autoreload | from django.utils import autoreload | ||||||
|  |  | ||||||
| naiveip_re = re.compile(r"""^(?: | naiveip_re = re.compile(r"""^(?: | ||||||
| @@ -17,7 +17,7 @@ naiveip_re = re.compile(r"""^(?: | |||||||
| DEFAULT_PORT = "8000" | DEFAULT_PORT = "8000" | ||||||
|  |  | ||||||
|  |  | ||||||
| class BaseRunserverCommand(BaseCommand): | class Command(BaseCommand): | ||||||
|     option_list = BaseCommand.option_list + ( |     option_list = BaseCommand.option_list + ( | ||||||
|         make_option('--ipv6', '-6', action='store_true', dest='use_ipv6', default=False, |         make_option('--ipv6', '-6', action='store_true', dest='use_ipv6', default=False, | ||||||
|             help='Tells Django to use a IPv6 address.'), |             help='Tells Django to use a IPv6 address.'), | ||||||
| @@ -128,15 +128,6 @@ class BaseRunserverCommand(BaseCommand): | |||||||
|                 self.stdout.write("%s\n" % shutdown_message) |                 self.stdout.write("%s\n" % shutdown_message) | ||||||
|             sys.exit(0) |             sys.exit(0) | ||||||
|  |  | ||||||
| class Command(BaseRunserverCommand): |  | ||||||
|     option_list = BaseRunserverCommand.option_list + ( |  | ||||||
|         make_option('--adminmedia', dest='admin_media_path', default='', |  | ||||||
|             help='Specifies the directory from which to serve admin media.'), |  | ||||||
|     ) |  | ||||||
|  |  | ||||||
|     def get_handler(self, *args, **options): | # Kept for backward compatibility | ||||||
|         """ | BaseRunserverCommand = Command | ||||||
|         Serves admin media like old-school (deprecation pending). |  | ||||||
|         """ |  | ||||||
|         handler = super(Command, self).get_handler(*args, **options) |  | ||||||
|         return AdminMediaHandler(handler, options.get('admin_media_path')) |  | ||||||
|   | |||||||
| @@ -22,10 +22,6 @@ from django.core.exceptions import ImproperlyConfigured | |||||||
| from django.core.management.color import color_style | from django.core.management.color import color_style | ||||||
| from django.core.wsgi import get_wsgi_application | from django.core.wsgi import get_wsgi_application | ||||||
| from django.utils.importlib import import_module | from django.utils.importlib import import_module | ||||||
| from django.utils._os import safe_join |  | ||||||
| from django.views import static |  | ||||||
|  |  | ||||||
| from django.contrib.staticfiles import handlers |  | ||||||
|  |  | ||||||
| __all__ = ['WSGIServer', 'WSGIRequestHandler'] | __all__ = ['WSGIServer', 'WSGIRequestHandler'] | ||||||
|  |  | ||||||
| @@ -131,7 +127,7 @@ class WSGIRequestHandler(simple_server.WSGIRequestHandler, object): | |||||||
|  |  | ||||||
|     def __init__(self, *args, **kwargs): |     def __init__(self, *args, **kwargs): | ||||||
|         from django.conf import settings |         from django.conf import settings | ||||||
|         self.admin_media_prefix = urlparse.urljoin(settings.STATIC_URL, 'admin/') |         self.admin_static_prefix = urlparse.urljoin(settings.STATIC_URL, 'admin/') | ||||||
|         # We set self.path to avoid crashes in log_message() on unsupported |         # We set self.path to avoid crashes in log_message() on unsupported | ||||||
|         # requests (like "OPTIONS"). |         # requests (like "OPTIONS"). | ||||||
|         self.path = '' |         self.path = '' | ||||||
| @@ -173,7 +169,7 @@ class WSGIRequestHandler(simple_server.WSGIRequestHandler, object): | |||||||
|  |  | ||||||
|     def log_message(self, format, *args): |     def log_message(self, format, *args): | ||||||
|         # Don't bother logging requests for admin images or the favicon. |         # Don't bother logging requests for admin images or the favicon. | ||||||
|         if (self.path.startswith(self.admin_media_prefix) |         if (self.path.startswith(self.admin_static_prefix) | ||||||
|                 or self.path == '/favicon.ico'): |                 or self.path == '/favicon.ico'): | ||||||
|             return |             return | ||||||
|  |  | ||||||
| @@ -200,48 +196,6 @@ class WSGIRequestHandler(simple_server.WSGIRequestHandler, object): | |||||||
|         sys.stderr.write(msg) |         sys.stderr.write(msg) | ||||||
|  |  | ||||||
|  |  | ||||||
| class AdminMediaHandler(handlers.StaticFilesHandler): |  | ||||||
|     """ |  | ||||||
|     WSGI middleware that intercepts calls to the admin media directory, as |  | ||||||
|     defined by the STATIC_URL setting, and serves those images. |  | ||||||
|     Use this ONLY LOCALLY, for development! This hasn't been tested for |  | ||||||
|     security and is not super efficient. |  | ||||||
|  |  | ||||||
|     This is pending for deprecation since 1.3. |  | ||||||
|     """ |  | ||||||
|     def get_base_dir(self): |  | ||||||
|         return os.path.join(django.__path__[0], 'contrib', 'admin', 'static', 'admin') |  | ||||||
|  |  | ||||||
|     def get_base_url(self): |  | ||||||
|         from django.conf import settings |  | ||||||
|         return urlparse.urljoin(settings.STATIC_URL, 'admin/') |  | ||||||
|  |  | ||||||
|     def file_path(self, url): |  | ||||||
|         """ |  | ||||||
|         Returns the path to the media file on disk for the given URL. |  | ||||||
|  |  | ||||||
|         The passed URL is assumed to begin with ``self.base_url``.  If the |  | ||||||
|         resulting file path is outside the media directory, then a ValueError |  | ||||||
|         is raised. |  | ||||||
|         """ |  | ||||||
|         relative_url = url[len(self.base_url[2]):] |  | ||||||
|         relative_path = urllib.url2pathname(relative_url) |  | ||||||
|         return safe_join(self.base_dir, relative_path) |  | ||||||
|  |  | ||||||
|     def serve(self, request): |  | ||||||
|         document_root, path = os.path.split(self.file_path(request.path)) |  | ||||||
|         return static.serve(request, path, document_root=document_root) |  | ||||||
|  |  | ||||||
|     def _should_handle(self, path): |  | ||||||
|         """ |  | ||||||
|         Checks if the path should be handled. Ignores the path if: |  | ||||||
|  |  | ||||||
|         * the host is provided as part of the base_url |  | ||||||
|         * the request's path isn't under the base path |  | ||||||
|         """ |  | ||||||
|         return path.startswith(self.base_url[2]) and not self.base_url[1] |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def run(addr, port, wsgi_handler, ipv6=False, threading=False): | def run(addr, port, wsgi_handler, ipv6=False, threading=False): | ||||||
|     server_address = (addr, port) |     server_address = (addr, port) | ||||||
|     if threading: |     if threading: | ||||||
|   | |||||||
| @@ -58,7 +58,7 @@ This provides a few Django-specific niceties: | |||||||
| * validates installed models | * validates installed models | ||||||
|  |  | ||||||
| * allows an ``--adminmedia`` option for passing in the location of the | * allows an ``--adminmedia`` option for passing in the location of the | ||||||
|   admin media files, mimicing the behavior of runserver. |   admin media files. | ||||||
|  |  | ||||||
| See Gunicorn's `deployment documentation`_ for additional tips on starting and | See Gunicorn's `deployment documentation`_ for additional tips on starting and | ||||||
| maintaining the Gunicorn server. | maintaining the Gunicorn server. | ||||||
|   | |||||||
| @@ -70,7 +70,7 @@ Runs this project as a FastCGI application. Requires flup. Use | |||||||
| .B runfcgi help | .B runfcgi help | ||||||
| for help on the KEY=val pairs. | for help on the KEY=val pairs. | ||||||
| .TP | .TP | ||||||
| .BI "runserver [" "\-\-noreload" "] [" "\-\-nothreading" "] [" "\-\-nostatic" "] [" "\-\-insecure" "] [" "\-\-ipv6" "] [" "\-\-adminmedia=ADMIN_MEDIA_PATH" "] [" "port|ipaddr:port" "]" | .BI "runserver [" "\-\-noreload" "] [" "\-\-nothreading" "] [" "\-\-nostatic" "] [" "\-\-insecure" "] [" "\-\-ipv6" "] [" "port|ipaddr:port" "]" | ||||||
| Starts a lightweight Web server for development. | Starts a lightweight Web server for development. | ||||||
| .TP | .TP | ||||||
| .BI "shell [" "\-\-plain" "]" | .BI "shell [" "\-\-plain" "]" | ||||||
| @@ -169,9 +169,6 @@ Enables IPv6 addresses. | |||||||
| .I \-\-verbosity=VERBOSITY | .I \-\-verbosity=VERBOSITY | ||||||
| Verbosity level: 0=minimal output, 1=normal output, 2=all output. | Verbosity level: 0=minimal output, 1=normal output, 2=all output. | ||||||
| .TP | .TP | ||||||
| .I \-\-adminmedia=ADMIN_MEDIA_PATH |  | ||||||
| Specifies the directory from which to serve admin media when using the development server. |  | ||||||
| .TP |  | ||||||
| .I \-\-traceback | .I \-\-traceback | ||||||
| By default, django-admin.py will show a simple error message whenever an | By default, django-admin.py will show a simple error message whenever an | ||||||
| error occurs. If you specify this option, django-admin.py  will | error occurs. If you specify this option, django-admin.py  will | ||||||
|   | |||||||
| @@ -655,23 +655,11 @@ You can provide an IPv6 address surrounded by brackets | |||||||
|  |  | ||||||
| A hostname containing ASCII-only characters can also be used. | A hostname containing ASCII-only characters can also be used. | ||||||
|  |  | ||||||
| .. django-admin-option:: --adminmedia |  | ||||||
|  |  | ||||||
| Use the ``--adminmedia`` option to tell Django where to find the various CSS |  | ||||||
| and JavaScript files for the Django admin interface. Normally, the development |  | ||||||
| server serves these files out of the Django source tree magically, but you'd |  | ||||||
| want to use this if you made any changes to those files for your own site. |  | ||||||
|  |  | ||||||
| Example usage:: |  | ||||||
|  |  | ||||||
|     django-admin.py runserver --adminmedia=/tmp/new-admin-style/ |  | ||||||
|  |  | ||||||
| .. versionchanged:: 1.3 | .. versionchanged:: 1.3 | ||||||
|  |  | ||||||
| If the :doc:`staticfiles</ref/contrib/staticfiles>` contrib app is enabled | If the :doc:`staticfiles</ref/contrib/staticfiles>` contrib app is enabled | ||||||
| (default in new projects) the :djadmin:`runserver` command will be overriden | (default in new projects) the :djadmin:`runserver` command will be overriden | ||||||
| with an own :djadmin:`runserver<staticfiles-runserver>` command which doesn't | with an own :djadmin:`runserver<staticfiles-runserver>` command. | ||||||
| have the :djadminopt:`--adminmedia` option due to deprecation. |  | ||||||
|  |  | ||||||
| .. django-admin-option:: --noreload | .. django-admin-option:: --noreload | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1095,12 +1095,12 @@ class ManageTestCommand(AdminScriptTestCase): | |||||||
|  |  | ||||||
| class ManageRunserver(AdminScriptTestCase): | class ManageRunserver(AdminScriptTestCase): | ||||||
|     def setUp(self): |     def setUp(self): | ||||||
|         from django.core.management.commands.runserver import BaseRunserverCommand |         from django.core.management.commands.runserver import Command | ||||||
|  |  | ||||||
|         def monkey_run(*args, **options): |         def monkey_run(*args, **options): | ||||||
|             return |             return | ||||||
|  |  | ||||||
|         self.cmd = BaseRunserverCommand() |         self.cmd = Command() | ||||||
|         self.cmd.run = monkey_run |         self.cmd.run = monkey_run | ||||||
|  |  | ||||||
|     def assertServerSettings(self, addr, port, ipv6=None, raw_ipv6=False): |     def assertServerSettings(self, addr, port, ipv6=None, raw_ipv6=False): | ||||||
|   | |||||||
| @@ -20,8 +20,8 @@ from . import models | |||||||
| from .widgetadmin import site as widget_admin_site | from .widgetadmin import site as widget_admin_site | ||||||
|  |  | ||||||
|  |  | ||||||
| admin_media_prefix = lambda: { | admin_static_prefix = lambda: { | ||||||
|     'ADMIN_MEDIA_PREFIX': "%sadmin/" % settings.STATIC_URL, |     'ADMIN_STATIC_PREFIX': "%sadmin/" % settings.STATIC_URL, | ||||||
| } | } | ||||||
|  |  | ||||||
| class AdminFormfieldForDBFieldTests(TestCase): | class AdminFormfieldForDBFieldTests(TestCase): | ||||||
| @@ -196,14 +196,14 @@ class FilteredSelectMultipleWidgetTest(DjangoTestCase): | |||||||
|         w = widgets.FilteredSelectMultiple('test', False) |         w = widgets.FilteredSelectMultiple('test', False) | ||||||
|         self.assertHTMLEqual( |         self.assertHTMLEqual( | ||||||
|             conditional_escape(w.render('test', 'test')), |             conditional_escape(w.render('test', 'test')), | ||||||
|             '<select multiple="multiple" name="test" class="selectfilter">\n</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 0, "%(ADMIN_MEDIA_PREFIX)s"); });</script>\n' % admin_media_prefix() |             '<select multiple="multiple" name="test" class="selectfilter">\n</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 0, "%(ADMIN_STATIC_PREFIX)s"); });</script>\n' % admin_static_prefix() | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|     def test_stacked_render(self): |     def test_stacked_render(self): | ||||||
|         w = widgets.FilteredSelectMultiple('test', True) |         w = widgets.FilteredSelectMultiple('test', True) | ||||||
|         self.assertHTMLEqual( |         self.assertHTMLEqual( | ||||||
|             conditional_escape(w.render('test', 'test')), |             conditional_escape(w.render('test', 'test')), | ||||||
|             '<select multiple="multiple" name="test" class="selectfilterstacked">\n</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 1, "%(ADMIN_MEDIA_PREFIX)s"); });</script>\n' % admin_media_prefix() |             '<select multiple="multiple" name="test" class="selectfilterstacked">\n</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 1, "%(ADMIN_STATIC_PREFIX)s"); });</script>\n' % admin_static_prefix() | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
| class AdminDateWidgetTest(DjangoTestCase): | class AdminDateWidgetTest(DjangoTestCase): | ||||||
| @@ -292,7 +292,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): | |||||||
|         w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) |         w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) | ||||||
|         self.assertHTMLEqual( |         self.assertHTMLEqual( | ||||||
|             conditional_escape(w.render('test', band.pk, attrs={})), |             conditional_escape(w.render('test', band.pk, attrs={})), | ||||||
|             '<input type="text" name="test" value="%(bandpk)s" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/band/?t=id" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Linkin Park</strong>' % dict(admin_media_prefix(), bandpk=band.pk) |             '<input type="text" name="test" value="%(bandpk)s" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/band/?t=id" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_STATIC_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Linkin Park</strong>' % dict(admin_static_prefix(), bandpk=band.pk) | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|     def test_relations_to_non_primary_key(self): |     def test_relations_to_non_primary_key(self): | ||||||
| @@ -307,7 +307,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): | |||||||
|         w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) |         w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) | ||||||
|         self.assertHTMLEqual( |         self.assertHTMLEqual( | ||||||
|             w.render('test', core.parent_id, attrs={}), |             w.render('test', core.parent_id, attrs={}), | ||||||
|             '<input type="text" name="test" value="86" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/inventory/?t=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Apple</strong>' % admin_media_prefix() |             '<input type="text" name="test" value="86" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/inventory/?t=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_STATIC_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Apple</strong>' % admin_static_prefix() | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|     def test_fk_related_model_not_in_admin(self): |     def test_fk_related_model_not_in_admin(self): | ||||||
| @@ -349,7 +349,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): | |||||||
|         ) |         ) | ||||||
|         self.assertHTMLEqual( |         self.assertHTMLEqual( | ||||||
|             w.render('test', child_of_hidden.parent_id, attrs={}), |             w.render('test', child_of_hidden.parent_id, attrs={}), | ||||||
|             '<input type="text" name="test" value="93" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/inventory/?t=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Hidden</strong>' % admin_media_prefix() |             '<input type="text" name="test" value="93" class="vForeignKeyRawIdAdminField" /><a href="/widget_admin/admin_widgets/inventory/?t=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_STATIC_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Hidden</strong>' % admin_static_prefix() | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -365,12 +365,12 @@ class ManyToManyRawIdWidgetTest(DjangoTestCase): | |||||||
|         w = widgets.ManyToManyRawIdWidget(rel, widget_admin_site) |         w = widgets.ManyToManyRawIdWidget(rel, widget_admin_site) | ||||||
|         self.assertHTMLEqual( |         self.assertHTMLEqual( | ||||||
|             conditional_escape(w.render('test', [m1.pk, m2.pk], attrs={})), |             conditional_escape(w.render('test', [m1.pk, m2.pk], attrs={})), | ||||||
|             '<input type="text" name="test" value="%(m1pk)s,%(m2pk)s" class="vManyToManyRawIdAdminField" /><a href="/widget_admin/admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="/static/admin/img/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % dict(admin_media_prefix(), m1pk=m1.pk, m2pk=m2.pk) |             '<input type="text" name="test" value="%(m1pk)s,%(m2pk)s" class="vManyToManyRawIdAdminField" /><a href="/widget_admin/admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="/static/admin/img/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % dict(admin_static_prefix(), m1pk=m1.pk, m2pk=m2.pk) | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         self.assertHTMLEqual( |         self.assertHTMLEqual( | ||||||
|             conditional_escape(w.render('test', [m1.pk])), |             conditional_escape(w.render('test', [m1.pk])), | ||||||
|             '<input type="text" name="test" value="%(m1pk)s" class="vManyToManyRawIdAdminField" /><a href="/widget_admin/admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % dict(admin_media_prefix(), m1pk=m1.pk) |             '<input type="text" name="test" value="%(m1pk)s" class="vManyToManyRawIdAdminField" /><a href="/widget_admin/admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_STATIC_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % dict(admin_static_prefix(), m1pk=m1.pk) | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         self.assertEqual(w._has_changed(None, None), False) |         self.assertEqual(w._has_changed(None, None), False) | ||||||
|   | |||||||
| @@ -2,77 +2,15 @@ | |||||||
| Tests for django.core.servers. | Tests for django.core.servers. | ||||||
| """ | """ | ||||||
| import os | import os | ||||||
| from urlparse import urljoin |  | ||||||
| import urllib2 | import urllib2 | ||||||
|  |  | ||||||
| import django |  | ||||||
| from django.conf import settings |  | ||||||
| from django.core.exceptions import ImproperlyConfigured | from django.core.exceptions import ImproperlyConfigured | ||||||
| from django.test import TestCase, LiveServerTestCase | from django.test import LiveServerTestCase | ||||||
| from django.core.handlers.wsgi import WSGIHandler | from django.core.servers.basehttp import WSGIServerException | ||||||
| from django.core.servers.basehttp import AdminMediaHandler, WSGIServerException |  | ||||||
| from django.test.utils import override_settings | from django.test.utils import override_settings | ||||||
|  |  | ||||||
| from .models import Person | from .models import Person | ||||||
|  |  | ||||||
| class AdminMediaHandlerTests(TestCase): |  | ||||||
|  |  | ||||||
|     def setUp(self): |  | ||||||
|         self.admin_media_url = urljoin(settings.STATIC_URL, 'admin/') |  | ||||||
|         self.admin_media_file_path = os.path.abspath( |  | ||||||
|             os.path.join(django.__path__[0], 'contrib', 'admin', 'static', 'admin') |  | ||||||
|         ) |  | ||||||
|         self.handler = AdminMediaHandler(WSGIHandler()) |  | ||||||
|  |  | ||||||
|     def test_media_urls(self): |  | ||||||
|         """ |  | ||||||
|         Tests that URLs that look like absolute file paths after the |  | ||||||
|         settings.STATIC_URL don't turn into absolute file paths. |  | ||||||
|         """ |  | ||||||
|         # Cases that should work on all platforms. |  | ||||||
|         data = ( |  | ||||||
|             ('%scss/base.css' % self.admin_media_url, ('css', 'base.css')), |  | ||||||
|         ) |  | ||||||
|         # Cases that should raise an exception. |  | ||||||
|         bad_data = () |  | ||||||
|  |  | ||||||
|         # Add platform-specific cases. |  | ||||||
|         if os.sep == '/': |  | ||||||
|             data += ( |  | ||||||
|                 # URL, tuple of relative path parts. |  | ||||||
|                 ('%s\\css/base.css' % self.admin_media_url, ('\\css', 'base.css')), |  | ||||||
|             ) |  | ||||||
|             bad_data += ( |  | ||||||
|                 '%s/css/base.css' % self.admin_media_url, |  | ||||||
|                 '%s///css/base.css' % self.admin_media_url, |  | ||||||
|                 '%s../css/base.css' % self.admin_media_url, |  | ||||||
|             ) |  | ||||||
|         elif os.sep == '\\': |  | ||||||
|             bad_data += ( |  | ||||||
|                 '%sC:\css/base.css' % self.admin_media_url, |  | ||||||
|                 '%s/\\css/base.css' % self.admin_media_url, |  | ||||||
|                 '%s\\css/base.css' % self.admin_media_url, |  | ||||||
|                 '%s\\\\css/base.css' % self.admin_media_url |  | ||||||
|             ) |  | ||||||
|         for url, path_tuple in data: |  | ||||||
|             try: |  | ||||||
|                 output = self.handler.file_path(url) |  | ||||||
|             except ValueError: |  | ||||||
|                 self.fail("Got a ValueError exception, but wasn't expecting" |  | ||||||
|                           " one. URL was: %s" % url) |  | ||||||
|             rel_path = os.path.join(*path_tuple) |  | ||||||
|             desired = os.path.join(self.admin_media_file_path, rel_path) |  | ||||||
|             self.assertEqual( |  | ||||||
|                 os.path.normcase(output), os.path.normcase(desired), |  | ||||||
|                 "Got: %s, Expected: %s, URL was: %s" % (output, desired, url)) |  | ||||||
|         for url in bad_data: |  | ||||||
|             try: |  | ||||||
|                 output = self.handler.file_path(url) |  | ||||||
|             except ValueError: |  | ||||||
|                 continue |  | ||||||
|             self.fail('URL: %s should have caused a ValueError exception.' |  | ||||||
|                       % url) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| TEST_ROOT = os.path.dirname(__file__) | TEST_ROOT = os.path.dirname(__file__) | ||||||
| TEST_SETTINGS = { | TEST_SETTINGS = { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user