diff --git a/CHANGELOG b/CHANGELOG index 43304c4c..da32d542 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,12 @@ # Change Log +## 2.2.59 08/05/2026 + +* Remove psutil version check +* Fix remaining PyQt6 compatibility issues. Fixes #3822 +* Add --title to remote-viewer console commands. Fixes #3783 +* Fix deleting drawings. Ref #3810 + ## 2.2.58.1 12/04/2026 * Fix callback issues in found in v2.2.58 diff --git a/gns3/crash_report.py b/gns3/crash_report.py index ec27a468..cd74696b 100644 --- a/gns3/crash_report.py +++ b/gns3/crash_report.py @@ -50,7 +50,7 @@ class CrashReport: Report crash to a third party service """ - DSN = "https://af760e2022b321441622330f11dcb650@o19455.ingest.us.sentry.io/38506" + DSN = "https://dd662ce99d7e4a04714a89939ec523c9@o19455.ingest.us.sentry.io/38506" _instance = None def __init__(self): diff --git a/gns3/items/drawing_item.py b/gns3/items/drawing_item.py index 88acbb0b..afd413cb 100644 --- a/gns3/items/drawing_item.py +++ b/gns3/items/drawing_item.py @@ -106,6 +106,11 @@ class DrawingItem: """ if error: + if "doesn't exist" in result.get("message", ""): + log.warning("Drawing not found on server, recreating: {}".format(self._id)) + self._id = None + self.create() + return True log.error("Error while updating drawing: {}".format(result["message"])) return False self.setPos(QtCore.QPointF(result["x"], result["y"])) @@ -214,7 +219,7 @@ class DrawingItem: """ Deletes this drawing. - :param skip_controller: Do not replicate change on the controller (usefull when it's already deleted on controller) + :param skip_controller: Do not replicate change on the controller (useful when it's already deleted on controller) """ self.setDeleting() @@ -222,7 +227,7 @@ class DrawingItem: from ..topology import Topology Topology.instance().removeDrawing(self) if self._id and not skip_controller: - self._project.delete("/drawings/" + self._id, None, body=self.__json__()) + self._project.delete("/drawings/" + self._id, None) def itemChange(self, change, value): diff --git a/gns3/items/text_item.py b/gns3/items/text_item.py index 715646b7..a0d3e9f2 100644 --- a/gns3/items/text_item.py +++ b/gns3/items/text_item.py @@ -132,7 +132,7 @@ class TextItem(QtWidgets.QGraphicsTextItem, DrawingItem): text.set("text-decoration", "underline") text.set("fill", "#" + hex(self.defaultTextColor().rgba())[4:]) text.set("fill-opacity", str(self.defaultTextColor().alphaF())) - text.text = self.toPlainText() + text.text = self.toPlainText() or " " svg = ET.tostring(svg, encoding="utf-8").decode("utf-8") return svg diff --git a/gns3/main.py b/gns3/main.py index db82469a..a59467b0 100644 --- a/gns3/main.py +++ b/gns3/main.py @@ -36,7 +36,6 @@ import time import locale import argparse import signal -import psutil try: from gns3.qt import QtCore, QtWidgets @@ -191,9 +190,6 @@ def main(): if parse_version(QtCore.QT_VERSION_STR) < parse_version("6.3.1"): raise SystemExit("Requirement is PyQt6 version 6.3.1 or higher, got version {}".format(QtCore.QT_VERSION_STR)) - if parse_version(psutil.__version__) < parse_version("2.2.1"): - raise SystemExit("Requirement is psutil version 2.2.1 or higher, got version {}".format(psutil.__version__)) - # check for the correct locale # (UNIX/Linux only) locale_check() diff --git a/gns3/settings.py b/gns3/settings.py index 3bbb66be..941a1179 100644 --- a/gns3/settings.py +++ b/gns3/settings.py @@ -208,7 +208,7 @@ else: 'TightVNC': 'vncviewer {host}:{port}', 'Vinagre': 'vinagre {host}::{port}', 'gvncviewer': 'gvncviewer {host}:{display}', - 'Remote Viewer': 'remote-viewer vnc://{host}:{port}', + 'Remote Viewer': 'remote-viewer --title "({name})" vnc://{host}:{port}', 'KRDC': 'krdc vnc://{host}:{port}' } @@ -219,7 +219,7 @@ else: if sys.platform.startswith("win"): # Windows PRECONFIGURED_SPICE_CONSOLE_COMMANDS = { - 'Remote Viewer': r'"{}\VirtViewer v11.0-256\bin\remote-viewer.exe" spice://{{host}}:{{port}}'.format(program_files), + 'Remote Viewer': r'"{}\VirtViewer v11.0-256\bin\remote-viewer.exe" --title "({{name}})" spice://{{host}}:{{port}}'.format(program_files), } # default Windows SPICE console command @@ -228,7 +228,7 @@ if sys.platform.startswith("win"): elif sys.platform.startswith("darwin"): # Mac OS X PRECONFIGURED_SPICE_CONSOLE_COMMANDS = { - 'Remote Viewer': '/Applications/RemoteViewer.app/Contents/MacOS/RemoteViewer spice://{host}:{port}', + 'Remote Viewer': '/Applications/RemoteViewer.app/Contents/MacOS/RemoteViewer --title "({name})" spice://{host}:{port}', } # default Mac OS X SPICE console command @@ -236,7 +236,7 @@ elif sys.platform.startswith("darwin"): else: PRECONFIGURED_SPICE_CONSOLE_COMMANDS = { - 'Remote Viewer': 'remote-viewer spice://{host}:{port}', + 'Remote Viewer': 'remote-viewer --title "({name})" spice://{host}:{port}', } # default SPICE console command on other systems diff --git a/gns3/version.py b/gns3/version.py index 9ee6a155..cfbcd811 100644 --- a/gns3/version.py +++ b/gns3/version.py @@ -23,8 +23,8 @@ # or negative for a release candidate or beta (after the base version # number has been incremented) -__version__ = "2.2.58.1" -__version_info__ = (2, 2, 58, -99) +__version__ = "2.2.59" +__version_info__ = (2, 2, 59, 0) if "dev" in __version__: try: diff --git a/requirements.txt b/requirements.txt index e2db0da3..bb928bad 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ jsonschema==4.25.1; python_version == '3.9' # version 4.25.1 is the last to support Python 3.9 jsonschema>=4.26.0,<4.27; python_version >= '3.10' -sentry-sdk>=2.52.0,<3 # optional dependency +sentry-sdk>=2.59.0,<3 # optional dependency psutil>=7.2.2 distro>=1.9.0 truststore>=0.10.4; python_version >= '3.10' diff --git a/setup.py b/setup.py index 0f75f49d..cf75ca16 100644 --- a/setup.py +++ b/setup.py @@ -79,7 +79,7 @@ setup( include_package_data=True, package_data={"gns3": ["configs/*.txt", "schemas/*.json"]}, platforms="any", - python_requires=">=3.8", + python_requires=">=3.9", setup_requires=["setuptools>=45.2"], classifiers=[ "Development Status :: 5 - Production/Stable",