Ticket #18035: 18035-2.diff

File 18035-2.diff, 24.7 KB (added by Claude Paroz, 12 years ago)

Fixed BaseRunserverCommand issue

  • django/contrib/admin/static/admin/js/SelectFilter2.js

    diff --git a/django/contrib/admin/static/admin/js/SelectFilter2.js b/django/contrib/admin/static/admin/js/SelectFilter2.js
    index 0accd08..24d88f7 100644
    a b function findForm(node) {  
    1313}
    1414
    1515window.SelectFilter = {
    16     init: function(field_id, field_name, is_stacked, admin_media_prefix) {
     16    init: function(field_id, field_name, is_stacked, admin_static_prefix) {
    1717        if (field_id.match(/__prefix__/)){
    1818            // Don't intialize on empty forms.
    1919            return;
    window.SelectFilter = {  
    4343        var selector_available = quickElement('div', selector_div, '');
    4444        selector_available.className = 'selector-available';
    4545        var title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name]));
    46         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]));
     46        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]));
    4747
    4848        var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter');
    4949        filter_p.className = 'selector-filter';
    5050
    5151        var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + "_input");
    5252
    53         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]));
     53        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]));
    5454
    5555        filter_p.appendChild(document.createTextNode(' '));
    5656
    window.SelectFilter = {  
    7373        var selector_chosen = quickElement('div', selector_div, '');
    7474        selector_chosen.className = 'selector-chosen';
    7575        var title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name]));
    76         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]));
     76        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]));
    7777
    7878        var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name'));
    7979        to_box.className = 'filtered';
  • django/contrib/gis/admin/widgets.py

    diff --git a/django/contrib/gis/admin/widgets.py b/django/contrib/gis/admin/widgets.py
    index 6dbbc60..aaffae8 100644
    a b from django.contrib.gis.geos import GEOSGeometry, GEOSException  
    88
    99# Creating a template context that contains Django settings
    1010# values needed by admin map templates.
    11 geo_context = Context({'ADMIN_MEDIA_PREFIX' : static('admin/'),
    12                        'LANGUAGE_BIDI' : translation.get_language_bidi()})
     11geo_context = Context({'LANGUAGE_BIDI' : translation.get_language_bidi()})
    1312
    1413class OpenLayersWidget(Textarea):
    1514    """
  • django/contrib/staticfiles/management/commands/runserver.py

    diff --git a/django/contrib/staticfiles/management/commands/runserver.py b/django/contrib/staticfiles/management/commands/runserver.py
    index 403df88..0f9e39f 100644
    a b  
    11from optparse import make_option
    22
    33from django.conf import settings
    4 from django.core.management.commands.runserver import BaseRunserverCommand
     4from django.core.management.commands.runserver import Command as RunserverCommand
    55
    66from django.contrib.staticfiles.handlers import StaticFilesHandler
    77
    8 class Command(BaseRunserverCommand):
    9     option_list = BaseRunserverCommand.option_list + (
     8class Command(RunserverCommand):
     9    option_list = RunserverCommand.option_list + (
    1010        make_option('--nostatic', action="store_false", dest='use_static_handler', default=True,
    1111            help='Tells Django to NOT automatically serve static files at STATIC_URL.'),
    1212        make_option('--insecure', action="store_true", dest='insecure_serving', default=False,
  • django/core/management/commands/runserver.py

    diff --git a/django/core/management/commands/runserver.py b/django/core/management/commands/runserver.py
    index e93af96..3007d0f 100644
    a b import sys  
    55import socket
    66
    77from django.core.management.base import BaseCommand, CommandError
    8 from django.core.servers.basehttp import AdminMediaHandler, run, WSGIServerException, get_internal_wsgi_application
     8from django.core.servers.basehttp import run, WSGIServerException, get_internal_wsgi_application
    99from django.utils import autoreload
    1010
    1111naiveip_re = re.compile(r"""^(?:
    naiveip_re = re.compile(r"""^(?:  
    1717DEFAULT_PORT = "8000"
    1818
    1919
    20 class BaseRunserverCommand(BaseCommand):
     20class Command(BaseCommand):
    2121    option_list = BaseCommand.option_list + (
    2222        make_option('--ipv6', '-6', action='store_true', dest='use_ipv6', default=False,
    2323            help='Tells Django to use a IPv6 address.'),
    class BaseRunserverCommand(BaseCommand):  
    128128                self.stdout.write("%s\n" % shutdown_message)
    129129            sys.exit(0)
    130130
    131 class Command(BaseRunserverCommand):
    132     option_list = BaseRunserverCommand.option_list + (
    133         make_option('--adminmedia', dest='admin_media_path', default='',
    134             help='Specifies the directory from which to serve admin media.'),
    135     )
    136131
    137     def get_handler(self, *args, **options):
    138         """
    139         Serves admin media like old-school (deprecation pending).
    140         """
    141         handler = super(Command, self).get_handler(*args, **options)
    142         return AdminMediaHandler(handler, options.get('admin_media_path'))
     132# Kept for backward compatibility
     133BaseRunserverCommand = Command
  • django/core/servers/basehttp.py

    diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py
    index 8d4ceab..d538ce7 100644
    a b from django.core.exceptions import ImproperlyConfigured  
    2222from django.core.management.color import color_style
    2323from django.core.wsgi import get_wsgi_application
    2424from django.utils.importlib import import_module
    25 from django.utils._os import safe_join
    26 from django.views import static
    27 
    28 from django.contrib.staticfiles import handlers
    2925
    3026__all__ = ['WSGIServer', 'WSGIRequestHandler']
    3127
    class WSGIRequestHandler(simple_server.WSGIRequestHandler, object):  
    131127
    132128    def __init__(self, *args, **kwargs):
    133129        from django.conf import settings
    134         self.admin_media_prefix = urlparse.urljoin(settings.STATIC_URL, 'admin/')
     130        self.admin_static_prefix = urlparse.urljoin(settings.STATIC_URL, 'admin/')
    135131        # We set self.path to avoid crashes in log_message() on unsupported
    136132        # requests (like "OPTIONS").
    137133        self.path = ''
    class WSGIRequestHandler(simple_server.WSGIRequestHandler, object):  
    173169
    174170    def log_message(self, format, *args):
    175171        # Don't bother logging requests for admin images or the favicon.
    176         if (self.path.startswith(self.admin_media_prefix)
     172        if (self.path.startswith(self.admin_static_prefix)
    177173                or self.path == '/favicon.ico'):
    178174            return
    179175
    class WSGIRequestHandler(simple_server.WSGIRequestHandler, object):  
    200196        sys.stderr.write(msg)
    201197
    202198
    203 class AdminMediaHandler(handlers.StaticFilesHandler):
    204     """
    205     WSGI middleware that intercepts calls to the admin media directory, as
    206     defined by the STATIC_URL setting, and serves those images.
    207     Use this ONLY LOCALLY, for development! This hasn't been tested for
    208     security and is not super efficient.
    209 
    210     This is pending for deprecation since 1.3.
    211     """
    212     def get_base_dir(self):
    213         return os.path.join(django.__path__[0], 'contrib', 'admin', 'static', 'admin')
    214 
    215     def get_base_url(self):
    216         from django.conf import settings
    217         return urlparse.urljoin(settings.STATIC_URL, 'admin/')
    218 
    219     def file_path(self, url):
    220         """
    221         Returns the path to the media file on disk for the given URL.
    222 
    223         The passed URL is assumed to begin with ``self.base_url``.  If the
    224         resulting file path is outside the media directory, then a ValueError
    225         is raised.
    226         """
    227         relative_url = url[len(self.base_url[2]):]
    228         relative_path = urllib.url2pathname(relative_url)
    229         return safe_join(self.base_dir, relative_path)
    230 
    231     def serve(self, request):
    232         document_root, path = os.path.split(self.file_path(request.path))
    233         return static.serve(request, path, document_root=document_root)
    234 
    235     def _should_handle(self, path):
    236         """
    237         Checks if the path should be handled. Ignores the path if:
    238 
    239         * the host is provided as part of the base_url
    240         * the request's path isn't under the base path
    241         """
    242         return path.startswith(self.base_url[2]) and not self.base_url[1]
    243 
    244 
    245199def run(addr, port, wsgi_handler, ipv6=False, threading=False):
    246200    server_address = (addr, port)
    247201    if threading:
  • docs/howto/deployment/wsgi/gunicorn.txt

    diff --git a/docs/howto/deployment/wsgi/gunicorn.txt b/docs/howto/deployment/wsgi/gunicorn.txt
    index ce9e54d..13d4043 100644
    a b This provides a few Django-specific niceties:  
    5858* validates installed models
    5959
    6060* allows an ``--adminmedia`` option for passing in the location of the
    61   admin media files, mimicing the behavior of runserver.
     61  admin media files.
    6262
    6363See Gunicorn's `deployment documentation`_ for additional tips on starting and
    6464maintaining the Gunicorn server.
  • docs/man/django-admin.1

    diff --git a/docs/man/django-admin.1 b/docs/man/django-admin.1
    index 1f693b8..730f3a5 100644
    a b Runs this project as a FastCGI application. Requires flup. Use  
    7575.B runfcgi help
    7676for help on the KEY=val pairs.
    7777.TP
    78 .BI "runserver [" "\-\-noreload" "] [" "\-\-nothreading" "] [" "\-\-nostatic" "] [" "\-\-insecure" "] [" "\-\-ipv6" "] [" "\-\-adminmedia=ADMIN_MEDIA_PATH" "] [" "port|ipaddr:port" "]"
     78.BI "runserver [" "\-\-noreload" "] [" "\-\-nothreading" "] [" "\-\-nostatic" "] [" "\-\-insecure" "] [" "\-\-ipv6" "] [" "port|ipaddr:port" "]"
    7979Starts a lightweight Web server for development.
    8080.TP
    8181.BI "shell [" "\-\-plain" "]"
    Enables IPv6 addresses.  
    178178.I \-\-verbosity=VERBOSITY
    179179Verbosity level: 0=minimal output, 1=normal output, 2=all output.
    180180.TP
    181 .I \-\-adminmedia=ADMIN_MEDIA_PATH
    182 Specifies the directory from which to serve admin media when using the development server.
    183 .TP
    184181.I \-\-traceback
    185182By default, django-admin.py will show a simple error message whenever an
    186183error occurs. If you specify this option, django-admin.py  will
  • docs/ref/django-admin.txt

    diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt
    index 5ea7280..93844a6 100644
    a b You can provide an IPv6 address surrounded by brackets  
    674674
    675675A hostname containing ASCII-only characters can also be used.
    676676
    677 .. django-admin-option:: --adminmedia
    678 
    679 Use the ``--adminmedia`` option to tell Django where to find the various CSS
    680 and JavaScript files for the Django admin interface. Normally, the development
    681 server serves these files out of the Django source tree magically, but you'd
    682 want to use this if you made any changes to those files for your own site.
    683 
    684 Example usage::
    685 
    686     django-admin.py runserver --adminmedia=/tmp/new-admin-style/
    687 
    688677.. versionchanged:: 1.3
    689678
    690679If the :doc:`staticfiles</ref/contrib/staticfiles>` contrib app is enabled
    691680(default in new projects) the :djadmin:`runserver` command will be overriden
    692 with an own :djadmin:`runserver<staticfiles-runserver>` command which doesn't
    693 have the :djadminopt:`--adminmedia` option due to deprecation.
     681with an own :djadmin:`runserver<staticfiles-runserver>` command.
    694682
    695683.. django-admin-option:: --noreload
    696684
  • tests/regressiontests/admin_scripts/tests.py

    diff --git a/tests/regressiontests/admin_scripts/tests.py b/tests/regressiontests/admin_scripts/tests.py
    index dd3b0b4..7fee78a 100644
    a b class ManageTestCommand(AdminScriptTestCase):  
    11051105
    11061106class ManageRunserver(AdminScriptTestCase):
    11071107    def setUp(self):
    1108         from django.core.management.commands.runserver import BaseRunserverCommand
     1108        from django.core.management.commands.runserver import Command
    11091109
    11101110        def monkey_run(*args, **options):
    11111111            return
    11121112
    1113         self.cmd = BaseRunserverCommand()
     1113        self.cmd = Command()
    11141114        self.cmd.run = monkey_run
    11151115
    11161116    def assertServerSettings(self, addr, port, ipv6=None, raw_ipv6=False):
  • tests/regressiontests/admin_widgets/tests.py

    diff --git a/tests/regressiontests/admin_widgets/tests.py b/tests/regressiontests/admin_widgets/tests.py
    index ab6db4d..c1116ba 100644
    a b from . import models  
    2020from .widgetadmin import site as widget_admin_site
    2121
    2222
    23 admin_media_prefix = lambda: {
    24     'ADMIN_MEDIA_PREFIX': "%sadmin/" % settings.STATIC_URL,
     23admin_static_prefix = lambda: {
     24    'ADMIN_STATIC_PREFIX': "%sadmin/" % settings.STATIC_URL,
    2525}
    2626
    2727class AdminFormfieldForDBFieldTests(TestCase):
    class FilteredSelectMultipleWidgetTest(DjangoTestCase):  
    196196        w = widgets.FilteredSelectMultiple('test', False)
    197197        self.assertHTMLEqual(
    198198            conditional_escape(w.render('test', 'test')),
    199             '<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()
     199            '<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()
    200200        )
    201201
    202202    def test_stacked_render(self):
    203203        w = widgets.FilteredSelectMultiple('test', True)
    204204        self.assertHTMLEqual(
    205205            conditional_escape(w.render('test', 'test')),
    206             '<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()
     206            '<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()
    207207        )
    208208
    209209class AdminDateWidgetTest(DjangoTestCase):
    class ForeignKeyRawIdWidgetTest(DjangoTestCase):  
    292292        w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
    293293        self.assertHTMLEqual(
    294294            conditional_escape(w.render('test', band.pk, attrs={})),
    295             '<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>&nbsp;<strong>Linkin Park</strong>' % dict(admin_media_prefix(), bandpk=band.pk)
     295            '<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>&nbsp;<strong>Linkin Park</strong>' % dict(admin_static_prefix(), bandpk=band.pk)
    296296        )
    297297
    298298    def test_relations_to_non_primary_key(self):
    class ForeignKeyRawIdWidgetTest(DjangoTestCase):  
    307307        w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site)
    308308        self.assertHTMLEqual(
    309309            w.render('test', core.parent_id, attrs={}),
    310             '<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>&nbsp;<strong>Apple</strong>' % admin_media_prefix()
     310            '<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>&nbsp;<strong>Apple</strong>' % admin_static_prefix()
    311311        )
    312312
    313313    def test_fk_related_model_not_in_admin(self):
    class ForeignKeyRawIdWidgetTest(DjangoTestCase):  
    349349        )
    350350        self.assertHTMLEqual(
    351351            w.render('test', child_of_hidden.parent_id, attrs={}),
    352             '<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>&nbsp;<strong>Hidden</strong>' % admin_media_prefix()
     352            '<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>&nbsp;<strong>Hidden</strong>' % admin_static_prefix()
    353353        )
    354354
    355355
    class ManyToManyRawIdWidgetTest(DjangoTestCase):  
    365365        w = widgets.ManyToManyRawIdWidget(rel, widget_admin_site)
    366366        self.assertHTMLEqual(
    367367            conditional_escape(w.render('test', [m1.pk, m2.pk], attrs={})),
    368             '<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)
     368            '<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)
    369369        )
    370370
    371371        self.assertHTMLEqual(
    372372            conditional_escape(w.render('test', [m1.pk])),
    373             '<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)
     373            '<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)
    374374        )
    375375
    376376        self.assertEqual(w._has_changed(None, None), False)
    class HorizontalVerticalFilterSeleniumChromeTests(HorizontalVerticalFilterSeleni  
    691691    webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver'
    692692
    693693class HorizontalVerticalFilterSeleniumIETests(HorizontalVerticalFilterSeleniumFirefoxTests):
    694     webdriver_class = 'selenium.webdriver.ie.webdriver.WebDriver'
    695  No newline at end of file
     694    webdriver_class = 'selenium.webdriver.ie.webdriver.WebDriver'
  • tests/regressiontests/servers/tests.py

    diff --git a/tests/regressiontests/servers/tests.py b/tests/regressiontests/servers/tests.py
    index d237c83..e226be9 100644
    a b  
    22Tests for django.core.servers.
    33"""
    44import os
    5 from urlparse import urljoin
    65import urllib2
    76
    8 import django
    9 from django.conf import settings
    107from django.core.exceptions import ImproperlyConfigured
    11 from django.test import TestCase, LiveServerTestCase
    12 from django.core.handlers.wsgi import WSGIHandler
    13 from django.core.servers.basehttp import AdminMediaHandler, WSGIServerException
     8from django.test import LiveServerTestCase
     9from django.core.servers.basehttp import WSGIServerException
    1410from django.test.utils import override_settings
    1511
    1612from .models import Person
    1713
    18 class AdminMediaHandlerTests(TestCase):
    19 
    20     def setUp(self):
    21         self.admin_media_url = urljoin(settings.STATIC_URL, 'admin/')
    22         self.admin_media_file_path = os.path.abspath(
    23             os.path.join(django.__path__[0], 'contrib', 'admin', 'static', 'admin')
    24         )
    25         self.handler = AdminMediaHandler(WSGIHandler())
    26 
    27     def test_media_urls(self):
    28         """
    29         Tests that URLs that look like absolute file paths after the
    30         settings.STATIC_URL don't turn into absolute file paths.
    31         """
    32         # Cases that should work on all platforms.
    33         data = (
    34             ('%scss/base.css' % self.admin_media_url, ('css', 'base.css')),
    35         )
    36         # Cases that should raise an exception.
    37         bad_data = ()
    38 
    39         # Add platform-specific cases.
    40         if os.sep == '/':
    41             data += (
    42                 # URL, tuple of relative path parts.
    43                 ('%s\\css/base.css' % self.admin_media_url, ('\\css', 'base.css')),
    44             )
    45             bad_data += (
    46                 '%s/css/base.css' % self.admin_media_url,
    47                 '%s///css/base.css' % self.admin_media_url,
    48                 '%s../css/base.css' % self.admin_media_url,
    49             )
    50         elif os.sep == '\\':
    51             bad_data += (
    52                 '%sC:\css/base.css' % self.admin_media_url,
    53                 '%s/\\css/base.css' % self.admin_media_url,
    54                 '%s\\css/base.css' % self.admin_media_url,
    55                 '%s\\\\css/base.css' % self.admin_media_url
    56             )
    57         for url, path_tuple in data:
    58             try:
    59                 output = self.handler.file_path(url)
    60             except ValueError:
    61                 self.fail("Got a ValueError exception, but wasn't expecting"
    62                           " one. URL was: %s" % url)
    63             rel_path = os.path.join(*path_tuple)
    64             desired = os.path.join(self.admin_media_file_path, rel_path)
    65             self.assertEqual(
    66                 os.path.normcase(output), os.path.normcase(desired),
    67                 "Got: %s, Expected: %s, URL was: %s" % (output, desired, url))
    68         for url in bad_data:
    69             try:
    70                 output = self.handler.file_path(url)
    71             except ValueError:
    72                 continue
    73             self.fail('URL: %s should have caused a ValueError exception.'
    74                       % url)
    75 
    7614
    7715TEST_ROOT = os.path.dirname(__file__)
    7816TEST_SETTINGS = {
Back to Top