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.
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')}}>]