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:
# 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,
RegexURLResolver, LocaleRegexURLResolver)
from django.core.exceptions import ImproperlyConfigured
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)
import warnings
warnings.warn("django.conf.urls.defaults is deprecated; use django.conf.urls instead",
PendingDeprecationWarning)

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.urls.defaults import patterns
from django.conf.urls import patterns
from django.core.urlresolvers import LocaleRegexURLResolver

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',
(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
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

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__()

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

def wrap(view):
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):
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 += patterns('',
Expand All @@ -199,7 +199,7 @@ def inner(request, *args, **kwargs):
return update_wrapper(inner, view)

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

if settings.DEBUG:
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

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)

def get_urls(self):
from django.conf.urls.defaults import patterns
from django.conf.urls import patterns
return patterns('',
(r'^(\d+)/password/$', self.admin_site.admin_view(self.user_change_password))
) + 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.urls import urlpatterns
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.
# 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('',
(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',
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

# 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
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',
(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.
"""

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

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 (
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 (
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

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

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.core.urlresolvers import reverse
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 django.conf.urls.defaults import *
from django.conf.urls import patterns
from django.contrib.sitemaps import Sitemap, GenericSitemap, FlatPageSitemap
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.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
---

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``
example above::

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

urlpatterns = patterns('',
(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::

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:
**from django.contrib import admin**
Expand Down

0 comments on commit 26b8122

Please sign in to comment.