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