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

Introduce proxy models for User and Group to organize admin UI

Jeremy Stretch 5 лет назад
Родитель
Сommit
90828cedae

+ 4 - 4
netbox/users/admin.py

@@ -1,10 +1,10 @@
 from django import forms
 from django.contrib import admin
 from django.contrib.auth.admin import UserAdmin as UserAdmin_
-from django.contrib.auth.models import Group, User
+from django.contrib.auth.models import Group as StockGroup, User as StockUser
 
 from extras.admin import order_content_types
-from .models import ObjectPermission, Token, UserConfig
+from .models import Group, User, ObjectPermission, Token, UserConfig
 
 
 #
@@ -12,8 +12,8 @@ from .models import ObjectPermission, Token, UserConfig
 #
 
 # Unregister the built-in GroupAdmin and UserAdmin classes so that we can use our custom admin classes below
-admin.site.unregister(Group)
-admin.site.unregister(User)
+admin.site.unregister(StockGroup)
+admin.site.unregister(StockUser)
 
 
 @admin.register(Group)

+ 0 - 32
netbox/users/migrations/0007_objectpermission.py

@@ -1,32 +0,0 @@
-# Generated by Django 3.0.6 on 2020-05-28 18:24
-
-from django.conf import settings
-import django.contrib.postgres.fields.jsonb
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('contenttypes', '0002_remove_content_type_name'),
-        ('auth', '0011_update_proxy_permissions'),
-        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
-        ('users', '0006_create_userconfigs'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='ObjectPermission',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
-                ('attrs', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True)),
-                ('can_view', models.BooleanField(default=False)),
-                ('can_add', models.BooleanField(default=False)),
-                ('can_change', models.BooleanField(default=False)),
-                ('can_delete', models.BooleanField(default=False)),
-                ('content_types', models.ManyToManyField(limit_choices_to={'app_label__in': ['circuits', 'dcim', 'extras', 'ipam', 'secrets', 'tenancy', 'virtualization']}, related_name='object_permissions', to='contenttypes.ContentType')),
-                ('groups', models.ManyToManyField(blank=True, related_name='object_permissions', to='auth.Group')),
-                ('users', models.ManyToManyField(blank=True, related_name='object_permissions', to=settings.AUTH_USER_MODEL)),
-            ],
-        ),
-    ]

+ 44 - 0
netbox/users/migrations/0007_proxy_group_user.py

@@ -0,0 +1,44 @@
+# Generated by Django 3.0.6 on 2020-05-29 14:30
+
+import django.contrib.auth.models
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('auth', '0011_update_proxy_permissions'),
+        ('users', '0006_create_userconfigs'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Group',
+            fields=[
+            ],
+            options={
+                'proxy': True,
+                'indexes': [],
+                'constraints': [],
+            },
+            bases=('auth.group',),
+            managers=[
+                ('objects', django.contrib.auth.models.GroupManager()),
+            ],
+        ),
+        migrations.CreateModel(
+            name='User',
+            fields=[
+            ],
+            options={
+                'proxy': True,
+                'indexes': [],
+                'constraints': [],
+            },
+            bases=('auth.user',),
+            managers=[
+                ('objects', django.contrib.auth.models.UserManager()),
+            ],
+        ),
+    ]

+ 33 - 3
netbox/users/models.py

@@ -1,18 +1,16 @@
 import binascii
 import os
 
-from django.contrib.auth.models import Group, User
+from django.contrib.auth.models import Group as Group_, User as User_
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.postgres.fields import JSONField
 from django.core.exceptions import FieldError, ValidationError
 from django.core.validators import MinLengthValidator
 from django.db import models
-from django.db.models import Q
 from django.db.models.signals import post_save
 from django.dispatch import receiver
 from django.utils import timezone
 
-from utilities.permissions import resolve_permission
 from utilities.utils import flatten_dict
 
 
@@ -23,6 +21,30 @@ __all__ = (
 )
 
 
+#
+# Proxy models for admin
+#
+
+class Group(Group_):
+    """
+    Proxy contrib.auth.models.Group for the admin UI
+    """
+    class Meta:
+        proxy = True
+
+
+class User(User_):
+    """
+    Proxy contrib.auth.models.User for the admin UI
+    """
+    class Meta:
+        proxy = True
+
+
+#
+# User preferences
+#
+
 class UserConfig(models.Model):
     """
     This model stores arbitrary user-specific preferences in a JSON data structure.
@@ -143,6 +165,10 @@ def create_userconfig(instance, created, **kwargs):
         UserConfig(user=instance).save()
 
 
+#
+# REST API
+#
+
 class Token(models.Model):
     """
     An API token used for user authentication. This extends the stock model to allow each user to have multiple tokens.
@@ -197,6 +223,10 @@ class Token(models.Model):
         return True
 
 
+#
+# Permissions
+#
+
 class ObjectPermission(models.Model):
     """
     A mapping of view, add, change, and/or delete permission for users and/or groups to an arbitrary set of objects