2015-02-13 3 views
1

Я хочу проверить разрешения в своем приложении. Я хочу предоставить свои разрешения для пользователей и посмотреть, есть ли они там. я получаю эту ошибку:ValueError в разрешениях тестов в django

ValueError: invalid literal for int() with base 10: 'myapp.can_view' 

КОД

class PermissionsTest(WebTest): 
    def setUp(self): 
     self.user = G(User, username='user', password='pass') 

    def test_user_login_permission(self): 
     app = self.app.get(reverse('myapp:dashboard'), user=self.user) 
     self.assertEqual(app.status_code, 200) 

    def test_user_add_permissions(self): 
     self.user.user_permissions.add('myapp.can_view') 
     self.user.save() 
     self.assertTrue(self.user.has_perm('myapp.can_view')) 

ответ

3

User.user_permissions это поле M2M, так что вы не можете добавить строку в этой области. Добавить Permission экземпляр вместо:

from django.contrib.auth.models import Permission 

permission = Permission.objects.get(codename='can_view') 
self.user.user_permissions.add(permission) 

Также обратите внимание, что разрешения are cached поэтому вы должны перезагрузить User объект в тесте.

UPDATE: Если Кодовое вашего разрешения не является уникальным, то вы должны добавить content_type к get() вызова, как в ответ на @ SELÇUK в.

ОБНОВЛЕНИЕ 2: Чтобы создать удержание, у вас есть два варианта.

автоматически, используя permission свойство вашего Model.Meta класса:

class MyModel(models.Model): 
    class Meta: 
     permissions = (('can_view', u'Can view my model'),) 

Рукой:

from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth.models import Permission 

ct = ContentType.objects.ContentType.objects.get_for_model(MyModel) 
permission = Permission.objects.create(content_type=ct, 
             codename='can_view', 
             name='Can view my model') 
+0

Я получаю DoNotExist: запрос соответствия разрешений не существует. – mark

+0

См. Обновленный ответ. – catavaran

1

Вы должны пропускать permission объект для add метод, а не строка. Это должно помочь:

from django.contrib.auth.models import Permission 
from django.contrib.contenttypes.models import ContentType 

content_type = ContentType.objects.get_for_model(MyModel) 
permission = Permission.objects.get(content_type=content_type, codename='can_view') 
request.user.user_permissions.add(permission) 

 Смежные вопросы

  • Нет связанных вопросов^_^