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.

initial = True
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'>>]