Django-guardian: استخدام assign_perm في ترحيل django 1.7

تم إنشاؤها على ١٣ نوفمبر ٢٠١٤  ·  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 call:

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 هو مثيل لمشروع يسمى النموذج الذي أحصل عليه مثل هذا:

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
لا تعمل أي عمليات ترحيل داخل التعيين_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 التقييمات

القضايا ذات الصلة

Dzejkob picture Dzejkob  ·  28تعليقات

brianmay picture brianmay  ·  16تعليقات

Allan-Nava picture Allan-Nava  ·  35تعليقات

lukaszb picture lukaszb  ·  14تعليقات

BenDevelopment picture BenDevelopment  ·  5تعليقات