[1.8.x] Fixed many spelling mistakes in code, comments, and docs.

Partial backport of 93452a70e8 from master
This commit is contained in:
Josh Soref 2015-12-02 23:55:50 +00:00 committed by Tim Graham
parent 2d321d2393
commit 751e5fcaf7
45 changed files with 71 additions and 70 deletions

View File

@ -16,7 +16,7 @@ def delete_selected(modeladmin, request, queryset):
"""
Default action which deletes the selected objects.
This action first displays a confirmation page whichs shows all the
This action first displays a confirmation page which shows all the
deleteable objects, or, if the user has no permission one of the related
childs (foreignkeys), a "permission denied" message.

View File

@ -13,7 +13,7 @@ class PermLookupDict(object):
return self.user.has_perm("%s.%s" % (self.app_label, perm_name))
def __iter__(self):
# To fix 'item in perms.someapp' and __getitem__ iteraction we need to
# To fix 'item in perms.someapp' and __getitem__ interaction we need to
# define __iter__. See #18979 for details.
raise TypeError("PermLookupDict is not iterable.")

View File

@ -51,7 +51,7 @@ class PostGISGeometryColumns(models.Model):
class PostGISSpatialRefSys(models.Model, SpatialRefSysMixin):
"""
The 'spatial_ref_sys' table from PostGIS. See the PostGIS
documentaiton at Ch. 4.2.1.
documentation at Ch. 4.2.1.
"""
srid = models.IntegerField(primary_key=True)
auth_name = models.CharField(max_length=256)

View File

@ -500,7 +500,7 @@ class GeoQuerySet(QuerySet):
SQL function to call.
settings:
Dictonary of internal settings to customize for the spatial procedure.
Dictionary of internal settings to customize for the spatial procedure.
Public Keyword Arguments:

View File

@ -3,7 +3,7 @@ from django.utils import six
class OGRGeomType(object):
"Encapulates OGR Geometry Types."
"Encapsulates OGR Geometry Types."
wkb25bit = -2147483648

View File

@ -44,7 +44,7 @@ class KMLSitemap(Sitemap):
def get_urls(self, page=1, site=None, protocol=None):
"""
This method is overrridden so the appropriate `geo_format` attribute
This method is overridden so the appropriate `geo_format` attribute
is placed on each URL element.
"""
urls = Sitemap.get_urls(self, page=page, site=site, protocol=protocol)

View File

@ -302,7 +302,7 @@ class BaseExpression(object):
Does this expression contain a reference to some of the
existing aggregates? If so, returns the aggregate and also
the lookup parts that *weren't* found. So, if
exsiting_aggregates = {'max_id': Max('id')}
existing_aggregates = {'max_id': Max('id')}
self.name = 'max_id'
queryset.filter(max_id__range=[10,100])
then this method will return Max('id') and those parts of the

View File

@ -841,7 +841,7 @@ def default_if_none(value, arg):
@register.filter(is_safe=False)
def divisibleby(value, arg):
"""Returns True if the value is devisible by the argument."""
"""Returns True if the value is divisible by the argument."""
return int(value) % int(arg) == 0

View File

@ -824,7 +824,7 @@ def do_for(parser, token):
than -- the following::
<ul>
{% if althete_list %}
{% if athlete_list %}
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}

View File

@ -118,7 +118,7 @@ div.admonition-philosophy { padding-left:65px; background:url(docicons-philosoph
div.admonition-behind-the-scenes { padding-left:65px; background:url(docicons-behindscenes.png) .8em .8em no-repeat;}
.admonition.warning { background:url(docicons-warning.png) .8em .8em no-repeat; border:1px solid #ffc83c;}
/*** versoinadded/changes ***/
/*** versionadded/changes ***/
div.versionadded, div.versionchanged { }
div.versionadded span.title, div.versionchanged span.title, span.versionmodified { font-weight: bold; }
div.versionadded, div.versionchanged, div.deprecated { color:#555; }

View File

@ -6,7 +6,7 @@
# This file is execfile()d with the current directory set to its containing dir.
#
# The contents of this file are pickled, so don't put values in the namespace
# that aren't pickleable (module imports are okay, they're removed automatically).
# that aren't picklable (module imports are okay, they're removed automatically).
#
# All configuration values have a default; values that are commented out
# serve to show the default.

View File

@ -823,7 +823,7 @@ This example illustrates all possible attributes and methods for a
def item_updateddate(self):
"""
Returns the updateddated for every item in the feed.
Returns the updateddate for every item in the feed.
"""
item_updateddate = datetime.datetime(2005, 5, 3) # Hard-coded updateddate.

View File

@ -451,6 +451,7 @@ pgAdmin
phishing
php
pickleable
picklable
picosecond
PIL
pingback

View File

@ -682,7 +682,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_add_row_selection(self):
"""
Ensure that the status line for selected rows gets updated correcly (#22038)
Ensure that the status line for selected rows gets updated correctly (#22038)
"""
self.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url,

View File

@ -1113,9 +1113,9 @@ class AggregationTests(TestCase):
in group by.
"""
qs = Book.objects.annotate(
acount=Count('authors')
account=Count('authors')
).filter(
acount=F('publisher__num_awards')
account=F('publisher__num_awards')
)
self.assertQuerysetEqual(
qs, ['Sams Teach Yourself Django in 24 Hours'],

View File

@ -304,7 +304,7 @@ class UserChangeFormTest(TestCase):
# Just check we can create it
MyUserForm({})
def test_unsuable_password(self):
def test_unusable_password(self):
user = User.objects.get(username='empty_password')
user.set_unusable_password()
user.save()

View File

@ -504,7 +504,7 @@ class LoginTest(AuthViewsTestCase):
for bad_url in ('http://example.com',
'http:///example.com',
'https://example.com',
'ftp://exampel.com',
'ftp://example.com',
'///example.com',
'//example.com',
'javascript:alert("XSS")'):
@ -525,7 +525,7 @@ class LoginTest(AuthViewsTestCase):
# These URLs *should* still pass the security check
for good_url in ('/view/?param=http://example.com',
'/view/?param=https://example.com',
'/view?param=ftp://exampel.com',
'/view?param=ftp://example.com',
'view/?param=//example.com',
'https://testserver/',
'HTTPS://testserver/',
@ -782,7 +782,7 @@ class LogoutTest(AuthViewsTestCase):
for bad_url in ('http://example.com',
'http:///example.com',
'https://example.com',
'ftp://exampel.com',
'ftp://example.com',
'///example.com',
'//example.com',
'javascript:alert("XSS")'):
@ -801,7 +801,7 @@ class LogoutTest(AuthViewsTestCase):
# These URLs *should* still pass the security check
for good_url in ('/view/?param=http://example.com',
'/view/?param=https://example.com',
'/view?param=ftp://exampel.com',
'/view?param=ftp://example.com',
'view/?param=//example.com',
'https://testserver/',
'HTTPS://testserver/',
@ -947,6 +947,6 @@ class UUIDUserTests(TestCase):
})
self.assertRedirects(response, user_change_url)
row = LogEntry.objects.latest('id')
self.assertEqual(row.user_id, 1) # harcoded in CustomUserAdmin.log_change()
self.assertEqual(row.user_id, 1) # hardcoded in CustomUserAdmin.log_change()
self.assertEqual(row.object_id, str(u.pk))
self.assertEqual(row.change_message, 'Changed password.')

View File

@ -224,7 +224,7 @@ class CheckStrictTransportSecurityTest(TestCase):
@override_settings(
MIDDLEWARE_CLASSES=[],
SECURE_HSTS_SECONDS=0)
def test_no_sts_no_middlware(self):
def test_no_sts_no_middleware(self):
"""
Don't warn if SECURE_HSTS_SECONDS isn't > 0 and SecurityMiddleware isn't
installed.
@ -258,7 +258,7 @@ class CheckStrictTransportSecuritySubdomainsTest(TestCase):
MIDDLEWARE_CLASSES=[],
SECURE_HSTS_INCLUDE_SUBDOMAINS=False,
SECURE_HSTS_SECONDS=3600)
def test_no_sts_subdomains_no_middlware(self):
def test_no_sts_subdomains_no_middleware(self):
"""
Don't warn if SecurityMiddleware isn't installed.
"""
@ -415,7 +415,7 @@ class CheckSSLRedirectTest(TestCase):
@override_settings(
MIDDLEWARE_CLASSES=[],
SECURE_SSL_REDIRECT=False)
def test_no_ssl_redirect_no_middlware(self):
def test_no_ssl_redirect_no_middleware(self):
"""
Don't warn if SECURE_SSL_REDIRECT is False and SecurityMiddleware isn't
installed.

View File

@ -1098,7 +1098,7 @@ class CaseExpressionTests(TestCase):
lambda x: (x, x.foo)
)
def test_join_promotion_multiple_annonations(self):
def test_join_promotion_multiple_annotations(self):
o = CaseTestModel.objects.create(integer=1, integer2=1, string='1')
# Testing that:
# 1. There isn't any object on the remote side of the fk_rel

View File

@ -517,7 +517,7 @@ class FormsTestCase(TestCase):
self.assertHTMLEqual(str(f['when']), '<input type="text" name="when_0" value="1992-01-01" id="id_when_0" /><input type="text" name="when_1" value="01:01" id="id_when_1" />')
self.assertHTMLEqual(f['when'].as_hidden(), '<input type="hidden" name="when_0" value="1992-01-01" id="id_when_0" /><input type="hidden" name="when_1" value="01:01" id="id_when_1" />')
def test_mulitple_choice_checkbox(self):
def test_multiple_choice_checkbox(self):
# MultipleChoiceField can also be used with the CheckboxSelectMultiple widget.
class SongForm(Form):
name = CharField()

View File

@ -173,7 +173,7 @@ class FormsModelTestCase(TestCase):
m.delete()
def test_boundary_conditions(self):
# Boundary conditions on a PostitiveIntegerField #########################
# Boundary conditions on a PositiveIntegerField #########################
class BoundaryForm(ModelForm):
class Meta:
model = BoundaryModel

View File

@ -309,7 +309,7 @@ class HttpResponseTests(unittest.TestCase):
h['Content-Disposition'] = 'attachment; filename="%s"' % f
# This one is triggering http://bugs.python.org/issue20747, that is Python
# will itself insert a newline in the header
h['Content-Disposition'] = 'attachement; filename="EdelRot_Blu\u0308te (3)-0.JPG"'
h['Content-Disposition'] = 'attachment; filename="EdelRot_Blu\u0308te (3)-0.JPG"'
def test_newlines_in_headers(self):
# Bug #10188: Do not allow newlines in headers (CR or LF)

View File

@ -9,6 +9,6 @@ dummy2 = _("This is another translatable string.")
# This file has a literal with plural forms. When processed first, makemessages
# shouldn't create a .po file with duplicate `Plural-Forms` headers
number = 3
dummuy3 = ungettext("%(number)s Foo", "%(number)s Foos", number) % {'number': number}
dummy3 = ungettext("%(number)s Foo", "%(number)s Foos", number) % {'number': number}
dummy4 = _('Size')

View File

@ -345,7 +345,7 @@ class FieldNamesTests(IsolatedModelsTestCase):
]
# Second error because the FK specified in the `through` model
# `m2msimple` has auto-genererated name longer than allowed.
# `m2msimple` has auto-generated name longer than allowed.
# There will be no check errors in the other M2M because it
# specifies db_column for the FK in `through` model even if the actual
# name is longer than the limits of the database.

View File

@ -346,7 +346,7 @@ class M2mThroughReferentialTests(TestCase):
[]
)
def test_self_referential_non_symmentrical_first_side(self):
def test_self_referential_non_symmetrical_first_side(self):
tony = PersonSelfRefM2M.objects.create(name="Tony")
chris = PersonSelfRefM2M.objects.create(name="Chris")
Friendship.objects.create(
@ -359,7 +359,7 @@ class M2mThroughReferentialTests(TestCase):
attrgetter("name")
)
def test_self_referential_non_symmentrical_second_side(self):
def test_self_referential_non_symmetrical_second_side(self):
tony = PersonSelfRefM2M.objects.create(name="Tony")
chris = PersonSelfRefM2M.objects.create(name="Chris")
Friendship.objects.create(
@ -371,7 +371,7 @@ class M2mThroughReferentialTests(TestCase):
[]
)
def test_self_referential_non_symmentrical_clear_first_side(self):
def test_self_referential_non_symmetrical_clear_first_side(self):
tony = PersonSelfRefM2M.objects.create(name="Tony")
chris = PersonSelfRefM2M.objects.create(name="Chris")
Friendship.objects.create(
@ -392,7 +392,7 @@ class M2mThroughReferentialTests(TestCase):
attrgetter("name")
)
def test_self_referential_symmentrical(self):
def test_self_referential_symmetrical(self):
tony = PersonSelfRefM2M.objects.create(name="Tony")
chris = PersonSelfRefM2M.objects.create(name="Chris")
Friendship.objects.create(

View File

@ -163,7 +163,7 @@ class CommonMiddlewareTest(TestCase):
request.urlconf = 'middleware.extra_urls'
r = CommonMiddleware().process_request(request)
self.assertIsNotNone(r,
"CommonMiddlware failed to return APPEND_SLASH redirect using request.urlconf")
"CommonMiddleware failed to return APPEND_SLASH redirect using request.urlconf")
self.assertEqual(r.status_code, 301)
self.assertEqual(r.url, 'http://testserver/customurlconf/slash/')
@ -199,7 +199,7 @@ class CommonMiddlewareTest(TestCase):
request.urlconf = 'middleware.extra_urls'
r = CommonMiddleware().process_request(request)
self.assertIsNotNone(r,
"CommonMiddlware failed to return APPEND_SLASH redirect using request.urlconf")
"CommonMiddleware failed to return APPEND_SLASH redirect using request.urlconf")
self.assertEqual(r.status_code, 301)
self.assertEqual(
r.url,

View File

@ -486,9 +486,9 @@ class WriterTests(TestCase):
# Yes, it doesn't make sense to use a class as a default for a
# CharField. It does make sense for custom fields though, for example
# an enumfield that takes the enum class as an argument.
class DeconstructableInstances(object):
class DeconstructibleInstances(object):
def deconstruct(self):
return ('DeconstructableInstances', [], {})
return ('DeconstructibleInstances', [], {})
string = MigrationWriter.serialize(models.CharField(default=DeconstructableInstances))[0]
self.assertEqual(string, "models.CharField(default=migrations.test_writer.DeconstructableInstances)")
string = MigrationWriter.serialize(models.CharField(default=DeconstructibleInstances))[0]
self.assertEqual(string, "models.CharField(default=migrations.test_writer.DeconstructibleInstances)")

View File

@ -248,7 +248,7 @@ if Image:
name = models.CharField(max_length=50)
mugshot = TestImageField(storage=temp_storage, upload_to='tests')
class AbsctractPersonWithHeight(models.Model):
class AbstractPersonWithHeight(models.Model):
"""
Abstract model that defines an ImageField with only one dimension field
to make sure the dimension update is correctly run on concrete subclass
@ -261,9 +261,9 @@ if Image:
class Meta:
abstract = True
class PersonWithHeight(AbsctractPersonWithHeight):
class PersonWithHeight(AbstractPersonWithHeight):
"""
Concrete model that subclass an abctract one with only on dimension
Concrete model that subclass an abstract one with only on dimension
field.
"""
name = models.CharField(max_length=50)
@ -295,7 +295,7 @@ if Image:
Model that:
* Defines two ImageFields
* Defines the height/width fields before the ImageFields
* Has a nullalble ImageField
* Has a nullable ImageField
"""
name = models.CharField(max_length=50)
mugshot_height = models.PositiveSmallIntegerField()

View File

@ -39,7 +39,7 @@ class DefaultRelatedNameTests(TestCase):
except AttributeError:
self.fail("Book should have a model_options_bookstores relation.")
def test_inheritance_with_overrided_default_related_name(self):
def test_inheritance_with_overridden_default_related_name(self):
try:
self.book.editor_stores
except AttributeError:

View File

@ -110,7 +110,7 @@ class ModelAdminTests(TestCase):
self.assertTrue(ma.lookup_allowed('name__nonexistent', 'test_value'))
def test_field_arguments(self):
# If we specify the fields argument, fieldsets_add and fielsets_change should
# If we specify the fields argument, fieldsets_add and fieldsets_change should
# just stick the fields into a formsets structure and return it.
class BandAdmin(ModelAdmin):
fields = ['name']

View File

@ -1,8 +1,8 @@
"""
Regression tests for proper working of ForeignKey(null=True). Tests these bugs:
* #7512: including a nullable foreign key reference in Meta ordering has un
xpected results
* #7512: including a nullable foreign key reference in Meta ordering has
unexpected results
"""
from __future__ import unicode_literals

View File

@ -29,7 +29,7 @@ class ProxyModelTests(TestCase):
DEFAULT_DB_ALIAS).as_sql()
self.assertEqual(my_person_sql, person_sql)
def test_inheretance_new_table(self):
def test_inheritance_new_table(self):
"""
The StatusPerson models should have its own table (it's using ORM-level
inheritance).

View File

@ -56,7 +56,7 @@ class Note(models.Model):
def __init__(self, *args, **kwargs):
super(Note, self).__init__(*args, **kwargs)
# Regression for #13227 -- having an attribute that
# is unpickleable doesn't stop you from cloning queries
# is unpicklable doesn't stop you from cloning queries
# that use objects of that type as an argument.
self.lock = threading.Lock()

View File

@ -1854,7 +1854,7 @@ class Queries6Tests(TestCase):
def test_tickets_8921_9188(self):
# Incorrect SQL was being generated for certain types of exclude()
# queries that crossed multi-valued relations (#8921, #9188 and some
# pre-emptively discovered cases).
# preemptively discovered cases).
self.assertQuerysetEqual(
PointerA.objects.filter(connection__pointerb__id=1),
@ -3086,7 +3086,7 @@ class NullJoinPromotionOrTest(TestCase):
p1 = Program.objects.create(identifier=i1)
c1 = Channel.objects.create(identifier=i1)
p2 = Program.objects.create(identifier=i2)
# Test OR + doubleneq. The expected result is that channel is LOUTER
# Test OR + doubleneg. The expected result is that channel is LOUTER
# joined, program INNER joined
qs1_filter = Identifier.objects.filter(
Q(program__id=p2.id, channel__id=c1.id)
@ -3173,7 +3173,7 @@ class JoinReuseTest(TestCase):
class DisjunctionPromotionTests(TestCase):
def test_disjuction_promotion_select_related(self):
def test_disjunction_promotion_select_related(self):
fk1 = FK1.objects.create(f1='f1', f2='f2')
basea = BaseA.objects.create(a=fk1)
qs = BaseA.objects.filter(Q(a=fk1) | Q(b=2))

View File

@ -59,7 +59,7 @@ class PickleabilityTestCase(TestCase):
def test_model_pickle(self):
"""
Test that a model not defined on module level is pickleable.
Test that a model not defined on module level is picklable.
"""
original = Container.SomeModel(pk=1)
dumped = pickle.dumps(original)

View File

@ -587,7 +587,7 @@ class HostValidationTests(SimpleTestCase):
'12.34.56.78:443',
'[2001:19f0:feee::dead:beef:cafe]',
'[2001:19f0:feee::dead:beef:cafe]:8080',
'xn--4ca9at.com', # Punnycode for öäü.com
'xn--4ca9at.com', # Punycode for öäü.com
'anything.multitenant.com',
'multitenant.com',
'insensitive.com',
@ -657,7 +657,7 @@ class HostValidationTests(SimpleTestCase):
'12.34.56.78:443',
'[2001:19f0:feee::dead:beef:cafe]',
'[2001:19f0:feee::dead:beef:cafe]:8080',
'xn--4ca9at.com', # Punnycode for öäü.com
'xn--4ca9at.com', # Punycode for öäü.com
]
for host in legit_hosts:
@ -703,7 +703,7 @@ class HostValidationTests(SimpleTestCase):
'example.com',
'12.34.56.78',
'[2001:19f0:feee::dead:beef:cafe]',
'xn--4ca9at.com', # Punnycode for öäü.com
'xn--4ca9at.com', # Punycode for öäü.com
]:
request = HttpRequest()
request.META = {'HTTP_HOST': host}

View File

@ -313,7 +313,7 @@ The end."""),
(im2m_obj, 470, M2MIntermediateData, None),
# testing post- and prereferences and extra fields
# testing post- and pre-references and extra fields
(im_obj, 480, Intermediate, {'right': 300, 'left': 470}),
(im_obj, 481, Intermediate, {'right': 300, 'left': 490}),
(im_obj, 482, Intermediate, {'right': 500, 'left': 470}),

