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,