#!/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)