add: check_card_id.py — проверка user_id -> CARD_ID -> телефон
Использует AD_BASES через utils.ad_search.search_by_user_id
This commit is contained in:
@@ -0,0 +1,154 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Проверочный скрипт: user_id -> CARD_ID -> телефон.
|
||||||
|
|
||||||
|
Интерактивный режим: после каждого запроса спрашивает,
|
||||||
|
хочешь ли продолжить.
|
||||||
|
|
||||||
|
config.py сам подтягивает все секреты из Passwork при импорте.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# config.py при импорте заполняет globals():
|
||||||
|
# AD_USER, AD_PASSWORD, AD_SERVER, AD_BASES
|
||||||
|
# DB_USER, DB_PASSWORD, SQL_SERVER, SQL_DB_NAME
|
||||||
|
# ============================================================
|
||||||
|
sys.path.insert(0, "/opt/trueconf_bot")
|
||||||
|
from config import config
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO, format="%(message)s")
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# AD: user_id -> CARD_ID
|
||||||
|
# ============================================================
|
||||||
|
def get_card_id_from_ad(user_id: str) -> str:
|
||||||
|
"""Ищем пользователя в AD по всем OU из AD_BASES, возвращаем extensionAttribute2 (CARD_ID)."""
|
||||||
|
from utils.ad_search import search_by_user_id
|
||||||
|
|
||||||
|
entries = search_by_user_id(user_id, ["extensionAttribute2"])
|
||||||
|
|
||||||
|
if not entries:
|
||||||
|
raise Exception("Пользователь не найден в AD")
|
||||||
|
|
||||||
|
entry = entries[0]
|
||||||
|
|
||||||
|
if "extensionAttribute2" in entry and entry.extensionAttribute2.value:
|
||||||
|
card_id = str(entry.extensionAttribute2.value).strip()
|
||||||
|
log.info("CARD_ID: {}".format(card_id))
|
||||||
|
return card_id
|
||||||
|
|
||||||
|
raise Exception("extensionAttribute2 пуст для этого пользователя в AD")
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# SQL: CARD_ID -> телефон в PR_CARD
|
||||||
|
# ============================================================
|
||||||
|
def get_phone_from_db(card_id: str) -> str:
|
||||||
|
"""Ищем сотрудника в UOV_SELFSERVICE_PR_CARD по CARD_ID."""
|
||||||
|
import pymssql
|
||||||
|
|
||||||
|
conn = pymssql.connect(
|
||||||
|
server=config.SQL_SERVER,
|
||||||
|
user=config.DB_USER,
|
||||||
|
password=config.DB_PASSWORD,
|
||||||
|
database=config.SQL_DB_NAME,
|
||||||
|
charset="cp1251",
|
||||||
|
)
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
query = """
|
||||||
|
SELECT c.ID, c.PHONE, c.F_NAME, c.L_NAME, c.M_NAME
|
||||||
|
FROM UOV_SELFSERVICE_PR_CARD c
|
||||||
|
WHERE c.ID = %s
|
||||||
|
"""
|
||||||
|
cursor.execute(query, (card_id,))
|
||||||
|
row = cursor.fetchone()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
if not row:
|
||||||
|
raise Exception("CARD_ID {} не найден в PR_CARD".format(card_id))
|
||||||
|
|
||||||
|
card_id_db = row[0]
|
||||||
|
phone = str(row[1]) if row[1] else "Не указан"
|
||||||
|
f_name = str(row[2]) if row[2] else ""
|
||||||
|
l_name = str(row[3]) if row[3] else ""
|
||||||
|
m_name = str(row[4]) if row[4] else ""
|
||||||
|
|
||||||
|
log.info("PR_CARD.ID: {}".format(card_id_db))
|
||||||
|
log.info("ФИО: {} {} {}".format(l_name, f_name, m_name))
|
||||||
|
log.info("PHONE: {}".format(phone))
|
||||||
|
return phone
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# MAIN
|
||||||
|
# ============================================================
|
||||||
|
def run_one():
|
||||||
|
"""Выполнить один запрос: ввод user_id -> CARD_ID -> телефон."""
|
||||||
|
user_id = input("\nВведите user_id (email или sAMAccountName): ").strip()
|
||||||
|
if not user_id:
|
||||||
|
print("user_id пустой, выход.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print()
|
||||||
|
print("[1] Поиск CARD_ID в Active Directory")
|
||||||
|
print(" Сервер: {}".format(config.AD_SERVER))
|
||||||
|
print(" Базы поиска: {}".format(config.AD_BASES))
|
||||||
|
print(" user_id: {}".format(user_id))
|
||||||
|
print()
|
||||||
|
|
||||||
|
try:
|
||||||
|
card_id = get_card_id_from_ad(user_id)
|
||||||
|
except Exception as e:
|
||||||
|
print("Ошибка AD: {}".format(e))
|
||||||
|
return None
|
||||||
|
|
||||||
|
print()
|
||||||
|
print("[2] Поиск телефона в базе BossCopy")
|
||||||
|
print(" Сервер: {}".format(config.SQL_SERVER))
|
||||||
|
print(" CARD_ID: {}".format(card_id))
|
||||||
|
print()
|
||||||
|
|
||||||
|
try:
|
||||||
|
phone = get_phone_from_db(card_id)
|
||||||
|
except Exception as e:
|
||||||
|
print("Ошибка SQL: {}".format(e))
|
||||||
|
return card_id
|
||||||
|
|
||||||
|
print()
|
||||||
|
print("=" * 70)
|
||||||
|
print(" ИТОГ")
|
||||||
|
print("=" * 70)
|
||||||
|
print(" user_id: {}".format(user_id))
|
||||||
|
print(" CARD_ID: {}".format(card_id))
|
||||||
|
print(" Телефон: {}".format(phone))
|
||||||
|
print("=" * 70)
|
||||||
|
print()
|
||||||
|
|
||||||
|
return card_id
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print()
|
||||||
|
print("=" * 70)
|
||||||
|
print(" Проверка: user_id -> CARD_ID -> телефон")
|
||||||
|
print("=" * 70)
|
||||||
|
print()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
run_one()
|
||||||
|
|
||||||
|
again = input("Продолжить? (y/n): ").strip().lower()
|
||||||
|
if again not in ("y", "yes", "д", "да"):
|
||||||
|
print("Готово.")
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user