From 29cfe0ab25a427571fc060d5e49ec8ab4f209fbb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ma=C3=ABl=20M=C3=A9liani?= <m.meliani@neogeo-online.net>
Date: Mon, 14 Oct 2013 18:13:32 +0200
Subject: [PATCH] Fixed bugs about OWS activation for the main mapfile
 (layers.map)...

---
 src/mra.py    | 50 ++++++++++++++++++++-------------------
 src/server.py | 65 ++++++++++++++-------------------------------------
 2 files changed, 43 insertions(+), 72 deletions(-)

diff --git a/src/mra.py b/src/mra.py
index c11b00f..7be7789 100644
--- a/src/mra.py
+++ b/src/mra.py
@@ -76,9 +76,11 @@ class Layer(MetadataMixin):
         self.update_metadatas(metadata)
 
     def enable(self, enabled=True):
-        requests = ["GetCapabilities", "GetMap", "GetFeatureInfo", "GetLegendGraphic"]
         self.ms.status = mapscript.MS_ON if enabled else mapscript.MS_OFF
-        self.set_metadata("wms_enable_request", " ".join(("%s" if enabled else "!%s") % c for c in requests))
+
+        # TODO: later...
+        # requests = ["GetCapabilities", "GetMap", "GetFeatureInfo", "GetLegendGraphic"]
+        # self.set_metadata("wms_enable_request", " ".join(("%s" if enabled else "!%s") % c for c in requests))
 
     def get_type_name(self):
         return {
@@ -284,15 +286,16 @@ class Mapfile(MetadataMixin):
 
         if create:
             self.ms = mapscript.mapObj()
+            # and adding some default values...
+            self.ms.name = self.name
+            self.ms.setProjection("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
+            self.ms.setExtent(-180,-90,180,90)
+            self.ms.units = mapscript.MS_DD
+            for ows in ("wms", "wfs", "wcs"):
+                self.set_metadata("%s_enable_request" % ows, "")
         else:
             self.ms = mapscript.mapObj(self.path)
 
-        # adding some default values...
-        self.ms.name = self.name
-        self.ms.setProjection("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
-        self.ms.setExtent(-180,-90,180,90)
-        self.ms.units = mapscript.MS_DD
-
     def save(self, path=None):
         self.ms.save(path or self.path)
 
@@ -444,9 +447,9 @@ class FeatureTypeModel(LayerModel):
             connection += " ".join("%s=%s" % (p, cparam[p]) for p in ["user", "password"] if p in cparam)
             self.ms.connection = connection
             self.ms.data = "%s FROM %s.%s" % (ds[ft_name].get_geometry_column(), cparam["schema"], ft_name)
-            self.set_metadata("ows_extent", "%s %s %s %s" %
-                (ft.get_extent().minX(), ft.get_extent().minY(),
-                ft.get_extent().maxX(), ft.get_extent().maxY()))
+            # self.set_metadata("ows_extent", "%s %s %s %s" %
+            #     (ft.get_extent().minX(), ft.get_extent().minY(),
+            #     ft.get_extent().maxX(), ft.get_extent().maxY()))
         #elif cpram["dbtype"] in ["shp", "shapefile"]:
         # TODO: clean up this fallback.
         else:
@@ -455,10 +458,10 @@ class FeatureTypeModel(LayerModel):
             self.ms.data = self.ws.mra.get_file_path(url.path)
 
         # Deactivate wms and wfs requests, because we are a virtual layer.
-        self.set_metadatas({
-            "wms_enable_request": "!GetCapabilities !GetMap !GetFeatureInfo !GetLegendGraphic",
-            "wfs_enable_request": "!GetCapabilities !DescribeFeatureType !GetFeature",
-            })
+        # self.set_metadatas({
+        #     "wms_enable_request": "!GetCapabilities !GetMap !GetFeatureInfo !GetLegendGraphic",
+        #     "wfs_enable_request": "!GetCapabilities !DescribeFeatureType !GetFeature",
+        #     })
 
         # Update mra metadata, and make sure the mandatory ones are left untouched.
         self.update_mra_metadatas(metadata)
@@ -492,9 +495,8 @@ class FeatureTypeModel(LayerModel):
                 "wfs_abstract": layer.get_metadata("wms_abstract"),
                 })
 
-        if enabled:
-            layer.set_metadata("wfs_enable_request",
-                               "GetCapabilities DescribeFeatureType GetFeature")
+        # if enabled:
+        #     layer.set_metadata("wfs_enable_request", "GetCapabilities DescribeFeatureType GetFeature")
 
         # Configure the layer based on information from the store.
         ds = ws.get_datastore(self.get_mra_metadata("storage"))
@@ -561,10 +563,10 @@ class CoverageModel(LayerModel):
         #    raise ValueError("Unhandled type \"%s\"." % cparam["dbtype"])
 
         # Deactivate wms and wcs requests, because we are a virtual layer.
-        self.set_metadatas({
-            "wms_enable_request": "!GetCapabilities !GetMap !GetFeatureInfo !GetLegendGraphic",
-            "wcs_enable_request": "!GetCapabilities !DescribeCoverage !GetCoverage",
-            })
+        # self.set_metadatas({
+        #     "wms_enable_request": "!GetCapabilities !GetMap !GetFeatureInfo !GetLegendGraphic",
+        #     "wcs_enable_request": "!GetCapabilities !DescribeCoverage !GetCoverage",
+        #     })
 
         # Update mra metadatas, and make sure the mandatory ones are left untouched.
         self.update_mra_metadatas(metadata)
@@ -601,8 +603,8 @@ class CoverageModel(LayerModel):
                 "wcs_description": layer.get_metadata("wms_abstract")
                 })
 
