L'aggiunta di nuove autorizzazioni personalizzate in Django
-
20-09-2019 - |
Domanda
Sono utilizzando autorizzazioni personalizzate nei miei modelli Django in questo modo:
class T21Turma(models.Model):
class Meta:
permissions = (("can_view_boletim", "Can view boletim"),
("can_view_mensalidades", "Can view mensalidades"),)
Il problema è che quando aggiungo un permesso per la lista non venga aggiunto alla tabella auth_permission
quando corro syncdb. Che cosa sto facendo di sbagliato. Se si fa alcuna differenza che sto usando sud per le migrazioni di database.
Soluzione
Sud non tiene django.contrib.auth permessi. Vedere biglietto # 211 per ulteriori informazioni.
Uno dei commenti sul biglietto suggerisce che utilizzando l'opzione --all
su syncdb può risolvere il problema.
Altri suggerimenti
Se si vuole "manage.py migrare" di fare tutto (senza chiamare syncdb --all). È necessario creare nuovi permessi con una migrazione:
user@host> manage.py datamigration myapp add_perm_foo --freeze=contenttypes --freeze=auth
Modificare il file creato:
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'))
Questo ha funzionato per me:
./manage.py update_permissions
Si tratta di una href="https://github.com/django-extensions/django-extensions"> django-extensions cosa
È possibile collegare al segnale post_migrate
al fine di aggiornare le autorizzazioni dopo la migrazione. Io uso il seguente codice, leggermente modificato da Dev con passione e originario di 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)
Quando ho runnning migrazione con seguente codice
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')
I ottenendo seguente errore
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."
Per evitare questo errore, ho modificato il codice
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()