Skip to content

Commit

Permalink
Fixed #14675 -- Completed removal of `from django.conf.urls.default i…
Browse files Browse the repository at this point in the history
…mport *` usage.

This applies to both our own [test] code and documentation examples. Also:
 * Moved the functions and handlers from `django.conf.urls.defaults` up to
   `django.conf.urls` deprecating the former module.
 * Added documentation for `handler403`.
 * Tweaked the URLs topic document a bit.

Thanks to pupeno and cdestigter for their great work contributing patches.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16818 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
ramiro committed Sep 11, 2011
1 parent fd90453 commit 26b8122
Show file tree
Hide file tree
Showing 88 changed files with 243 additions and 198 deletions.
2 changes: 1 addition & 1 deletion django/conf/project_template/urls.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import patterns, include, url from django.conf.urls import patterns, include, url


# Uncomment the next two lines to enable the admin: # Uncomment the next two lines to enable the admin:
# from django.contrib import admin # from django.contrib import admin
Expand Down
61 changes: 61 additions & 0 deletions django/conf/urls/__init__.py
@@ -0,0 +1,61 @@
from django.core.urlresolvers import (RegexURLPattern,
RegexURLResolver, LocaleRegexURLResolver)
from django.core.exceptions import ImproperlyConfigured
from django.utils.importlib import import_module


__all__ = ['handler403', 'handler404', 'handler500', 'include', 'patterns', 'url']

handler403 = 'django.views.defaults.permission_denied'
handler404 = 'django.views.defaults.page_not_found'
handler500 = 'django.views.defaults.server_error'

def include(arg, namespace=None, app_name=None):
if isinstance(arg, tuple):
# callable returning a namespace hint
if namespace:
raise ImproperlyConfigured('Cannot override the namespace for a dynamic module that provides a namespace')
urlconf_module, app_name, namespace = arg
else:
# No namespace hint - use manually provided namespace
urlconf_module = arg

if isinstance(urlconf_module, basestring):
urlconf_module = import_module(urlconf_module)
patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)

# Make sure we can iterate through the patterns (without this, some
# testcases will break).
if isinstance(patterns, (list, tuple)):
for url_pattern in patterns:
# Test if the LocaleRegexURLResolver is used within the include;
# this should throw an error since this is not allowed!
if isinstance(url_pattern, LocaleRegexURLResolver):
raise ImproperlyConfigured(
'Using i18n_patterns in an included URLconf is not allowed.')

return (urlconf_module, app_name, namespace)

def patterns(prefix, *args):
pattern_list = []
for t in args:
if isinstance(t, (list, tuple)):
t = url(prefix=prefix, *t)
elif isinstance(t, RegexURLPattern):
t.add_prefix(prefix)
pattern_list.append(t)
return pattern_list

def url(regex, view, kwargs=None, name=None, prefix=''):
if isinstance(view, (list,tuple)):
# For include(...) processing.
urlconf_module, app_name, namespace = view
return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
else:
if isinstance(view, basestring):
if not view:
raise ImproperlyConfigured('Empty URL pattern view name not permitted (for pattern %r)' % regex)
if prefix:
view = prefix + '.' + view
return RegexURLPattern(regex, view, kwargs, name)

65 changes: 5 additions & 60 deletions django/conf/urls/defaults.py
@@ -1,61 +1,6 @@
from django.core.urlresolvers import (RegexURLPattern, import warnings
RegexURLResolver, LocaleRegexURLResolver) warnings.warn("django.conf.urls.defaults is deprecated; use django.conf.urls instead",
from django.core.exceptions import ImproperlyConfigured PendingDeprecationWarning)
from django.utils.importlib import import_module


__all__ = ['handler404', 'handler500', 'include', 'patterns', 'url']

handler403 = 'django.views.defaults.permission_denied'
handler404 = 'django.views.defaults.page_not_found'
handler500 = 'django.views.defaults.server_error'

def include(arg, namespace=None, app_name=None):
if isinstance(arg, tuple):
# callable returning a namespace hint
if namespace:
raise ImproperlyConfigured('Cannot override the namespace for a dynamic module that provides a namespace')
urlconf_module, app_name, namespace = arg
else:
# No namespace hint - use manually provided namespace
urlconf_module = arg

if isinstance(urlconf_module, basestring):
urlconf_module = import_module(urlconf_module)
patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)

# Make sure we can iterate through the patterns (without this, some
# testcases will break).
if isinstance(patterns, (list, tuple)):
for url_pattern in patterns:
# Test if the LocaleRegexURLResolver is used within the include;
# this should throw an error since this is not allowed!
if isinstance(url_pattern, LocaleRegexURLResolver):
raise ImproperlyConfigured(
'Using i18n_patterns in an included URLconf is not allowed.')

return (urlconf_module, app_name, namespace)

def patterns(prefix, *args):
pattern_list = []
for t in args:
if isinstance(t, (list, tuple)):
t = url(prefix=prefix, *t)
elif isinstance(t, RegexURLPattern):
t.add_prefix(prefix)
pattern_list.append(t)
return pattern_list

def url(regex, view, kwargs=None, name=None, prefix=''):
if isinstance(view, (list,tuple)):
# For include(...) processing.
urlconf_module, app_name, namespace = view
return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
else:
if isinstance(view, basestring):
if not view:
raise ImproperlyConfigured('Empty URL pattern view name not permitted (for pattern %r)' % regex)
if prefix:
view = prefix + '.' + view
return RegexURLPattern(regex, view, kwargs, name)


from django.conf.urls import (handler403, handler404, handler500,
include, patterns, url)
2 changes: 1 addition & 1 deletion django/conf/urls/i18n.py
@@ -1,5 +1,5 @@
from django.conf import settings from django.conf import settings
from django.conf.urls.defaults import patterns from django.conf.urls import patterns
from django.core.urlresolvers import LocaleRegexURLResolver from django.core.urlresolvers import LocaleRegexURLResolver


def i18n_patterns(prefix, *args): def i18n_patterns(prefix, *args):
Expand Down
2 changes: 1 addition & 1 deletion django/conf/urls/shortcut.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import * from django.conf.urls import patterns


urlpatterns = patterns('django.views', urlpatterns = patterns('django.views',
(r'^(?P<content_type_id>\d+)/(?P<object_id>.*)/$', 'defaults.shortcut'), (r'^(?P<content_type_id>\d+)/(?P<object_id>.*)/$', 'defaults.shortcut'),
Expand Down
2 changes: 1 addition & 1 deletion django/conf/urls/static.py
@@ -1,6 +1,6 @@
import re import re
from django.conf import settings from django.conf import settings
from django.conf.urls.defaults import patterns, url from django.conf.urls import patterns, url
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured


def static(prefix, view='django.views.static.serve', **kwargs): def static(prefix, view='django.views.static.serve', **kwargs):
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/admin/options.py
Expand Up @@ -320,7 +320,7 @@ def __init__(self, model, admin_site):
super(ModelAdmin, self).__init__() super(ModelAdmin, self).__init__()


def get_urls(self): def get_urls(self):
from django.conf.urls.defaults import patterns, url from django.conf.urls import patterns, url


def wrap(view): def wrap(view):
def wrapper(*args, **kwargs): def wrapper(*args, **kwargs):
Expand Down
4 changes: 2 additions & 2 deletions django/contrib/admin/sites.py
Expand Up @@ -174,7 +174,7 @@ def admin_view(self, view, cacheable=False):
class MyAdminSite(AdminSite): class MyAdminSite(AdminSite):
def get_urls(self): def get_urls(self):
from django.conf.urls.defaults import patterns, url from django.conf.urls import patterns, url
urls = super(MyAdminSite, self).get_urls() urls = super(MyAdminSite, self).get_urls()
urls += patterns('', urls += patterns('',
Expand All @@ -199,7 +199,7 @@ def inner(request, *args, **kwargs):
return update_wrapper(inner, view) return update_wrapper(inner, view)


def get_urls(self): def get_urls(self):
from django.conf.urls.defaults import patterns, url, include from django.conf.urls import patterns, url, include


if settings.DEBUG: if settings.DEBUG:
self.check_dependencies() self.check_dependencies()
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/admindocs/urls.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import * from django.conf.urls import patterns, url
from django.contrib.admindocs import views from django.contrib.admindocs import views


urlpatterns = patterns('', urlpatterns = patterns('',
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/auth/admin.py
Expand Up @@ -74,7 +74,7 @@ def get_form(self, request, obj=None, **kwargs):
return super(UserAdmin, self).get_form(request, obj, **defaults) return super(UserAdmin, self).get_form(request, obj, **defaults)


def get_urls(self): def get_urls(self):
from django.conf.urls.defaults import patterns from django.conf.urls import patterns
return patterns('', return patterns('',
(r'^(\d+)/password/$', self.admin_site.admin_view(self.user_change_password)) (r'^(\d+)/password/$', self.admin_site.admin_view(self.user_change_password))
) + super(UserAdmin, self).get_urls() ) + super(UserAdmin, self).get_urls()
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/auth/tests/urls.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import patterns, url from django.conf.urls import patterns, url
from django.contrib.auth import context_processors from django.contrib.auth import context_processors
from django.contrib.auth.urls import urlpatterns from django.contrib.auth.urls import urlpatterns
from django.contrib.auth.views import password_reset from django.contrib.auth.views import password_reset
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/auth/urls.py
Expand Up @@ -2,7 +2,7 @@
# provided as a convenience to those who want to deploy these URLs elsewhere. # provided as a convenience to those who want to deploy these URLs elsewhere.
# This file is also used to provide a reliable view deployment for test purposes. # This file is also used to provide a reliable view deployment for test purposes.


from django.conf.urls.defaults import * from django.conf.urls import patterns


urlpatterns = patterns('', urlpatterns = patterns('',
(r'^login/$', 'django.contrib.auth.views.login'), (r'^login/$', 'django.contrib.auth.views.login'),
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/comments/urls.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import * from django.conf.urls import patterns, url


urlpatterns = patterns('django.contrib.comments.views', urlpatterns = patterns('django.contrib.comments.views',
url(r'^post/$', 'comments.post_comment', name='comments-post-comment'), url(r'^post/$', 'comments.post_comment', name='comments-post-comment'),
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/databrowse/urls.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import * from django.conf.urls import patterns
from django.contrib.databrowse import views from django.contrib.databrowse import views


# Note: The views in this URLconf all require a 'models' argument, # Note: The views in this URLconf all require a 'models' argument,
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/flatpages/tests/urls.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import * from django.conf.urls import patterns, include


# special urls for flatpage test cases # special urls for flatpage test cases
urlpatterns = patterns('', urlpatterns = patterns('',
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/flatpages/urls.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import * from django.conf.urls import patterns


urlpatterns = patterns('django.contrib.flatpages.views', urlpatterns = patterns('django.contrib.flatpages.views',
(r'^(?P<url>.*)$', 'flatpage'), (r'^(?P<url>.*)$', 'flatpage'),
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/formtools/tests/urls.py
Expand Up @@ -2,7 +2,7 @@
This is a URLconf to be loaded by tests.py. Add any URLs needed for tests only. This is a URLconf to be loaded by tests.py. Add any URLs needed for tests only.
""" """


from django.conf.urls.defaults import * from django.conf.urls import patterns, url
from django.contrib.formtools.tests import TestFormPreview, TestWizardClass from django.contrib.formtools.tests import TestFormPreview, TestWizardClass


from forms import (ContactWizard, Page1, Page2, Page3, TestForm, from forms import (ContactWizard, Page1, Page2, Page3, TestForm,
Expand Down
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import patterns, url from django.conf.urls import patterns, url
from django.contrib.formtools.tests.wizard.namedwizardtests.forms import ( from django.contrib.formtools.tests.wizard.namedwizardtests.forms import (
SessionContactWizard, CookieContactWizard, Page1, Page2, Page3, Page4) SessionContactWizard, CookieContactWizard, Page1, Page2, Page3, Page4)


Expand Down
2 changes: 1 addition & 1 deletion django/contrib/formtools/tests/wizard/wizardtests/urls.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import * from django.conf.urls import patterns, url
from django.contrib.formtools.tests.wizard.wizardtests.forms import ( from django.contrib.formtools.tests.wizard.wizardtests.forms import (
SessionContactWizard, CookieContactWizard, Page1, Page2, Page3, Page4) SessionContactWizard, CookieContactWizard, Page1, Page2, Page3, Page4)


Expand Down
2 changes: 1 addition & 1 deletion django/contrib/gis/tests/geoadmin/urls.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import * from django.conf.urls import patterns, include
from django.contrib import admin from django.contrib import admin


urlpatterns = patterns('', urlpatterns = patterns('',
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/gis/tests/geoapp/urls.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import * from django.conf.urls import patterns
from feeds import feed_dict from feeds import feed_dict


urlpatterns = patterns('', urlpatterns = patterns('',
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/messages/tests/urls.py
@@ -1,4 +1,4 @@
from django.conf.urls.defaults import * from django.conf.urls import patterns
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect, HttpResponse from django.http import HttpResponseRedirect, HttpResponse
Expand Down
2 changes: 1 addition & 1 deletion django/contrib/sitemaps/tests/urls.py
@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from django.conf.urls.defaults import * from django.conf.urls import patterns
from django.contrib.sitemaps import Sitemap, GenericSitemap, FlatPageSitemap from django.contrib.sitemaps import Sitemap, GenericSitemap, FlatPageSitemap
from django.contrib.auth.models import User from django.contrib.auth.models import User


Expand Down
6 changes: 6 additions & 0 deletions docs/internals/deprecation.txt
Expand Up @@ -243,6 +243,12 @@ their deprecation, as per the :ref:`deprecation policy
:mod:`django.contrib.gis.geoip` in 1.4 -- the shortcut in :mod:`django.contrib.gis.geoip` in 1.4 -- the shortcut in
:mod:`django.contrib.gis.utils` will be removed. :mod:`django.contrib.gis.utils` will be removed.