-        if enabled:
-            layer.set_metadata("wcs_enable_request", "GetCapabilities DescribeCoverage GetCoverage")
+        # if enabled:
+        #     layer.set_metadata("wcs_enable_request", "GetCapabilities DescribeCoverage GetCoverage")
 
         plugins.extend("post_configure_raster_layer", self, ws, layer)
 
diff --git a/src/server.py b/src/server.py
index b1bec29..0bb34b4 100755
--- a/src/server.py
+++ b/src/server.py
@@ -64,6 +64,9 @@ class index(object):
             "styles": href("styles/"),
             "layers": href("layers/"),
             "layergroups": href("layergroups/"),
+            "services/wms/settings": href("services/wms/settings"),
+            "services/wcs/settings": href("services/wcs/settings"),
+            "services/wfs/settings": href("services/wfs/settings")
             }
 
 class workspaces(object):
@@ -1136,72 +1139,39 @@ class layergroup(object):
 
 
 class OWSGlobalSettings(object):
+    """Control settings of the main OWS service, i.e. the mapfile: layers.map
 
+    http://hostname/mra/services/[wms|wfs|wcs]/settings<lg>
+
+    """
     @HTTPCompatible()
     def GET(self, ows, format):
+        """It returns the status of the OGC service."""
+
         mf = mra.get_available()
-        try:
-            if mf.get_metadata("%s_enable_request" % ows) == "*":
-                is_enabled = True
-        except:
-            is_enabled = False
 
         return {
-            ows: {
-                "enabled": is_enabled,
+            ows: Entries({
+                "enabled": mf.get_metadata("%s_enable_request" % ows) == "*" and True or False,
                 "name": ows,
                 "schemaBaseURL": mf.get_metadata("ows_schemas_location", "http://schemas.opengis.net"),
                 }
-            }
+            )}
 
     @HTTPCompatible()
     def PUT(self, ows, format):
+        """To enable or disable OGC service..."""
+
         mf = mra.get_available()
         data = get_data(name=ows, mandatory=["enabled"], authorized=["enabled"])
         is_enabled = data.pop("enabled")
-        values = {True: "*", "true": "*", False: "", "false": ""}
+        # TODO: That would be cool to be able to control each operation...
+        values = {True: "*", "True": "*", "true": "*", False: "", "False": "", "false": ""}
         if is_enabled not in values:
-            raise KeyError("'%s' is not valid" % is_enabled)
+            raise KeyError("\"%s\" is not valid" % is_enabled)
         mf.set_metadata("%s_enable_request" % ows, values[is_enabled])
         mf.save()
 
-
-class OWSSettings(object):
-
-    @HTTPCompatible()
-    def GET(self, ows, ws_name, format):
-        ws = get_workspace(ws_name)
-        try:
-            if ws.get_metadata("%s_enable_request" % ows) == "*":
-                is_enabled = True
-        except:
-            is_enabled = False
-
-        return {
-            ows: {
-                "enabled": is_enabled,
-                "name": ows,
-                "schemaBaseURL": ws.get_metadata("ows_schemas_location", "http://schemas.opengis.net"),
-                }
-            }
-
-    @HTTPCompatible()
-    def PUT(self, ows, ws_name, format):
-        ws = get_workspace(ws_name)
-        data = get_data(name=ows, mandatory=["enabled"], authorized=["enabled"])
-        is_enabled = data.pop("enabled")
-        values = {True: "*", "true": "*", False: "", "false": ""}
-        if is_enabled not in values:
-            raise KeyError("'%s' is not valid" % is_enabled)
-        ws.set_metadata("%s_enable_request" % ows, values[is_enabled])
-        ws.save()
-
-    @HTTPCompatible()
-    def DELETE(self, ows, ws_name, format):
-        ws = get_workspace(ws_name)
-        ws.set_metadata("%s_enable_request" % ows, "")
-        ws.save()
-
 # Index:
 urlmap(index, "")
 # Workspaces:
@@ -1235,7 +1205,6 @@ urlmap(layergroups, "layergroups")
 urlmap(layergroup, "layergroups", ())
 # OGC Web Services:
 urlmap(OWSGlobalSettings, "services", "(wms|wfs|wcs)", "settings")
-urlmap(OWSSettings, "services", "(wms|wfs|wcs)", (), "settings")
 
 urls = tuple(urlmap)
 
-- 
GitLab