Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ:
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)
+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
}
)
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π― ΠΏΡΠ±Π»ΠΈΠΊΡΡ ΡΡΠΎ Π·Π΄Π΅ΡΡ Π½Π° ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π΅ΡΠ΅, Π½ΠΎ Ρ Π½Π°ΠΏΠΈΡΠ°Π» ΡΡΠΎΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄
assign_perm
Π΄Π»Ρ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, Π΄Π΅Π»Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ: