Question

Je suis en utilisant 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'ajouter une autorisation à la liste qu'il ne soit pas ajouté à la table de auth_permission quand je lance syncdb. Qu'est-ce que je fais mal. Si cela fait une différence que je utilise au sud pour les migrations de bases de données.

Était-ce utile?

La solution

Sud ne suit pas django.contrib.auth autorisations. 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.

Autres conseils

Si vous voulez « manage.py migrer » à tout faire (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

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

Cela a fonctionné pour moi:

./manage.py update_permissions

Il est un django-extensions chose .

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

Quand je runnning 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, je 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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top