Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge branch 'master' into schema-alteration

  • Loading branch information...
commit 828d691f62814edf3e93d981c0f991a48781fb79 2 parents ca9c3cd + 5999eb4
@andrewgodwin andrewgodwin authored
Showing with 414 additions and 415 deletions.
  1. +6 −5 django/contrib/auth/tests/models.py
  2. +5 −5 django/contrib/localflavor/hr/forms.py
  3. +11 −11 django/contrib/localflavor/ro/forms.py
  4. +1 −1  django/core/cache/backends/memcached.py
  5. +1 −1  django/core/mail/backends/console.py
  6. +6 −1 django/db/backends/creation.py
  7. +1 −4 django/db/backends/sqlite3/base.py
  8. +3 −9 django/db/models/sql/compiler.py
  9. +3 −2 django/db/models/sql/query.py
  10. +18 −18 django/forms/formsets.py
  11. +2 −6 django/forms/widgets.py
  12. +2 −3 django/http/multipartparser.py
  13. +1 −1  django/test/testcases.py
  14. +7 −0 django/utils/six.py
  15. +1 −1  docs/intro/tutorial03.txt
  16. +13 −13 docs/ref/contrib/gis/install.txt
  17. +2 −3 docs/ref/forms/validation.txt
  18. +4 −0 docs/ref/forms/widgets.txt
  19. +4 −3 docs/ref/models/options.txt
  20. +1 −2  docs/ref/models/querysets.txt
  21. +1 −1  docs/releases/1.3.txt
  22. +2 −2 docs/topics/db/queries.txt
  23. +13 −5 docs/topics/python3.txt
  24. +26 −6 docs/topics/security.txt
  25. +14 −14 tests/modeltests/basic/tests.py
  26. +4 −3 tests/modeltests/empty/tests.py
  27. +17 −17 tests/modeltests/fixtures/tests.py
  28. +2 −1  tests/modeltests/many_to_many/tests.py
  29. +1 −1  tests/modeltests/many_to_one/tests.py
  30. +1 −1  tests/modeltests/raw_query/tests.py
  31. +2 −1  tests/modeltests/update_only_fields/tests.py
  32. +2 −1  tests/modeltests/validation/test_error_messages.py
  33. +4 −3 tests/regressiontests/admin_filters/tests.py
  34. +3 −3 tests/regressiontests/admin_scripts/tests.py
  35. +1 −1  tests/regressiontests/backends/tests.py
  36. +3 −4 tests/regressiontests/cache/tests.py
  37. +1 −1  tests/regressiontests/file_storage/tests.py
  38. +7 −9 tests/regressiontests/file_uploads/tests.py
  39. +20 −24 tests/regressiontests/fixtures_regress/tests.py
  40. +3 −3 tests/regressiontests/forms/tests/fields.py
  41. +3 −7 tests/regressiontests/forms/tests/widgets.py
  42. +1 −3 tests/regressiontests/handlers/tests.py
  43. +5 −4 tests/regressiontests/i18n/commands/compilation.py
  44. +2 −2 tests/regressiontests/inline_formsets/tests.py
  45. +17 −15 tests/regressiontests/localflavor/tr/tests.py
  46. +3 −2 tests/regressiontests/m2m_regress/tests.py
  47. +3 −2 tests/regressiontests/many_to_one_regress/tests.py
  48. +64 −64 tests/regressiontests/modeladmin/tests.py
  49. +1 −4 tests/regressiontests/queries/tests.py
  50. +12 −10 tests/regressiontests/settings_tests/tests.py
  51. +34 −36 tests/regressiontests/signals_regress/tests.py
  52. +1 −1  tests/regressiontests/staticfiles_tests/tests.py
  53. +26 −25 tests/regressiontests/templates/custom.py
  54. +6 −6 tests/regressiontests/templates/loaders.py
  55. +3 −3 tests/regressiontests/test_utils/tests.py
  56. +7 −15 tests/regressiontests/transactions_regress/tests.py
  57. +4 −4 tests/regressiontests/urlpatterns_reverse/tests.py
  58. +0 −18 tests/regressiontests/utils/crypto.py
  59. +3 −4 tests/regressiontests/wsgi/tests.py
