Django-guardian: ИспользованиС assign_perm Π² ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ django 1.7

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 13 нояб. 2014  Β·  10ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: django-guardian/django-guardian

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ:

from django.db import models, migrations
from guardian.shortcuts import assign_perm

def assign_perms(apps, schema_editor):
    Group = apps.get_model("auth", "Group")
    for group in Group.objects.all():
        assign_perm('products.view_product', group)
        # assign_perm('products.view_product', group, product)

class Migration(migrations.Migration):

    operations = [
        migrations.RunPython(assign_perms),
    ]

ΠŸΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ этой ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ² assign_perm Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

guardian.exceptions.NotUserNorGroup: User/AnonymousUser or Group instance is required (got Group object)

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π― ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽ это здСсь Π½Π° случай, Ссли это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅, Π½ΠΎ я написал этот ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ assign_perm для Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ настройки, Π΄Π΅Π»Π°Π΅Ρ‚ нСсколько ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ, вСроятно, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ:

def assign_perm(perm, user_or_group, obj=None, apps=None):
    permission_model = apps.get_model('auth', 'Permission')
    permission = permission_model.objects.get(codename=perm)

    # Assumes object permission models live in the same app as the model they govern
    # and are named like `ProjectUserObjectPermission`/`ProjectGroupObjectPermission`
    obj_permission_model = apps.get_model(obj._meta.app_label, '{}{}ObjectPermission'.format(
        obj._meta.object_name,
        user_or_group._meta.object_name,
    ))
    obj_permission_model.objects.create(
        # `object_pk` and `content_type_id` keys if you're not using direct foreign keys
        # https://django-guardian.readthedocs.io/en/stable/userguide/performance.html#direct-foreign-keys
        content_object=obj,
        permission=permission,
        **{
            user_or_group._meta.model_name: user_or_group
        }
    )

ВсС 10 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

+1

+1

+1

Π― исправил эту ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π² Group ΠΈΠ· django.contrib.auth , ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, ΠΎΠ½ Π½Π΅ вносит Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… (см. # 333). Π­Ρ‚ΠΎ Π½Π° django 1.8 ΠΈ guardian 1.3, поэтому, Ссли Π±Ρ‹ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΌΠΎΠ³ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ 1.7, это Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ я использовал Π΄Π²Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для сцСнариСв ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ:
https://gist.github.com/xuhcc/67871719116bdc0fee6c
(django-guardian == 1.2.5)

К соТалСнию, Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅Ρ‚ любви ΠΊ 1.8 / 1.3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ваши Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ сообщСниС ΠΎΠ± ошибкС
ValueError: Cannot query "project": Must be "ContentType" instance Π²

perm = Permission.objects.get(
            content_type=get_content_type(obj),
            codename=codename)

obj - это экзСмпляр ΠΌΠΎΠ΄Π΅Π»ΠΈ с ΠΈΠΌΠ΅Π½Π΅ΠΌ project, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

projs = get_objects_for_user(user, 'api.view_project')
        for proj in projs:
                assign_perm(apps, 'api.edit_project', user, proj)

К соТалСнию, использованиС assign_perms Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ (ΠΈΠ»ΠΈ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, зависящСго ΠΎΡ‚ схСмы, Π½Π΅ входящСго Π² саму ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ) - Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ плохая идСя. Π― Π½Π΅ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½, Ρ‡Ρ‚ΠΎ это Ρ‚ΠΎΠΆΠ΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ это Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, скорСС всСго, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ° поиска ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ модСль, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡƒΡŽ apps.get_model() Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ для ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ.

Однако здСсь Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ assign_perm() ΠΈΠ»ΠΈ Π»ΡŽΠ±ΡƒΡŽ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… assign_perm() . Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π±ΠΎΠ»Π΅Π΅ поздняя вСрсия django-guardian ΠΌΠΎΠ³Π»Π° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ схСму Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ assign_perm() Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ схСму. Π’Π°ΡˆΠΈ старыС ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ прСрвутся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄ assign_perm() со старой схСмой Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

ЀактичСски, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ€ΠΎΠ»ΠΈ, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ этого измСнСния Π² схСмС.

ВСроятно, это Π½Π΅ Ρ‚ΠΎΡ‚ ΠΎΡ‚Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ искали, ΠΎΠ΄Π½Π°ΠΊΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня для установки Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. Под этим я ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽ прямоС взаимодСйствиС с модСлями Permission db. ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Django Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ функциям, зависящим ΠΎΡ‚ схСмы Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Π½Π΅ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² классС ΠΌΠΎΠ΄Π΅Π»ΠΈ db.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Запросы Π½Π° вытягиваниС ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ΡΡ.

Как Ρ‚Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ этой ошибки.

ΠŸΡ€ΠΈΠ²Π΅Ρ‚
Π£ мСня такая ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с вСрсиСй 1.4.4 pf guardian ΠΈ django 1.9.7
любой assign_perm Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ... :(
Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΠ±Π΅Π·ΡŒΡΠ½Ρƒ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ?

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ это Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, скорСС всСго, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ° поиска ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ модСль, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡƒΡŽ apps.get_model (), Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π³Ρ€ΡƒΠΏΠΏΡ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π²Π΅Π»ΠΈ сСбя ΠΊΠ°ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ°-Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅Π»ΡŒ.

Π― ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽ это здСсь Π½Π° случай, Ссли это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅, Π½ΠΎ я написал этот ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ assign_perm для Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ настройки, Π΄Π΅Π»Π°Π΅Ρ‚ нСсколько ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ, вСроятно, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ:

def assign_perm(perm, user_or_group, obj=None, apps=None):
    permission_model = apps.get_model('auth', 'Permission')
    permission = permission_model.objects.get(codename=perm)

    # Assumes object permission models live in the same app as the model they govern
    # and are named like `ProjectUserObjectPermission`/`ProjectGroupObjectPermission`
    obj_permission_model = apps.get_model(obj._meta.app_label, '{}{}ObjectPermission'.format(
        obj._meta.object_name,
        user_or_group._meta.object_name,
    ))
    obj_permission_model.objects.create(
        # `object_pk` and `content_type_id` keys if you're not using direct foreign keys
        # https://django-guardian.readthedocs.io/en/stable/userguide/performance.html#direct-foreign-keys
        content_object=obj,
        permission=permission,
        **{
            user_or_group._meta.model_name: user_or_group
        }
    )
Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

lukaszb picture lukaszb  Β·  14ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

David-OConnor picture David-OConnor  Β·  6ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

BenDevelopment picture BenDevelopment  Β·  5ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

g-as picture g-as  Β·  10ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Allan-Nava picture Allan-Nava  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