authentik.stages.authenticator_email.migrations.0001_initial

  1# Generated by Django 5.0.10 on 2025-01-27 20:05
  2
  3import django.db.models.deletion
  4import django.utils.timezone
  5from django.conf import settings
  6from django.db import migrations, models
  7
  8import authentik.lib.utils.time
  9
 10
 11class Migration(migrations.Migration):
 12
 13    initial = True
 14
 15    dependencies = [
 16        ("authentik_flows", "0027_auto_20231028_1424"),
 17        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 18    ]
 19
 20    operations = [
 21        migrations.CreateModel(
 22            name="AuthenticatorEmailStage",
 23            fields=[
 24                (
 25                    "stage_ptr",
 26                    models.OneToOneField(
 27                        auto_created=True,
 28                        on_delete=django.db.models.deletion.CASCADE,
 29                        parent_link=True,
 30                        primary_key=True,
 31                        serialize=False,
 32                        to="authentik_flows.stage",
 33                    ),
 34                ),
 35                ("friendly_name", models.TextField(null=True)),
 36                (
 37                    "use_global_settings",
 38                    models.BooleanField(
 39                        default=False,
 40                        help_text="When enabled, global Email connection settings will be used and connection settings below will be ignored.",
 41                    ),
 42                ),
 43                ("host", models.TextField(default="localhost")),
 44                ("port", models.IntegerField(default=25)),
 45                ("username", models.TextField(blank=True, default="")),
 46                ("password", models.TextField(blank=True, default="")),
 47                ("use_tls", models.BooleanField(default=False)),
 48                ("use_ssl", models.BooleanField(default=False)),
 49                ("timeout", models.IntegerField(default=10)),
 50                (
 51                    "from_address",
 52                    models.EmailField(default="system@authentik.local", max_length=254),
 53                ),
 54                (
 55                    "token_expiry",
 56                    models.TextField(
 57                        default="minutes=30",
 58                        help_text="Time the token sent is valid (Format: hours=3,minutes=17,seconds=300).",
 59                        validators=[authentik.lib.utils.time.timedelta_string_validator],
 60                    ),
 61                ),
 62                ("subject", models.TextField(default="authentik Sign-in code")),
 63                ("template", models.TextField(default="email/email_otp.html")),
 64                (
 65                    "configure_flow",
 66                    models.ForeignKey(
 67                        blank=True,
 68                        help_text="Flow used by an authenticated user to configure this Stage. If empty, user will not be able to configure this stage.",
 69                        null=True,
 70                        on_delete=django.db.models.deletion.SET_NULL,
 71                        to="authentik_flows.flow",
 72                    ),
 73                ),
 74            ],
 75            options={
 76                "verbose_name": "Email Authenticator Setup Stage",
 77                "verbose_name_plural": "Email Authenticator Setup Stages",
 78            },
 79            bases=("authentik_flows.stage", models.Model),
 80        ),
 81        migrations.CreateModel(
 82            name="EmailDevice",
 83            fields=[
 84                (
 85                    "id",
 86                    models.AutoField(
 87                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
 88                    ),
 89                ),
 90                ("created", models.DateTimeField(auto_now_add=True)),
 91                ("last_updated", models.DateTimeField(auto_now=True)),
 92                (
 93                    "name",
 94                    models.CharField(
 95                        help_text="The human-readable name of this device.", max_length=64
 96                    ),
 97                ),
 98                (
 99                    "confirmed",
100                    models.BooleanField(default=True, help_text="Is this device ready for use?"),
101                ),
102                ("token", models.CharField(blank=True, max_length=16, null=True)),
103                (
104                    "valid_until",
105                    models.DateTimeField(
106                        default=django.utils.timezone.now,
107                        help_text="The timestamp of the moment of expiry of the saved token.",
108                    ),
109                ),
110                ("email", models.EmailField(max_length=254)),
111                ("last_used", models.DateTimeField(auto_now=True)),
112                (
113                    "stage",
114                    models.ForeignKey(
115                        on_delete=django.db.models.deletion.CASCADE,
116                        to="authentik_stages_authenticator_email.authenticatoremailstage",
117                    ),
118                ),
119                (
120                    "user",
121                    models.ForeignKey(
122                        on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL
123                    ),
124                ),
125            ],
126            options={
127                "verbose_name": "Email Device",
128                "verbose_name_plural": "Email Devices",
129                "unique_together": {("user", "email")},
130            },
131        ),
132    ]
class Migration(django.db.migrations.migration.Migration):
 12class Migration(migrations.Migration):
 13
 14    initial = True
 15
 16    dependencies = [
 17        ("authentik_flows", "0027_auto_20231028_1424"),
 18        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 19    ]
 20
 21    operations = [
 22        migrations.CreateModel(
 23            name="AuthenticatorEmailStage",
 24            fields=[
 25                (
 26                    "stage_ptr",
 27                    models.OneToOneField(
 28                        auto_created=True,
 29                        on_delete=django.db.models.deletion.CASCADE,
 30                        parent_link=True,
 31                        primary_key=True,
 32                        serialize=False,
 33                        to="authentik_flows.stage",
 34                    ),
 35                ),
 36                ("friendly_name", models.TextField(null=True)),
 37                (
 38                    "use_global_settings",
 39                    models.BooleanField(
 40                        default=False,
 41                        help_text="When enabled, global Email connection settings will be used and connection settings below will be ignored.",
 42                    ),
 43                ),
 44                ("host", models.TextField(default="localhost")),
 45                ("port", models.IntegerField(default=25)),
 46                ("username", models.TextField(blank=True, default="")),
 47                ("password", models.TextField(blank=True, default="")),
 48                ("use_tls", models.BooleanField(default=False)),
 49                ("use_ssl", models.BooleanField(default=False)),
 50                ("timeout", models.IntegerField(default=10)),
 51                (
 52                    "from_address",
 53                    models.EmailField(default="system@authentik.local", max_length=254),
 54                ),
 55                (
 56                    "token_expiry",
 57                    models.TextField(
 58                        default="minutes=30",
 59                        help_text="Time the token sent is valid (Format: hours=3,minutes=17,seconds=300).",
 60                        validators=[authentik.lib.utils.time.timedelta_string_validator],
 61                    ),
 62                ),
 63                ("subject", models.TextField(default="authentik Sign-in code")),
 64                ("template", models.TextField(default="email/email_otp.html")),
 65                (
 66                    "configure_flow",
 67                    models.ForeignKey(
 68                        blank=True,
 69                        help_text="Flow used by an authenticated user to configure this Stage. If empty, user will not be able to configure this stage.",
 70                        null=True,
 71                        on_delete=django.db.models.deletion.SET_NULL,
 72                        to="authentik_flows.flow",
 73                    ),
 74                ),
 75            ],
 76            options={
 77                "verbose_name": "Email Authenticator Setup Stage",
 78                "verbose_name_plural": "Email Authenticator Setup Stages",
 79            },
 80            bases=("authentik_flows.stage", models.Model),
 81        ),
 82        migrations.CreateModel(
 83            name="EmailDevice",
 84            fields=[
 85                (
 86                    "id",
 87                    models.AutoField(
 88                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
 89                    ),
 90                ),
 91                ("created", models.DateTimeField(auto_now_add=True)),
 92                ("last_updated", models.DateTimeField(auto_now=True)),
 93                (
 94                    "name",
 95                    models.CharField(
 96                        help_text="The human-readable name of this device.", max_length=64
 97                    ),
 98                ),
 99                (
100                    "confirmed",
101                    models.BooleanField(default=True, help_text="Is this device ready for use?"),
102                ),
103                ("token", models.CharField(blank=True, max_length=16, null=True)),
104                (
105                    "valid_until",
106                    models.DateTimeField(
107                        default=django.utils.timezone.now,
108                        help_text="The timestamp of the moment of expiry of the saved token.",
109                    ),
110                ),
111                ("email", models.EmailField(max_length=254)),
112                ("last_used", models.DateTimeField(auto_now=True)),
113                (
114                    "stage",
115                    models.ForeignKey(
116                        on_delete=django.db.models.deletion.CASCADE,
117                        to="authentik_stages_authenticator_email.authenticatoremailstage",
118                    ),
119                ),
120                (
121                    "user",
122                    models.ForeignKey(
123                        on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL
124                    ),
125                ),
126            ],
127            options={
128                "verbose_name": "Email Device",
129                "verbose_name_plural": "Email Devices",
130                "unique_together": {("user", "email")},
131            },
132        ),
133    ]

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', '0027_auto_20231028_1424'), ('authentik_core', '__first__')]
operations = [<CreateModel name='AuthenticatorEmailStage', fields=[('stage_ptr', <django.db.models.fields.related.OneToOneField>), ('friendly_name', <django.db.models.fields.TextField>), ('use_global_settings', <django.db.models.fields.BooleanField>), ('host', <django.db.models.fields.TextField>), ('port', <django.db.models.fields.IntegerField>), ('username', <django.db.models.fields.TextField>), ('password', <django.db.models.fields.TextField>), ('use_tls', <django.db.models.fields.BooleanField>), ('use_ssl', <django.db.models.fields.BooleanField>), ('timeout', <django.db.models.fields.IntegerField>), ('from_address', <django.db.models.fields.EmailField>), ('token_expiry', <django.db.models.fields.TextField>), ('subject', <django.db.models.fields.TextField>), ('template', <django.db.models.fields.TextField>), ('configure_flow', <django.db.models.fields.related.ForeignKey>)], options={'verbose_name': 'Email Authenticator Setup Stage', 'verbose_name_plural': 'Email Authenticator Setup Stages'}, bases=('authentik_flows.stage', <class 'django.db.models.base.Model'>)>, <CreateModel name='EmailDevice', fields=[('id', <django.db.models.fields.AutoField>), ('created', <django.db.models.fields.DateTimeField>), ('last_updated', <django.db.models.fields.DateTimeField>), ('name', <django.db.models.fields.CharField>), ('confirmed', <django.db.models.fields.BooleanField>), ('token', <django.db.models.fields.CharField>), ('valid_until', <django.db.models.fields.DateTimeField>), ('email', <django.db.models.fields.EmailField>), ('last_used', <django.db.models.fields.DateTimeField>), ('stage', <django.db.models.fields.related.ForeignKey>), ('user', <django.db.models.fields.related.ForeignKey>)], options={'verbose_name': 'Email Device', 'verbose_name_plural': 'Email Devices', 'unique_together': {('user', 'email')}}>]