Ajout de nouvelles autorisations personnalisées dans Django
-
20-09-2019 - |
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.
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'))
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()