mirror of https://github.com/django/django.git
Fixed #22956 -- Made PermissionManager.get_by_natural_key() use the correct database for content type lookup.
This commit is contained in:
parent
da59902250
commit
76f2f58a18
|
@ -32,8 +32,7 @@ class PermissionManager(models.Manager):
|
||||||
def get_by_natural_key(self, codename, app_label, model):
|
def get_by_natural_key(self, codename, app_label, model):
|
||||||
return self.get(
|
return self.get(
|
||||||
codename=codename,
|
codename=codename,
|
||||||
content_type=ContentType.objects.get_by_natural_key(app_label,
|
content_type=ContentType.objects.db_manager(self.db).get_by_natural_key(app_label, model),
|
||||||
model),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.contrib.auth.models import AbstractUser, Group, User, UserManager
|
from django.contrib.auth.models import AbstractUser, Group, Permission, User, UserManager
|
||||||
from django.contrib.auth.tests.utils import skipIfCustomUser
|
from django.contrib.auth.tests.utils import skipIfCustomUser
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.core import mail
|
from django.core import mail
|
||||||
from django.db.models.signals import post_save
|
from django.db.models.signals import post_save
|
||||||
from django.test import TestCase, override_settings
|
from django.test import TestCase, override_settings
|
||||||
|
@ -43,6 +44,64 @@ class LoadDataWithNaturalKeysTestCase(TestCase):
|
||||||
self.assertEqual(group, user.groups.get())
|
self.assertEqual(group, user.groups.get())
|
||||||
|
|
||||||
|
|
||||||
|
class LoadDataWithNaturalKeysAndMultipleDatabasesTestCase(TestCase):
|
||||||
|
multi_db = True
|
||||||
|
|
||||||
|
def test_load_data_with_user_permissions(self):
|
||||||
|
# Create test contenttypes for both databases
|
||||||
|
default_objects = [
|
||||||
|
ContentType.objects.db_manager('default').create(
|
||||||
|
model='examplemodela',
|
||||||
|
name='example model a',
|
||||||
|
app_label='app_a',
|
||||||
|
),
|
||||||
|
ContentType.objects.db_manager('default').create(
|
||||||
|
model='examplemodelb',
|
||||||
|
name='example model b',
|
||||||
|
app_label='app_b',
|
||||||
|
),
|
||||||
|
]
|
||||||
|
other_objects = [
|
||||||
|
ContentType.objects.db_manager('other').create(
|
||||||
|
model='examplemodelb',
|
||||||
|
name='example model b',
|
||||||
|
app_label='app_b',
|
||||||
|
),
|
||||||
|
ContentType.objects.db_manager('other').create(
|
||||||
|
model='examplemodela',
|
||||||
|
name='example model a',
|
||||||
|
app_label='app_a',
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Now we create the test UserPermission
|
||||||
|
Permission.objects.db_manager("default").create(
|
||||||
|
name="Can delete example model b",
|
||||||
|
codename="delete_examplemodelb",
|
||||||
|
content_type=default_objects[1],
|
||||||
|
)
|
||||||
|
Permission.objects.db_manager("other").create(
|
||||||
|
name="Can delete example model b",
|
||||||
|
codename="delete_examplemodelb",
|
||||||
|
content_type=other_objects[0],
|
||||||
|
)
|
||||||
|
|
||||||
|
perm_default = Permission.objects.get_by_natural_key(
|
||||||
|
'delete_examplemodelb',
|
||||||
|
'app_b',
|
||||||
|
'examplemodelb',
|
||||||
|
)
|
||||||
|
|
||||||
|
perm_other = Permission.objects.db_manager('other').get_by_natural_key(
|
||||||
|
'delete_examplemodelb',
|
||||||
|
'app_b',
|
||||||
|
'examplemodelb',
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(perm_default.content_type_id, default_objects[1].id)
|
||||||
|
self.assertEqual(perm_other.content_type_id, other_objects[0].id)
|
||||||
|
|
||||||
|
|
||||||
@skipIfCustomUser
|
@skipIfCustomUser
|
||||||
class UserManagerTestCase(TestCase):
|
class UserManagerTestCase(TestCase):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue