web-dev-qa-db-fra.com

Ajout de nouvelles autorisations personnalisées dans Django

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

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 au auth_permission table lorsque j'exécute syncdb. Qu'est-ce que je fais mal. Si cela fait une différence, j'utilise le sud pour les migrations de bases de données.

70
user27478

South ne suit pas les autorisations Django.contrib.auth. Voir ticket # 211 pour plus d'informations.

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

59
Daniel Naab

Si vous voulez que "manage.py migrate" fasse tout (sans appeler syncdb --all). Vous devez créer de nouvelles autorisations avec 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'))
48
guettli

Cela a fonctionné pour moi:

./manage.py update_permissions

C'est une chose Django-extensions .

27
wouldnt

Vous pouvez vous connecter au post_migrate signal afin de mettre à jour les autorisations après la migration. J'utilise le code suivant, légèrement modifié de Dev with Passion et originellement 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)
20
Vebjorn Ljosa

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')

J'obtiens 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()
2
balmaster