import users.models from django.db import migrations, models def update_custom_fields(apps, schema_editor): """ Update any CustomFields referencing the old Group model to use the new model. """ ContentType = apps.get_model('contenttypes', 'ContentType') CustomField = apps.get_model('extras', 'CustomField') Group = apps.get_model('users', 'Group') if old_ct := ContentType.objects.filter(app_label='users', model='netboxgroup').first(): new_ct = ContentType.objects.get_for_model(Group) CustomField.objects.filter(related_object_type=old_ct).update(related_object_type=new_ct) class Migration(migrations.Migration): dependencies = [ ('users', '0005_alter_user_table'), ] operations = [ # Create the new Group model & table migrations.CreateModel( name='Group', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), ('name', models.CharField(max_length=150, unique=True)), ('description', models.CharField(blank=True, max_length=200)), ('permissions', models.ManyToManyField(blank=True, related_name='groups', related_query_name='group', to='auth.permission')), ], options={ 'ordering': ('name',), 'verbose_name': 'group', 'verbose_name_plural': 'groups', }, managers=[ ('objects', users.models.GroupManager()), ], ), # Copy existing groups from the old table into the new one migrations.RunSQL( "INSERT INTO users_group (SELECT id, name, '' AS description FROM auth_group)" ), # Update the sequence for group ID values migrations.RunSQL( "SELECT setval('users_group_id_seq', (SELECT MAX(id) FROM users_group))" ), # Update the "groups" M2M fields on User & ObjectPermission migrations.AlterField( model_name='user', name='groups', field=models.ManyToManyField(blank=True, related_name='users', related_query_name='user', to='users.group'), ), migrations.AlterField( model_name='objectpermission', name='groups', field=models.ManyToManyField(blank=True, related_name='object_permissions', to='users.group'), ), # Delete any lingering group assignments for legacy permissions (from before NetBox v2.9) migrations.RunSQL( "DELETE from auth_group_permissions" ), # Delete groups from the old table migrations.RunSQL( "DELETE from auth_group" ), # Update custom fields migrations.RunPython( code=update_custom_fields, reverse_code=migrations.RunPython.noop ), # Delete the proxy model migrations.DeleteModel( name='NetBoxGroup', ), ]