From 61652406c74936d4d0516ba8336848bd2c119a91 Mon Sep 17 00:00:00 2001 From: Jens Langhammer Date: Mon, 5 Apr 2021 13:33:01 +0200 Subject: [PATCH] events: add progress bar to event expiry migration Signed-off-by: Jens Langhammer --- authentik/events/migrations/0014_expiry.py | 51 +++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/authentik/events/migrations/0014_expiry.py b/authentik/events/migrations/0014_expiry.py index e722c8ff8..032aeb404 100644 --- a/authentik/events/migrations/0014_expiry.py +++ b/authentik/events/migrations/0014_expiry.py @@ -1,6 +1,7 @@ # Generated by Django 3.1.7 on 2021-03-18 16:01 from datetime import timedelta +from typing import Iterable from django.apps.registry import Apps from django.db import migrations, models @@ -9,11 +10,59 @@ from django.db.backends.base.schema import BaseDatabaseSchemaEditor 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): 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") - 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.save()