From f39acaf02e40a8f0843d8adfeb1a71598d2be776 Mon Sep 17 00:00:00 2001 From: vesp Date: Wed, 31 Dec 2025 01:46:43 +0100 Subject: [PATCH] Save and restore scripts with saved requests to projects --- src/models.py | 7 +++++-- src/project_manager.py | 8 +++++--- src/window.py | 18 +++++++++++++----- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/models.py b/src/models.py index 6638097..06d6532 100644 --- a/src/models.py +++ b/src/models.py @@ -98,6 +98,7 @@ class SavedRequest: request: HttpRequest created_at: str # ISO format modified_at: str # ISO format + scripts: Optional['Scripts'] = None # Scripts for preprocessing and postprocessing def to_dict(self): """Convert to dictionary for JSON serialization.""" @@ -106,7 +107,8 @@ class SavedRequest: 'name': self.name, 'request': self.request.to_dict(), 'created_at': self.created_at, - 'modified_at': self.modified_at + 'modified_at': self.modified_at, + 'scripts': self.scripts.to_dict() if self.scripts else None } @classmethod @@ -117,7 +119,8 @@ class SavedRequest: name=data['name'], request=HttpRequest.from_dict(data['request']), created_at=data['created_at'], - modified_at=data['modified_at'] + modified_at=data['modified_at'], + scripts=Scripts.from_dict(data['scripts']) if data.get('scripts') else None ) diff --git a/src/project_manager.py b/src/project_manager.py index 442bcdf..14fcab1 100644 --- a/src/project_manager.py +++ b/src/project_manager.py @@ -111,7 +111,7 @@ class ProjectManager: projects = [p for p in projects if p.id != project_id] self.save_projects(projects) - def add_request(self, project_id: str, name: str, request: HttpRequest) -> SavedRequest: + def add_request(self, project_id: str, name: str, request: HttpRequest, scripts=None) -> SavedRequest: """Add request to a project.""" projects = self.load_projects() now = datetime.now(timezone.utc).isoformat() @@ -120,7 +120,8 @@ class ProjectManager: name=name, request=request, created_at=now, - modified_at=now + modified_at=now, + scripts=scripts ) for p in projects: if p.id == project_id: @@ -140,7 +141,7 @@ class ProjectManager: break return None - def update_request(self, project_id: str, request_id: str, name: str, request: HttpRequest) -> SavedRequest: + def update_request(self, project_id: str, request_id: str, name: str, request: HttpRequest, scripts=None) -> SavedRequest: """Update an existing request.""" projects = self.load_projects() updated_request = None @@ -150,6 +151,7 @@ class ProjectManager: if req.id == request_id: req.name = name req.request = request + req.scripts = scripts req.modified_at = datetime.now(timezone.utc).isoformat() updated_request = req break diff --git a/src/window.py b/src/window.py index eafd06f..64dd2f9 100644 --- a/src/window.py +++ b/src/window.py @@ -705,6 +705,7 @@ class RosterWindow(Adw.ApplicationWindow): return request = widget.get_request() + scripts = widget.get_scripts() if not request.url.strip(): self._show_toast("Cannot save: URL is empty") @@ -779,10 +780,10 @@ class RosterWindow(Adw.ApplicationWindow): existing = self.project_manager.find_request_by_name(project.id, name) if existing: # Show overwrite confirmation - self._show_overwrite_dialog(project, name, existing.id, request) + self._show_overwrite_dialog(project, name, existing.id, request, scripts) else: # No duplicate, save normally - saved_request = self.project_manager.add_request(project.id, name, request) + saved_request = self.project_manager.add_request(project.id, name, request, scripts) self._load_projects() self._show_toast(f"Saved as '{name}'") @@ -824,7 +825,7 @@ class RosterWindow(Adw.ApplicationWindow): # Update tab page title (widget.modified is now False, so no star) page.set_title(name) - def _show_overwrite_dialog(self, project, name, existing_request_id, request): + def _show_overwrite_dialog(self, project, name, existing_request_id, request, scripts=None): """Show dialog asking if user wants to overwrite existing request.""" dialog = Adw.AlertDialog() dialog.set_heading("Request Already Exists") @@ -839,7 +840,7 @@ class RosterWindow(Adw.ApplicationWindow): def on_overwrite_response(dlg, response): if response == "overwrite": # Update the existing request - self.project_manager.update_request(project.id, existing_request_id, name, request) + self.project_manager.update_request(project.id, existing_request_id, name, request, scripts) self._load_projects() self._show_toast(f"Updated '{name}'") @@ -893,6 +894,7 @@ class RosterWindow(Adw.ApplicationWindow): def _on_load_request(self, widget, saved_request): """Load saved request - smart loading based on current tab state.""" req = saved_request.request + scripts = saved_request.scripts # First, check if this request is already open in an unmodified tab existing_tab = self._find_tab_by_saved_request_id(saved_request.id) @@ -932,6 +934,7 @@ class RosterWindow(Adw.ApplicationWindow): current_tab.saved_request_id = link_to_saved current_tab.project_id = project_id current_tab.selected_environment_id = default_env_id + current_tab.scripts = scripts # Update widget with project context widget.project_id = project_id @@ -945,6 +948,10 @@ class RosterWindow(Adw.ApplicationWindow): # Load request into widget widget._load_request(req) + # Load scripts into widget + if scripts: + widget.load_scripts(scripts) + if is_copy: # This is a copy - mark as unsaved current_tab.original_request = None @@ -971,7 +978,8 @@ class RosterWindow(Adw.ApplicationWindow): request=req, saved_request_id=link_to_saved, project_id=project_id, - selected_environment_id=default_env_id + selected_environment_id=default_env_id, + scripts=scripts ) # If it's a copy, clear the original_request to mark as unsaved