View
11 django/contrib/auth/tests/models.py
@@ -1,8 +1,9 @@
from django.conf import settings
+from django.contrib.auth.models import (Group, User, SiteProfileNotAvailable,
+ UserManager)
from django.test import TestCase
from django.test.utils import override_settings
-from django.contrib.auth.models import (Group, User,
- SiteProfileNotAvailable, UserManager)
+from django.utils import six
@override_settings(USE_TZ=False, AUTH_PROFILE_MODULE='')
@@ -13,19 +14,19 @@ def test_site_profile_not_available(self):
# calling get_profile without AUTH_PROFILE_MODULE set
del settings.AUTH_PROFILE_MODULE
- with self.assertRaisesRegexp(SiteProfileNotAvailable,
+ with six.assertRaisesRegex(self, SiteProfileNotAvailable,
"You need to set AUTH_PROFILE_MODULE in your project"):
user.get_profile()
# Bad syntax in AUTH_PROFILE_MODULE:
settings.AUTH_PROFILE_MODULE = 'foobar'
- with self.assertRaisesRegexp(SiteProfileNotAvailable,
+ with six.assertRaisesRegex(self, SiteProfileNotAvailable,
"app_label and model_name should be separated by a dot"):
user.get_profile()
# module that doesn't exist
settings.AUTH_PROFILE_MODULE = 'foo.bar'
- with self.assertRaisesRegexp(SiteProfileNotAvailable,
+ with six.assertRaisesRegex(self, SiteProfileNotAvailable,
"Unable to load the profile model"):
user.get_profile()
View
10 django/contrib/localflavor/hr/forms.py
@@ -4,6 +4,7 @@
"""
from __future__ import absolute_import, unicode_literals
+import datetime
import re
from django.contrib.localflavor.hr.hr_choices import (
@@ -91,17 +92,16 @@ def clean(self, value):
dd = int(matches.group('dd'))
mm = int(matches.group('mm'))
yyy = int(matches.group('yyy'))
- import datetime
try:
- datetime.date(yyy,mm,dd)
- except:
+ datetime.date(yyy, mm, dd)
+ except ValueError:
raise ValidationError(self.error_messages['date'])
# Validate checksum.
k = matches.group('k')
checksum = 0
- for i,j in zip(range(7,1,-1),range(6)):
- checksum+=i*(int(value[j])+int(value[13-i]))
+ for i, j in zip(range(7, 1, -1), range(6)):
+ checksum += i * (int(value[j]) + int(value[13 - i]))
m = 11 - checksum % 11
if m == 10:
raise ValidationError(self.error_messages['invalid'])
View
22 django/contrib/localflavor/ro/forms.py
@@ -4,6 +4,8 @@
"""
from __future__ import absolute_import, unicode_literals
+import datetime
+
from django.contrib.localflavor.ro.ro_counties import COUNTIES_CHOICES
from django.core.validators import EMPTY_VALUES
from django.forms import ValidationError, Field, RegexField, Select
@@ -69,10 +71,9 @@ def clean(self, value):
if value in EMPTY_VALUES:
return ''
# check birthdate digits
- import datetime
try:
- datetime.date(int(value[1:3]),int(value[3:5]),int(value[5:7]))
- except:
+ datetime.date(int(value[1:3]), int(value[3:5]), int(value[5:7]))
+ except ValueError:
raise ValidationError(self.error_messages['invalid'])
# checksum
key = '279146358279'
@@ -118,7 +119,7 @@ def clean(self, value):
# search for county name
normalized_CC = []
for entry in COUNTIES_CHOICES:
- normalized_CC.append((entry[0],entry[1].upper()))
+ normalized_CC.append((entry[0], entry[1].upper()))
for entry in normalized_CC:
if entry[1] == value:
return entry[0]
@@ -153,8 +154,8 @@ def clean(self, value):
value = super(ROIBANField, self).clean(value)
if value in EMPTY_VALUES:
return ''
- value = value.replace('-','')
- value = value.replace(' ','')
+ value = value.replace('-', '')
+ value = value.replace(' ', '')
value = value.upper()
if value[0:2] != 'RO':
raise ValidationError(self.error_messages['invalid'])
@@ -185,10 +186,10 @@ def clean(self, value):
value = super(ROPhoneNumberField, self).clean(value)
if value in EMPTY_VALUES:
return ''
- value = value.replace('-','')
- value = value.replace('(','')
- value = value.replace(')','')
- value = value.replace(' ','')
+ value = value.replace('-', '')
+ value = value.replace('(', '')
+ value = value.replace(')', '')
+ value = value.replace(' ', '')
if len(value) != 10:
raise ValidationError(self.error_messages['invalid'])
return value
@@ -202,4 +203,3 @@ class ROPostalCodeField(RegexField):
def __init__(self, max_length=6, min_length=6, *args, **kwargs):
super(ROPostalCodeField, self).__init__(r'^[0-9][0-8][0-9]{4}$',
max_length, min_length, *args, **kwargs)
-
View
2  django/core/cache/backends/memcached.py
@@ -141,7 +141,7 @@ def __init__(self, server, params):
)
try:
import memcache
- except:
+ except ImportError:
raise InvalidCacheBackendError(
"Memcached cache backend requires either the 'memcache' or 'cmemcache' library"
)
View
2  django/core/mail/backends/console.py
@@ -21,7 +21,7 @@ def send_messages(self, email_messages):
stream_created = self.open()
for message in email_messages:
self.stream.write('%s\n' % message.message().as_string())
- self.stream.write('-'*79)
+ self.stream.write('-' * 79)
self.stream.write('\n')
self.stream.flush() # flush after each message
if stream_created:
View
7 django/db/backends/creation.py
@@ -1,8 +1,10 @@
+import hashlib
import sys
import time
from django.conf import settings
from django.db.utils import load_backend
+from django.utils.encoding import force_bytes
from django.utils.six.moves import input
# The prefix to put on the default database name when creating
@@ -29,7 +31,10 @@ def _digest(cls, *args):
Generates a 32-bit digest of a set of arguments that can be used to
shorten identifying names.
"""
- return '%x' % (abs(hash(args)) % 4294967296) # 2**32
+ h = hashlib.md5()
+ for arg in args:
+ h.update(force_bytes(arg))
+ return h.hexdigest()[:8]
def sql_create_model(self, model, style, known_models=set()):
"""
View
5 django/db/backends/sqlite3/base.py
@@ -419,7 +419,4 @@ def _sqlite_format_dtdelta(dt, conn, days, secs, usecs):
return str(dt)
def _sqlite_regexp(re_pattern, re_string):
- try:
- return bool(re.search(re_pattern, re_string))
- except:
- return False
+ return bool(re.search(re_pattern, re_string))
View
12 django/db/models/sql/compiler.py
@@ -4,7 +4,8 @@
from django.db import transaction
from django.db.backends.util import truncate_name
from django.db.models.query_utils import select_related_descend
-from django.db.models.sql.constants import *
+from django.db.models.sql.constants import (SINGLE, MULTI, ORDER_DIR,
+ LOOKUP_SEP, GET_ITERATOR_CHUNK_SIZE)
from django.db.models.sql.datastructures import EmptyResultSet
from django.db.models.sql.expressions import SQLEvaluator
from django.db.models.sql.query import get_order_dir, Query
@@ -811,7 +812,7 @@ def execute_sql(self, result_type=MULTI):
raise EmptyResultSet
except EmptyResultSet:
if result_type == MULTI:
- return empty_iter()
+ return iter([])
else:
return
@@ -1088,13 +1089,6 @@ def results_iter(self):
yield date
-def empty_iter():
- """
- Returns an iterator containing no results.
- """
- yield next(iter([]))
-
-
def order_modified_iter(cursor, trim, sentinel):
"""
Yields blocks of rows from a cursor. We use this iterator in the special
View
5 django/db/models/sql/query.py
@@ -17,9 +17,9 @@
from django.db.models import signals
from django.db.models.expressions import ExpressionNode
from django.db.models.fields import FieldDoesNotExist
-from django.db.models.query_utils import InvalidQuery
from django.db.models.sql import aggregates as base_aggregates_module
-from django.db.models.sql.constants import *
+from django.db.models.sql.constants import (QUERY_TERMS, LOOKUP_SEP, ORDER_DIR,
+ SINGLE, ORDER_PATTERN, JoinInfo)
from django.db.models.sql.datastructures import EmptyResultSet, Empty, MultiJoin
from django.db.models.sql.expressions import SQLEvaluator
from django.db.models.sql.where import (WhereNode, Constraint, EverythingNode,
@@ -28,6 +28,7 @@
__all__ = ['Query', 'RawQuery']
+
class RawQuery(object):
"""
A single raw SQL query
View
36 django/forms/formsets.py
@@ -71,7 +71,8 @@ def __bool__(self):
return True
__nonzero__ = __bool__ # Python 2
- def _management_form(self):
+ @property
+ def management_form(self):
"""Returns the ManagementForm instance for this FormSet."""
if self.is_bound:
form = ManagementForm(self.data, auto_id=self.auto_id, prefix=self.prefix)
@@ -84,7 +85,6 @@ def _management_form(self):
MAX_NUM_FORM_COUNT: self.max_num
})
return form
- management_form = property(_management_form)
def total_form_count(self):
"""Returns the total number of forms in this FormSet."""
@@ -140,17 +140,18 @@ def _construct_form(self, i, **kwargs):
self.add_fields(form, i)
return form
- def _get_initial_forms(self):
+ @property
+ def initial_forms(self):
"""Return a list of all the initial forms in this formset."""
return self.forms[:self.initial_form_count()]
- initial_forms = property(_get_initial_forms)
- def _get_extra_forms(self):
+ @property
+ def extra_forms(self):
"""Return a list of all the extra forms in this formset."""
return self.forms[self.initial_form_count():]
- extra_forms = property(_get_extra_forms)
- def _get_empty_form(self, **kwargs):
+ @property
+ def empty_form(self, **kwargs):
defaults = {
'auto_id': self.auto_id,
'prefix': self.add_prefix('__prefix__'),
@@ -160,19 +161,19 @@ def _get_empty_form(self, **kwargs):
form = self.form(**defaults)
self.add_fields(form, None)
return form
- empty_form = property(_get_empty_form)
# Maybe this should just go away?
- def _get_cleaned_data(self):
+ @property
+ def cleaned_data(self):
"""
Returns a list of form.cleaned_data dicts for every form in self.forms.
"""
if not self.is_valid():
raise AttributeError("'%s' object has no attribute 'cleaned_data'" % self.__class__.__name__)
return [form.cleaned_data for form in self.forms]
- cleaned_data = property(_get_cleaned_data)
- def _get_deleted_forms(self):
+ @property
+ def deleted_forms(self):
"""
Returns a list of forms that have been marked for deletion. Raises an
AttributeError if deletion is not allowed.
@@ -191,9 +192,9 @@ def _get_deleted_forms(self):
if self._should_delete_form(form):
self._deleted_form_indexes.append(i)
return [self.forms[i] for i in self._deleted_form_indexes]
- deleted_forms = property(_get_deleted_forms)
- def _get_ordered_forms(self):
+ @property
+ def ordered_forms(self):
"""
Returns a list of form in the order specified by the incoming data.
Raises an AttributeError if ordering is not allowed.
@@ -228,7 +229,6 @@ def compare_ordering_key(k):
# Return a list of form.cleaned_data dicts in the order specified by
# the form data.
return [self.forms[i[0]] for i in self._ordering]
- ordered_forms = property(_get_ordered_forms)
@classmethod
def get_default_prefix(cls):
@@ -244,14 +244,14 @@ def non_form_errors(self):
return self._non_form_errors
return self.error_class()
- def _get_errors(self):
+ @property
+ def errors(self):
"""
Returns a list of form.errors for every form in self.forms.
"""
if self._errors is None:
self.full_clean()
return self._errors
- errors = property(_get_errors)
def _should_delete_form(self, form):
"""
@@ -332,14 +332,14 @@ def is_multipart(self):
"""
return self.forms and self.forms[0].is_multipart()
- def _get_media(self):
+ @property
+ def media(self):
# All the forms on a FormSet are the same, so you only need to
# interrogate the first form for media.
if self.forms:
return self.forms[0].media
else:
return Media()
- media = property(_get_media)
def as_table(self):
"Returns this formset rendered as HTML <tr>s -- excluding the <table></table>."
View
8 django/forms/widgets.py
@@ -507,11 +507,7 @@ def __init__(self, attrs=None, check_test=None):
def render(self, name, value, attrs=None):
final_attrs = self.build_attrs(attrs, type='checkbox', name=name)
- try:
- result = self.check_test(value)
- except: # Silently catch exceptions
- result = False
- if result:
+ if self.check_test(value):
final_attrs['checked'] = 'checked'
if not (value is True or value is False or value is None or value == ''):
# Only add the 'value' attribute if a value is non-empty.
@@ -525,7 +521,7 @@ def value_from_datadict(self, data, files, name):
return False
value = data.get(name)
# Translate true and false strings to boolean values.
- values = {'true': True, 'false': False}
+ values = {'true': True, 'false': False}
if isinstance(value, six.string_types):
value = values.get(value.lower(), value)
return value
View
5 django/http/multipartparser.py
@@ -68,11 +68,10 @@ def __init__(self, META, input_data, upload_handlers, encoding=None):
if not boundary or not cgi.valid_boundary(boundary):
raise MultiPartParserError('Invalid boundary in multipart: %s' % boundary)
-
# Content-Length should contain the length of the body we are about
# to receive.
try:
- content_length = int(META.get('HTTP_CONTENT_LENGTH', META.get('CONTENT_LENGTH',0)))
+ content_length = int(META.get('HTTP_CONTENT_LENGTH', META.get('CONTENT_LENGTH', 0)))
except (ValueError, TypeError):
content_length = 0
@@ -178,7 +177,7 @@ def parse(self):
content_type = meta_data.get('content-type', ('',))[0].strip()
try:
- charset = meta_data.get('content-type', (0,{}))[1].get('charset', None)
+ charset = meta_data.get('content-type', (0, {}))[1].get('charset', None)
except:
charset = None
View
2  django/test/testcases.py
@@ -358,7 +358,7 @@ def assertRaisesMessage(self, expected_exception, expected_message,
args: Extra args.
kwargs: Extra kwargs.
"""
- return self.assertRaisesRegexp(expected_exception,
+ return six.assertRaisesRegex(self, expected_exception,
re.escape(expected_message), callable_obj, *args, **kwargs)
def assertFieldOutput(self, fieldclass, valid, invalid, field_args=None,
View
7 django/utils/six.py
@@ -370,13 +370,20 @@ def with_metaclass(meta, base=object):
if PY3:
_iterlists = "lists"
+ _assertRaisesRegex = "assertRaisesRegex"
else:
_iterlists = "iterlists"
+ _assertRaisesRegex = "assertRaisesRegexp"
+
def iterlists(d):
"""Return an iterator over the values of a MultiValueDict."""
return getattr(d, _iterlists)()
+def assertRaisesRegex(self, *args, **kwargs):
+ return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
add_move(MovedModule("_dummy_thread", "dummy_thread"))
add_move(MovedModule("_thread", "thread"))
View
2  docs/intro/tutorial03.txt
@@ -517,7 +517,7 @@ URLconf by removing the leading "polls/" from each line, and removing the
lines registering the admin site. Your ``polls/urls.py`` file should now look like
this::
- from django.conf.urls import patterns, include, url
+ from django.conf.urls import patterns, url
urlpatterns = patterns('polls.views',
url(r'^$', 'index'),
View
26 docs/ref/contrib/gis/install.txt
@@ -80,7 +80,7 @@ geospatial libraries:
Program Description Required Supported Versions
======================== ==================================== ================================ ==========================
:ref:`GEOS <ref-geos>` Geometry Engine Open Source Yes 3.3, 3.2, 3.1, 3.0
-`PROJ.4`_ Cartographic Projections library Yes (PostgreSQL and SQLite only) 4.7, 4.6, 4.5, 4.4
+`PROJ.4`_ Cartographic Projections library Yes (PostgreSQL and SQLite only) 4.8, 4.7, 4.6, 4.5, 4.4
:ref:`GDAL <ref-gdal>` Geospatial Data Abstraction Library No (but, required for SQLite) 1.9, 1.8, 1.7, 1.6, 1.5
:ref:`GeoIP <ref-geoip>` IP-based geolocation library No 1.4
`PostGIS`__ Spatial extensions for PostgreSQL Yes (PostgreSQL only) 1.5, 1.4, 1.3
@@ -140,16 +140,16 @@ internal geometry representation used by GeoDjango (it's behind the "lazy"
geometries). Specifically, the C API library is called (e.g., ``libgeos_c.so``)
directly from Python using ctypes.
-First, download GEOS 3.3.0 from the refractions Web site and untar the source
+First, download GEOS 3.3.5 from the refractions Web site and untar the source
archive::
- $ wget http://download.osgeo.org/geos/geos-3.3.0.tar.bz2
- $ tar xjf geos-3.3.0.tar.bz2
+ $ wget http://download.osgeo.org/geos/geos-3.3.5.tar.bz2
+ $ tar xjf geos-3.3.5.tar.bz2
Next, change into the directory where GEOS was unpacked, run the configure
script, compile, and install::
- $ cd geos-3.3.0
+ $ cd geos-3.3.5
$ ./configure
$ make
$ sudo make install
@@ -203,15 +203,15 @@ reference systems.
First, download the PROJ.4 source code and datum shifting files [#]_::
- $ wget http://download.osgeo.org/proj/proj-4.7.0.tar.gz
- $ wget http://download.osgeo.org/proj/proj-datumgrid-1.5.zip
+ $ wget http://download.osgeo.org/proj/proj-4.8.0.tar.gz
+ $ wget http://download.osgeo.org/proj/proj-datumgrid-1.5.tar.gz
Next, untar the source code archive, and extract the datum shifting files in the
``nad`` subdirectory. This must be done *prior* to configuration::
- $ tar xzf proj-4.7.0.tar.gz
- $ cd proj-4.7.0/nad
- $ unzip ../../proj-datumgrid-1.5.zip
+ $ tar xzf proj-4.8.0.tar.gz
+ $ cd proj-4.8.0/nad
+ $ tar xzf ../../proj-datumgrid-1.5.tar.gz
$ cd ..
Finally, configure, make and install PROJ.4::
@@ -239,9 +239,9 @@ installed prior to building PostGIS.
First download the source archive, and extract::
- $ wget http://postgis.refractions.net/download/postgis-1.5.2.tar.gz
- $ tar xzf postgis-1.5.2.tar.gz
- $ cd postgis-1.5.2
+ $ wget http://postgis.refractions.net/download/postgis-1.5.5.tar.gz
+ $ tar xzf postgis-1.5.5.tar.gz
+ $ cd postgis-1.5.5
Next, configure, make and install PostGIS::
View
5 docs/ref/forms/validation.txt
@@ -70,9 +70,8 @@ overridden:
formfield-specific piece of validation and, possibly,
cleaning/normalizing the data.
- Just like the general field ``clean()`` method, above, this method
- should return the cleaned data, regardless of whether it changed
- anything or not.
+ This method should return the cleaned value obtained from cleaned_data,
+ regardless of whether it changed anything or not.
* The Form subclass's ``clean()`` method. This method can perform
any validation that requires access to multiple fields from the form at
View
4 docs/ref/forms/widgets.txt
@@ -310,6 +310,10 @@ commonly used groups of widgets:
A callable that takes the value of the CheckBoxInput and returns
``True`` if the checkbox should be checked for that value.
+ .. versionchanged:: 1.5
+ Exceptions from ``check_test`` used to be silenced by its caller,
+ this is no longer the case, they will propagate upwards.
+
``Select``
~~~~~~~~~~
View
7 docs/ref/models/options.txt
@@ -83,9 +83,10 @@ Django quotes column and table names behind the scenes.
.. attribute:: Options.get_latest_by
- The name of a :class:`DateField` or :class:`DateTimeField` in the model.
- This specifies the default field to use in your model :class:`Manager`'s
- :class:`~QuerySet.latest` method.
+ The name of an orderable field in the model, typically a :class:`DateField`,
+ :class:`DateTimeField`, or :class:`IntegerField`. This specifies the default
+ field to use in your model :class:`Manager`'s :class:`~QuerySet.latest`
+ method.
Example::
View
3  docs/ref/models/querysets.txt
@@ -2064,7 +2064,7 @@ Note this is only available in MySQL and requires direct manipulation of the
database to add the full-text index. By default Django uses BOOLEAN MODE for
full text searches. See the `MySQL documentation`_ for additional details.
-.. _MySQL documentation: http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html>
+.. _MySQL documentation: http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html
.. fieldlookup:: regex
@@ -2236,4 +2236,3 @@ Variance
extension.
.. _SQLite documentation: http://www.sqlite.org/contrib
-
View
2  docs/releases/1.3.txt
@@ -587,7 +587,7 @@ gettext domain):
ones listed later.
* The ``locale`` subdirectory of the directory containing the settings, that
- usually coincides with and is know as the *project directory* is being
+ usually coincides with and is known as the *project directory* is being
deprecated in this release as a source of translations. (the precedence of
these translations is intermediate between applications and :setting:`LOCALE_PATHS`
translations). See the `corresponding deprecated features section`_
View
4 docs/topics/db/queries.txt
@@ -235,14 +235,14 @@ refinements together. For example::
... ).exclude(
... pub_date__gte=datetime.now()
... ).filter(
- ... pub_date__gte=datetime(2005, 1, 1)
+ ... pub_date__gte=datetime(2005, 1, 30)
... )
This takes the initial :class:`~django.db.models.query.QuerySet` of all entries
in the database, adds a filter, then an exclusion, then another filter. The
final result is a :class:`~django.db.models.query.QuerySet` containing all
entries with a headline that starts with "What", that were published between
-January 1, 2005, and the current day.
+January 30, 2005, and the current day.
.. _filtered-querysets-are-unique:
View
18 docs/topics/python3.txt
@@ -25,10 +25,11 @@ free to chose another strategy for your own code, especially if you don't need
to stay compatible with Python 2. But authors of pluggable applications are
encouraged to use the same porting strategy as Django itself.
-Writing compatible code is much easier if you target Python ≥ 2.6. You will
-most likely take advantage of the compatibility functions introduced in Django
-1.5, like :mod:`django.utils.six`, so your application will also require
-Django ≥ 1.5.
+Writing compatible code is much easier if you target Python ≥ 2.6. Django 1.5
+introduces compatibility tools such as :mod:`django.utils.six`. For
+convenience, forwards-compatible aliases were introduced in Django 1.4.2. If
+your application takes advantage of these tools, it will require Django ≥
+1.4.2.
Obviously, writing compatible source code adds some overhead, and that can
cause frustration. Django's developers have found that attempting to write
@@ -102,6 +103,8 @@ Old name New name
For backwards compatibility, the old names still work on Python 2. Under
Python 3, ``smart_str`` is an alias for ``smart_text``.
+For forwards compatibility, the new names work as of Django 1.4.2.
+
.. note::
:mod:`django.utils.encoding` was deeply refactored in Django 1.5 to
@@ -126,6 +129,8 @@ For backwards compatibility, the old names still work on Python 2. Under
Python 3, ``EscapeString`` and ``SafeString`` are aliases for ``EscapeText``
and ``SafeText`` respectively.
+For forwards compatibility, the new names work as of Django 1.4.2.
+
:meth:`__str__` and :meth:`__unicode__` methods
-----------------------------------------------
@@ -166,6 +171,8 @@ On Python 3, the decorator is a no-op. On Python 2, it defines appropriate
This technique is the best match for Django's porting philosophy.
+For forwards compatibility, this decorator is available as of Django 1.4.2.
+
Finally, note that :meth:`__repr__` must return a :class:`str` on all versions
of Python.
@@ -317,7 +324,8 @@ Writing compatible code with six
six_ is the canonical compatibility library for supporting Python 2 and 3 in
a single codebase. Read its documentation!
-:mod:`six` is bundled with Django: you can import it as :mod:`django.utils.six`.
+:mod`six` is bundled with Django as of version 1.4.2. You can import it as
+:mod`django.utils.six`.
Here are the most common changes required to write compatible code.
View
32 docs/topics/security.txt
@@ -76,9 +76,17 @@ POST to your Web site and have another logged in user unwittingly submit that
form. The malicious user would have to know the nonce, which is user specific
(using a cookie).
+When deployed with :ref:`HTTPS <security-recommendation-ssl>`,
+``CsrfViewMiddleware`` will check that the HTTP referer header is set to a
+URL on the same origin (including subdomain and port). Because HTTPS
+provides additional security, it is imperative to ensure connections use HTTPS
+where it is available by forwarding insecure connection requests and using
+HSTS for supported browsers.
+
Be very careful with marking views with the ``csrf_exempt`` decorator unless
it is absolutely necessary.
+
SQL injection protection
========================
@@ -112,6 +120,8 @@ The middleware is strongly recommended for any site that does not need to have
its pages wrapped in a frame by third party sites, or only needs to allow that
for a small section of the site.
+.. _security-recommendation-ssl:
+
SSL/HTTPS
=========
@@ -147,7 +157,15 @@ server, there are some additional steps you may need:
any POST data being accepted over HTTP (which will be fine if you are
redirecting all HTTP traffic to HTTPS).
-.. _additional-security-topics:
+* Use HTTP Strict Transport Security (HSTS)
+
+ HSTS is an HTTP header that informs a browser that all future connections
+ to a particular site should always use HTTPS. Combined with redirecting
+ requests over HTTP to HTTPS, this will ensure that connections always enjoy
+ the added security of SSL provided one successful connection has occurred.
+ HSTS is usually configured on the web server.
+
+.. _host-headers-virtual-hosting:
Host headers and virtual hosting
================================
@@ -158,15 +176,17 @@ Site Scripting attacks, they can be used for Cross-Site Request
Forgery and cache poisoning attacks in some circumstances. We
recommend you ensure your Web server is configured such that:
- * It always validates incoming HTTP ``Host`` headers against the expected
- host name.
- * Disallows requests with no ``Host`` header.
- * Is *not* configured with a catch-all virtual host that forwards requests
- to a Django application.
+* It always validates incoming HTTP ``Host`` headers against the expected
+ host name.
+* Disallows requests with no ``Host`` header.
+* Is *not* configured with a catch-all virtual host that forwards requests
+ to a Django application.
Additionally, as of 1.3.1, Django requires you to explicitly enable support for
the ``X-Forwarded-Host`` header if your configuration requires it.
+.. _additional-security-topics:
+
Additional security topics
==========================
View
28 tests/modeltests/basic/tests.py
@@ -5,7 +5,7 @@
from django.core.exceptions import ObjectDoesNotExist
from django.db.models.fields import Field, FieldDoesNotExist
from django.test import TestCase, skipIfDBFeature, skipUnlessDBFeature
-from django.utils.six import PY3
+from django.utils import six
from django.utils.translation import ugettext_lazy
from .models import Article
@@ -82,7 +82,7 @@ def test_lookup(self):
# Django raises an Article.DoesNotExist exception for get() if the
# parameters don't match any object.
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ObjectDoesNotExist,
"Article matching query does not exist. Lookup parameters were "
"{'id__exact': 2000}",
@@ -91,14 +91,14 @@ def test_lookup(self):
)
# To avoid dict-ordering related errors check only one lookup
# in single assert.
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ObjectDoesNotExist,
".*'pub_date__year': 2005.*",
Article.objects.get,
pub_date__year=2005,
pub_date__month=8,
)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ObjectDoesNotExist,
".*'pub_date__month': 8.*",
Article.objects.get,
@@ -106,7 +106,7 @@ def test_lookup(self):
pub_date__month=8,
)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ObjectDoesNotExist,
"Article matching query does not exist. Lookup parameters were "
"{'pub_date__week_day': 6}",
@@ -168,7 +168,7 @@ def test_object_creation(self):
self.assertEqual(a4.headline, 'Fourth article')
# Don't use invalid keyword arguments.
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
TypeError,
"'foo' is an invalid keyword argument for this function",
Article,
@@ -259,13 +259,13 @@ def test_object_creation(self):
"datetime.datetime(2005, 7, 28, 0, 0)"])
# dates() requires valid arguments.
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
TypeError,
"dates\(\) takes at least 3 arguments \(1 given\)",
Article.objects.dates,
)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
FieldDoesNotExist,
"Article has no field named 'invalid_field'",
Article.objects.dates,
@@ -273,7 +273,7 @@ def test_object_creation(self):
"year",
)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
AssertionError,
"'kind' must be one of 'year', 'month' or 'day'.",
Article.objects.dates,
@@ -281,7 +281,7 @@ def test_object_creation(self):
"bad_kind",
)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
AssertionError,
"'order' must be either 'ASC' or 'DESC'.",
Article.objects.dates,
@@ -323,7 +323,7 @@ def test_object_creation(self):
"<Article: Third article>"])
# Slicing works with longs (Python 2 only -- Python 3 doesn't have longs).
- if not PY3:
+ if not six.PY3:
self.assertEqual(Article.objects.all()[long(0)], a)
self.assertQuerysetEqual(Article.objects.all()[long(1):long(3)],
["<Article: Second article>", "<Article: Third article>"])
@@ -369,14 +369,14 @@ def test_object_creation(self):
"<Article: Updated article 8>"])
# Also, once you have sliced you can't filter, re-order or combine
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
AssertionError,
"Cannot filter a query once a slice has been taken.",
Article.objects.all()[0:5].filter,
id=a.id,
)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
AssertionError,
"Cannot reorder a query once a slice has been taken.",
Article.objects.all()[0:5].order_by,
@@ -411,7 +411,7 @@ def test_object_creation(self):
# An Article instance doesn't have access to the "objects" attribute.
# That's only available on the class.
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
AttributeError,
"Manager isn't accessible via Article instances",
getattr,
View
7 tests/modeltests/empty/tests.py
@@ -1,10 +1,10 @@
from __future__ import absolute_import
-from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.db.models.loading import get_app
from django.test import TestCase
from django.test.utils import override_settings
+from django.utils import six
from .models import Empty
@@ -14,12 +14,13 @@ def test_empty(self):
m = Empty()
self.assertEqual(m.id, None)
m.save()
- m2 = Empty.objects.create()
+ Empty.objects.create()
self.assertEqual(len(Empty.objects.all()), 2)
self.assertTrue(m.id is not None)
existing = Empty(m.id)
existing.save()
+
class NoModelTests(TestCase):
"""
Test for #7198 to ensure that the proper error message is raised
@@ -32,6 +33,6 @@ class NoModelTests(TestCase):
"""
@override_settings(INSTALLED_APPS=("modeltests.empty.no_models",))
def test_no_models(self):
- with self.assertRaisesRegexp(ImproperlyConfigured,
+ with six.assertRaisesRegex(self, ImproperlyConfigured,
'App with label no_models is missing a models.py module.'):
get_app('no_models')
View
34 tests/modeltests/fixtures/tests.py
@@ -4,7 +4,7 @@
from django.core import management
from django.db import connection, IntegrityError
from django.test import TestCase, TransactionTestCase, skipUnlessDBFeature
-from django.utils.six import StringIO
+from django.utils import six
from .models import Article, Book, Spy, Tag, Visa
@@ -21,16 +21,17 @@ def testClassFixtures(self):
'<Article: Poker has no place on ESPN>',
])
+
class FixtureLoadingTests(TestCase):
def _dumpdata_assert(self, args, output, format='json', natural_keys=False,
use_base_manager=False, exclude_list=[]):
- new_io = StringIO()
- management.call_command('dumpdata', *args, **{'format':format,
- 'stdout':new_io,
- 'stderr':new_io,
- 'use_natural_keys':natural_keys,
- 'use_base_manager':use_base_manager,
+ new_io = six.StringIO()
+ management.call_command('dumpdata', *args, **{'format': format,
+ 'stdout': new_io,
+ 'stderr': new_io,
+ 'use_natural_keys': natural_keys,
+ 'use_base_manager': use_base_manager,
'exclude': exclude_list})
command_output = new_io.getvalue().strip()
self.assertEqual(command_output, output)
@@ -42,8 +43,6 @@ def test_initial_data(self):
])
def test_loading_and_dumping(self):
- new_io = StringIO()
-
Site.objects.all().delete()
# Load fixture 1. Single JSON file, with two objects.
management.call_command('loaddata', 'fixture1.json', verbosity=0, commit=False)
@@ -184,12 +183,12 @@ def test_dumpdata_with_excludes(self):
exclude_list=['fixtures.Article', 'fixtures.Book', 'sites'])
# Excluding a bogus app should throw an error
- with self.assertRaisesRegexp(management.CommandError,
+ with six.assertRaisesRegex(self, management.CommandError,
"Unknown app in excludes: foo_app"):
self._dumpdata_assert(['fixtures', 'sites'], '', exclude_list=['foo_app'])
# Excluding a bogus model should throw an error
- with self.assertRaisesRegexp(management.CommandError,
+ with six.assertRaisesRegex(self, management.CommandError,
"Unknown model in excludes: fixtures.FooModel"):
self._dumpdata_assert(['fixtures', 'sites'], '', exclude_list=['fixtures.FooModel'])
@@ -199,7 +198,7 @@ def test_dumpdata_with_filtering_manager(self):
self.assertQuerysetEqual(Spy.objects.all(),
['<Spy: Paul>'])
# Use the default manager
- self._dumpdata_assert(['fixtures.Spy'],'[{"pk": %d, "model": "fixtures.spy", "fields": {"cover_blown": false}}]' % spy1.pk)
+ self._dumpdata_assert(['fixtures.Spy'], '[{"pk": %d, "model": "fixtures.spy", "fields": {"cover_blown": false}}]' % spy1.pk)
# Dump using Django's base manager. Should return all objects,
# even those normally filtered by the manager
self._dumpdata_assert(['fixtures.Spy'], '[{"pk": %d, "model": "fixtures.spy", "fields": {"cover_blown": true}}, {"pk": %d, "model": "fixtures.spy", "fields": {"cover_blown": false}}]' % (spy2.pk, spy1.pk), use_base_manager=True)
@@ -227,7 +226,7 @@ def test_compressed_loading(self):
def test_ambiguous_compressed_fixture(self):
# The name "fixture5" is ambigous, so loading it will raise an error
- with self.assertRaisesRegexp(management.CommandError,
+ with six.assertRaisesRegex(self, management.CommandError,
"Multiple fixtures named 'fixture5'"):
management.call_command('loaddata', 'fixture5', verbosity=0, commit=False)
@@ -251,7 +250,7 @@ def test_loaddata_error_message(self):
# is closed at the end of each test.
if connection.vendor == 'mysql':
connection.cursor().execute("SET sql_mode = 'TRADITIONAL'")
- with self.assertRaisesRegexp(IntegrityError,
+ with six.assertRaisesRegex(self, IntegrityError,
"Could not load fixtures.Article\(pk=1\): .*$"):
management.call_command('loaddata', 'invalid.json', verbosity=0, commit=False)
@@ -290,10 +289,11 @@ def test_output_formats(self):
self._dumpdata_assert(['fixtures'], """<?xml version="1.0" encoding="utf-8"?>
<django-objects version="1.0"><object pk="1" model="fixtures.category"><field type="CharField" name="title">News Stories</field><field type="TextField" name="description">Latest news stories</field></object><object pk="2" model="fixtures.article"><field type="CharField" name="headline">Poker has no place on ESPN</field><field type="DateTimeField" name="pub_date">2006-06-16T12:00:00</field></object><object pk="3" model="fixtures.article"><field type="CharField" name="headline">Time to reform copyright</field><field type="DateTimeField" name="pub_date">2006-06-16T13:00:00</field></object><object pk="1" model="fixtures.tag"><field type="CharField" name="name">copyright</field><field to="contenttypes.contenttype" name="tagged_type" rel="ManyToOneRel"><natural>fixtures</natural><natural>article</natural></field><field type="PositiveIntegerField" name="tagged_id">3</field></object><object pk="2" model="fixtures.tag"><field type="CharField" name="name">law</field><field to="contenttypes.contenttype" name="tagged_type" rel="ManyToOneRel"><natural>fixtures</natural><natural>article</natural></field><field type="PositiveIntegerField" name="tagged_id">3</field></object><object pk="1" model="fixtures.person"><field type="CharField" name="name">Django Reinhardt</field></object><object pk="2" model="fixtures.person"><field type="CharField" name="name">Stephane Grappelli</field></object><object pk="3" model="fixtures.person"><field type="CharField" name="name">Prince</field></object><object pk="10" model="fixtures.book"><field type="CharField" name="name">Achieving self-awareness of Python programs</field><field to="fixtures.person" name="authors" rel="ManyToManyRel"></field></object></django-objects>""", format='xml', natural_keys=True)
+
class FixtureTransactionTests(TransactionTestCase):
def _dumpdata_assert(self, args, output, format='json'):
- new_io = StringIO()
- management.call_command('dumpdata', *args, **{'format':format, 'stdout':new_io})
+ new_io = six.StringIO()
+ management.call_command('dumpdata', *args, **{'format': format, 'stdout': new_io})
command_output = new_io.getvalue().strip()
self.assertEqual(command_output, output)
@@ -308,7 +308,7 @@ def test_format_discovery(self):
# Try to load fixture 2 using format discovery; this will fail
# because there are two fixture2's in the fixtures directory
- with self.assertRaisesRegexp(management.CommandError,
+ with six.assertRaisesRegex(self, management.CommandError,
"Multiple fixtures named 'fixture2'"):
management.call_command('loaddata', 'fixture2', verbosity=0)
View
3  tests/modeltests/many_to_many/tests.py
@@ -1,6 +1,7 @@
from __future__ import absolute_import
from django.test import TestCase
+from django.utils import six
from .models import Article, Publication
@@ -52,7 +53,7 @@ def test_add(self):
])
# Adding an object of the wrong type raises TypeError
- with self.assertRaisesRegexp(TypeError, "'Publication' instance expected, got <Article.*"):
+ with six.assertRaisesRegex(self, TypeError, "'Publication' instance expected, got <Article.*"):
a6.publications.add(a5)
# Add a Publication directly via publications.add by using keyword arguments.
p4 = a6.publications.create(title='Highlights for Adults')
View
2  tests/modeltests/many_to_one/tests.py
@@ -70,7 +70,7 @@ def test_add(self):
self.assertQuerysetEqual(self.r2.article_set.all(), ["<Article: Paul's story>"])
# Adding an object of the wrong type raises TypeError.
- with self.assertRaisesRegexp(TypeError, "'Article' instance expected, got <Reporter.*"):
+ with six.assertRaisesRegex(self, TypeError, "'Article' instance expected, got <Reporter.*"):
self.r.article_set.add(self.r2)
self.assertQuerysetEqual(self.r.article_set.all(),
[
View
2  tests/modeltests/raw_query/tests.py
@@ -2,7 +2,7 @@
from datetime import date
-from django.db.models.sql.query import InvalidQuery
+from django.db.models.query_utils import InvalidQuery
from django.test import TestCase
from .models import Author, Book, Coffee, Reviewer, FriendlyAuthor
View
3  tests/modeltests/update_only_fields/tests.py
@@ -1,7 +1,8 @@
from __future__ import absolute_import
-from django.test import TestCase
from django.db.models.signals import pre_save, post_save
+from django.test import TestCase
+
from .models import Person, Employee, ProxyEmployee, Profile, Account
View
3  tests/modeltests/validation/test_error_messages.py
@@ -3,6 +3,7 @@
from django.core.exceptions import ValidationError
from django.db import models
+from django.utils import six
from django.utils.unittest import TestCase
@@ -18,7 +19,7 @@ def test_autofield_field_raises_error_message(self):
self._test_validation_messages(f, 'fõo',
["'fõo' value must be an integer."])
# primary_key must be True. Refs #12467.
- with self.assertRaisesRegexp(AssertionError,
+ with six.assertRaisesRegex(self, AssertionError,
"AutoFields must have primary_key=True."):
models.AutoField(primary_key=False)
View
7 tests/regressiontests/admin_filters/tests.py
@@ -9,7 +9,7 @@
from django.contrib.auth.models import User
from django.core.exceptions import ImproperlyConfigured
from django.test import TestCase, RequestFactory
-from django.test.utils import override_settings
+from django.test.utils import override_settings, six
from django.utils.encoding import force_text
from .models import Book, Department, Employee
@@ -18,6 +18,7 @@
def select_by(dictlist, key, value):
return [x for x in dictlist if x[key] == value][0]
+
class DecadeListFilter(SimpleListFilter):
def lookups(self, request, model_admin):
@@ -520,7 +521,7 @@ def test_listfilter_without_title(self):
"""
modeladmin = DecadeFilterBookAdminWithoutTitle(Book, site)
request = self.request_factory.get('/', {})
- self.assertRaisesRegexp(ImproperlyConfigured,
+ six.assertRaisesRegex(self, ImproperlyConfigured,
"The list filter 'DecadeListFilterWithoutTitle' does not specify a 'title'.",
self.get_changelist, request, Book, modeladmin)
@@ -530,7 +531,7 @@ def test_simplelistfilter_without_parameter(self):
"""
modeladmin = DecadeFilterBookAdminWithoutParameter(Book, site)
request = self.request_factory.get('/', {})
- self.assertRaisesRegexp(ImproperlyConfigured,
+ six.assertRaisesRegex(self, ImproperlyConfigured,
"The list filter 'DecadeListFilterWithoutParameter' does not specify a 'parameter_name'.",
self.get_changelist, request, Book, modeladmin)
View
6 tests/regressiontests/admin_scripts/tests.py
@@ -1576,7 +1576,6 @@ def test_custom_project_destination_missing(self):
self.assertOutput(err, "Destination directory '%s' does not exist, please create it first." % testproject_dir)
self.assertFalse(os.path.exists(testproject_dir))
-
def test_custom_project_template_with_non_ascii_templates(self):
"Ticket 18091: Make sure the startproject management command is able to render templates with non-ASCII content"
template_path = os.path.join(test_dir, 'admin_scripts', 'custom_templates', 'project_template')
@@ -1588,5 +1587,6 @@ def test_custom_project_template_with_non_ascii_templates(self):
self.assertNoOutput(err)
self.assertTrue(os.path.isdir(testproject_dir))
path = os.path.join(testproject_dir, 'ticket-18091-non-ascii-template.txt')
- self.assertEqual(codecs.open(path, 'r', 'utf-8').read(),
- 'Some non-ASCII text for testing ticket #18091:\nüäö €\n')
+ with codecs.open(path, 'r', 'utf-8') as f:
+ self.assertEqual(f.read(),
+ 'Some non-ASCII text for testing ticket #18091:\nüäö €\n')
View
2  tests/regressiontests/backends/tests.py
@@ -655,7 +655,7 @@ def runner2(other_thread_connection):
class BackendLoadingTests(TestCase):
def test_old_style_backends_raise_useful_exception(self):
- self.assertRaisesRegexp(ImproperlyConfigured,
+ six.assertRaisesRegex(self, ImproperlyConfigured,
"Try using django.db.backends.sqlite3 instead",
load_backend, 'sqlite3')
View
7 tests/regressiontests/cache/tests.py
@@ -15,7 +15,7 @@
from django.conf import settings
from django.core import management
-from django.core.cache import get_cache, DEFAULT_CACHE_ALIAS
+from django.core.cache import get_cache
from django.core.cache.backends.base import (CacheKeyWarning,
InvalidCacheBackendError)
from django.db import router
@@ -25,8 +25,7 @@
from django.template import Template
from django.template.response import TemplateResponse
from django.test import TestCase, TransactionTestCase, RequestFactory
-from django.test.utils import (get_warnings_state, restore_warnings_state,
- override_settings)
+from django.test.utils import override_settings, six
from django.utils import timezone, translation, unittest
from django.utils.cache import (patch_vary_headers, get_cache_key,
learn_cache_key, patch_cache_control, patch_response_headers)
@@ -821,7 +820,7 @@ def test_old_initialization(self):
self.perform_cull_test(50, 18)
def test_second_call_doesnt_crash(self):
- with self.assertRaisesRegexp(management.CommandError,
+ with six.assertRaisesRegex(self, management.CommandError,
"Cache table 'test cache table' could not be created"):
management.call_command(
'createcachetable',
View
2  tests/regressiontests/file_storage/tests.py
@@ -73,7 +73,7 @@ def test_get_nonexisting_storage_module(self):
get_storage_class raises an error if the requested module don't exist.
"""
# Error message may or may not be the fully qualified path.
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
('Error importing storage module django.core.files.non_existing_'
'storage: "No module named .*non_existing_storage"'),
View
16 tests/regressiontests/file_uploads/tests.py
@@ -100,7 +100,7 @@ def test_unicode_file_name(self):
try:
os.unlink(file1.name)
- except:
+ except OSError:
pass
self.assertEqual(response.status_code, 200)
@@ -384,15 +384,13 @@ def test_not_a_directory(self):
"""The correct IOError is raised when the upload directory name exists but isn't a directory"""
# Create a file with the upload directory name
open(UPLOAD_TO, 'wb').close()
- try:
+ with self.assertRaises(IOError) as exc_info:
self.obj.testfile.save('foo.txt', SimpleUploadedFile('foo.txt', b'x'))
- except IOError as err:
- # The test needs to be done on a specific string as IOError
- # is raised even without the patch (just not early enough)
- self.assertEqual(err.args[0],
- "%s exists and is not a directory." % UPLOAD_TO)
- except:
- self.fail("IOError not raised")
+ # The test needs to be done on a specific string as IOError
+ # is raised even without the patch (just not early enough)
+ self.assertEqual(exc_info.exception.args[0],
+ "%s exists and is not a directory." % UPLOAD_TO)
+
class MultiParserTests(unittest.TestCase):
View
44 tests/regressiontests/fixtures_regress/tests.py
@@ -13,6 +13,7 @@
from django.test import (TestCase, TransactionTestCase, skipIfDBFeature,
skipUnlessDBFeature)
from django.test.utils import override_settings
+from django.utils import six
from django.utils.six import PY3, StringIO
from .models import (Animal, Stuff, Absolute, Parent, Child, Article, Widget,
@@ -20,18 +21,15 @@
ExternalDependency, Thingy)
-pre_save_checks = []
-def animal_pre_save_check(signal, sender, instance, **kwargs):
- "A signal that is used to check the type of data loaded from fixtures"
- pre_save_checks.append(
- (
- 'Count = %s (%s)' % (instance.count, type(instance.count)),
- 'Weight = %s (%s)' % (instance.weight, type(instance.weight)),
+class TestFixtures(TestCase):
+ def animal_pre_save_check(self, signal, sender, instance, **kwargs):
+ self.pre_save_checks.append(
+ (
+ 'Count = %s (%s)' % (instance.count, type(instance.count)),
+ 'Weight = %s (%s)' % (instance.weight, type(instance.weight)),
+ )
)
- )
-
-class TestFixtures(TestCase):
def test_duplicate_pk(self):
"""
This is a regression test for ticket #3790.
@@ -110,13 +108,12 @@ def test_absolute_path(self):
)
self.assertEqual(Absolute.load_count, 1)
-
def test_unknown_format(self):
"""
Test for ticket #4371 -- Loading data of an unknown format should fail
Validate that error conditions are caught correctly
"""
- with self.assertRaisesRegexp(management.CommandError,
+ with six.assertRaisesRegex(self, management.CommandError,
"Problem installing fixture 'bad_fixture1': "
"unkn is not a known serialization format."):
management.call_command(
@@ -131,7 +128,7 @@ def test_unimportable_serializer(self):
"""
Test that failing serializer import raises the proper error
"""
- with self.assertRaisesRegexp(ImportError,
+ with six.assertRaisesRegex(self, ImportError,
"No module named unexistent.path"):
management.call_command(
'loaddata',
@@ -146,7 +143,7 @@ def test_invalid_data(self):
using explicit filename.
Validate that error conditions are caught correctly
"""
- with self.assertRaisesRegexp(management.CommandError,
+ with six.assertRaisesRegex(self, management.CommandError,
"No fixture data found for 'bad_fixture2'. \(File format may be invalid.\)"):
management.call_command(
'loaddata',
@@ -161,7 +158,7 @@ def test_invalid_data_no_ext(self):
without file extension.
Validate that error conditions are caught correctly
"""
- with self.assertRaisesRegexp(management.CommandError,
+ with six.assertRaisesRegex(self, management.CommandError,
"No fixture data found for 'bad_fixture2'. \(File format may be invalid.\)"):
management.call_command(
'loaddata',
@@ -175,7 +172,7 @@ def test_empty(self):
Test for ticket #4371 -- Loading a fixture file with no data returns an error.
Validate that error conditions are caught correctly
"""
- with self.assertRaisesRegexp(management.CommandError,
+ with six.assertRaisesRegex(self, management.CommandError,
"No fixture data found for 'empty'. \(File format may be invalid.\)"):
management.call_command(
'loaddata',
@@ -188,7 +185,7 @@ def test_error_message(self):
"""
(Regression for #9011 - error message is correct)
"""
- with self.assertRaisesRegexp(management.CommandError,
+ with six.assertRaisesRegex(self, management.CommandError,
"^No fixture data found for 'bad_fixture2'. \(File format may be invalid.\)$"):
management.call_command(
'loaddata',
@@ -245,9 +242,8 @@ def test_field_value_coerce(self):
Test for tickets #8298, #9942 - Field values should be coerced into the
correct type by the deserializer, not as part of the database write.
"""
- global pre_save_checks
- pre_save_checks = []
- signals.pre_save.connect(animal_pre_save_check)
+ self.pre_save_checks = []
+ signals.pre_save.connect(self.animal_pre_save_check)
try:
management.call_command(
'loaddata',
@@ -256,14 +252,14 @@ def test_field_value_coerce(self):
commit=False,
)
self.assertEqual(
- pre_save_checks,
+ self.pre_save_checks,
[
("Count = 42 (<%s 'int'>)" % ('class' if PY3 else 'type'),
"Weight = 1.2 (<%s 'float'>)" % ('class' if PY3 else 'type'))
]
)
finally:
- signals.pre_save.disconnect(animal_pre_save_check)
+ signals.pre_save.disconnect(self.animal_pre_save_check)
def test_dumpdata_uses_default_manager(self):
"""
@@ -353,7 +349,7 @@ def test_loaddata_raises_error_when_fixture_has_invalid_foreign_key(self):
"""
Regression for #3615 - Ensure data with nonexistent child key references raises error
"""
- with self.assertRaisesRegexp(IntegrityError,
+ with six.assertRaisesRegex(self, IntegrityError,
"Problem installing fixture"):
management.call_command(
'loaddata',
@@ -385,7 +381,7 @@ def test_loaddata_no_fixture_specified(self):
"""
Regression for #7043 - Error is quickly reported when no fixtures is provided in the command line.
"""
- with self.assertRaisesRegexp(management.CommandError,
+ with six.assertRaisesRegex(self, management.CommandError,
"No database fixture specified. Please provide the path of "
"at least one fixture in the command line."):
management.call_command(
View
6 tests/regressiontests/forms/tests/fields.py
@@ -475,7 +475,7 @@ def test_regexfield_4(self):
def test_regexfield_5(self):
f = RegexField('^\d+$', min_length=5, max_length=10)
self.assertRaisesMessage(ValidationError, "'Ensure this value has at least 5 characters (it has 3).'", f.clean, '123')
- self.assertRaisesRegexp(ValidationError, "'Ensure this value has at least 5 characters \(it has 3\)\.', u?'Enter a valid value\.'", f.clean, 'abc')
+ six.assertRaisesRegex(self, ValidationError, "'Ensure this value has at least 5 characters \(it has 3\)\.', u?'Enter a valid value\.'", f.clean, 'abc')
self.assertEqual('12345', f.clean('12345'))
self.assertEqual('1234567890', f.clean('1234567890'))
self.assertRaisesMessage(ValidationError, "'Ensure this value has at most 10 characters (it has 11).'", f.clean, '12345678901')
@@ -1036,7 +1036,7 @@ def test_splitdatetimefield_1(self):
self.assertRaisesMessage(ValidationError, "'This field is required.'", f.clean, None)
self.assertRaisesMessage(ValidationError, "'This field is required.'", f.clean, '')
self.assertRaisesMessage(ValidationError, "'Enter a list of values.'", f.clean, 'hello')
- self.assertRaisesRegexp(ValidationError, "'Enter a valid date\.', u?'Enter a valid time\.'", f.clean, ['hello', 'there'])
+ six.assertRaisesRegex(self, ValidationError, "'Enter a valid date\.', u?'Enter a valid time\.'", f.clean, ['hello', 'there'])
self.assertRaisesMessage(ValidationError, "'Enter a valid time.'", f.clean, ['2006-01-10', 'there'])
self.assertRaisesMessage(ValidationError, "'Enter a valid date.'", f.clean, ['hello', '07:30'])
@@ -1049,7 +1049,7 @@ def test_splitdatetimefield_2(self):
self.assertEqual(None, f.clean(['']))
self.assertEqual(None, f.clean(['', '']))
self.assertRaisesMessage(ValidationError, "'Enter a list of values.'", f.clean, 'hello')
- self.assertRaisesRegexp(ValidationError, "'Enter a valid date\.', u?'Enter a valid time\.'", f.clean, ['hello', 'there'])
+ six.assertRaisesRegex(self, ValidationError, "'Enter a valid date\.', u?'Enter a valid time\.'", f.clean, ['hello', 'there'])
self.assertRaisesMessage(ValidationError, "'Enter a valid time.'", f.clean, ['2006-01-10', 'there'])
self.assertRaisesMessage(ValidationError, "'Enter a valid date.'", f.clean, ['hello', '07:30'])
self.assertRaisesMessage(ValidationError, "'Enter a valid time.'", f.clean, ['2006-01-10', ''])
View
10 tests/regressiontests/forms/tests/widgets.py
@@ -216,13 +216,9 @@ def test_checkboxinput(self):
self.assertHTMLEqual(w.render('greeting', 'hello there'), '<input checked="checked" type="checkbox" name="greeting" value="hello there" />')
self.assertHTMLEqual(w.render('greeting', 'hello & goodbye'), '<input checked="checked" type="checkbox" name="greeting" value="hello &amp; goodbye" />')
- # A subtlety: If the 'check_test' argument cannot handle a value and raises any
- # exception during its __call__, then the exception will be swallowed and the box
- # will not be checked. In this example, the 'check_test' assumes the value has a
- # startswith() method, which fails for the values True, False and None.
- self.assertHTMLEqual(w.render('greeting', True), '<input type="checkbox" name="greeting" />')
- self.assertHTMLEqual(w.render('greeting', False), '<input type="checkbox" name="greeting" />')
- self.assertHTMLEqual(w.render('greeting', None), '<input type="checkbox" name="greeting" />')
+ # Ticket #17888: calling check_test shouldn't swallow exceptions
+ with self.assertRaises(AttributeError):
+ w.render('greeting', True)
# The CheckboxInput widget will return False if the key is not found in the data
# dictionary (because HTML form submission doesn't send any result for unchecked
View
4 tests/regressiontests/handlers/tests.py
@@ -17,10 +17,8 @@ def test_lock_safety(self):
# Try running the handler, it will fail in load_middleware
handler = WSGIHandler()
self.assertEqual(handler.initLock.locked(), False)
- try:
+ with self.assertRaises(Exception):
handler(None, None)
- except:
- pass
self.assertEqual(handler.initLock.locked(), False)
# Reset settings
settings.MIDDLEWARE_CLASSES = old_middleware_classes
View
9 tests/regressiontests/i18n/commands/compilation.py
@@ -3,11 +3,12 @@
from django.core.management import call_command, CommandError
from django.test import TestCase
from django.test.utils import override_settings
-from django.utils import translation
+from django.utils import translation, six
from django.utils.six import StringIO
test_dir = os.path.abspath(os.path.dirname(__file__))
+
class MessageCompilationTests(TestCase):
def setUp(self):
@@ -19,12 +20,12 @@ def tearDown(self):
class PoFileTests(MessageCompilationTests):
- LOCALE='es_AR'
- MO_FILE='locale/%s/LC_MESSAGES/django.mo' % LOCALE
+ LOCALE = 'es_AR'
+ MO_FILE = 'locale/%s/LC_MESSAGES/django.mo' % LOCALE
def test_bom_rejection(self):
os.chdir(test_dir)
- with self.assertRaisesRegexp(CommandError,
+ with six.assertRaisesRegex(self, CommandError,
"file has a BOM \(Byte Order Mark\)"):
call_command('compilemessages', locale=self.LOCALE, stderr=StringIO())
self.assertFalse(os.path.exists(self.MO_FILE))
View
4 tests/regressiontests/inline_formsets/tests.py
@@ -123,7 +123,7 @@ def test_exception_on_unspecified_foreign_key(self):
Child has two ForeignKeys to Parent, so if we don't specify which one
to use for the inline formset, we should get an exception.
"""
- self.assertRaisesRegexp(Exception,
+ six.assertRaisesRegex(self, Exception,
"<class 'regressiontests.inline_formsets.models.Child'> has more than 1 ForeignKey to <class 'regressiontests.inline_formsets.models.Parent'>",
inlineformset_factory, Parent, Child
)
@@ -143,7 +143,7 @@ def test_non_foreign_key_field(self):
If the field specified in fk_name is not a ForeignKey, we should get an
exception.
"""
- self.assertRaisesRegexp(Exception,
+ six.assertRaisesRegex(self, Exception,
"<class 'regressiontests.inline_formsets.models.Child'> has no field named 'test'",
inlineformset_factory, Parent, Child, fk_name='test'
)
View
32 tests/regressiontests/localflavor/tr/tests.py
@@ -2,29 +2,31 @@
from django.contrib.localflavor.tr import forms as trforms
from django.core.exceptions import ValidationError
+from django.utils import six
from django.utils.unittest import TestCase
+
class TRLocalFlavorTests(TestCase):
def test_TRPostalCodeField(self):
f = trforms.TRPostalCodeField()
self.assertEqual(f.clean("06531"), "06531")
self.assertEqual(f.clean("12345"), "12345")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
"Enter a postal code in the format XXXXX.",
f.clean, "a1234")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
"Enter a postal code in the format XXXXX.",
f.clean, "1234")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
"Enter a postal code in the format XXXXX.",
f.clean, "82123")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
"Enter a postal code in the format XXXXX.",
f.clean, "00123")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
"Enter a postal code in the format XXXXX.",
f.clean, "123456")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
"Enter a postal code in the format XXXXX.",
f.clean, "12 34")
self.assertRaises(ValidationError, f.clean, None)
@@ -40,34 +42,34 @@ def test_TRPhoneNumberField(self):
self.assertEqual(f.clean("+90 312 455 4567"), "3124554567")
self.assertEqual(f.clean("+90 312 455 45 67"), "3124554567")
self.assertEqual(f.clean("+90 (312) 4554567"), "3124554567")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
'Phone numbers must be in 0XXX XXX XXXX format.',
f.clean, "1234 233 1234")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
'Phone numbers must be in 0XXX XXX XXXX format.',
f.clean, "0312 233 12345")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
'Phone numbers must be in 0XXX XXX XXXX format.',
f.clean, "0312 233 123")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
'Phone numbers must be in 0XXX XXX XXXX format.',
f.clean, "0312 233 xxxx")
def test_TRIdentificationNumberField(self):
f = trforms.TRIdentificationNumberField()
self.assertEqual(f.clean("10000000146"), "10000000146")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
'Enter a valid Turkish Identification number.',
f.clean, "10000000136")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
'Enter a valid Turkish Identification number.',
f.clean, "10000000147")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
'Turkish Identification number must be 11 digits.',
f.clean, "123456789")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
'Enter a valid Turkish Identification number.',
f.clean, "1000000014x")
- self.assertRaisesRegexp(ValidationError,
+ six.assertRaisesRegex(self, ValidationError,
'Enter a valid Turkish Identification number.',
f.clean, "x0000000146")
View
5 tests/regressiontests/m2m_regress/tests.py
@@ -2,6 +2,7 @@
from django.core.exceptions import FieldError
from django.test import TestCase
+from django.utils import six
from .models import (SelfRefer, Tag, TagCollection, Entry, SelfReferChild,
SelfReferChildSibling, Worksheet)
@@ -35,7 +36,7 @@ def test_internal_related_name_not_in_error_msg(self):
# The secret internal related names for self-referential many-to-many
# fields shouldn't appear in the list when an error is made.
- self.assertRaisesRegexp(FieldError,
+ six.assertRaisesRegex(self, FieldError,
"Choices are: id, name, references, related, selfreferchild, selfreferchildsibling$",
lambda: SelfRefer.objects.filter(porcupine='fred')
)
@@ -70,7 +71,7 @@ def test_add_m2m_with_base_class(self):
t2 = Tag.objects.create(name='t2')
c1 = TagCollection.objects.create(name='c1')
- c1.tags = [t1,t2]
+ c1.tags = [t1, t2]
c1 = TagCollection.objects.get(name='c1')
self.assertQuerysetEqual(c1.tags.all(), ["<Tag: t1>", "<Tag: t2>"])
View
5 tests/regressiontests/many_to_one_regress/tests.py
@@ -2,8 +2,9 @@
from django.db import models
from django.test import TestCase
+from django.utils import six
-from .models import First, Second, Third, Parent, Child, Category, Record, Relation
+from .models import First, Third, Parent, Child, Category, Record, Relation
class ManyToOneRegressionTests(TestCase):
@@ -59,7 +60,7 @@ def test_fk_assignment_and_related_object_cache(self):
self.assertRaises(ValueError, Child.objects.create, name='xyzzy', parent=None)
# Trying to assign to unbound attribute raises AttributeError
- self.assertRaisesRegexp(AttributeError, "must be accessed via instance",
+ six.assertRaisesRegex(self, AttributeError, "must be accessed via instance",
Child.parent.__set__, None, p)
# Creation using keyword argument should cache the related object.
View
128 tests/regressiontests/modeladmin/tests.py
@@ -16,7 +16,7 @@
from django.forms.widgets import Select
from django.test import TestCase
from django.test.utils import str_prefix
-from django.utils import unittest
+from django.utils import unittest, six
from .models import Band, Concert, ValidationTestModel, ValidationTestInlineModel
@@ -506,7 +506,7 @@ class ValidationTestModelAdmin(ModelAdmin):
site = AdminSite()
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.raw_id_fields' must be a list or tuple.",
site.register,
@@ -524,7 +524,7 @@ def test_raw_id_fields_validation(self):
class ValidationTestModelAdmin(ModelAdmin):
raw_id_fields = 10
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.raw_id_fields' must be a list or tuple.",
validate,
@@ -535,7 +535,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
raw_id_fields = ('non_existent_field',)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.raw_id_fields' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.",
validate,
@@ -546,7 +546,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
raw_id_fields = ('name',)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.raw_id_fields\[0\]', 'name' must be either a ForeignKey or ManyToManyField.",
validate,
@@ -564,7 +564,7 @@ def test_fieldsets_validation(self):
class ValidationTestModelAdmin(ModelAdmin):
fieldsets = 10
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.fieldsets' must be a list or tuple.",
validate,
@@ -575,7 +575,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
fieldsets = ({},)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.fieldsets\[0\]' must be a list or tuple.",
validate,
@@ -586,7 +586,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
fieldsets = ((),)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.fieldsets\[0\]' does not have exactly two elements.",
validate,
@@ -597,7 +597,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
fieldsets = (("General", ()),)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.fieldsets\[0\]\[1\]' must be a dictionary.",
validate,
@@ -608,7 +608,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
fieldsets = (("General", {}),)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'fields' key is required in ValidationTestModelAdmin.fieldsets\[0\]\[1\] field options dict.",
validate,
@@ -619,7 +619,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
fieldsets = (("General", {"fields": ("non_existent_field",)}),)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.fieldsets\[0\]\[1\]\['fields'\]' refers to field 'non_existent_field' that is missing from the form.",
validate,
@@ -636,7 +636,7 @@ class ValidationTestModelAdmin(ModelAdmin):
fieldsets = (("General", {"fields": ("name",)}),)
fields = ["name",]
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"Both fieldsets and fields are specified in ValidationTestModelAdmin.",
validate,
@@ -647,7 +647,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
fieldsets = [(None, {'fields': ['name', 'name']})]
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"There are duplicate field\(s\) in ValidationTestModelAdmin.fieldsets",
validate,
@@ -658,7 +658,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
fields = ["name", "name"]
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"There are duplicate field\(s\) in ValidationTestModelAdmin.fields",
validate,
@@ -674,7 +674,7 @@ class FakeForm(object):
class ValidationTestModelAdmin(ModelAdmin):
form = FakeForm
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"ValidationTestModelAdmin.form does not inherit from BaseModelForm.",
validate,
@@ -692,7 +692,7 @@ class BandAdmin(ModelAdmin):
}),
)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'BandAdmin.fieldsets\[0\]\[1\]\['fields'\]' refers to field 'non_existent_field' that is missing from the form.",
validate,
@@ -722,7 +722,7 @@ class BandAdmin(ModelAdmin):
}),
)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'BandAdmin.fieldsets\[0]\[1\]\['fields'\]' refers to field 'non_existent_field' that is missing from the form.",
validate,
@@ -752,7 +752,7 @@ def test_filter_vertical_validation(self):
class ValidationTestModelAdmin(ModelAdmin):
filter_vertical = 10
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.filter_vertical' must be a list or tuple.",
validate,
@@ -763,7 +763,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
filter_vertical = ("non_existent_field",)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.filter_vertical' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.",
validate,
@@ -774,7 +774,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
filter_vertical = ("name",)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.filter_vertical\[0\]' must be a ManyToManyField.",
validate,
@@ -792,7 +792,7 @@ def test_filter_horizontal_validation(self):
class ValidationTestModelAdmin(ModelAdmin):
filter_horizontal = 10
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.filter_horizontal' must be a list or tuple.",
validate,
@@ -803,7 +803,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
filter_horizontal = ("non_existent_field",)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.filter_horizontal' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.",
validate,
@@ -814,7 +814,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
filter_horizontal = ("name",)
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.filter_horizontal\[0\]' must be a ManyToManyField.",
validate,
@@ -832,7 +832,7 @@ def test_radio_fields_validation(self):
class ValidationTestModelAdmin(ModelAdmin):
radio_fields = ()
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.radio_fields' must be a dictionary.",
validate,
@@ -843,7 +843,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
radio_fields = {"non_existent_field": None}
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.radio_fields' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.",
validate,
@@ -854,7 +854,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
radio_fields = {"name": None}
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.radio_fields\['name'\]' is neither an instance of ForeignKey nor does have choices set.",
validate,
@@ -865,7 +865,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
radio_fields = {"state": None}
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.radio_fields\['state'\]' is neither admin.HORIZONTAL nor admin.VERTICAL.",
validate,
@@ -883,7 +883,7 @@ def test_prepopulated_fields_validation(self):
class ValidationTestModelAdmin(ModelAdmin):
prepopulated_fields = ()
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.prepopulated_fields' must be a dictionary.",
validate,
@@ -894,7 +894,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
prepopulated_fields = {"non_existent_field": None}
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,
"'ValidationTestModelAdmin.prepopulated_fields' refers to field 'non_existent_field' that is missing from model 'modeladmin.ValidationTestModel'.",
validate,
@@ -905,7 +905,7 @@ class ValidationTestModelAdmin(ModelAdmin):
class ValidationTestModelAdmin(ModelAdmin):
prepopulated_fields = {"slug": ("non_existent_field",)}
- self.assertRaisesRegexp(
+ six.assertRaisesRegex(self,
ImproperlyConfigured,