lib.itmens/catalog/management/commands/index.py

90 lines
2.6 KiB
Python
Raw Normal View History

2022-12-31 17:16:47 -05:00
import pprint
from time import sleep
from django.core.management.base import BaseCommand
from django.core.paginator import Paginator
from tqdm import tqdm
2023-07-20 21:59:49 -04:00
from catalog.models import Item
from catalog.search.typesense import Indexer
2022-12-31 18:55:27 -05:00
BATCH_SIZE = 1000
2022-12-31 17:16:47 -05:00
class Command(BaseCommand):
help = "Manage the search index"
def add_arguments(self, parser):
parser.add_argument(
"--init",
help="initialize index",
action="store_true",
)
2022-12-31 18:55:27 -05:00
parser.add_argument(
"--update",
help="update index schema",
action="store_true",
)
2022-12-31 17:16:47 -05:00
parser.add_argument(
"--stat",
action="store_true",
)
2022-12-31 18:55:27 -05:00
parser.add_argument(
"--reindex",
action="store_true",
)
parser.add_argument(
"--delete",
action="store_true",
)
2022-12-31 17:16:47 -05:00
def init_index(self):
Indexer.init()
self.stdout.write(self.style.SUCCESS("Index created."))
def delete(self):
Indexer.delete_index()
self.stdout.write(self.style.SUCCESS("Index deleted."))
2022-12-31 18:55:27 -05:00
def update_index(self):
Indexer.update_settings()
self.stdout.write(self.style.SUCCESS("Index updated."))
2022-12-31 17:16:47 -05:00
def stat(self, *args, **options):
stats = Indexer.get_stats()
pprint.pp(stats)
2022-12-31 18:55:27 -05:00
def reindex(self):
if Indexer.busy():
self.stdout.write("Please wait for previous updates")
# Indexer.update_settings()
# self.stdout.write(self.style.SUCCESS('Index settings updated.'))
2023-01-08 20:28:18 -05:00
qs = Item.objects.filter(
is_deleted=False, merged_to_item_id__isnull=True
2022-12-31 18:55:27 -05:00
) # if h == 0 else c.objects.filter(edited_time__gt=timezone.now() - timedelta(hours=h))
pg = Paginator(qs.order_by("id"), BATCH_SIZE)
for p in tqdm(pg.page_range):
Indexer.replace_batch(pg.get_page(p).object_list)
while Indexer.busy():
sleep(0.5)
2022-12-31 18:55:27 -05:00
2022-12-31 17:16:47 -05:00
def handle(self, *args, **options):
if options["init"]:
self.init_index()
2022-12-31 18:55:27 -05:00
elif options["update"]:
self.update_index()
2022-12-31 17:16:47 -05:00
elif options["stat"]:
self.stat()
2022-12-31 18:55:27 -05:00
elif options["reindex"]:
self.reindex()
elif options["delete"]:
self.delete()
2022-12-31 17:16:47 -05:00
# else:
# try:
# Indexer.init()
# self.stdout.write(self.style.SUCCESS('Index created.'))
# except Exception:
# Indexer.update_settings()
# self.stdout.write(self.style.SUCCESS('Index settings updated.'))