From 16910133ac50b025139ecf298f89013dd1243c26 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 20 Jan 2025 17:26:34 +0300 Subject: [PATCH] =?UTF-8?q?chore:=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D0=B5=D0=BC=D1=8B=D0=BC=D0=B8=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/base.py | 76 ++++++++++++++++++++++++++------ src/controller/monitor.py | 91 +++++++++++++++++++++------------------ 2 files changed, 111 insertions(+), 56 deletions(-) diff --git a/src/base/base.py b/src/base/base.py index 9669db5..297fe51 100644 --- a/src/base/base.py +++ b/src/base/base.py @@ -19,14 +19,12 @@ from utils.qt_settings import dark_style class BaseMediator: def __init__(self, - monitor: BaseDirectoryMonitor, converter: BaseDataConverter, # TODO: passport_former passportFormer: BasePointPassportFormer, plot: BasePlotWidget, - controller: BaseController): - self._monitor = monitor - self._monitor.mediator = self + controller: BaseController, + file_manager: BaseFileManager): self._converter = converter self._converter.mediator = self self._passportFormer = passportFormer @@ -35,6 +33,8 @@ class BaseMediator: self._plot.mediator = self self._controller = controller self._controller.mediator = self + self._file_manager = file_manager + self._file_manager.mediator = self def notify(self, source: Union[BaseDirectoryMonitor, BaseDataConverter, BasePointPassportFormer, BasePlotWidget], @@ -52,14 +52,13 @@ class BaseDirectoryMonitor: update_timer = QTimer() def __init__(self, - mediator: Optional[BaseMediator] = None): + file_manager: Optional[BaseFileManager] = None): super().__init__() self._directory_path = None self._update_time = None self.isActive = False self._files = [] - self._mediator = mediator - + self._file_manager = file_manager @property def directory_path(self) -> str: @@ -74,14 +73,14 @@ class BaseDirectoryMonitor: return self._files @property - def mediator(self) -> BaseMediator: - return self._mediator + def file_manager(self) -> BaseFileManager: + return self._file_manager - @mediator.setter - def mediator(self, mediator: BaseMediator) -> None: - self._mediator = mediator + @file_manager.setter + def file_manager(self, file_manager: BaseFileManager) -> None: + self._file_manager = file_manager - def _init_state(self): + def init_state(self): files = os.listdir(self._directory_path) self._files = files @@ -92,6 +91,10 @@ class BaseDirectoryMonitor: def stop(self): self.isActive = False self.update_timer.stop() + + def pause(self): + self.update_timer.stop() + # TODO: Почему монитор директорий обновляет какие-то настройки, графики и т.д.? Помним про # принцип единичной ответственности. def update_settings(self, data: list[dict]) -> None: @@ -361,6 +364,10 @@ class BasePlotWidget: class BaseController(QObject): + def __init__(self, + mediator: Optional[BaseMediator] = None): + self._mediator = mediator + def send_widgets(self, widgets: list[QWidget]) -> None: ... @@ -383,6 +390,49 @@ class BaseController(QObject): def update_status(self, msg: Union[str, float]) -> None: ... + + @property + def mediator(self) -> BaseMediator: + return self._mediator + + @mediator.setter + def mediator(self, mediator: BaseMediator) -> None: + self._mediator = mediator + + +class BaseFileManager: + + def __init__(self, + mediator: Optional[BaseMediator] = None, + monitor: Optional[BaseDirectoryMonitor] = None): + self._mediator = mediator + self._monitor = monitor + self._paths_library = set() + + @property + def paths_library(self) -> set: + return self._paths_library + + @property + def mediator(self) -> BaseMediator: + return self._mediator + + @mediator.setter + def mediator(self, mediator: BaseMediator) -> None: + self._mediator = mediator + + @property + def monitor(self) -> BaseDirectoryMonitor: + return self._monitor + + @monitor.setter + def monitor(self, monitor: BaseDirectoryMonitor) -> None: + self._monitor = monitor + + def add_new_paths(self, paths:list[str]): + ... + + class BaseIdealDataBuilder(OptAlgorithm): diff --git a/src/controller/monitor.py b/src/controller/monitor.py index be2afa6..6ccadb6 100644 --- a/src/controller/monitor.py +++ b/src/controller/monitor.py @@ -2,17 +2,19 @@ import os from loguru import logger -from base.base import BaseDirectoryMonitor +from base.base import BaseDirectoryMonitor, BaseFileManager class DirectoryMonitor(BaseDirectoryMonitor): - def _init_state(self): + def init_state(self): + if not os.path.exists(self._directory_path): + logger.error(f"Путь {self._directory_path} не существует.") + raise FileNotFoundError(f"Путь {self._directory_path} не существует.") + self._files = [ os.path.join(self._directory_path, file) for file in os.listdir(self._directory_path) - # TODO: FileNotFoundError: [Errno 2] No such file or directory: 'D:/downloads/a22' - # при выборе real time mode. if file.lower().endswith('.csv') ] @@ -28,50 +30,53 @@ class DirectoryMonitor(BaseDirectoryMonitor): new_files = sorted(list(filter(lambda x: x not in self._files, current_files))) if new_files: logger.info(f"New files detected: {new_files}") - self._mediator.notify(self, new_files) + self._file_manager.add_new_paths(new_files) self._files = current_files if not current_files: self._files = [] - # TODO: Почему монитор директории обновляет какие-то настройки, графики, стартует что-то? - # Это не должно быть в его зоне ответственности. - # TODO: Может стоит сделать какой-то класс, который будет заниматься обновлениями? - def update_settings(self, data: list[dict]) -> None: - if self.isActive: - self.stop() - _, system_params = data - self._directory_path = system_params['trace_storage_path'][0] - self._update_time = system_params['monitor_update_period'][0] - if not os.path.exists(self._directory_path): - logger.error(f"Путь {self._directory_path} не существует.") - raise FileNotFoundError(f"Путь {self._directory_path} не существует.") - else: - self._init_state() - self.start() - else: - _, system_params = data - self._directory_path = system_params['trace_storage_path'][0] - self._update_time = system_params['monitor_update_period'][0] - +class FileManager(BaseFileManager): + def update_plots(self): - if self._files is not None: - self._mediator.notify(self, self._files) + if self._paths_library is not None: + self._mediator.notify(self, list(self._paths_library)) + + def open_custom_file(self, path:str): + self._paths_library.add(path) + self._mediator.notify(self, [path if path else '']) + + def start_raport_mode(self) -> None: + self._monitor.stop() + self._paths_library.clear() + self._paths_library.add('') + self._mediator.notify(self, list(self._paths_library)) + + def start_seeking_mode(self) -> None: + self._monitor.init_state() + self._monitor.start() + + def update_monitor_settings(self, settings:list[dict]) -> None: + _, system_params = settings + directory_path = system_params['trace_storage_path'][0] + update_time = system_params['monitor_update_period'][0] + + if not os.path.exists(directory_path): + logger.error(f"Путь {directory_path} не существует.") + raise FileNotFoundError(f"Путь {directory_path} не существует.") + + if update_time <= 0.01: + logger.error(f"Путь {directory_path} не существует.") + + if self._monitor.isActive: self._monitor.pause() + self._monitor.directory_path = directory_path + self._monitor.update_time = update_time + if self._monitor.isActive: self._monitor.start() + + def add_new_paths(self, paths): + paths_set = set(paths) + new = self._paths_library.difference(paths_set) + self._paths_library.update(new) + self._mediator.notify(list(new)) - def custom_csv_extract_only(self, path: str): - self._files.append(path) - if path is not None: - self._mediator.notify(self, [path]) - else: - self._mediator.notify(self, ['']) - - def start_raport(self) -> None: - self.stop() - self._files = [''] - self._mediator.notify(self, ['']) - - - def start_seeking(self) -> None: - self._init_state() - self.start()