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?
Comment configurez-vous les utilisateurs et attribuez-vous les autorisations dans les tests? – Alasdair
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
Comment vous connectez-vous à l'utilisateur dans le test? – Alasdair