View File

@ -168,7 +168,7 @@ class SignalTests(BaseSignalTest):
data.append(instance)
try:
c1 = Car.objects.create(make="Volkswagon", model="Passat")
c1 = Car.objects.create(make="Volkswagen", model="Passat")
self.assertEqual(data, [c1, c1])
finally:
signals.pre_save.disconnect(decorated_handler)

View File

@ -1,5 +1,5 @@
"""
A subset of the tests in tests/servers/tests exercicing
A subset of the tests in tests/servers/tests exercising
django.contrib.staticfiles.testing.StaticLiveServerTestCase instead of
django.test.LiveServerTestCase.
"""

View File

@ -166,7 +166,7 @@ class SimpleTemplateResponseTest(SimpleTestCase):
def test_pickling(self):
# Create a template response. The context is
# known to be unpickleable (e.g., a function).
# known to be unpicklable (e.g., a function).
response = SimpleTemplateResponse('first/test.html', {
'value': 123,
'fn': datetime.now,
@ -289,7 +289,7 @@ class TemplateResponseTest(SimpleTestCase):
def test_pickling(self):
# Create a template response. The context is
# known to be unpickleable (e.g., a function).
# known to be unpicklable (e.g., a function).
response = TemplateResponse(self.factory.get('/'),
'first/test.html', {
'value': 123,

View File

@ -155,11 +155,11 @@ class DiscoverRunnerTest(TestCase):
self.assertIn('test_2', suite[8].id(),
msg="Methods of unittest cases should be reversed.")
def test_overrideable_test_suite(self):
def test_overridable_test_suite(self):
self.assertEqual(DiscoverRunner().test_suite, TestSuite)
def test_overrideable_test_runner(self):
def test_overridable_test_runner(self):
self.assertEqual(DiscoverRunner().test_runner, TextTestRunner)
def test_overrideable_test_loader(self):
def test_overridable_test_loader(self):
self.assertEqual(DiscoverRunner().test_loader, defaultTestLoader)

View File

@ -155,7 +155,7 @@ class LegacyDatabaseTests(TestCase):
self.assertEqual(event.dt.replace(tzinfo=ICT), dt)
@skipIfDBFeature('supports_timezones')
def test_aware_datetime_unspported(self):
def test_aware_datetime_unsupported(self):
dt = datetime.datetime(2011, 9, 1, 13, 20, 30, tzinfo=EAT)
with self.assertRaises(ValueError):
Event.objects.create(dt=dt)

View File

@ -129,7 +129,7 @@ class Unmanaged1(models.Model):
db_table = "unmanaged_models_proxy1"
# Unmanged with an m2m to unmanaged: the intermediary table won't be created.
# Unmanaged with an m2m to unmanaged: the intermediary table won't be created.
class Unmanaged2(models.Model):
mm = models.ManyToManyField(Unmanaged1)

View File

@ -29,7 +29,7 @@ Fragments
<center> ![image](http://iontech.files.wordpress.com/2013/01/androidfragmentation1-264x300.png) </center>
Fragments encompass both layout resource and Java source. Hence, unlike ``, they allow us to reuse the View components along with their functionality, if needed.
Fragments were first introduced in Honeycomb(API 11), living under the `android.app` package.
**Note**: API 11 implies that Fragments have no support for devices less than Honeycomb and, for the record, as of writing this post, [more than 50% of Android devices worldwide run versions of Android below Honeycomb](http://developer.android.com/about/dashboards/index.html). Developer dissapointed? You don't have to be, cause google has been cautious enough to add the Fragment APIs to the support library. Yay!
**Note**: API 11 implies that Fragments have no support for devices less than Honeycomb and, for the record, as of writing this post, [more than 50% of Android devices worldwide run versions of Android below Honeycomb](http://developer.android.com/about/dashboards/index.html). Developer disappointed? You don't have to be, cause google has been cautious enough to add the Fragment APIs to the support library. Yay!
In the support library Fragment APIs sit in the `android.support.v4.app` package. This post assumes that your `minSdk` support is below API 11. Hence we concentrate on the Fragment APIs of the support library.

View File

@ -100,7 +100,7 @@ class TestUtilsHttp(unittest.TestCase):
for bad_url in ('http://example.com',
'http:///example.com',
'https://example.com',
'ftp://exampel.com',
'ftp://example.com',
r'\\example.com',
r'\\\example.com',
r'/\\/example.com',
@ -121,7 +121,7 @@ class TestUtilsHttp(unittest.TestCase):
self.assertFalse(http.is_safe_url(bad_url, host='testserver'), "%s should be blocked" % bad_url)
for good_url in ('/view/?param=http://example.com',
'/view/?param=https://example.com',
'/view?param=ftp://exampel.com',
'/view?param=ftp://example.com',
'view/?param=//example.com',
'https://testserver/',
'HTTPS://testserver/',