70 votes

Ajout de nouvelles permissions personnalisées dans Django

J'utilise des autorisations personnalisées dans mes modèles Django comme ceci :

class T21Turma(models.Model):
    class Meta:
        permissions = (("can_view_boletim", "Can view boletim"),
                       ("can_view_mensalidades", "Can view mensalidades"),)

Le problème est que lorsque j'ajoute une autorisation à la liste, elle n'est pas ajoutée à la liste des autorisations. auth_permission lorsque je lance syncdb. Qu'est-ce que je fais de mal ? Si cela fait une différence, j'utilise South pour les migrations de bases de données.

60voto

Daniel Naab Points 9857

South ne suit pas les permissions de django.contrib.auth. Voir ticket #211 pour plus d'informations.

L'un des commentaires sur le billet suggère que l'utilisation de l'option --all sur syncdb peut résoudre le problème.

48voto

guettli Points 3284

Si vous voulez que "manage.py migrate" fasse tout (sans appeler syncdb --all). Vous devez créer de nouvelles permissions lors d'une migration :

user@host> manage.py datamigration myapp add_perm_foo --freeze=contenttypes --freeze=auth

Modifiez le fichier créé :

class Migration(DataMigration):

    def forwards(self, orm):
        "Write your forwards methods here."
        ct, created = orm['contenttypes.ContentType'].objects.get_or_create(
            model='mymodel', app_label='myapp') # model must be lowercase!
        perm, created = orm['auth.permission'].objects.get_or_create(
            content_type=ct, codename='mymodel_foo', defaults=dict(name=u'Verbose Name'))

27voto

wouldnt Points 175

Cela a marché pour moi :

./manage.py update_permissions

Il s'agit d'un django-extensions chose.

20voto

Vebjorn Ljosa Points 6215

Vous pouvez vous connecter à l post_migrate afin de mettre à jour les permissions après la migration. J'utilise le code suivant, légèrement modifié à partir de Dev avec passion et originaire de django-extensions .

# Add to your project-level __init__.py

from south.signals import post_migrate

def update_permissions_after_migration(app,**kwargs):
    """
    Update app permission just after every migration.
    This is based on app django_extensions update_permissions management command.
    """
    from django.conf import settings
    from django.db.models import get_app, get_models
    from django.contrib.auth.management import create_permissions

    create_permissions(get_app(app), get_models(), 2 if settings.DEBUG else 0)

post_migrate.connect(update_permissions_after_migration)

2voto

balmaster Points 108

Lorsque j'exécute la migration avec le code suivant

ct, created = orm['contenttypes.ContentType'].objects.get_or_create(model='mymodel',     app_label='myapp') # model must bei lowercase!
perm, created = orm['auth.permission'].objects.get_or_create(content_type=ct, codename='mymodel_foo')

Je reçois l'erreur suivante

File "C:\Python26\lib\site-packages\south-0.7.3-py2.6.egg\south\orm.py", line 170, in  __getitem__
raise KeyError("The model '%s' from the app '%s' is not available in this migration." % (model, app))
KeyError: "The model 'contenttype' from the app 'contenttypes' is not available in this migration."

Pour éviter cette erreur, j'ai modifié le code

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

class Migration(DataMigration):

    def forwards(self, orm):
        "Write your forwards methods here."
        ct = ContentType.objects.get(model='mymodel', app_label='myapp') 
        perm, created = Permission.objects.get_or_create(content_type=ct, codename='mymodel_foo')
        if created:
            perm.name=u'my permission description'
            perm.save()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X