summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-05-15 17:12:09 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-05-15 17:12:09 +0200
commit1c80444bf0ef92845210f4cab5477f43756624df (patch)
treec1aa1da5927788fcf45c5ece1a8c5260165812e8
parent95504e6daf8f62f9822d61c39fdea5655d44eb1d (diff)
downloadIshtar-1c80444bf0ef92845210f4cab5477f43756624df.tar.bz2
Ishtar-1c80444bf0ef92845210f4cab5477f43756624df.zip
✨ migrate_search_queries_v4_2: migration script for search query
Change to the new syntax for before (=<), after (=>), larger (=>) and smaller (=<).
-rw-r--r--ishtar_common/management/commands/migrate_search_queries_v4_2.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/ishtar_common/management/commands/migrate_search_queries_v4_2.py b/ishtar_common/management/commands/migrate_search_queries_v4_2.py
new file mode 100644
index 000000000..268d5f70d
--- /dev/null
+++ b/ishtar_common/management/commands/migrate_search_queries_v4_2.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import csv
+import datetime
+import os
+import sys
+
+from django.conf import settings
+from django.core.management.base import BaseCommand
+
+from ishtar_common.utils import get_log_time, get_percent, get_eta, BColors
+from ishtar_common.models import SearchQuery
+
+log_path = os.sep.join([settings.ROOT_PATH, "logs"])
+if not os.path.exists(log_path):
+ os.mkdir(log_path, mode=0o770)
+
+
+def write_output(base_lbl, idx, total, ref_time):
+ lbl = f"\r{BColors.OKBLUE}[{get_percent(idx, total)}] {base_lbl} {idx + 1}/{total}"
+ lbl += f" ({get_eta(idx, total, ref_time, datetime.datetime.now())} left){BColors.ENDC}"
+ sys.stdout.write(lbl)
+ sys.stdout.flush()
+
+
+KEYS = (
+ ("-plus-grand=", "=>"),
+ ("-plus-petit=", "=<"),
+ ("-avant=", "=<"),
+ ("-apres=", "=>"),
+)
+
+
+def migrate(log=True):
+ changed = []
+ if not quiet:
+ sys.stdout.write(
+ f"{BColors.OKGREEN}\r[{get_log_time()}] Fix search queries\n{BColors.ENDC}"
+ )
+ q = SearchQuery.objects.all()
+ total = q.count()
+ ref_time = datetime.datetime.now()
+ base_lbl = "Update search queries"
+ for idx, sq in enumerate(q):
+ is_changed = False
+ if not quiet:
+ write_output(base_lbl, idx, total, ref_time)
+ base_query = sq.query[:]
+ for key, rep in KEYS:
+ if key not in sq.query:
+ continue
+ sq.query = sq.query.replace(key, rep)
+ is_changed = True
+ if is_changed:
+ changed.append((sq.id, base_query, sq.query[:]))
+ sq.save()
+
+ if log and changed:
+ filename = f"migrate_search_queries_v4_2-{get_log_time().replace(':', '')}.csv"
+ path = os.sep.join([log_path, filename])
+ with open(path, "w+") as fle:
+ writer = csv.writer(fle)
+ writer.writerow(["search query id", "old query", "new query"])
+ for change in changed:
+ writer.writerow(change)
+ if not quiet:
+ sys.stdout.write(f"\n[{get_log_time()}] Log: {path} written\n")
+ return
+
+
+class Command(BaseCommand):
+ help = "v4.2 - update search queries"
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ "--quiet", dest="quiet", action="store_true", help="Quiet output"
+ )
+ parser.add_argument(
+ "--no-log", dest="log", action="store_false", help="Do not log into a file"
+ )
+
+ def handle(self, *args, **options):
+ log = options["log"]
+ global quiet
+ quiet = options["quiet"]
+ if not quiet:
+ sys.stdout.write(f"{BColors.OKGREEN}[{get_log_time()}] Processing migration\n{BColors.ENDC}")
+ settings.USE_BACKGROUND_TASK = False
+ errors = migrate(log=log)
+ if not errors:
+ if not quiet:
+ sys.stdout.write(f"{BColors.OKGREEN}[{get_log_time()}] Migration finished\n{BColors.ENDC}")
+ sys.exit()
+ if not quiet:
+ sys.stdout.write("\n".join(errors))
+ sys.exit(1)