Compare commits

..

6 Commits

Author SHA1 Message Date
gitea b7c25c4ff1 fix: add missing 'import os' (used on line 28 for sys.path) 2026-07-04 19:05:55 +07:00
gitea 23960cbbb6 fix: remove duplicate exclusion block, replace continue with else branch
- Removed duplicate department exclusion check (was duplicated twice)
- Replaced 'continue' (invalid inside 'if ENABLE_AUTO_APPROVAL') with 'else:' branch
- Properly indented auto-approval logic inside the else block
2026-07-04 18:50:40 +07:00
Denis Krivchenko c3503975a0 merge: sync dispatcher with main — resolve conflicts 2026-07-04 18:02:30 +07:00
Denis Krivchenko 1949a461b2 feat: add department exclusion for auto-approval
- Add department attribute to LDAP search
- Add APPROVAL_EXCLUDED_DEPARTMENTS config
- Skip auto-approval if user department is excluded
2026-07-04 17:55:35 +07:00
dddennnisss 074379aa22 chore: remove test_ad_lookup.py from main 2026-07-04 16:16:36 +07:00
dddennnisss 179f1b1a74 chore: remove test_ad.py from main 2026-07-04 16:16:35 +07:00
+16 -20
View File
@@ -2,6 +2,7 @@
import requests
import json
import urllib3
import os
import math
import warnings
import datetime
@@ -170,8 +171,8 @@ def find_user_in_ad(requester, caller_phone=None, ticket_id=None):
try:
server = Server(AD_SERVER, get_info=ALL, connect_timeout=AD_CONNECT_TIMEOUT)
conn = Connection(server, user=AD_USER, password=AD_PASSWORD, auto_bind=True, receive_timeout=AD_RECEIVE_TIMEOUT)
conn.search(search_base=AD_BASE, search_filter=ldap_filter, attributes=["l", "company", "manager"])
conn.search(search_base=AD_BASE, search_filter=ldap_filter, attributes=["l", "company", "manager", "department"])
if not conn.entries:
log_to_file(f" [AD] ❌ Объект ({search_by}) не найден in AD!", ticket_id)
return None
@@ -196,8 +197,8 @@ def find_user_in_ad(requester, caller_phone=None, ticket_id=None):
manager_email = conn.entries[0].mail.value
department = user.department.value if "department" in user and user.department.value else None
return {"city": city, "company": company, "ad_path": ad_path, "manager_email": manager_email, "source": f"AD ({search_by})"}
return {"city": city, "company": company, "department": department, "ad_path": ad_path, "manager_email": manager_email, "source": f"AD ({search_by})"}
except Exception as e:
log_to_file(f"❌ Ошибка LDAP или таймаут сети AD: {e}", ticket_id)
return None
@@ -555,9 +556,7 @@ def classify_ticket(text, ticket_id=None):
if not result:
return "Не определено", 0, [], True, [], {"pure_qdrant_choice": "Не определено", "q_variance": 0, "q_unique_groups": 0, "q_max_score": 0, "q_dominance": 0}
# =================================================================
# ЭТАП 1: РАСЧЕТ ВЫБОРА ЧИСТОГО QDRANT (ДО СЛУЖБЫ РЕРАНКИНГА)
# =================================================================
pure_scores = defaultdict(float)
pure_counts = defaultdict(int)
for p in result:
@@ -573,9 +572,7 @@ def classify_ticket(text, ticket_id=None):
qdrant_scores = [p.score for p in result]
# =================================================================
# ЭТАП 2: СЛУЖБА ПЕРЕРАНЖИРОВАНИЯ CROSS-ENCODER + БЛЕНДИНГ СКОРОВ
# =================================================================
documents = [p.payload.get("text", "Текст отсутствует").strip()[:RERANKER_MAX_DOC_CHARS] for p in result]
rerank_payload = {
@@ -903,23 +900,22 @@ def process_ticket_logic(req_id):
break
if is_excluded:
t_log(" ⏭ Пропуск: пользователь в исключённом отделе.")
continue
else:
if is_city_ok and (is_group_ok or is_cat_ok):
if manager_email:
t_log(f"✔ Условия совпали. Запуск процесса согласования для {manager_email}...")
ai_was_used = True
if is_city_ok and (is_group_ok or is_cat_ok):
if manager_email:
t_log(f"✔ Условия совпали. Запуск процесса согласования для {manager_email}...")
ai_was_used = True
share_success, share_log = share_ticket_for_approval(req_id, manager_email)
t_log(share_log)
share_success, share_log = share_ticket_for_approval(req_id, manager_email)
t_log(share_log)
cc_success, cc_log = add_email_to_notify(req_id, manager_email)
t_log(cc_log)
cc_success, cc_log = add_email_to_notify(req_id, manager_email)
t_log(cc_log)
success, step_detail = trigger_manager_approval(req_id, manager_email)
t_log(step_detail)
else:
t_log("⚠️ Согласование невозможно: у пользователя не указан руководитель в AD.")
success, step_detail = trigger_manager_approval(req_id, manager_email)
t_log(step_detail)
else:
t_log("⚠️ Согласование невозможно: у пользователя не указан руководитель в AD.")
else:
if ai_was_used:
t_log("\n=== ШАГ 5. АВТОСОГЛАСОВАНИЕ ===")