Merge remote-tracking branch 'core/master' into schema-alteration
Conflicts: django/db/models/options.py
This commit is contained in:
commit
588b523233
|
@ -107,7 +107,9 @@ class BaseSettings(object):
|
||||||
elif name == "ALLOWED_INCLUDE_ROOTS" and isinstance(value, six.string_types):
|
elif name == "ALLOWED_INCLUDE_ROOTS" and isinstance(value, six.string_types):
|
||||||
raise ValueError("The ALLOWED_INCLUDE_ROOTS setting must be set "
|
raise ValueError("The ALLOWED_INCLUDE_ROOTS setting must be set "
|
||||||
"to a tuple, not a string.")
|
"to a tuple, not a string.")
|
||||||
elif name == "INSTALLED_APPS" and len(value) != len(set(value)):
|
elif name == "INSTALLED_APPS":
|
||||||
|
value = list(value) # force evaluation of generators on Python 3
|
||||||
|
if len(value) != len(set(value)):
|
||||||
raise ImproperlyConfigured("The INSTALLED_APPS setting must contain unique values.")
|
raise ImproperlyConfigured("The INSTALLED_APPS setting must contain unique values.")
|
||||||
|
|
||||||
object.__setattr__(self, name, value)
|
object.__setattr__(self, name, value)
|
||||||
|
|
|
@ -30,9 +30,10 @@ def _get_all_permissions(opts, ctype):
|
||||||
def _get_builtin_permissions(opts):
|
def _get_builtin_permissions(opts):
|
||||||
"""
|
"""
|
||||||
Returns (codename, name) for all autogenerated permissions.
|
Returns (codename, name) for all autogenerated permissions.
|
||||||
|
By default, this is ('add', 'change', 'delete')
|
||||||
"""
|
"""
|
||||||
perms = []
|
perms = []
|
||||||
for action in ('add', 'change', 'delete'):
|
for action in opts.default_permissions:
|
||||||
perms.append((get_permission_codename(action, opts),
|
perms.append((get_permission_codename(action, opts),
|
||||||
'Can %s %s' % (action, opts.verbose_name_raw)))
|
'Can %s %s' % (action, opts.verbose_name_raw)))
|
||||||
return perms
|
return perms
|
||||||
|
|
|
@ -196,13 +196,15 @@ class CustomUserModelValidationTestCase(TestCase):
|
||||||
self.assertIn("The USERNAME_FIELD must be unique. Add unique=True to the field parameters.", new_io.getvalue())
|
self.assertIn("The USERNAME_FIELD must be unique. Add unique=True to the field parameters.", new_io.getvalue())
|
||||||
|
|
||||||
|
|
||||||
class PermissionDuplicationTestCase(TestCase):
|
class PermissionTestCase(TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self._original_permissions = models.Permission._meta.permissions[:]
|
self._original_permissions = models.Permission._meta.permissions[:]
|
||||||
|
self._original_default_permissions = models.Permission._meta.default_permissions
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
models.Permission._meta.permissions = self._original_permissions
|
models.Permission._meta.permissions = self._original_permissions
|
||||||
|
models.Permission._meta.default_permissions = self._original_default_permissions
|
||||||
ContentType.objects.clear_cache()
|
ContentType.objects.clear_cache()
|
||||||
|
|
||||||
def test_duplicated_permissions(self):
|
def test_duplicated_permissions(self):
|
||||||
|
@ -235,3 +237,23 @@ class PermissionDuplicationTestCase(TestCase):
|
||||||
('other_one', 'Some other permission'),
|
('other_one', 'Some other permission'),
|
||||||
]
|
]
|
||||||
create_permissions(models, [], verbosity=0)
|
create_permissions(models, [], verbosity=0)
|
||||||
|
|
||||||
|
def test_default_permissions(self):
|
||||||
|
models.Permission._meta.permissions = [
|
||||||
|
('my_custom_permission', 'Some permission'),
|
||||||
|
]
|
||||||
|
create_permissions(models, [], verbosity=0)
|
||||||
|
|
||||||
|
# add/change/delete permission by default + custom permission
|
||||||
|
self.assertEqual(models.Permission.objects.filter(content_type=
|
||||||
|
ContentType.objects.get_by_natural_key('auth', 'permission')
|
||||||
|
).count(), 4)
|
||||||
|
|
||||||
|
models.Permission.objects.all().delete()
|
||||||
|
models.Permission._meta.default_permissions = []
|
||||||
|
create_permissions(models, [], verbosity=0)
|
||||||
|
|
||||||
|
# custom permission only since default permissions is empty
|
||||||
|
self.assertEqual(models.Permission.objects.filter(content_type=
|
||||||
|
ContentType.objects.get_by_natural_key('auth', 'permission')
|
||||||
|
).count(), 1)
|
||||||
|
|
|
@ -21,8 +21,8 @@ get_verbose_name = lambda class_name: re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|
|
||||||
DEFAULT_NAMES = ('verbose_name', 'verbose_name_plural', 'db_table', 'ordering',
|
DEFAULT_NAMES = ('verbose_name', 'verbose_name_plural', 'db_table', 'ordering',
|
||||||
'unique_together', 'permissions', 'get_latest_by',
|
'unique_together', 'permissions', 'get_latest_by',
|
||||||
'order_with_respect_to', 'app_label', 'db_tablespace',
|
'order_with_respect_to', 'app_label', 'db_tablespace',
|
||||||
'abstract', 'managed', 'proxy', 'swappable', 'auto_created', 'index_together', 'app_cache')
|
'abstract', 'managed', 'proxy', 'swappable', 'auto_created',
|
||||||
|
'index_together', 'app_cache', 'default_permissions')
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class Options(object):
|
class Options(object):
|
||||||
|
@ -35,6 +35,7 @@ class Options(object):
|
||||||
self.ordering = []
|
self.ordering = []
|
||||||
self.unique_together = []
|
self.unique_together = []
|
||||||
self.index_together = []
|
self.index_together = []
|
||||||
|
self.default_permissions = ('add', 'change', 'delete')
|
||||||
self.permissions = []
|
self.permissions = []
|
||||||
self.object_name, self.app_label = None, app_label
|
self.object_name, self.app_label = None, app_label
|
||||||
self.get_latest_by = None
|
self.get_latest_by = None
|
||||||
|
|
|
@ -235,6 +235,19 @@ Django quotes column and table names behind the scenes.
|
||||||
This is a list or tuple of 2-tuples in the format ``(permission_code,
|
This is a list or tuple of 2-tuples in the format ``(permission_code,
|
||||||
human_readable_permission_name)``.
|
human_readable_permission_name)``.
|
||||||
|
|
||||||
|
``default_permissions``
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
.. attribute:: Options.default_permissions
|
||||||
|
|
||||||
|
.. versionadded:: 1.7
|
||||||
|
|
||||||
|
Defaults to ``('add', 'change', 'delete')``. You may customize this list,
|
||||||
|
for example, by setting this to an empty list if your app doesn't require
|
||||||
|
any of the default permissions. It must be specified on the model before
|
||||||
|
the model is created by :djadmin:`syncdb` in order to prevent any omitted
|
||||||
|
permissions from being created.
|
||||||
|
|
||||||
``proxy``
|
``proxy``
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
|
|
@ -185,6 +185,10 @@ Minor features
|
||||||
return ``self.cleaned_data``. If it does return a changed dictionary then
|
return ``self.cleaned_data``. If it does return a changed dictionary then
|
||||||
that will still be used.
|
that will still be used.
|
||||||
|
|
||||||
|
* The new :attr:`~django.db.models.Options.default_permissions` model
|
||||||
|
``Meta`` option allows you to customize (or disable) creation of the default
|
||||||
|
add, change, and delete permissions.
|
||||||
|
|
||||||
Backwards incompatible changes in 1.7
|
Backwards incompatible changes in 1.7
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
|
|
|
@ -226,7 +226,7 @@ class TestComplexSettingOverride(TestCase):
|
||||||
self.assertEqual('Overriding setting TEST_WARN can lead to unexpected behaviour.', str(w[-1].message))
|
self.assertEqual('Overriding setting TEST_WARN can lead to unexpected behaviour.', str(w[-1].message))
|
||||||
|
|
||||||
|
|
||||||
class UniqueSettngsTests(TestCase):
|
class UniqueSettingsTests(TestCase):
|
||||||
"""
|
"""
|
||||||
Tests for the INSTALLED_APPS setting.
|
Tests for the INSTALLED_APPS setting.
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue