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