Просмотр исходного кода

Add migration for replicating legact permissions to ObjectPermissions

Jeremy Stretch 5 лет назад
Родитель
Сommit
5d3cf8074b
1 измененных файлов с 41 добавлено и 0 удалено
  1. 41 0
      netbox/users/migrations/0009_replicate_permissions.py

+ 41 - 0
netbox/users/migrations/0009_replicate_permissions.py

@@ -0,0 +1,41 @@
+from django.db import migrations
+
+
+ACTIONS = ['view', 'add', 'change', 'delete']
+
+
+def replicate_permissions(apps, schema_editor):
+    """
+    Replicate all Permission assignments as ObjectPermissions.
+    """
+    Permission = apps.get_model('auth', 'Permission')
+    ObjectPermission = apps.get_model('users', 'ObjectPermission')
+
+    # TODO: Optimize this iteration so that ObjectPermissions with identical sets of users and groups
+    # are combined into a single ObjectPermission instance.
+    for perm in Permission.objects.all():
+        print(f'Replicating permission {perm.codename}')
+        action, model_name = perm.codename.split('_')
+
+        if perm.group_set.exists() or perm.user_set.exists():
+            obj_perm = ObjectPermission(actions=[action])
+            obj_perm.save()
+            obj_perm.content_types.add(perm.content_type)
+            if perm.group_set.exists():
+                obj_perm.groups.add(*list(perm.group_set.all()))
+            if perm.user_set.exists():
+                obj_perm.users.add(*list(perm.user_set.all()))
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('users', '0008_objectpermission'),
+    ]
+
+    operations = [
+        migrations.RunPython(
+            code=replicate_permissions,
+            reverse_code=migrations.RunPython.noop
+        )
+    ]