diff --git a/src/petab_gui/controllers/mother_controller.py b/src/petab_gui/controllers/mother_controller.py index a1c0d2a..fe05a00 100644 --- a/src/petab_gui/controllers/mother_controller.py +++ b/src/petab_gui/controllers/mother_controller.py @@ -836,9 +836,10 @@ def new_file(self): def check_model(self): """Check the consistency of the model. And log the results.""" capture_handler = CaptureLogHandler() - logger = logging.getLogger("petab.v1.lint") # Target the specific - # logger - logger.addHandler(capture_handler) + logger_lint = logging.getLogger("petab.v1.lint") + logger_vis = logging.getLogger("petab.v1.visualize.lint") + logger_lint.addHandler(capture_handler) + logger_vis.addHandler(capture_handler) try: # Run the consistency check @@ -871,7 +872,8 @@ def check_model(self): self.logger.log_message(msg, color="red") finally: # Always remove the capture handler - logger.removeHandler(capture_handler) + logger_lint.removeHandler(capture_handler) + logger_vis.removeHandler(capture_handler) def unsaved_changes_change(self, unsaved_changes: bool): self.unsaved_changes = unsaved_changes @@ -1154,3 +1156,7 @@ def _show_help_welcome(self): msg.exec() if dont.isChecked(): settings.setValue("help_mode/welcome_disabled", True) + + def get_current_problem(self): + """Get the current PEtab problem from the model.""" + return self.model.current_petab_problem diff --git a/src/petab_gui/controllers/table_controllers.py b/src/petab_gui/controllers/table_controllers.py index bf0b69f..5301823 100644 --- a/src/petab_gui/controllers/table_controllers.py +++ b/src/petab_gui/controllers/table_controllers.py @@ -1,5 +1,6 @@ """Classes for the controllers of the tables in the GUI.""" +import logging import re from collections.abc import Sequence from pathlib import Path @@ -22,7 +23,12 @@ PandasTableModel, ) from ..settings_manager import settings_manager -from ..utils import ConditionInputDialog, get_selected, process_file +from ..utils import ( + CaptureLogHandler, + ConditionInputDialog, + get_selected, + process_file, +) from ..views.other_views import DoseTimeDialog from ..views.table_view import ( ColumnSuggestionDelegate, @@ -1316,6 +1322,26 @@ def __init__( mother_controller=mother_controller, ) + @linter_wrapper(additional_error_check=True) + def check_petab_lint( + self, + row_data: pd.DataFrame = None, + row_name: str = None, + col_name: str = None, + ): + """Check a number of rows of the model with petablint.""" + problem = self.mother_controller.get_current_problem() + capture_handler = CaptureLogHandler() + logger_vis = logging.getLogger("petab.v1.visualize.lint") + logger_vis.addHandler(capture_handler) + errors = petab.visualize.lint.validate_visualization_df(problem) + if not errors: + return not errors + captured_output = "
    ".join( + capture_handler.get_formatted_messages() + ) + raise ValueError(captured_output) + def setup_completers(self): """Set completers for the visualization table.""" table_view = self.view.table_view