events: add progress bar to event expiry migration

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
Jens Langhammer 2021-04-05 13:33:01 +02:00
parent 11859c8cea
commit 61652406c7
1 changed files with 50 additions and 1 deletions

View File

@ -1,6 +1,7 @@
# Generated by Django 3.1.7 on 2021-03-18 16:01 # Generated by Django 3.1.7 on 2021-03-18 16:01
from datetime import timedelta from datetime import timedelta
from typing import Iterable
from django.apps.registry import Apps from django.apps.registry import Apps
from django.db import migrations, models from django.db import migrations, models
@ -9,11 +10,59 @@ from django.db.backends.base.schema import BaseDatabaseSchemaEditor
import authentik.events.models import authentik.events.models
# Taken from https://stackoverflow.com/questions/3173320/text-progress-bar-in-the-console
def progress_bar(
iterable: Iterable,
prefix="Writing: ",
suffix=" finished",
decimals=1,
length=100,
fill="",
print_end="\r",
):
"""
Call in a loop to create terminal progress bar
@params:
iteration - Required : current iteration (Int)
total - Required : total iterations (Int)
prefix - Optional : prefix string (Str)
suffix - Optional : suffix string (Str)
decimals - Optional : positive number of decimals in percent complete (Int)
length - Optional : character length of bar (Int)
fill - Optional : bar fill character (Str)
print_end - Optional : end character (e.g. "\r", "\r\n") (Str)
"""
total = len(iterable)
if total < 1:
return
def print_progress_bar(iteration):
"""Progress Bar Printing Function"""
percent = ("{0:." + str(decimals) + "f}").format(
100 * (iteration / float(total))
)
filledLength = int(length * iteration // total)
bar = fill * filledLength + "-" * (length - filledLength)
print(f"\r{prefix} |{bar}| {percent}% {suffix}", end=print_end)
# Initial Call
print_progress_bar(0)
# Update Progress Bar
for i, item in enumerate(iterable):
yield item
print_progress_bar(i + 1)
# Print New Line on Complete
print()
def update_expires(apps: Apps, schema_editor: BaseDatabaseSchemaEditor): def update_expires(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
db_alias = schema_editor.connection.alias db_alias = schema_editor.connection.alias
print("\nAdding expiry to events, this might take a couple of minutes...")
Event = apps.get_model("authentik_events", "event") Event = apps.get_model("authentik_events", "event")
for event in Event.objects.using(db_alias).all(): all_events = Event.objects.using(db_alias).all()
for event in progress_bar(all_events):
event.expires = event.created + timedelta(days=365) event.expires = event.created + timedelta(days=365)
event.save() event.save()