summaryrefslogtreecommitdiff
path: root/ishtar_common/management
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/management')
-rw-r--r--ishtar_common/management/commands/ishtar_maintenance.py47
1 files changed, 42 insertions, 5 deletions
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()