From 39ce822235b7b1c1ec7110379d200333bc2cad1e Mon Sep 17 00:00:00 2001 From: Wannes Rombouts <wapiflapi@yahoo.fr> Date: Tue, 4 Jun 2013 14:50:33 +0200 Subject: [PATCH] Added checks to not delete stuff that is beeing used. --- src/server.py | 24 ++++++++++++++++++++++++ src/tools.py | 10 +++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/server.py b/src/server.py index 965ea15..ae95b9d 100755 --- a/src/server.py +++ b/src/server.py @@ -188,6 +188,9 @@ class datastore(object): def DELETE(self, map_name, ws_name, ds_name, format): mf, ws = get_mapfile_workspace(map_name, ws_name) + # We need to check if this datatore is empty. + assert_is_empty(ws.iter_featuretypes(ds_name=ds_name), "datastore", ds_name) + with webapp.mightNotFound("dataStore", workspace=ws_name): ws.delete_datastore(ds_name) ws.save() @@ -292,6 +295,10 @@ class featuretype(object): def DELETE(self, map_name, ws_name, ds_name, ft_name, format): mf, ws = get_mapfile_workspace(map_name, ws_name) + # We need to check if there are any layers using this. + assert_is_empty(mg.iter_layers(mra={"name":ft_name, "workspace":ws_name, "storage":ds_name, "type":"featuretype"}), + "featuretype", ft_name) + with webapp.mightNotFound("featureType", datastore=ds_name): ws.delete_featuretype(ft_name, ds_name) ws.save() @@ -349,6 +356,10 @@ class coveragestore(object): def DELETE(self, map_name, ws_name, cs_name, format): mf, ws = get_mapfile_workspace(map_name, ws_name) + + # We need to check if this datatore is empty. + assert_is_empty(ws.iter_coverages(cs_name=cs_name), "coveragestore", ds_name) + with webapp.mightNotFound("coverageStore", workspace=ws_name): ws.delete_coveragestore(cs_name) ws.save() @@ -442,6 +453,10 @@ class coverage(object): def DELETE(self, map_name, ws_name, cs_name, c_name, format): mf, ws = get_mapfile_workspace(map_name, ws_name) + # We need to check if there are any layers using this. + assert_is_empty(mg.iter_layers(mra={"name":c_name, "workspace":ws_name, "storage":cs_name, "type":"coverage"}), + "coverage", ft_name) + with webapp.mightNotFound("coverage", coveragestore=cs_name): ws.delete_coverage(c_name, cs_name) ws.save() @@ -582,6 +597,15 @@ class style(object): def DELETE(self, map_name, s_name, format): + mf = get_mapfile(map_name) + + # OK check any(class.group == s_name for class in layer.iter_classes) + layers_using = [layer.ms.name for layer in mf.iter_layers() + if any(clazz.ms.group == s_name for clazz in layer.iter_classes())] + + if layers_using: + raise webapp.Forbidden(message="Can't remove style '%s' because it is beeing used by the folowing layers: %s." + % (s_name, layers_using)) path = tools.get_style_path(s_name) try: diff --git a/src/tools.py b/src/tools.py index 9751995..636debf 100644 --- a/src/tools.py +++ b/src/tools.py @@ -67,6 +67,15 @@ def get_mapfile_workspace(mf_name, ws_name): ws = mf.get_workspace(ws_name) return mf, ws +def assert_is_empty(generator, tname, iname): + try: + next(generator) + except StopIteration: + pass # Everything is ok. + else: + raise webapp.Forbidden(message="Can't remove '%s' because it is an non-empty %s." % (iname, tname)) + + def href(url): return pyxml.Entries({'href': url}) @@ -148,4 +157,3 @@ def is_hidden(path): return os.path.basename(path).startswith(".") - -- GitLab