authentik.events.migrations.0001_squashed_0019_alter_notificationtransport_webhook_url

  1# Generated by Django 3.2.8 on 2021-10-10 16:01
  2
  3import uuid
  4from datetime import timedelta
  5
  6import django.db.models.deletion
  7from django.apps.registry import Apps
  8from django.conf import settings
  9from django.db import migrations, models
 10from django.db.backends.base.schema import BaseDatabaseSchemaEditor
 11
 12import authentik.events.models
 13import authentik.lib.models
 14from authentik.lib.migrations import progress_bar
 15
 16
 17def convert_user_to_json(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
 18    Event = apps.get_model("authentik_events", "Event")
 19
 20    db_alias = schema_editor.connection.alias
 21    for event in Event.objects.using(db_alias).all():
 22        event.delete()
 23        # Because event objects cannot be updated, we have to re-create them
 24        event.pk = None
 25        event.user_json = authentik.events.models.get_user(event.user) if event.user else {}
 26        event._state.adding = True
 27        event.save()
 28
 29
 30def token_view_to_secret_view(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
 31    from authentik.events.models import EventAction
 32
 33    db_alias = schema_editor.connection.alias
 34    Event = apps.get_model("authentik_events", "Event")
 35
 36    events = Event.objects.using(db_alias).filter(action="token_view")
 37
 38    for event in events:
 39        event.context["secret"] = event.context.pop("token")
 40        event.action = EventAction.SECRET_VIEW
 41
 42    Event.objects.using(db_alias).bulk_update(events, ["context", "action"])
 43
 44
 45def update_expires(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
 46    db_alias = schema_editor.connection.alias
 47    Event = apps.get_model("authentik_events", "event")
 48    all_events = Event.objects.using(db_alias).all()
 49    if all_events.count() < 1:
 50        return
 51
 52    print("\nAdding expiry to events, this might take a couple of minutes...")
 53    for event in progress_bar(all_events):
 54        event.expires = event.created + timedelta(days=365)
 55        event.save()
 56
 57
 58class Migration(migrations.Migration):
 59    replaces = [
 60        ("authentik_events", "0001_initial"),
 61        ("authentik_events", "0002_auto_20200918_2116"),
 62        ("authentik_events", "0003_auto_20200917_1155"),
 63        ("authentik_events", "0004_auto_20200921_1829"),
 64        ("authentik_events", "0005_auto_20201005_2139"),
 65        ("authentik_events", "0006_auto_20201017_2024"),
 66        ("authentik_events", "0007_auto_20201215_0939"),
 67        ("authentik_events", "0008_auto_20201220_1651"),
 68        ("authentik_events", "0009_auto_20201227_1210"),
 69        ("authentik_events", "0010_notification_notificationtransport_notificationrule"),
 70        ("authentik_events", "0011_notification_rules_default_v1"),
 71        ("authentik_events", "0012_auto_20210202_1821"),
 72        ("authentik_events", "0013_auto_20210209_1657"),
 73        ("authentik_events", "0014_expiry"),
 74        ("authentik_events", "0015_alter_event_action"),
 75        ("authentik_events", "0016_add_tenant"),
 76        ("authentik_events", "0017_alter_event_action"),
 77        ("authentik_events", "0018_auto_20210911_2217"),
 78        ("authentik_events", "0019_alter_notificationtransport_webhook_url"),
 79    ]
 80
 81    initial = True
 82
 83    dependencies = [
 84        ("authentik_policies", "0004_policy_execution_logging"),
 85        ("authentik_core", "0016_auto_20201202_2234"),
 86        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 87        ("authentik_policies_event_matcher", "0003_auto_20210110_1907"),
 88        ("authentik_core", "0028_alter_token_intent"),
 89    ]
 90
 91    operations = [
 92        migrations.CreateModel(
 93            name="Event",
 94            fields=[
 95                (
 96                    "event_uuid",
 97                    models.UUIDField(
 98                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
 99                    ),
100                ),
101                (
102                    "action",
103                    models.TextField(
104                        choices=[
105                            ("LOGIN", "login"),
106                            ("LOGIN_FAILED", "login_failed"),
107                            ("LOGOUT", "logout"),
108                            ("AUTHORIZE_APPLICATION", "authorize_application"),
109                            ("SUSPICIOUS_REQUEST", "suspicious_request"),
110                            ("SIGN_UP", "sign_up"),
111                            ("PASSWORD_RESET", "password_reset"),
112                            ("INVITE_CREATED", "invitation_created"),
113                            ("INVITE_USED", "invitation_used"),
114                            ("IMPERSONATION_STARTED", "impersonation_started"),
115                            ("IMPERSONATION_ENDED", "impersonation_ended"),
116                            ("CUSTOM", "custom"),
117                        ]
118                    ),
119                ),
120                ("date", models.DateTimeField(auto_now_add=True)),
121                ("app", models.TextField()),
122                ("context", models.JSONField(blank=True, default=dict)),
123                ("client_ip", models.GenericIPAddressField(null=True)),
124                ("created", models.DateTimeField(auto_now_add=True)),
125                (
126                    "user",
127                    models.ForeignKey(
128                        null=True,
129                        on_delete=django.db.models.deletion.SET_NULL,
130                        to=settings.AUTH_USER_MODEL,
131                    ),
132                ),
133                ("user_json", models.JSONField(default=dict)),
134            ],
135            options={
136                "verbose_name": "Event",
137                "verbose_name_plural": "Events",
138            },
139        ),
140        migrations.RunPython(
141            code=convert_user_to_json,
142        ),
143        migrations.RemoveField(
144            model_name="event",
145            name="user",
146        ),
147        migrations.RenameField(
148            model_name="event",
149            old_name="user_json",
150            new_name="user",
151        ),
152        migrations.RemoveField(
153            model_name="event",
154            name="date",
155        ),
156        migrations.CreateModel(
157            name="NotificationTransport",
158            fields=[
159                (
160                    "uuid",
161                    models.UUIDField(
162                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
163                    ),
164                ),
165                ("name", models.TextField(unique=True)),
166                (
167                    "mode",
168                    models.TextField(
169                        choices=[
170                            ("webhook", "Generic Webhook"),
171                            ("webhook_slack", "Slack Webhook (Slack/Discord)"),
172                            ("email", "Email"),
173                        ]
174                    ),
175                ),
176                ("webhook_url", models.TextField(blank=True)),
177            ],
178            options={
179                "verbose_name": "Notification Transport",
180                "verbose_name_plural": "Notification Transports",
181            },
182        ),
183        migrations.CreateModel(
184            name="NotificationRule",
185            fields=[
186                (
187                    "policybindingmodel_ptr",
188                    models.OneToOneField(
189                        auto_created=True,
190                        on_delete=django.db.models.deletion.CASCADE,
191                        parent_link=True,
192                        primary_key=True,
193                        serialize=False,
194                        to="authentik_policies.policybindingmodel",
195                    ),
196                ),
197                ("name", models.TextField(unique=True)),
198                (
199                    "severity",
200                    models.TextField(
201                        choices=[("notice", "Notice"), ("warning", "Warning"), ("alert", "Alert")],
202                        default="notice",
203                        help_text=(
204                            "Controls which severity level the created notifications will have."
205                        ),
206                    ),
207                ),
208                (
209                    "group",
210                    models.ForeignKey(
211                        blank=True,
212                        help_text=(
213                            "Define which group of users this notification should be sent and shown"
214                            " to. If left empty, Notification won't ben sent."
215                        ),
216                        null=True,
217                        on_delete=django.db.models.deletion.SET_NULL,
218                        to="authentik_core.group",
219                    ),
220                ),
221                (
222                    "transports",
223                    models.ManyToManyField(
224                        help_text=(
225                            "Select which transports should be used to notify the user. If none are"
226                            " selected, the notification will only be shown in the authentik UI."
227                        ),
228                        to="authentik_events.NotificationTransport",
229                        blank=True,
230                    ),
231                ),
232            ],
233            options={
234                "verbose_name": "Notification Rule",
235                "verbose_name_plural": "Notification Rules",
236            },
237            bases=("authentik_policies.policybindingmodel",),
238        ),
239        migrations.CreateModel(
240            name="Notification",
241            fields=[
242                (
243                    "uuid",
244                    models.UUIDField(
245                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
246                    ),
247                ),
248                (
249                    "severity",
250                    models.TextField(
251                        choices=[("notice", "Notice"), ("warning", "Warning"), ("alert", "Alert")]
252                    ),
253                ),
254                ("body", models.TextField()),
255                ("created", models.DateTimeField(auto_now_add=True)),
256                ("seen", models.BooleanField(default=False)),
257                (
258                    "event",
259                    models.ForeignKey(
260                        blank=True,
261                        null=True,
262                        on_delete=django.db.models.deletion.SET_NULL,
263                        to="authentik_events.event",
264                    ),
265                ),
266                (
267                    "user",
268                    models.ForeignKey(
269                        on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL
270                    ),
271                ),
272            ],
273            options={
274                "verbose_name": "Notification",
275                "verbose_name_plural": "Notifications",
276            },
277        ),
278        migrations.AddField(
279            model_name="notificationtransport",
280            name="send_once",
281            field=models.BooleanField(
282                default=False,
283                help_text=(
284                    "Only send notification once, for example when sending a webhook into a chat"
285                    " channel."
286                ),
287            ),
288        ),
289        migrations.RunPython(
290            code=token_view_to_secret_view,
291        ),
292        migrations.AddField(
293            model_name="event",
294            name="expires",
295            field=models.DateTimeField(default=authentik.events.models.default_event_duration),
296        ),
297        migrations.AddField(
298            model_name="event",
299            name="expiring",
300            field=models.BooleanField(default=True),
301        ),
302        migrations.RunPython(
303            code=update_expires,
304        ),
305        migrations.AddField(
306            model_name="event",
307            name="tenant",
308            field=models.JSONField(blank=True, default=authentik.events.models.default_brand),
309        ),
310        migrations.AlterField(
311            model_name="event",
312            name="action",
313            field=models.TextField(
314                choices=[
315                    ("login", "Login"),
316                    ("login_failed", "Login Failed"),
317                    ("logout", "Logout"),
318                    ("user_write", "User Write"),
319                    ("suspicious_request", "Suspicious Request"),
320                    ("password_set", "Password Set"),
321                    ("secret_view", "Secret View"),
322                    ("secret_rotate", "Secret Rotate"),
323                    ("invitation_used", "Invite Used"),
324                    ("authorize_application", "Authorize Application"),
325                    ("source_linked", "Source Linked"),
326                    ("impersonation_started", "Impersonation Started"),
327                    ("impersonation_ended", "Impersonation Ended"),
328                    ("flow_execution", "Flow Execution"),
329                    ("policy_execution", "Policy Execution"),
330                    ("policy_exception", "Policy Exception"),
331                    ("property_mapping_exception", "Property Mapping Exception"),
332                    ("system_task_execution", "System Task Execution"),
333                    ("system_task_exception", "System Task Exception"),
334                    ("system_exception", "System Exception"),
335                    ("configuration_error", "Configuration Error"),
336                    ("model_created", "Model Created"),
337                    ("model_updated", "Model Updated"),
338                    ("model_deleted", "Model Deleted"),
339                    ("email_sent", "Email Sent"),
340                    ("update_available", "Update Available"),
341                    ("custom_", "Custom Prefix"),
342                ]
343            ),
344        ),
345        migrations.CreateModel(
346            name="NotificationWebhookMapping",
347            fields=[
348                (
349                    "propertymapping_ptr",
350                    models.OneToOneField(
351                        auto_created=True,
352                        on_delete=django.db.models.deletion.CASCADE,
353                        parent_link=True,
354                        primary_key=True,
355                        serialize=False,
356                        to="authentik_core.propertymapping",
357                    ),
358                ),
359            ],
360            options={
361                "verbose_name": "Notification Webhook Mapping",
362                "verbose_name_plural": "Notification Webhook Mappings",
363            },
364            bases=("authentik_core.propertymapping",),
365        ),
366        migrations.AddField(
367            model_name="notificationtransport",
368            name="webhook_mapping",
369            field=models.ForeignKey(
370                default=None,
371                null=True,
372                on_delete=django.db.models.deletion.SET_DEFAULT,
373                to="authentik_events.notificationwebhookmapping",
374            ),
375        ),
376        migrations.AlterField(
377            model_name="notificationtransport",
378            name="webhook_url",
379            field=models.TextField(
380                blank=True, validators=[authentik.lib.models.DomainlessURLValidator()]
381            ),
382        ),
383    ]
def convert_user_to_json( apps: django.apps.registry.Apps, schema_editor: django.db.backends.base.schema.BaseDatabaseSchemaEditor):
18def convert_user_to_json(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
19    Event = apps.get_model("authentik_events", "Event")
20
21    db_alias = schema_editor.connection.alias
22    for event in Event.objects.using(db_alias).all():
23        event.delete()
24        # Because event objects cannot be updated, we have to re-create them
25        event.pk = None
26        event.user_json = authentik.events.models.get_user(event.user) if event.user else {}
27        event._state.adding = True
28        event.save()
def token_view_to_secret_view( apps: django.apps.registry.Apps, schema_editor: django.db.backends.base.schema.BaseDatabaseSchemaEditor):
31def token_view_to_secret_view(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
32    from authentik.events.models import EventAction
33
34    db_alias = schema_editor.connection.alias
35    Event = apps.get_model("authentik_events", "Event")
36
37    events = Event.objects.using(db_alias).filter(action="token_view")
38
39    for event in events:
40        event.context["secret"] = event.context.pop("token")
41        event.action = EventAction.SECRET_VIEW
42
43    Event.objects.using(db_alias).bulk_update(events, ["context", "action"])
def update_expires( apps: django.apps.registry.Apps, schema_editor: django.db.backends.base.schema.BaseDatabaseSchemaEditor):
46def update_expires(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
47    db_alias = schema_editor.connection.alias
48    Event = apps.get_model("authentik_events", "event")
49    all_events = Event.objects.using(db_alias).all()
50    if all_events.count() < 1:
51        return
52
53    print("\nAdding expiry to events, this might take a couple of minutes...")
54    for event in progress_bar(all_events):
55        event.expires = event.created + timedelta(days=365)
56        event.save()
class Migration(django.db.migrations.migration.Migration):
 59class Migration(migrations.Migration):
 60    replaces = [
 61        ("authentik_events", "0001_initial"),
 62        ("authentik_events", "0002_auto_20200918_2116"),
 63        ("authentik_events", "0003_auto_20200917_1155"),
 64        ("authentik_events", "0004_auto_20200921_1829"),
 65        ("authentik_events", "0005_auto_20201005_2139"),
 66        ("authentik_events", "0006_auto_20201017_2024"),
 67        ("authentik_events", "0007_auto_20201215_0939"),
 68        ("authentik_events", "0008_auto_20201220_1651"),
 69        ("authentik_events", "0009_auto_20201227_1210"),
 70        ("authentik_events", "0010_notification_notificationtransport_notificationrule"),
 71        ("authentik_events", "0011_notification_rules_default_v1"),
 72        ("authentik_events", "0012_auto_20210202_1821"),
 73        ("authentik_events", "0013_auto_20210209_1657"),
 74        ("authentik_events", "0014_expiry"),
 75        ("authentik_events", "0015_alter_event_action"),
 76        ("authentik_events", "0016_add_tenant"),
 77        ("authentik_events", "0017_alter_event_action"),
 78        ("authentik_events", "0018_auto_20210911_2217"),
 79        ("authentik_events", "0019_alter_notificationtransport_webhook_url"),
 80    ]
 81
 82    initial = True
 83
 84    dependencies = [
 85        ("authentik_policies", "0004_policy_execution_logging"),
 86        ("authentik_core", "0016_auto_20201202_2234"),
 87        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 88        ("authentik_policies_event_matcher", "0003_auto_20210110_1907"),
 89        ("authentik_core", "0028_alter_token_intent"),
 90    ]
 91
 92    operations = [
 93        migrations.CreateModel(
 94            name="Event",
 95            fields=[
 96                (
 97                    "event_uuid",
 98                    models.UUIDField(
 99                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
100                    ),
101                ),
102                (
103                    "action",
104                    models.TextField(
105                        choices=[
106                            ("LOGIN", "login"),
107                            ("LOGIN_FAILED", "login_failed"),
108                            ("LOGOUT", "logout"),
109                            ("AUTHORIZE_APPLICATION", "authorize_application"),
110                            ("SUSPICIOUS_REQUEST", "suspicious_request"),
111                            ("SIGN_UP", "sign_up"),
112                            ("PASSWORD_RESET", "password_reset"),
113                            ("INVITE_CREATED", "invitation_created"),
114                            ("INVITE_USED", "invitation_used"),
115                            ("IMPERSONATION_STARTED", "impersonation_started"),
116                            ("IMPERSONATION_ENDED", "impersonation_ended"),
117                            ("CUSTOM", "custom"),
118                        ]
119                    ),
120                ),
121                ("date", models.DateTimeField(auto_now_add=True)),
122                ("app", models.TextField()),
123                ("context", models.JSONField(blank=True, default=dict)),
124                ("client_ip", models.GenericIPAddressField(null=True)),
125                ("created", models.DateTimeField(auto_now_add=True)),
126                (
127                    "user",
128                    models.ForeignKey(
129                        null=True,
130                        on_delete=django.db.models.deletion.SET_NULL,
131                        to=settings.AUTH_USER_MODEL,
132                    ),
133                ),
134                ("user_json", models.JSONField(default=dict)),
135            ],
136            options={
137                "verbose_name": "Event",
138                "verbose_name_plural": "Events",
139            },
140        ),
141        migrations.RunPython(
142            code=convert_user_to_json,
143        ),
144        migrations.RemoveField(
145            model_name="event",
146            name="user",
147        ),
148        migrations.RenameField(
149            model_name="event",
150            old_name="user_json",
151            new_name="user",
152        ),
153        migrations.RemoveField(
154            model_name="event",
155            name="date",
156        ),
157        migrations.CreateModel(
158            name="NotificationTransport",
159            fields=[
160                (
161                    "uuid",
162                    models.UUIDField(
163                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
164                    ),
165                ),
166                ("name", models.TextField(unique=True)),
167                (
168                    "mode",
169                    models.TextField(
170                        choices=[
171                            ("webhook", "Generic Webhook"),
172                            ("webhook_slack", "Slack Webhook (Slack/Discord)"),
173                            ("email", "Email"),
174                        ]
175                    ),
176                ),
177                ("webhook_url", models.TextField(blank=True)),
178            ],
179            options={
180                "verbose_name": "Notification Transport",
181                "verbose_name_plural": "Notification Transports",
182            },
183        ),
184        migrations.CreateModel(
185            name="NotificationRule",
186            fields=[
187                (
188                    "policybindingmodel_ptr",
189                    models.OneToOneField(
190                        auto_created=True,
191                        on_delete=django.db.models.deletion.CASCADE,
192                        parent_link=True,
193                        primary_key=True,
194                        serialize=False,
195                        to="authentik_policies.policybindingmodel",
196                    ),
197                ),
198                ("name", models.TextField(unique=True)),
199                (
200                    "severity",
201                    models.TextField(
202                        choices=[("notice", "Notice"), ("warning", "Warning"), ("alert", "Alert")],
203                        default="notice",
204                        help_text=(
205                            "Controls which severity level the created notifications will have."
206                        ),
207                    ),
208                ),
209                (
210                    "group",
211                    models.ForeignKey(
212                        blank=True,
213                        help_text=(
214                            "Define which group of users this notification should be sent and shown"
215                            " to. If left empty, Notification won't ben sent."
216                        ),
217                        null=True,
218                        on_delete=django.db.models.deletion.SET_NULL,
219                        to="authentik_core.group",
220                    ),
221                ),
222                (
223                    "transports",
224                    models.ManyToManyField(
225                        help_text=(
226                            "Select which transports should be used to notify the user. If none are"
227                            " selected, the notification will only be shown in the authentik UI."
228                        ),
229                        to="authentik_events.NotificationTransport",
230                        blank=True,
231                    ),
232                ),
233            ],
234            options={
235                "verbose_name": "Notification Rule",
236                "verbose_name_plural": "Notification Rules",
237            },
238            bases=("authentik_policies.policybindingmodel",),
239        ),
240        migrations.CreateModel(
241            name="Notification",
242            fields=[
243                (
244                    "uuid",
245                    models.UUIDField(
246                        default=uuid.uuid4, editable=False, primary_key=True, serialize=False
247                    ),
248                ),
249                (
250                    "severity",
251                    models.TextField(
252                        choices=[("notice", "Notice"), ("warning", "Warning"), ("alert", "Alert")]
253                    ),
254                ),
255                ("body", models.TextField()),
256                ("created", models.DateTimeField(auto_now_add=True)),
257                ("seen", models.BooleanField(default=False)),
258                (
259                    "event",
260                    models.ForeignKey(
261                        blank=True,
262                        null=True,
263                        on_delete=django.db.models.deletion.SET_NULL,
264                        to="authentik_events.event",
265                    ),
266                ),
267                (
268                    "user",
269                    models.ForeignKey(
270                        on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL
271                    ),
272                ),
273            ],
274            options={
275                "verbose_name": "Notification",
276                "verbose_name_plural": "Notifications",
277            },
278        ),
279        migrations.AddField(
280            model_name="notificationtransport",
281            name="send_once",
282            field=models.BooleanField(
283                default=False,
284                help_text=(
285                    "Only send notification once, for example when sending a webhook into a chat"
286                    " channel."
287                ),
288            ),
289        ),
290        migrations.RunPython(
291            code=token_view_to_secret_view,
292        ),
293        migrations.AddField(
294            model_name="event",
295            name="expires",
296            field=models.DateTimeField(default=authentik.events.models.default_event_duration),
297        ),
298        migrations.AddField(
299            model_name="event",
300            name="expiring",
301            field=models.BooleanField(default=True),
302        ),
303        migrations.RunPython(
304            code=update_expires,
305        ),
306        migrations.AddField(
307            model_name="event",
308            name="tenant",
309            field=models.JSONField(blank=True, default=authentik.events.models.default_brand),
310        ),
311        migrations.AlterField(
312            model_name="event",
313            name="action",
314            field=models.TextField(
315                choices=[
316                    ("login", "Login"),
317                    ("login_failed", "Login Failed"),
318                    ("logout", "Logout"),
319                    ("user_write", "User Write"),
320                    ("suspicious_request", "Suspicious Request"),
321                    ("password_set", "Password Set"),
322                    ("secret_view", "Secret View"),
323                    ("secret_rotate", "Secret Rotate"),
324                    ("invitation_used", "Invite Used"),
325                    ("authorize_application", "Authorize Application"),
326                    ("source_linked", "Source Linked"),
327                    ("impersonation_started", "Impersonation Started"),
328                    ("impersonation_ended", "Impersonation Ended"),
329                    ("flow_execution", "Flow Execution"),
330                    ("policy_execution", "Policy Execution"),
331                    ("policy_exception", "Policy Exception"),
332                    ("property_mapping_exception", "Property Mapping Exception"),
333                    ("system_task_execution", "System Task Execution"),
334                    ("system_task_exception", "System Task Exception"),
335                    ("system_exception", "System Exception"),
336                    ("configuration_error", "Configuration Error"),
337                    ("model_created", "Model Created"),
338                    ("model_updated", "Model Updated"),
339                    ("model_deleted", "Model Deleted"),
340                    ("email_sent", "Email Sent"),
341                    ("update_available", "Update Available"),
342                    ("custom_", "Custom Prefix"),
343                ]
344            ),
345        ),
346        migrations.CreateModel(
347            name="NotificationWebhookMapping",
348            fields=[
349                (
350                    "propertymapping_ptr",
351                    models.OneToOneField(
352                        auto_created=True,
353                        on_delete=django.db.models.deletion.CASCADE,
354                        parent_link=True,
355                        primary_key=True,
356                        serialize=False,
357                        to="authentik_core.propertymapping",
358                    ),
359                ),
360            ],
361            options={
362                "verbose_name": "Notification Webhook Mapping",
363                "verbose_name_plural": "Notification Webhook Mappings",
364            },
365            bases=("authentik_core.propertymapping",),
366        ),
367        migrations.AddField(
368            model_name="notificationtransport",
369            name="webhook_mapping",
370            field=models.ForeignKey(
371                default=None,
372                null=True,
373                on_delete=django.db.models.deletion.SET_DEFAULT,
374                to="authentik_events.notificationwebhookmapping",
375            ),
376        ),
377        migrations.AlterField(
378            model_name="notificationtransport",
379            name="webhook_url",
380            field=models.TextField(
381                blank=True, validators=[authentik.lib.models.DomainlessURLValidator()]
382            ),
383        ),
384    ]

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.

replaces = [('authentik_events', '0001_initial'), ('authentik_events', '0002_auto_20200918_2116'), ('authentik_events', '0003_auto_20200917_1155'), ('authentik_events', '0004_auto_20200921_1829'), ('authentik_events', '0005_auto_20201005_2139'), ('authentik_events', '0006_auto_20201017_2024'), ('authentik_events', '0007_auto_20201215_0939'), ('authentik_events', '0008_auto_20201220_1651'), ('authentik_events', '0009_auto_20201227_1210'), ('authentik_events', '0010_notification_notificationtransport_notificationrule'), ('authentik_events', '0011_notification_rules_default_v1'), ('authentik_events', '0012_auto_20210202_1821'), ('authentik_events', '0013_auto_20210209_1657'), ('authentik_events', '0014_expiry'), ('authentik_events', '0015_alter_event_action'), ('authentik_events', '0016_add_tenant'), ('authentik_events', '0017_alter_event_action'), ('authentik_events', '0018_auto_20210911_2217'), ('authentik_events', '0019_alter_notificationtransport_webhook_url')]
initial = True
dependencies = [('authentik_policies', '0004_policy_execution_logging'), ('authentik_core', '0016_auto_20201202_2234'), ('authentik_core', '__first__'), ('authentik_policies_event_matcher', '0003_auto_20210110_1907'), ('authentik_core', '0028_alter_token_intent')]
operations = [<CreateModel name='Event', fields=[('event_uuid', <django.db.models.fields.UUIDField>), ('action', <django.db.models.fields.TextField>), ('date', <django.db.models.fields.DateTimeField>), ('app', <django.db.models.fields.TextField>), ('context', <django.db.models.fields.json.JSONField>), ('client_ip', <django.db.models.fields.GenericIPAddressField>), ('created', <django.db.models.fields.DateTimeField>), ('user', <django.db.models.fields.related.ForeignKey>), ('user_json', <django.db.models.fields.json.JSONField>)], options={'verbose_name': 'Event', 'verbose_name_plural': 'Events'}>, <RunPython code=<function convert_user_to_json>>, <RemoveField model_name='event', name='user'>, <RenameField model_name='event', old_name='user_json', new_name='user'>, <RemoveField model_name='event', name='date'>, <CreateModel name='NotificationTransport', fields=[('uuid', <django.db.models.fields.UUIDField>), ('name', <django.db.models.fields.TextField>), ('mode', <django.db.models.fields.TextField>), ('webhook_url', <django.db.models.fields.TextField>)], options={'verbose_name': 'Notification Transport', 'verbose_name_plural': 'Notification Transports'}>, <CreateModel name='NotificationRule', fields=[('policybindingmodel_ptr', <django.db.models.fields.related.OneToOneField>), ('name', <django.db.models.fields.TextField>), ('severity', <django.db.models.fields.TextField>), ('group', <django.db.models.fields.related.ForeignKey>), ('transports', <django.db.models.fields.related.ManyToManyField>)], options={'verbose_name': 'Notification Rule', 'verbose_name_plural': 'Notification Rules'}, bases=('authentik_policies.policybindingmodel',)>, <CreateModel name='Notification', fields=[('uuid', <django.db.models.fields.UUIDField>), ('severity', <django.db.models.fields.TextField>), ('body', <django.db.models.fields.TextField>), ('created', <django.db.models.fields.DateTimeField>), ('seen', <django.db.models.fields.BooleanField>), ('event', <django.db.models.fields.related.ForeignKey>), ('user', <django.db.models.fields.related.ForeignKey>)], options={'verbose_name': 'Notification', 'verbose_name_plural': 'Notifications'}>, <AddField model_name='notificationtransport', name='send_once', field=<django.db.models.fields.BooleanField>>, <RunPython code=<function token_view_to_secret_view>>, <AddField model_name='event', name='expires', field=<django.db.models.fields.DateTimeField>>, <AddField model_name='event', name='expiring', field=<django.db.models.fields.BooleanField>>, <RunPython code=<function update_expires>>, <AddField model_name='event', name='tenant', field=<django.db.models.fields.json.JSONField>>, <AlterField model_name='event', name='action', field=<django.db.models.fields.TextField>>, <CreateModel name='NotificationWebhookMapping', fields=[('propertymapping_ptr', <django.db.models.fields.related.OneToOneField>)], options={'verbose_name': 'Notification Webhook Mapping', 'verbose_name_plural': 'Notification Webhook Mappings'}, bases=('authentik_core.propertymapping',)>, <AddField model_name='notificationtransport', name='webhook_mapping', field=<django.db.models.fields.related.ForeignKey>>, <AlterField model_name='notificationtransport', name='webhook_url', field=<django.db.models.fields.TextField>>]