Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge remote-tracking branch 'core/master' into schema-alteration

Conflicts:
	django/db/models/options.py
  • Loading branch information...
commit 588b523233e6cd3e7f9695b76ba639fe26fe5192 2 parents 1d1cfd0 + ddae74b
@andrewgodwin andrewgodwin authored
View
6 django/conf/__init__.py
@@ -107,8 +107,10 @@ def __setattr__(self, name, value):
elif name == "ALLOWED_INCLUDE_ROOTS" and isinstance(value, six.string_types):
raise ValueError("The ALLOWED_INCLUDE_ROOTS setting must be set "
"to a tuple, not a string.")
- elif name == "INSTALLED_APPS" and len(value) != len(set(value)):
- raise ImproperlyConfigured("The INSTALLED_APPS setting must contain unique values.")
+ 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.")
object.__setattr__(self, name, value)
View
3  django/contrib/auth/management/__init__.py
@@ -30,9 +30,10 @@ def _get_all_permissions(opts, ctype):
def _get_builtin_permissions(opts):
"""
Returns (codename, name) for all autogenerated permissions.
+ By default, this is ('add', 'change', 'delete')
"""
perms = []
- for action in ('add', 'change', 'delete'):
+ for action in opts.default_permissions:
perms.append((get_permission_codename(action, opts),
'Can %s %s' % (action, opts.verbose_name_raw)))
return perms
View
24 django/contrib/auth/tests/test_management.py
@@ -196,13 +196,15 @@ def test_username_non_unique(self):
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):
self._original_permissions = models.Permission._meta.permissions[:]
+ self._original_default_permissions = models.Permission._meta.default_permissions
def tearDown(self):
models.Permission._meta.permissions = self._original_permissions
+ models.Permission._meta.default_permissions = self._original_default_permissions
ContentType.objects.clear_cache()
def test_duplicated_permissions(self):
@@ -235,3 +237,23 @@ def test_duplicated_permissions(self):
('other_one', 'Some other permission'),
]
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)
View
5 django/db/models/options.py
@@ -21,8 +21,8 @@
DEFAULT_NAMES = ('verbose_name', 'verbose_name_plural', 'db_table', 'ordering',
'unique_together', 'permissions', 'get_latest_by',
'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
class Options(object):
@@ -35,6 +35,7 @@ def __init__(self, meta, app_label=None):
self.ordering = []
self.unique_together = []
self.index_together = []
+ self.default_permissions = ('add', 'change', 'delete')
self.permissions = []
self.object_name, self.app_label = None, app_label
self.get_latest_by = None
View
13 docs/ref/models/options.txt
@@ -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,
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``
---------
View
4 docs/releases/1.7.txt
@@ -185,6 +185,10 @@ Minor features
return ``self.cleaned_data``. If it does return a changed dictionary then
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
=====================================
View
2  tests/settings_tests/tests.py
@@ -226,7 +226,7 @@ def test_complex_override_warning(self):
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.
"""
Please sign in to comment.
Something went wrong with that request. Please try again.