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,