From 724eda1f355c2cb83261b668757e2454dc7e4904 Mon Sep 17 00:00:00 2001 From: grossmj Date: Sat, 2 Mar 2019 16:26:40 +0700 Subject: [PATCH 1/2] Handle locking/unlocking items independently from the layer position. --- gns3server/controller/drawing.py | 13 ++++++++++++- gns3server/controller/node.py | 13 ++++++++++++- gns3server/controller/topology.py | 4 ++-- gns3server/schemas/drawing.py | 4 ++++ gns3server/schemas/node.py | 8 ++++++++ tests/controller/test_drawing.py | 2 ++ tests/controller/test_node.py | 2 ++ 7 files changed, 42 insertions(+), 4 deletions(-) diff --git a/gns3server/controller/drawing.py b/gns3server/controller/drawing.py index 58605e6d..4ef324b4 100644 --- a/gns3server/controller/drawing.py +++ b/gns3server/controller/drawing.py @@ -37,7 +37,7 @@ class Drawing: text, images, rectangle... They are pure SVG elements. """ - def __init__(self, project, drawing_id=None, svg="", x=0, y=0, z=2, rotation=0): + def __init__(self, project, drawing_id=None, svg="", x=0, y=0, z=2, locked=False, rotation=0): self._project = project if drawing_id is None: self._id = str(uuid.uuid4()) @@ -49,6 +49,7 @@ class Drawing: self._y = y self._z = z self._rotation = rotation + self._locked = locked @property def id(self): @@ -157,6 +158,14 @@ class Drawing: def z(self, val): self._z = val + @property + def locked(self): + return self._locked + + @locked.setter + def locked(self, val): + self._locked = val + @property def rotation(self): return self._rotation @@ -198,6 +207,7 @@ class Drawing: "x": self._x, "y": self._y, "z": self._z, + "locked": self._locked, "rotation": self._rotation, "svg": self._svg } @@ -207,6 +217,7 @@ class Drawing: "x": self._x, "y": self._y, "z": self._z, + "locked": self._locked, "rotation": self._rotation, "svg": self.svg } diff --git a/gns3server/controller/node.py b/gns3server/controller/node.py index 60e70c01..fb8576a3 100644 --- a/gns3server/controller/node.py +++ b/gns3server/controller/node.py @@ -34,7 +34,7 @@ log = logging.getLogger(__name__) class Node: # This properties are used only on controller and are not forwarded to the compute - CONTROLLER_ONLY_PROPERTIES = ["x", "y", "z", "width", "height", "symbol", "label", "console_host", + CONTROLLER_ONLY_PROPERTIES = ["x", "y", "z", "locked", "width", "height", "symbol", "label", "console_host", "port_name_format", "first_port_name", "port_segment_size", "ports", "category", "console_auto_start"] @@ -74,6 +74,7 @@ class Node: self._x = 0 self._y = 0 self._z = 1 # default z value is 1 + self._locked = False self._ports = None self._symbol = None self._custom_adapters = [] @@ -236,6 +237,14 @@ class Node: def z(self, val): self._z = val + @property + def locked(self): + return self._locked + + @locked.setter + def locked(self, val): + self._locked = val + @property def width(self): return self._width @@ -681,6 +690,7 @@ class Node: "x": self._x, "y": self._y, "z": self._z, + "locked": self._locked, "width": self._width, "height": self._height, "symbol": self._symbol, @@ -708,6 +718,7 @@ class Node: "x": self._x, "y": self._y, "z": self._z, + "locked": self._locked, "width": self._width, "height": self._height, "symbol": self._symbol, diff --git a/gns3server/controller/topology.py b/gns3server/controller/topology.py index 50f150ed..bdde30d9 100644 --- a/gns3server/controller/topology.py +++ b/gns3server/controller/topology.py @@ -160,7 +160,7 @@ def load_topology(path): topo = _convert_2_1_0(topo, path) # Version GNS3 2.2 dev (for project created with 2.2dev). - # Appliance ID has been repleace by Template ID + # Appliance ID has been replaced by Template ID if topo["revision"] == 9: for node in topo.get("topology", {}).get("nodes", []): if "appliance_id" in node: @@ -177,7 +177,7 @@ def load_topology(path): try: with open(path, "w+", encoding="utf-8") as f: json.dump(topo, f, indent=4, sort_keys=True) - except (OSError) as e: + except OSError as e: raise aiohttp.web.HTTPConflict(text="Can't write the topology {}: {}".format(path, str(e))) return topo diff --git a/gns3server/schemas/drawing.py b/gns3server/schemas/drawing.py index b15a5e3c..37f8fd6c 100644 --- a/gns3server/schemas/drawing.py +++ b/gns3server/schemas/drawing.py @@ -47,6 +47,10 @@ DRAWING_OBJECT_SCHEMA = { "description": "Z property", "type": "integer" }, + "locked": { + "description": "Whether the element locked or not", + "type": "boolean" + }, "rotation": { "description": "Rotation of the element", "type": "integer", diff --git a/gns3server/schemas/node.py b/gns3server/schemas/node.py index 55ae1d05..b48372ed 100644 --- a/gns3server/schemas/node.py +++ b/gns3server/schemas/node.py @@ -193,6 +193,10 @@ NODE_OBJECT_SCHEMA = { "description": "Z position of the node", "type": "integer" }, + "locked": { + "description": "Whether the element locked or not", + "type": "boolean" + }, "port_name_format": { "description": "Formating for port name {0} will be replace by port number", "type": "string" @@ -280,6 +284,10 @@ NODE_DUPLICATE_SCHEMA = { "z": { "description": "Z position of the node", "type": "integer" + }, + "locked": { + "description": "Whether the element locked or not", + "type": "boolean" } }, "additionalProperties": False, diff --git a/tests/controller/test_drawing.py b/tests/controller/test_drawing.py index 4a934923..5b5ffbfb 100644 --- a/tests/controller/test_drawing.py +++ b/tests/controller/test_drawing.py @@ -56,6 +56,7 @@ def test_json(project): "x": i.x, "y": i.y, "z": i.z, + "locked": i.locked, "svg": i.svg, "rotation": i.rotation } @@ -65,6 +66,7 @@ def test_json(project): "y": i.y, "z": i.z, "rotation": i.rotation, + "locked": i.locked, "svg": i.svg } diff --git a/tests/controller/test_node.py b/tests/controller/test_node.py index 7ed82881..e72b1db4 100644 --- a/tests/controller/test_node.py +++ b/tests/controller/test_node.py @@ -135,6 +135,7 @@ def test_json(node, compute): "x": node.x, "y": node.y, "z": node.z, + "locked": node.locked, "width": node.width, "height": node.height, "symbol": node.symbol, @@ -167,6 +168,7 @@ def test_json(node, compute): "x": node.x, "y": node.y, "z": node.z, + "locked": node.locked, "width": node.width, "height": node.height, "symbol": node.symbol, From 3f679bd106d1a4ff194c44d9807e227309c98383 Mon Sep 17 00:00:00 2001 From: grossmj Date: Sat, 2 Mar 2019 16:39:05 +0700 Subject: [PATCH 2/2] Locked state should not be used when duplicating a node. --- gns3server/controller/project.py | 1 + gns3server/schemas/node.py | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index a7407a69..f163a92c 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -1070,6 +1070,7 @@ class Project: data['x'] = x data['y'] = y data['z'] = z + data['locked'] = False # duplicated node must not be locked new_node_uuid = str(uuid.uuid4()) new_node = await self.add_node( node.compute, diff --git a/gns3server/schemas/node.py b/gns3server/schemas/node.py index b48372ed..5d3cc11a 100644 --- a/gns3server/schemas/node.py +++ b/gns3server/schemas/node.py @@ -284,10 +284,6 @@ NODE_DUPLICATE_SCHEMA = { "z": { "description": "Z position of the node", "type": "integer" - }, - "locked": { - "description": "Whether the element locked or not", - "type": "boolean" } }, "additionalProperties": False,