variable template linebreaksbr examples bootstrap django django-south django-permissions

template - Agregar nuevos permisos personalizados en Django



linebreaksbr django (5)

Estoy usando permisos personalizados en mis modelos Django como este:

class T21Turma(models.Model): class Meta: permissions = (("can_view_boletim", "Can view boletim"), ("can_view_mensalidades", "Can view mensalidades"),)

El problema es que cuando agrego un permiso a la lista, no se agrega a la tabla auth_permission cuando ejecuto syncdb. Qué estoy haciendo mal. Si hace alguna diferencia, estoy usando el sur para las migraciones de bases de datos.


Cuando realizo la migración con el siguiente código

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

Obtengo un error de seguimiento

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."

Para evitar este error, modifiqué el código

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


Esto funcionó para mí:

./manage.py update_permissions

Es una cosa django-extensions .


Puede conectarse a la señal post_migrate para actualizar los permisos después de la migración. Utilizo el siguiente código, ligeramente modificado de Dev con Passion y originalmente 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)


Si desea que "manage.py migrate" haga todo (sin llamar a syncdb --all). Necesita crear nuevos permisos con una migración:

user@host> manage.py datamigration myapp add_perm_foo --freeze=contenttypes --freeze=auth

Edite el archivo creado:

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


South no rastrea los permisos django.contrib.auth. Vea el boleto # 211 para más información.

Uno de los comentarios en el ticket sugiere que usar la opción --all en syncdb puede resolver el problema.