fix org
This commit is contained in:
110
import_orgs.py
Normal file
110
import_orgs.py
Normal file
@@ -0,0 +1,110 @@
|
||||
"""
|
||||
Скрипт для массового импорта организаций из .docx файла через API.
|
||||
|
||||
Использование:
|
||||
python import_orgs.py МБОУ.docx
|
||||
|
||||
Требования:
|
||||
pip install python-docx httpx
|
||||
|
||||
Настройки ниже (или через переменные окружения):
|
||||
API_URL — адрес API (по умолчанию http://localhost:8000)
|
||||
ADMIN_KEY — значение переменной ADMIN_KEY из .env
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import httpx
|
||||
from docx import Document
|
||||
|
||||
API_URL = os.getenv("API_URL", "http://localhost:8000")
|
||||
ADMIN_KEY = os.getenv("ADMIN_KEY", "")
|
||||
|
||||
|
||||
def extract_names_from_docx(path: str) -> list[str]:
|
||||
"""Извлекает непустые строки из параграфов и ячеек таблиц docx."""
|
||||
doc = Document(path)
|
||||
names = []
|
||||
|
||||
# Параграфы
|
||||
for para in doc.paragraphs:
|
||||
text = para.text.strip()
|
||||
if text:
|
||||
names.append(text)
|
||||
|
||||
# Таблицы (если список оформлен таблицей)
|
||||
for table in doc.tables:
|
||||
for row in table.rows:
|
||||
for cell in row.cells:
|
||||
text = cell.text.strip()
|
||||
if text and text not in names:
|
||||
names.append(text)
|
||||
|
||||
return names
|
||||
|
||||
|
||||
def import_organizations(names: list[str]) -> None:
|
||||
if not ADMIN_KEY:
|
||||
print("ОШИБКА: задайте ADMIN_KEY=... перед запуском")
|
||||
print(" Пример: ADMIN_KEY=mykey python import_orgs.py МБОУ.docx")
|
||||
sys.exit(1)
|
||||
|
||||
headers = {"X-Admin-Key": ADMIN_KEY, "Content-Type": "application/json"}
|
||||
added = 0
|
||||
skipped = 0
|
||||
errors = 0
|
||||
|
||||
with httpx.Client(base_url=API_URL, headers=headers, timeout=30) as client:
|
||||
for name in names:
|
||||
try:
|
||||
resp = client.post("/organizations/", json={"name_organization": name})
|
||||
if resp.status_code == 201:
|
||||
added += 1
|
||||
print(f" [+] {name}")
|
||||
elif resp.status_code == 400:
|
||||
skipped += 1
|
||||
print(f" [=] УЖЕ ЕСТЬ: {name}")
|
||||
else:
|
||||
errors += 1
|
||||
print(f" [!] ОШИБКА {resp.status_code}: {name} — {resp.text}")
|
||||
except Exception as e:
|
||||
errors += 1
|
||||
print(f" [!] ОШИБКА соединения: {name} — {e}")
|
||||
|
||||
print(f"\nГотово: добавлено {added}, пропущено {skipped}, ошибок {errors}")
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print("Использование: python import_orgs.py <файл.docx>")
|
||||
sys.exit(1)
|
||||
|
||||
docx_path = sys.argv[1]
|
||||
if not os.path.exists(docx_path):
|
||||
print(f"Файл не найден: {docx_path}")
|
||||
sys.exit(1)
|
||||
|
||||
print(f"Читаю: {docx_path}")
|
||||
names = extract_names_from_docx(docx_path)
|
||||
print(f"Найдено строк: {len(names)}")
|
||||
print()
|
||||
|
||||
# Показываем первые 10 для проверки
|
||||
print("Первые 10 записей:")
|
||||
for n in names[:10]:
|
||||
print(f" • {n}")
|
||||
if len(names) > 10:
|
||||
print(f" ... и ещё {len(names) - 10}")
|
||||
|
||||
print()
|
||||
confirm = input("Начать импорт? (y/n): ").strip().lower()
|
||||
if confirm != "y":
|
||||
print("Отменено.")
|
||||
sys.exit(0)
|
||||
|
||||
print()
|
||||
import_organizations(names)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user