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:
parent
4f62352412
commit
5c53e30607
|
@ -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 = {
|
||||||
|
|
Loading…
Reference in New Issue