authentik.endpoints.migrations.0001_initial
1# Generated by Django 5.2.8 on 2025-11-19 17:50 2 3import authentik.lib.models 4import authentik.lib.utils.time 5import django.db.models.deletion 6import uuid 7from django.db import migrations, models 8 9 10class Migration(migrations.Migration): 11 12 initial = True 13 14 dependencies = [ 15 ("authentik_flows", "0028_flowtoken_revoke_on_execution"), 16 ("authentik_policies", "0011_policybinding_failure_result_and_more"), 17 ] 18 19 operations = [ 20 migrations.CreateModel( 21 name="Connector", 22 fields=[ 23 ( 24 "connector_uuid", 25 models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False), 26 ), 27 ("name", models.TextField()), 28 ("enabled", models.BooleanField(default=True)), 29 ( 30 "snapshot_expiry", 31 models.TextField( 32 default="hours=24", 33 validators=[authentik.lib.utils.time.timedelta_string_validator], 34 ), 35 ), 36 ], 37 options={ 38 "abstract": False, 39 }, 40 ), 41 migrations.CreateModel( 42 name="Device", 43 fields=[ 44 ( 45 "policybindingmodel_ptr", 46 models.OneToOneField( 47 auto_created=True, 48 on_delete=django.db.models.deletion.CASCADE, 49 parent_link=True, 50 to="authentik_policies.policybindingmodel", 51 ), 52 ), 53 ("attributes", models.JSONField(blank=True, default=dict)), 54 ("expires", models.DateTimeField(default=None, null=True)), 55 ("expiring", models.BooleanField(default=True)), 56 ( 57 "device_uuid", 58 models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False), 59 ), 60 ("name", models.TextField()), 61 ("identifier", models.TextField(unique=True)), 62 ], 63 options={ 64 "abstract": False, 65 }, 66 bases=("authentik_policies.policybindingmodel", models.Model), 67 ), 68 migrations.CreateModel( 69 name="DeviceGroup", 70 fields=[ 71 ( 72 "policybindingmodel_ptr", 73 models.OneToOneField( 74 auto_created=True, 75 on_delete=django.db.models.deletion.CASCADE, 76 parent_link=True, 77 primary_key=True, 78 serialize=False, 79 to="authentik_policies.policybindingmodel", 80 ), 81 ), 82 ("name", models.TextField(unique=True)), 83 ], 84 bases=("authentik_policies.policybindingmodel",), 85 ), 86 migrations.CreateModel( 87 name="DeviceConnection", 88 fields=[ 89 ( 90 "device_connection_uuid", 91 models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False), 92 ), 93 ( 94 "connector", 95 models.ForeignKey( 96 on_delete=django.db.models.deletion.CASCADE, 97 to="authentik_endpoints.connector", 98 ), 99 ), 100 ( 101 "device", 102 models.ForeignKey( 103 on_delete=django.db.models.deletion.CASCADE, to="authentik_endpoints.device" 104 ), 105 ), 106 ], 107 options={ 108 "abstract": False, 109 }, 110 ), 111 migrations.AddField( 112 model_name="device", 113 name="connections", 114 field=models.ManyToManyField( 115 through="authentik_endpoints.DeviceConnection", to="authentik_endpoints.connector" 116 ), 117 ), 118 migrations.AddField( 119 model_name="device", 120 name="group", 121 field=models.ForeignKey( 122 default=None, 123 null=True, 124 on_delete=django.db.models.deletion.SET_DEFAULT, 125 to="authentik_endpoints.devicegroup", 126 ), 127 ), 128 migrations.CreateModel( 129 name="DeviceUserBinding", 130 fields=[ 131 ( 132 "policybinding_ptr", 133 models.OneToOneField( 134 auto_created=True, 135 on_delete=django.db.models.deletion.CASCADE, 136 parent_link=True, 137 primary_key=True, 138 serialize=False, 139 to="authentik_policies.policybinding", 140 ), 141 ), 142 ("is_primary", models.BooleanField(default=False)), 143 ( 144 "connector", 145 models.ForeignKey( 146 null=True, 147 on_delete=django.db.models.deletion.CASCADE, 148 to="authentik_endpoints.connector", 149 ), 150 ), 151 ], 152 options={ 153 "abstract": False, 154 }, 155 bases=("authentik_policies.policybinding",), 156 ), 157 migrations.CreateModel( 158 name="EndpointStage", 159 fields=[ 160 ( 161 "stage_ptr", 162 models.OneToOneField( 163 auto_created=True, 164 on_delete=django.db.models.deletion.CASCADE, 165 parent_link=True, 166 primary_key=True, 167 serialize=False, 168 to="authentik_flows.stage", 169 ), 170 ), 171 ( 172 "connector", 173 authentik.lib.models.InheritanceForeignKey( 174 on_delete=django.db.models.deletion.CASCADE, 175 to="authentik_endpoints.connector", 176 ), 177 ), 178 ], 179 options={ 180 "abstract": False, 181 }, 182 bases=("authentik_flows.stage",), 183 ), 184 migrations.CreateModel( 185 name="DeviceFactSnapshot", 186 fields=[ 187 ("expires", models.DateTimeField(default=None, null=True)), 188 ("expiring", models.BooleanField(default=True)), 189 ( 190 "snapshot_id", 191 models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False), 192 ), 193 ("data", models.JSONField(default=dict)), 194 ("created", models.DateTimeField(auto_now_add=True)), 195 ( 196 "connection", 197 models.ForeignKey( 198 on_delete=django.db.models.deletion.CASCADE, 199 to="authentik_endpoints.deviceconnection", 200 ), 201 ), 202 ], 203 options={ 204 "abstract": False, 205 "indexes": [ 206 models.Index(fields=["expires"], name="authentik_e_expires_a1e8b7_idx"), 207 models.Index(fields=["expiring"], name="authentik_e_expirin_b1eb6b_idx"), 208 models.Index( 209 fields=["expiring", "expires"], name="authentik_e_expirin_ce06ca_idx" 210 ), 211 ], 212 }, 213 ), 214 migrations.AddIndex( 215 model_name="device", 216 index=models.Index(fields=["expires"], name="authentik_e_expires_f533f5_idx"), 217 ), 218 migrations.AddIndex( 219 model_name="device", 220 index=models.Index(fields=["expiring"], name="authentik_e_expirin_038503_idx"), 221 ), 222 migrations.AddIndex( 223 model_name="device", 224 index=models.Index( 225 fields=["expiring", "expires"], name="authentik_e_expirin_b26ba1_idx" 226 ), 227 ), 228 ]
class
Migration(django.db.migrations.migration.Migration):
11class Migration(migrations.Migration): 12 13 initial = True 14 15 dependencies = [ 16 ("authentik_flows", "0028_flowtoken_revoke_on_execution"), 17 ("authentik_policies", "0011_policybinding_failure_result_and_more"), 18 ] 19 20 operations = [ 21 migrations.CreateModel( 22 name="Connector", 23 fields=[ 24 ( 25 "connector_uuid", 26 models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False), 27 ), 28 ("name", models.TextField()), 29 ("enabled", models.BooleanField(default=True)), 30 ( 31 "snapshot_expiry", 32 models.TextField( 33 default="hours=24", 34 validators=[authentik.lib.utils.time.timedelta_string_validator], 35 ), 36 ), 37 ], 38 options={ 39 "abstract": False, 40 }, 41 ), 42 migrations.CreateModel( 43 name="Device", 44 fields=[ 45 ( 46 "policybindingmodel_ptr", 47 models.OneToOneField( 48 auto_created=True, 49 on_delete=django.db.models.deletion.CASCADE, 50 parent_link=True, 51 to="authentik_policies.policybindingmodel", 52 ), 53 ), 54 ("attributes", models.JSONField(blank=True, default=dict)), 55 ("expires", models.DateTimeField(default=None, null=True)), 56 ("expiring", models.BooleanField(default=True)), 57 ( 58 "device_uuid", 59 models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False), 60 ), 61 ("name", models.TextField()), 62 ("identifier", models.TextField(unique=True)), 63 ], 64 options={ 65 "abstract": False, 66 }, 67 bases=("authentik_policies.policybindingmodel", models.Model), 68 ), 69 migrations.CreateModel( 70 name="DeviceGroup", 71 fields=[ 72 ( 73 "policybindingmodel_ptr", 74 models.OneToOneField( 75 auto_created=True, 76 on_delete=django.db.models.deletion.CASCADE, 77 parent_link=True, 78 primary_key=True, 79 serialize=False, 80 to="authentik_policies.policybindingmodel", 81 ), 82 ), 83 ("name", models.TextField(unique=True)), 84 ], 85 bases=("authentik_policies.policybindingmodel",), 86 ), 87 migrations.CreateModel( 88 name="DeviceConnection", 89 fields=[ 90 ( 91 "device_connection_uuid", 92 models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False), 93 ), 94 ( 95 "connector", 96 models.ForeignKey( 97 on_delete=django.db.models.deletion.CASCADE, 98 to="authentik_endpoints.connector", 99 ), 100 ), 101 ( 102 "device", 103 models.ForeignKey( 104 on_delete=django.db.models.deletion.CASCADE, to="authentik_endpoints.device" 105 ), 106 ), 107 ], 108 options={ 109 "abstract": False, 110 }, 111 ), 112 migrations.AddField( 113 model_name="device", 114 name="connections", 115 field=models.ManyToManyField( 116 through="authentik_endpoints.DeviceConnection", to="authentik_endpoints.connector" 117 ), 118 ), 119 migrations.AddField( 120 model_name="device", 121 name="group", 122 field=models.ForeignKey( 123 default=None, 124 null=True, 125 on_delete=django.db.models.deletion.SET_DEFAULT, 126 to="authentik_endpoints.devicegroup", 127 ), 128 ), 129 migrations.CreateModel( 130 name="DeviceUserBinding", 131 fields=[ 132 ( 133 "policybinding_ptr", 134 models.OneToOneField( 135 auto_created=True, 136 on_delete=django.db.models.deletion.CASCADE, 137 parent_link=True, 138 primary_key=True, 139 serialize=False, 140 to="authentik_policies.policybinding", 141 ), 142 ), 143 ("is_primary", models.BooleanField(default=False)), 144 ( 145 "connector", 146 models.ForeignKey( 147 null=True, 148 on_delete=django.db.models.deletion.CASCADE, 149 to="authentik_endpoints.connector", 150 ), 151 ), 152 ], 153 options={ 154 "abstract": False, 155 }, 156 bases=("authentik_policies.policybinding",), 157 ), 158 migrations.CreateModel( 159 name="EndpointStage", 160 fields=[ 161 ( 162 "stage_ptr", 163 models.OneToOneField( 164 auto_created=True, 165 on_delete=django.db.models.deletion.CASCADE, 166 parent_link=True, 167 primary_key=True, 168 serialize=False, 169 to="authentik_flows.stage", 170 ), 171 ), 172 ( 173 "connector", 174 authentik.lib.models.InheritanceForeignKey( 175 on_delete=django.db.models.deletion.CASCADE, 176 to="authentik_endpoints.connector", 177 ), 178 ), 179 ], 180 options={ 181 "abstract": False, 182 }, 183 bases=("authentik_flows.stage",), 184 ), 185 migrations.CreateModel( 186 name="DeviceFactSnapshot", 187 fields=[ 188 ("expires", models.DateTimeField(default=None, null=True)), 189 ("expiring", models.BooleanField(default=True)), 190 ( 191 "snapshot_id", 192 models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False), 193 ), 194 ("data", models.JSONField(default=dict)), 195 ("created", models.DateTimeField(auto_now_add=True)), 196 ( 197 "connection", 198 models.ForeignKey( 199 on_delete=django.db.models.deletion.CASCADE, 200 to="authentik_endpoints.deviceconnection", 201 ), 202 ), 203 ], 204 options={ 205 "abstract": False, 206 "indexes": [ 207 models.Index(fields=["expires"], name="authentik_e_expires_a1e8b7_idx"), 208 models.Index(fields=["expiring"], name="authentik_e_expirin_b1eb6b_idx"), 209 models.Index( 210 fields=["expiring", "expires"], name="authentik_e_expirin_ce06ca_idx" 211 ), 212 ], 213 }, 214 ), 215 migrations.AddIndex( 216 model_name="device", 217 index=models.Index(fields=["expires"], name="authentik_e_expires_f533f5_idx"), 218 ), 219 migrations.AddIndex( 220 model_name="device", 221 index=models.Index(fields=["expiring"], name="authentik_e_expirin_038503_idx"), 222 ), 223 migrations.AddIndex( 224 model_name="device", 225 index=models.Index( 226 fields=["expiring", "expires"], name="authentik_e_expirin_b26ba1_idx" 227 ), 228 ), 229 ]
The base class for all migrations.
Migration files will import this from django.db.migrations.Migration and subclass it as a class called Migration. It will have one or more of the following attributes:
- operations: A list of Operation instances, probably from django.db.migrations.operations
- dependencies: A list of tuples of (app_path, migration_name)
- run_before: A list of tuples of (app_path, migration_name)
- replaces: A list of migration_names
Note that all migrations come out of migrations and into the Loader or Graph as instances, having been initialized with their app label and name.
dependencies =
[('authentik_flows', '0028_flowtoken_revoke_on_execution'), ('authentik_policies', '0011_policybinding_failure_result_and_more')]
operations =
[<CreateModel name='Connector', fields=[('connector_uuid', <django.db.models.fields.UUIDField>), ('name', <django.db.models.fields.TextField>), ('enabled', <django.db.models.fields.BooleanField>), ('snapshot_expiry', <django.db.models.fields.TextField>)], options={'abstract': False}>, <CreateModel name='Device', fields=[('policybindingmodel_ptr', <django.db.models.fields.related.OneToOneField>), ('attributes', <django.db.models.fields.json.JSONField>), ('expires', <django.db.models.fields.DateTimeField>), ('expiring', <django.db.models.fields.BooleanField>), ('device_uuid', <django.db.models.fields.UUIDField>), ('name', <django.db.models.fields.TextField>), ('identifier', <django.db.models.fields.TextField>)], options={'abstract': False}, bases=('authentik_policies.policybindingmodel', <class 'django.db.models.base.Model'>)>, <CreateModel name='DeviceGroup', fields=[('policybindingmodel_ptr', <django.db.models.fields.related.OneToOneField>), ('name', <django.db.models.fields.TextField>)], bases=('authentik_policies.policybindingmodel',)>, <CreateModel name='DeviceConnection', fields=[('device_connection_uuid', <django.db.models.fields.UUIDField>), ('connector', <django.db.models.fields.related.ForeignKey>), ('device', <django.db.models.fields.related.ForeignKey>)], options={'abstract': False}>, <AddField model_name='device', name='connections', field=<django.db.models.fields.related.ManyToManyField>>, <AddField model_name='device', name='group', field=<django.db.models.fields.related.ForeignKey>>, <CreateModel name='DeviceUserBinding', fields=[('policybinding_ptr', <django.db.models.fields.related.OneToOneField>), ('is_primary', <django.db.models.fields.BooleanField>), ('connector', <django.db.models.fields.related.ForeignKey>)], options={'abstract': False}, bases=('authentik_policies.policybinding',)>, <CreateModel name='EndpointStage', fields=[('stage_ptr', <django.db.models.fields.related.OneToOneField>), ('connector', <authentik.lib.models.InheritanceForeignKey>)], options={'abstract': False}, bases=('authentik_flows.stage',)>, <CreateModel name='DeviceFactSnapshot', fields=[('expires', <django.db.models.fields.DateTimeField>), ('expiring', <django.db.models.fields.BooleanField>), ('snapshot_id', <django.db.models.fields.UUIDField>), ('data', <django.db.models.fields.json.JSONField>), ('created', <django.db.models.fields.DateTimeField>), ('connection', <django.db.models.fields.related.ForeignKey>)], options={'abstract': False, 'indexes': [<Index: fields=['expires'] name='authentik_e_expires_a1e8b7_idx'>, <Index: fields=['expiring'] name='authentik_e_expirin_b1eb6b_idx'>, <Index: fields=['expiring', 'expires'] name='authentik_e_expirin_ce06ca_idx'>]}>, <AddIndex model_name='device', index=<Index: fields=['expires'] name='authentik_e_expires_f533f5_idx'>>, <AddIndex model_name='device', index=<Index: fields=['expiring'] name='authentik_e_expirin_038503_idx'>>, <AddIndex model_name='device', index=<Index: fields=['expiring', 'expires'] name='authentik_e_expirin_b26ba1_idx'>>]