crk_telegram_bot/app/engine.py

173 lines
7.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import re
from app.settings.config import DEBUG
class SearchEngine:
def __init__(self, debug=False):
self.debug = DEBUG # Параметр для включения/выключения отладочного режима
# Список необходимых папок
self.required_folders = [
"3D сканы",
"Анализы",
"Документы",
"План лечения",
"Снимки и КТ",
"Фотографии"
]
# Метод для поиска в папке
def search_folder(self, path, message_text):
if self.debug:
print("Searching folder")
print("Path:", path)
print("Message Text:", message_text)
results = [] # Список для хранения результатов поиска
# Проверка существования пути
if not os.path.exists(path):
print(f"Path '{path}' does not exist.")
return results
# Рекурсивный обход папок
for root, dirs, files in os.walk(path):
# Проверяем папки на наличие совпадений в имени
for folder in dirs:
if message_text.lower() in folder.lower():
full_path = os.path.join(root, folder)
results.append(full_path)
if self.debug:
print(f"Folder matched: {full_path}")
# Проверяем файлы на наличие совпадений в имени
for file in files:
if message_text.lower() in file.lower():
full_path = os.path.join(root, file)
results.append(full_path)
if self.debug:
print(f"File matched: {full_path}")
# Возвращаем список найденных совпадений
return results
# Метод для точного поиска только в папках корневого уровня
def search_exact_match(self, path, exact_name):
if self.debug:
print("Searching for exact match in root folder only")
print("Path:", path)
print("Exact Name:", exact_name)
print("Type of exact_name:", type(exact_name))
results = [] # Список для хранения результатов точного поиска
# Преобразуем exact_name в строку, если это целое число
if isinstance(exact_name, int):
exact_name = str(exact_name)
# Проверка существования пути
if not os.path.exists(path):
if self.debug:
print(f"Path '{path}' does not exist.")
return results
# Проверка только корневых папок
with os.scandir(path) as entries:
for entry in entries:
if entry.is_dir() and entry.name == exact_name: # Только папки с точным совпадением
full_path = os.path.join(path, entry.name)
results.append(full_path)
if self.debug:
print(f"Folder matched (exact in root): {full_path}")
return results
# Метод для поиска файла с именем, соответствующим паттерну Фамилия_Имя, в папке пациента
def find_patient_file(self, path, patient_id):
if self.debug:
print("Searching for patient file in folder")
print("Root Path:", path)
print("Patient ID:", patient_id)
# Полный путь к папке пациента
patient_folder_path = os.path.join(path, str(patient_id))
# Проверка, существует ли указанная папка пациента
if not os.path.exists(patient_folder_path) or not os.path.isdir(patient_folder_path):
if self.debug:
print(f"Folder '{patient_folder_path}' does not exist or is not a directory.")
return None
# Паттерн для поиска файла с форматом Фамилия_Имя
pattern = re.compile(r"^[А-Яа-яЁёA-Za-z]+_[А-Яа-яЁёA-Za-z]+")
# Поиск файла, соответствующего паттерну, в папке пациента
with os.scandir(patient_folder_path) as entries:
for entry in entries:
if entry.is_file() and pattern.match(entry.name):
full_path = os.path.join(patient_folder_path, entry.name)
if self.debug:
print(f"File matched: {full_path}")
print(f"entry.name: {entry.name}")
return entry.name
# Если файл не найден, возвращаем None
if self.debug:
print(f"No matching file found in folder '{patient_folder_path}'.")
return None
def check_and_create_patient_folders(self, path, patient_id):
# Полный путь к папке пациента
patient_folder_path = os.path.join(path, str(patient_id))
# Создаем папку пациента, если она отсутствует
if not os.path.exists(patient_folder_path):
os.makedirs(patient_folder_path)
if self.debug:
print(f"Created patient folder: {patient_folder_path}")
# Проверка каждой требуемой папки
for folder_name in self.required_folders:
full_folder_path = os.path.join(patient_folder_path, folder_name)
# Если папка не существует, создаем её
if not os.path.exists(full_folder_path):
os.makedirs(full_folder_path)
if self.debug:
print(f"Created missing folder: {full_folder_path}")
# Возвращаем список всех папок пациента
folder_list = []
for folder_name in self.required_folders:
folder_list.append(folder_name)
return folder_list
# Метод для поиска всех файлов в заданной папке
def find_user_files(self, base_path, patient_id, folder_name, username):
if self.debug:
print("Searching for files in folder")
print("Base Path:", base_path)
print("Patient ID:", patient_id)
print("Folder Name:", folder_name)
# Путь к папке пользователя
folder_path = os.path.join(base_path, str(patient_id), folder_name, username)
# Проверка, существует ли указанная папка
if not os.path.exists(folder_path):
if self.debug:
print(f"Folder '{folder_path}' does not exist.")
return []
# Получаем список файлов в папке
files = []
with os.scandir(folder_path) as entries:
for entry in entries:
if entry.is_file():
files.append(entry.name)
if self.debug:
print(f"Found file: {entry.name}")
return files