2017-10-10 30 views
0

각 레스토랑에는 여러 명의 관리자가있을 수 있습니다.Django "규칙"을 CBV와 함께 사용하면 작동하지 않는 것 같습니다.

class Restaurant(models.Model): 
    ... 
    managers = models.ManyToManyField(User, related_name='restaurants_which_they_manage') 

식당 관리자 만 식당 목록을 변경할 수 있습니다. 이걸 적용하기 위해 django-rules을 사용하고 있습니다.

@rules.predicate 
def is_restaurant_manager(user, restaurant): 
    return user in restaurant.managers.all() 

그리고 여기 권한입니다 : 나는 좋은 자세한 "is_restaurant_manager"참조를 생성하는 조건이있어

class RestaurantChange(PermissionRequiredMixin, UpdateView): 
    model = Restaurant 
    permission_required = 'restaurants.change_restaurant' 
    fields = ['name', 'description', ] 

: 마지막으로

rules.add_perm('restaurants.change_restaurant', is_restaurant_manager) 

을, 여기에 내 생각이다 두 가지 검사가있어.

테스트 A는 권한이 제대로 작동하는지 확인 :

self.assertEqual(rules.has_perm('restaurants.change_restaurant', self.user, self.restaurant), True) 

이 첫 번째 테스트를 성공적으로 통과한다.

시험 B는 유효한 사용자와 URL을 액세스를 시도 :

url = reverse('restaurants__restaurant_change', kwargs={'pk': self.restaurant.key,}) 
response = self.client.get(url) 
self.assertEqual(response.status_code, 200) 

시험 B가 실패, 나는 재를 얻을 수있다. 이것은 브라우저를 통해 URL에 액세스하려고 시도 할 때도 발생합니다. 리디렉션은 사용자가보기에 액세스 할 수있는 권한이없는 것처럼 로그인 프로세스로 이동합니다.

내 코드에 어떤 문제가 있습니까?

+0

사용자를 설정하고 테스트에 사용 권한을 할당하려면 어떻게합니까? – Alasdair

+0

안녕 Alasdair, 나는'User.objects.create_user' 다음에'Restaurant.objects.create'와'restaurant.managers.add (user)'를 사용합니다. 브라우저에서 재생성 할 수 있으므로 문제가 테스트에서 비롯된 것이라고 생각하지 않습니다. – Brachamul

+0

테스트에 사용자를 어떻게 로그인 하시겠습니까? – Alasdair

답변

3

나는 장고 규칙을 가지고 프로젝트의 필요성에 부합하는지 확인하고 장고 규칙에 추가 한 문제를 실행하고있다. 이전에 설정된 인증 백엔드를 무시

https://github.com/tavolia/Tavolia/blob/7aca6530a8a301b8b81999095cf7535c363dd484/_project/settings.py#L121-L124

https://github.com/tavolia/Tavolia/blob/7aca6530a8a301b8b81999095cf7535c363dd484/_project/settings.py#L142-L145

두 번째 링크가 과제입니다 :

은 시험에 PDB 추적을 추가하고 설정을 통해 가기 후에 나는 다음을 발견 과제.

두 번째 백엔드 세트에 'rules.permissions.ObjectPermissionBackend'을 추가하면 오류없이 테스트가 통과합니다. https://github.com/tavolia/Tavolia/pull/5

건배 : code diff and test run

나는이 문제를 해결하기 위해 GitHub의에 끌어 오기 요청을!

+0

놀라운! 고맙습니다 ! – Brachamul