diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2023-07-20 12:35:43 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2023-07-20 12:35:43 +0200 |
commit | d882ede1626159293b99097d2761e8b1c8884b9c (patch) | |
tree | e9197fc27c68b4f1c1925827a48e759b9be864b3 | |
parent | f33d6bddae55c9c7bf9b976a0cb87ddb5ba005de (diff) | |
download | Ishtar-d882ede1626159293b99097d2761e8b1c8884b9c.tar.bz2 Ishtar-d882ede1626159293b99097d2761e8b1c8884b9c.zip |
✨ ishtar_maintenance script: add "filter" option in order to limit script to a specific query
-rw-r--r-- | changelog/en/changelog_2022-06-15.md | 6 | ||||
-rw-r--r-- | changelog/fr/changelog_2023-01-25.md | 6 | ||||
-rw-r--r-- | ishtar_common/management/commands/ishtar_maintenance.py | 47 |
3 files changed, 54 insertions, 5 deletions
diff --git a/changelog/en/changelog_2022-06-15.md b/changelog/en/changelog_2022-06-15.md index a9cf23540..55ab4efb0 100644 --- a/changelog/en/changelog_2022-06-15.md +++ b/changelog/en/changelog_2022-06-15.md @@ -1,3 +1,9 @@ +v4.0.55 - 2099-12-31 +-------------------- + +### Technical ### +- `ishtar_maintenance` script: add "filter" option in order to limit script to a specific query + v4.0.54 - 2023-07-19 -------------------- diff --git a/changelog/fr/changelog_2023-01-25.md b/changelog/fr/changelog_2023-01-25.md index 442107a2d..4e085b3ca 100644 --- a/changelog/fr/changelog_2023-01-25.md +++ b/changelog/fr/changelog_2023-01-25.md @@ -1,3 +1,9 @@ +v4.0.55 - 2099-12-31 +-------------------- + +### Technique ### +- script `ishtar_maintenance` : ajout de l'option "filter" afin de limiter le script à une requête spécifique + v4.0.54 - 2023-07-19 -------------------- diff --git a/ishtar_common/management/commands/ishtar_maintenance.py b/ishtar_common/management/commands/ishtar_maintenance.py index d6e7ae5de..8bfd06812 100644 --- a/ishtar_common/management/commands/ishtar_maintenance.py +++ b/ishtar_common/management/commands/ishtar_maintenance.py @@ -4,6 +4,7 @@ from argparse import RawTextHelpFormatter import csv import datetime +import json import os import tempfile import shutil @@ -35,6 +36,7 @@ if not os.path.exists(log_path): def task_update_search_vectors(options): quiet = options.get("quiet", False) log = options.get("log", False) + filtr = options.get("filter", "") for model in apps.get_models(): if options.get('model', None) and model.__name__ != options['model']: continue @@ -47,6 +49,8 @@ def task_update_search_vectors(options): store_results = [] msg = "-> processing {}: ".format(model._meta.verbose_name) q = model.objects + if filtr: + q = q.filter(**filtr) ln = q.count() changed_nb = 0 @@ -75,6 +79,7 @@ def task_update_search_vectors(options): def task_check_cached_label(options): quiet = options.get("quiet", False) log = options.get("log", False) + filtr = options.get("filter", "") for model in apps.get_models(): if options.get('model', None) and model.__name__ != options['model']: continue @@ -89,6 +94,8 @@ def task_check_cached_label(options): store_results = [] msg = "-> processing {}: ".format(model._meta.verbose_name) q = model.objects + if filtr: + q = q.filter(**filtr) ln = q.count() changed_nb = 0 @@ -130,6 +137,7 @@ def task_check_cached_label(options): def task_update_external_id(options): quiet = options.get("quiet", False) + filtr = options.get("filter", "") for model in apps.get_models(): if options.get('model', None) and model.__name__ != options['model']: continue @@ -139,8 +147,11 @@ def task_update_external_id(options): [k for k in dir(model) if k == "external_id"]): continue msg = "-> processing {}: ".format(model._meta.verbose_name) - ln = model.objects.count() - for idx, item in enumerate(model.objects.all()): + q = model.objects + if filtr: + q = q.filter(**filtr) + ln = q.count() + for idx, item in enumerate(q.all()): item.skip_history_when_saving = True item.external_id = "" item.complete_identifier = "" @@ -174,6 +185,7 @@ def _end_task(changed_nb, msg, quiet, store_results, log, log_name, csv_cols): def task_main_image(options): quiet = options.get("quiet", False) + filtr = options.get("filter", "") for model in apps.get_models(): if not issubclass(model, models_common.DocumentItem): continue @@ -182,6 +194,8 @@ def task_main_image(options): q = model.objects.filter( main_image__isnull=True, documents__image__isnull=False ).exclude(documents__image="") + if filtr: + q = q.filter(**filtr) nb = q.count() if not nb: # no image attached continue @@ -197,6 +211,7 @@ def task_main_image(options): def task_regenerate_qrcodes(options): quiet = options.get("quiet", False) secure = not options['no-https'] + filtr = options.get("filter", "") for model in apps.get_models(): if options.get('model', None) and model.__name__ != options['model']: continue @@ -205,9 +220,12 @@ def task_regenerate_qrcodes(options): except FieldDoesNotExist: continue msg = "-> processing {}: ".format(model._meta.verbose_name) - ln = model.objects.count() + q = model.objects + if filtr: + q = q.filter(**filtr) + ln = q.count() tmpdir = tempfile.mkdtemp("-qrcode") - for idx, obj in enumerate(model.objects.all()): + for idx, obj in enumerate(q.all()): obj.skip_history_when_saving = True obj._no_move = True if not quiet: @@ -261,6 +279,12 @@ def get_time(): return datetime.datetime.now().isoformat().split(".")[0] +def get_filter(filter_str): + if not filter_str: + return {} + return json.loads(filter_str) + + TASKS = { "fix_main_image": { "help": "for items with images and no main image, put the first one created as a main image", @@ -318,6 +342,9 @@ class Command(BaseCommand): '--model', type=str, default='', dest='model', help='Specific model to update') parser.add_argument( + '--filter', type=str, default='', dest='filter', + help='Filter query') + parser.add_argument( "--quiet", dest="quiet", action="store_true", help="Quiet output" ) parser.add_argument( @@ -343,13 +370,23 @@ class Command(BaseCommand): msg = f"{options['task']} is not a valid task. Available tasks are:\n" msg += "\n".join(TASKS.keys()) raise CommandError(msg) + if options["filter"] and not options["model"]: + msg = "model option is mandatory if you use filter option" + raise CommandError(msg) + if options["filter"]: + try: + options["filter"] = get_filter(options.get("filter", "")) + except json.decoder.JSONDecodeError: + msg = f"\"{options['filter']}\" is not a valid filter: it must a valid JSON dict string" + raise CommandError(msg) + quiet = options["quiet"] if not quiet: sys.stdout.write(f"[{get_time()}] Processing task {options['task']}\n") errors = TASKS[options["task"]]["action"](options) if not errors: if not quiet: - sys.stdout.write(f"[{get_time()}] Task {options['task']} finished\n") + sys.stdout.write(f"\n[{get_time()}] Task {options['task']} finished\n") if options["test"]: return sys.exit() |