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