#!/usr/bin/env python3 # -*- coding: utf-8 -*- from argparse import RawTextHelpFormatter import datetime import sys from django.conf import settings from django.core.management.base import BaseCommand from ishtar_common import models from ishtar_common.utils import BColors def update_permissions(quiet=False, force=False): q = models.IshtarUser.objects.all() nb = q.count() updated = 0 for idx, user in enumerate(q.all()): if not quiet: sys.stdout.write(f"\r[{percent(idx, nb)}] {idx + 1}/{nb}") if force or user.need_permission_refresh(): user.generate_permission() updated += 1 if not quiet: msg = BColors.format("OKGREEN", f"\r{updated} user permissions updated") sys.stdout.write(msg) sys.stdout.write("\n") def percent(current, total): return f"{(current + 1) / total * 100:.1f}".rjust(4, "0") + "%" def get_time(): return datetime.datetime.now().isoformat().split(".")[0] class Command(BaseCommand): help = "Update permissions" def parser_error(self, message=""): sys.stderr.write(f"{message}\n") self.parser.print_help() sys.exit(2) def create_parser(self, *args, **kwargs): parser = super(Command, self).create_parser(*args, **kwargs) parser.formatter_class = RawTextHelpFormatter self.parser = parser parser.error = self.parser_error return parser def add_arguments(self, parser): parser.add_argument( "--quiet", dest="quiet", action="store_true", help="Quiet output" ) parser.add_argument( "--force", dest="force", action="store_true", help="Force regeneration for all accounts" ) def handle(self, *args, **options): settings.USE_BACKGROUND_TASK = False quiet = options["quiet"] if not quiet: msg = BColors.format("HEADER", f"[{get_time()}] Updating permissions\n") sys.stdout.write(msg) update_permissions(quiet, force=options["force"]) sys.exit(1)