""" فهرستِ زنده‌ی collectionهای Qdrant + تعدادِ نقطه و مقادیرِ فیلترِ درس/فصل. فقط خواندنی؛ هیچ‌چیزی روی Qdrant نمی‌نویسد. برای این‌که همیشه بدونیم چه کتاب/درسی روی سرورِ تیمِ دیگه در دسترس است و rag/services/known_collections.py با واقعیت هم‌خوان است. python manage.py rag_catalog python manage.py rag_catalog --values # مقادیرِ lesson_number/chapter را هم چاپ کن """ import json from django.core.management.base import BaseCommand class Command(BaseCommand): help = 'فهرستِ زنده‌ی collectionهای Qdrant (فقط خواندنی).' def add_arguments(self, parser): parser.add_argument('--values', action='store_true', help='مقادیرِ متمایزِ lesson_number/chapter هر collection را هم چاپ کن.') parser.add_argument('--json', action='store_true', help='خروجی JSON.') def handle(self, *args, **opts): from rag.services.clients import RagNotConfigured, get_qdrant_client try: client = get_qdrant_client() names = sorted(c.name for c in client.get_collections().collections) except RagNotConfigured as exc: self.stderr.write(self.style.ERROR(f'RAG پیکربندی نشده: {exc}')) return except Exception as exc: # noqa: BLE001 self.stderr.write(self.style.ERROR(f'اتصال به Qdrant شکست خورد: {exc}')) return catalog = [] for name in names: info = client.get_collection(name) row = { 'collection': name, 'points': info.points_count, 'vectorSize': info.config.params.vectors.size, } if opts['values']: lessons, chapters = set(), set() offset = None while True: pts, offset = client.scroll(collection_name=name, limit=256, with_payload=True, with_vectors=False, offset=offset) for p in pts: pl = p.payload or {} if 'lesson_number' in pl: lessons.add(pl['lesson_number']) if 'chapter' in pl: chapters.add(pl['chapter']) if offset is None: break if lessons: row['lessonNumbers'] = sorted(lessons, key=lambda x: (isinstance(x, str), x)) if chapters: row['chapters'] = sorted(chapters) catalog.append(row) if opts['json']: self.stdout.write(json.dumps(catalog, ensure_ascii=False, indent=2)) return total_points = sum(r['points'] for r in catalog) self.stdout.write(self.style.SUCCESS(f'{len(catalog)} collection، مجموعاً {total_points} نقطه:\n')) for r in catalog: self.stdout.write(f" • {r['collection']} — {r['points']} نقطه (بُعد {r['vectorSize']})") if 'lessonNumbers' in r: self.stdout.write(f" lesson_number: {r['lessonNumbers']}") if 'chapters' in r: for ch in r['chapters']: self.stdout.write(f" chapter: {ch!r}")