* In 1.4, functions :func:`~django.conf.urls.include`, :func:`~django.conf.urls.patterns`
and :func:`~django.conf.urls.url` plus :data:`~django.conf.urls.handler404`,
:data:`~django.conf.urls.handler500` were moved to :mod:`django.conf.urls`
from their previous location ``django.conf.urls.defaults``. This module
was deprecated at the same time and will be removed in this Django release.

2.0 2.0
--- ---


Expand Down
2 changes: 1 addition & 1 deletion docs/intro/overview.txt
Expand Up @@ -176,7 +176,7 @@ decouple URLs from Python code.
Here's what a URLconf might look like for the ``Reporter``/``Article`` Here's what a URLconf might look like for the ``Reporter``/``Article``
example above:: example above::


from django.conf.urls.defaults import * from django.conf.urls import patterns, url, include


urlpatterns = patterns('', urlpatterns = patterns('',
(r'^articles/(\d{4})/$', 'news.views.year_archive'), (r'^articles/(\d{4})/$', 'news.views.year_archive'),
Expand Down
2 changes: 1 addition & 1 deletion docs/intro/tutorial02.txt
Expand Up @@ -40,7 +40,7 @@ activate the admin site for your installation, do these three things:


.. parsed-literal:: .. parsed-literal::


from django.conf.urls.defaults import patterns, include, url from django.conf.urls import patterns, include, url


# Uncomment the next two lines to enable the admin: # Uncomment the next two lines to enable the admin:
**from django.contrib import admin** **from django.contrib import admin**
Expand Down

0 comments on commit 26b8122

Please sign in to comment.