authentik.enterprise.lifecycle.migrations.0001_initial

  1# Generated by Django 5.2.11 on 2026-02-09 15:57
  2
  3import authentik.lib.utils.time
  4import django.db.models.deletion
  5import uuid
  6from django.conf import settings
  7from django.db import migrations, models
  8
  9
 10class Migration(migrations.Migration):
 11
 12    initial = True
 13
 14    dependencies = [
 15        ("authentik_core", "0057_remove_user_groups_remove_user_user_permissions_and_more"),
 16        ("authentik_events", "0016_alter_event_action"),
 17        ("contenttypes", "0002_remove_content_type_name"),
 18        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 19    ]
 20
 21    operations = [
 22        migrations.CreateModel(
 23            name="LifecycleRule",
 24            fields=[
 25                ("id", models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
 26                ("name", models.TextField(unique=True)),
 27                ("object_id", models.TextField(default=None, null=True)),
 28                (
 29                    "interval",
 30                    models.TextField(
 31                        default="days=60",
 32                        validators=[authentik.lib.utils.time.timedelta_string_validator],
 33                    ),
 34                ),
 35                (
 36                    "grace_period",
 37                    models.TextField(
 38                        default="days=30",
 39                        validators=[authentik.lib.utils.time.timedelta_string_validator],
 40                    ),
 41                ),
 42                ("min_reviewers", models.PositiveSmallIntegerField(default=1)),
 43                ("min_reviewers_is_per_group", models.BooleanField(default=False)),
 44                (
 45                    "content_type",
 46                    models.ForeignKey(
 47                        on_delete=django.db.models.deletion.CASCADE, to="contenttypes.contenttype"
 48                    ),
 49                ),
 50                (
 51                    "notification_transports",
 52                    models.ManyToManyField(
 53                        blank=True,
 54                        help_text="Select which transports should be used to notify the reviewers. If none are selected, the notification will only be shown in the authentik UI.",
 55                        to="authentik_events.notificationtransport",
 56                    ),
 57                ),
 58                ("reviewer_groups", models.ManyToManyField(blank=True, to="authentik_core.group")),
 59                ("reviewers", models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL)),
 60            ],
 61        ),
 62        migrations.CreateModel(
 63            name="LifecycleIteration",
 64            fields=[
 65                (
 66                    "managed",
 67                    models.TextField(
 68                        default=None,
 69                        help_text="Objects that are managed by authentik. These objects are created and updated automatically. This flag only indicates that an object can be overwritten by migrations. You can still modify the objects via the API, but expect changes to be overwritten in a later update.",
 70                        null=True,
 71                        unique=True,
 72                        verbose_name="Managed by authentik",
 73                    ),
 74                ),
 75                ("id", models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
 76                ("object_id", models.TextField()),
 77                (
 78                    "state",
 79                    models.CharField(
 80                        choices=[
 81                            ("REVIEWED", "Reviewed"),
 82                            ("PENDING", "Pending"),
 83                            ("OVERDUE", "Overdue"),
 84                            ("CANCELED", "Canceled"),
 85                        ],
 86                        default="PENDING",
 87                        max_length=10,
 88                    ),
 89                ),
 90                ("opened_on", models.DateField(auto_now_add=True)),
 91                (
 92                    "content_type",
 93                    models.ForeignKey(
 94                        on_delete=django.db.models.deletion.CASCADE, to="contenttypes.contenttype"
 95                    ),
 96                ),
 97                (
 98                    "rule",
 99                    models.ForeignKey(
100                        null=True,
101                        on_delete=django.db.models.deletion.SET_NULL,
102                        to="authentik_lifecycle.lifecyclerule",
103                    ),
104                ),
105            ],
106        ),
107        migrations.CreateModel(
108            name="Review",
109            fields=[
110                ("id", models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
111                ("timestamp", models.DateTimeField(auto_now_add=True)),
112                ("note", models.TextField(null=True)),
113                (
114                    "iteration",
115                    models.ForeignKey(
116                        on_delete=django.db.models.deletion.CASCADE,
117                        to="authentik_lifecycle.lifecycleiteration",
118                    ),
119                ),
120                (
121                    "reviewer",
122                    models.ForeignKey(
123                        on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL
124                    ),
125                ),
126            ],
127        ),
128        migrations.AddIndex(
129            model_name="lifecyclerule",
130            index=models.Index(fields=["content_type"], name="authentik_l_content_4e3a6a_idx"),
131        ),
132        migrations.AddConstraint(
133            model_name="lifecyclerule",
134            constraint=models.UniqueConstraint(
135                condition=models.Q(("object_id__isnull", True)),
136                fields=("content_type",),
137                name="uniq_lifecycle_rule_ct_null_object",
138            ),
139        ),
140        migrations.AlterUniqueTogether(
141            name="lifecyclerule",
142            unique_together={("content_type", "object_id")},
143        ),
144        migrations.AddIndex(
145            model_name="lifecycleiteration",
146            index=models.Index(
147                fields=["content_type", "opened_on"], name="authentik_l_content_09c32a_idx"
148            ),
149        ),
150        migrations.AlterUniqueTogether(
151            name="review",
152            unique_together={("iteration", "reviewer")},
153        ),
154    ]
class Migration(django.db.migrations.migration.Migration):
 11class Migration(migrations.Migration):
 12
 13    initial = True
 14
 15    dependencies = [
 16        ("authentik_core", "0057_remove_user_groups_remove_user_user_permissions_and_more"),
 17        ("authentik_events", "0016_alter_event_action"),
 18        ("contenttypes", "0002_remove_content_type_name"),
 19        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 20    ]
 21
 22    operations = [
 23        migrations.CreateModel(
 24            name="LifecycleRule",
 25            fields=[
 26                ("id", models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
 27                ("name", models.TextField(unique=True)),
 28                ("object_id", models.TextField(default=None, null=True)),
 29                (
 30                    "interval",
 31                    models.TextField(
 32                        default="days=60",
 33                        validators=[authentik.lib.utils.time.timedelta_string_validator],
 34                    ),
 35                ),
 36                (
 37                    "grace_period",
 38                    models.TextField(
 39                        default="days=30",
 40                        validators=[authentik.lib.utils.time.timedelta_string_validator],
 41                    ),
 42                ),
 43                ("min_reviewers", models.PositiveSmallIntegerField(default=1)),
 44                ("min_reviewers_is_per_group", models.BooleanField(default=False)),
 45                (
 46                    "content_type",
 47                    models.ForeignKey(
 48                        on_delete=django.db.models.deletion.CASCADE, to="contenttypes.contenttype"
 49                    ),
 50                ),
 51                (
 52                    "notification_transports",
 53                    models.ManyToManyField(
 54                        blank=True,
 55                        help_text="Select which transports should be used to notify the reviewers. If none are selected, the notification will only be shown in the authentik UI.",
 56                        to="authentik_events.notificationtransport",
 57                    ),
 58                ),
 59                ("reviewer_groups", models.ManyToManyField(blank=True, to="authentik_core.group")),
 60                ("reviewers", models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL)),
 61            ],
 62        ),
 63        migrations.CreateModel(
 64            name="LifecycleIteration",
 65            fields=[
 66                (
 67                    "managed",
 68                    models.TextField(
 69                        default=None,
 70                        help_text="Objects that are managed by authentik. These objects are created and updated automatically. This flag only indicates that an object can be overwritten by migrations. You can still modify the objects via the API, but expect changes to be overwritten in a later update.",
 71                        null=True,
 72                        unique=True,
 73                        verbose_name="Managed by authentik",
 74                    ),
 75                ),
 76                ("id", models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
 77                ("object_id", models.TextField()),
 78                (
 79                    "state",
 80                    models.CharField(
 81                        choices=[
 82                            ("REVIEWED", "Reviewed"),
 83                            ("PENDING", "Pending"),
 84                            ("OVERDUE", "Overdue"),
 85                            ("CANCELED", "Canceled"),
 86                        ],
 87                        default="PENDING",
 88                        max_length=10,
 89                    ),
 90                ),
 91                ("opened_on", models.DateField(auto_now_add=True)),
 92                (
 93                    "content_type",
 94                    models.ForeignKey(
 95                        on_delete=django.db.models.deletion.CASCADE, to="contenttypes.contenttype"
 96                    ),
 97                ),
 98                (
 99                    "rule",
100                    models.ForeignKey(
101                        null=True,
102                        on_delete=django.db.models.deletion.SET_NULL,
103                        to="authentik_lifecycle.lifecyclerule",
104                    ),
105                ),
106            ],
107        ),
108        migrations.CreateModel(
109            name="Review",
110            fields=[
111                ("id", models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
112                ("timestamp", models.DateTimeField(auto_now_add=True)),
113                ("note", models.TextField(null=True)),
114                (
115                    "iteration",
116                    models.ForeignKey(
117                        on_delete=django.db.models.deletion.CASCADE,
118                        to="authentik_lifecycle.lifecycleiteration",
119                    ),
120                ),
121                (
122                    "reviewer",
123                    models.ForeignKey(
124                        on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL
125                    ),
126                ),
127            ],
128        ),
129        migrations.AddIndex(
130            model_name="lifecyclerule",
131            index=models.Index(fields=["content_type"], name="authentik_l_content_4e3a6a_idx"),
132        ),
133        migrations.AddConstraint(
134            model_name="lifecyclerule",
135            constraint=models.UniqueConstraint(
136                condition=models.Q(("object_id__isnull", True)),
137                fields=("content_type",),
138                name="uniq_lifecycle_rule_ct_null_object",
139            ),
140        ),
141        migrations.AlterUniqueTogether(
142            name="lifecyclerule",
143            unique_together={("content_type", "object_id")},
144        ),
145        migrations.AddIndex(
146            model_name="lifecycleiteration",
147            index=models.Index(
148                fields=["content_type", "opened_on"], name="authentik_l_content_09c32a_idx"
149            ),
150        ),
151        migrations.AlterUniqueTogether(
152            name="review",
153            unique_together={("iteration", "reviewer")},
154        ),
155    ]

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_core', '0057_remove_user_groups_remove_user_user_permissions_and_more'), ('authentik_events', '0016_alter_event_action'), ('contenttypes', '0002_remove_content_type_name'), ('authentik_core', '__first__')]
operations = [<CreateModel name='LifecycleRule', fields=[('id', <django.db.models.fields.UUIDField>), ('name', <django.db.models.fields.TextField>), ('object_id', <django.db.models.fields.TextField>), ('interval', <django.db.models.fields.TextField>), ('grace_period', <django.db.models.fields.TextField>), ('min_reviewers', <django.db.models.fields.PositiveSmallIntegerField>), ('min_reviewers_is_per_group', <django.db.models.fields.BooleanField>), ('content_type', <django.db.models.fields.related.ForeignKey>), ('notification_transports', <django.db.models.fields.related.ManyToManyField>), ('reviewer_groups', <django.db.models.fields.related.ManyToManyField>), ('reviewers', <django.db.models.fields.related.ManyToManyField>)]>, <CreateModel name='LifecycleIteration', fields=[('managed', <django.db.models.fields.TextField>), ('id', <django.db.models.fields.UUIDField>), ('object_id', <django.db.models.fields.TextField>), ('state', <django.db.models.fields.CharField>), ('opened_on', <django.db.models.fields.DateField>), ('content_type', <django.db.models.fields.related.ForeignKey>), ('rule', <django.db.models.fields.related.ForeignKey>)]>, <CreateModel name='Review', fields=[('id', <django.db.models.fields.UUIDField>), ('timestamp', <django.db.models.fields.DateTimeField>), ('note', <django.db.models.fields.TextField>), ('iteration', <django.db.models.fields.related.ForeignKey>), ('reviewer', <django.db.models.fields.related.ForeignKey>)]>, <AddIndex model_name='lifecyclerule', index=<Index: fields=['content_type'] name='authentik_l_content_4e3a6a_idx'>>, <AddConstraint model_name='lifecyclerule', constraint=<UniqueConstraint: fields=('content_type',) name='uniq_lifecycle_rule_ct_null_object' condition=(AND: ('object_id__isnull', True))>>, <AlterUniqueTogether name='lifecyclerule', unique_together={('content_type', 'object_id')}>, <AddIndex model_name='lifecycleiteration', index=<Index: fields=['content_type', 'opened_on'] name='authentik_l_content_09c32a_idx'>>, <AlterUniqueTogether name='review', unique_together={('iteration', 'reviewer')}>]