Permissions par instance

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je travaille avec Python 3 et Django 1.9 et j'ai le modèle suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Project(models.Model):
    correspondent = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        verbose_name='Correspondant',
        blank=True, # Set to blank when project is archived
    )
    # ...

    class Meta:
        permissions = (
            # ...
            ('view_project', 'View a project'),
        )

J'ai deux types d'utilisateurs : les directeurs, qui a toutes les permissions sur tous les projets, et les correspondants, qui n'ont que certaines permissions sur un seul projet, celui dont ils s'occupent.

Premièrement, je ne comprends pas pourquoi la vue suivante retourne une 403 à un directeur, qui dispose de la permission projects.view_project :

1
2
3
4
5
6
@login_required
def edit_project(request, pk, slug):
    project = get_object_or_404(models.Project, pk=pk)

    if not request.user.has_perm('projects.view_project', project):
        raise PermissionDenied

Ensuite, j'ignore comment faire un truc du genre, dans la vue qui associe un projet à un correspondant :

1
correspondent.add_perm('projects.view_project', project)

Merci. :)

Edit : Manifestement, ce n'est pas possible par défaut : https://docs.djangoproject.com/fr/1.9/topics/auth/customizing/#handling-object-permissions

Django guardian permet cela : https://pythonhosted.org/django-guardian/

+0 -0

Pour ton second code je te conseille de regarder ça https://docs.djangoproject.com/fr/1.9/topics/auth/default/#the-permission-required-decorator

Le problème est que j'ai besoin ici de récupérer le projet avant de vérifier la permission. Or ce projet dépend des paramètres passés à la vue, inaccessibles depuis le décorateur si je ne m'abuse.

Ensuite pour ta 403 je pense (à vérifier) que c'est ''project.view_project''.

Nop, c'est le nom de l'application et non du modèle. ^^

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte