173 lines
7.4 KiB
Python
173 lines
7.4 KiB
Python
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
|