2017-10-10 4 views
0

Chaque restaurant peut avoir plusieurs gestionnaires.L'utilisation des «règles» Django avec les CBV ne semble pas fonctionner

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

Seuls les directeurs de restaurant peuvent modifier une fiche de restaurant. J'utilise django-rules pour appliquer ceci. J'ai un prédicat qui crée une belle référence "is_restaurant_manager" bavard:

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

Et voici la permission:

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

Enfin, voici mon avis:

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

J'ai deux tests.

Test A vérifie que l'autorisation fonctionne correctement:

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

Ce premier test passe avec succès.

test B tente d'accéder à l'URL avec un utilisateur valide:

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

test B échoue, que je reçois une redirection. Cela arrive aussi si j'essaie d'accéder à l'URL via le navigateur. La redirection est envoyée au processus de connexion, comme si l'utilisateur n'avait pas l'autorisation d'accéder à la vue.

Quel est le problème avec mon code?

+0

Comment configurez-vous les utilisateurs et attribuez-vous les autorisations dans les tests? – Alasdair

+0

Bonjour Alasdair, j'utilise 'User.objects.create_user', puis' Restaurant.objects.create', suivi de 'restaurant.managers.add (user)'. Je ne pense pas que le problème vient des tests, puisque je peux le reproduire dans le navigateur. – Brachamul

+0

Comment vous connectez-vous à l'utilisateur dans le test? – Alasdair

Répondre

3

Je jouais avec django-rules pour voir si cela correspondait aux besoins d'un projet et pour résoudre le problème que vous avez ajouté sur django-rules.

Après avoir ajouté une trace pdb dans les tests et en passant par vos paramètres j'ai remarqué les points suivants:

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

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

Le second lien est une mission, back-end d'authentification remplacer le jeu dans la précédente affectations.

En ajoutant le 'rules.permissions.ObjectPermissionBackend' au deuxième ensemble de backends, les tests passent sans erreur.

code diff and test run

je fait une demande de traction sur github pour résoudre ce problème: https://github.com/tavolia/Tavolia/pull/5

Cheers!

+0

Incroyable! Je vous remercie ! – Brachamul