diff --git a/src/mra.py b/src/mra.py index ecddeeaf08def775d6f903b0c551d8990634942a..5101f7fffdf4f65b0b830ac4438b6f933ea08fc9 100644 --- a/src/mra.py +++ b/src/mra.py @@ -824,23 +824,23 @@ class Workspace(Mapfile): # Coverages - def iter_coveragemodels(self, ds_name=None, **kwargs): - return self.iter_layermodels("coverage", ds_name, **kwargs) + def iter_coveragemodels(self, cs_name=None, **kwargs): + return self.iter_layermodels("coverage", cs_name, **kwargs) - def get_coveragemodel(self, ds_name, ft_name): - return self.get_layermodel("coverage", ds_name, ft_name) + def get_coveragemodel(self, cs_name, c_name): + return self.get_layermodel("coverage", cs_name, c_name) - def has_coveragemodel(self, ds_name, ft_name): - return self.has_layermodel("coverage", ds_name, ft_name) + def has_coveragemodel(self, cs_name, c_name): + return self.has_layermodel("coverage", cs_name, c_name) - def create_coveragemodel(self, ds_name, ft_name, metadata={}): - return self.create_layermodel("coverage", ds_name, ft_name, metadata) + def create_coveragemodel(self, cs_name, c_name, metadata={}): + return self.create_layermodel("coverage", cs_name, c_name, metadata) - def update_coveragemodel(self, ds_name, ft_name, metadata={}): - return self.update_layermodel("coverage", ds_name, ft_name, metadata={}) + def update_coveragemodel(self, cs_name, c_name, metadata={}): + return self.update_layermodel("coverage", cs_name, c_name, metadata={}) - def delete_coveragemodel(self, ds_name, ft_name): - return self.delete_layermodel("coverage", ds_name, ft_name) + def delete_coveragemodel(self, cs_name, c_name): + return self.delete_layermodel("coverage", cs_name, c_name) # Finaly the global context: @@ -952,7 +952,7 @@ class MRA(object): raise KeyError(name) def delete_style(self, name): - path = self.get_style_path(s_name) + path = self.get_style_path(name) try: os.remove(path) except (OSError, IOError): diff --git a/src/server.py b/src/server.py index 5197a20075e237d69fbe707f57d5938b3339b0af..b1f04e5a98aabd9d936c73a97949163025d60700 100755 --- a/src/server.py +++ b/src/server.py @@ -27,7 +27,6 @@ """ URL mapping infrastructure and HTTP methods used by the REST API. - MRA is following the model: <container> --- <element>. """ @@ -144,6 +143,9 @@ class workspace(object): }) } + # TODO: def PUT(... + # TODO: def DELETE(... + class datastores(object): """Data stores container. @@ -503,7 +505,9 @@ class coveragestore(object): """Modify coverage store <ds>.""" ws = get_workspace(ws_name) - data = get_data(name="coverageStore", mandatory=["name"], authorized=["name", "title", "abstract", "connectionParameters"]) + data = get_data(name="coverageStore", + mandatory=["name"], + authorized=["name", "title", "abstract", "connectionParameters"]) if cs_name != data.pop("name"): raise webapp.Forbidden("Can't change the name of a coverage store.") @@ -513,12 +517,12 @@ class coveragestore(object): @HTTPCompatible() def DELETE(self, ws_name, cs_name, format): - """Delete coverage store <ds>.""" + """Delete coverage store <cs>.""" ws = get_workspace(ws_name) # TODO: check, this is not consistent between ds/cs. # We need to check if this datastore is empty. - assert_is_empty(ws.iter_coverages(cs_name=cs_name), "coveragestore", ds_name) + assert_is_empty(ws.iter_coveragemodels(cs_name=cs_name), "coveragestore", cs_name) with webapp.mightNotFound("coverageStore", workspace=ws_name): ws.delete_coveragestore(cs_name) @@ -555,6 +559,13 @@ class coverages(object): ws.create_coveragemodel(data["name"], cs_name, data) ws.save() + # Then creates the associated layer by default: + model = ws.get_coveragemodel(cs_name, data["name"]) + mf = mra.get_available() + with webapp.mightConflict(): + mf.create_layer(model, data["name"], True) + mf.save() + webapp.Created("%s/workspaces/%s/coveragestores/%s/coverages/%s.%s" % ( web.ctx.home, ws.name, cs_name, data["name"], format)) @@ -659,7 +670,7 @@ class coverage(object): # We need to check if there are any layers using this. mf = mra.get_available() assert_is_empty(mf.iter_layers(mra={"name":c_name, "workspace":ws_name, "storage":cs_name, - "type":"coverage"}), "coverage", ft_name) + "type":"coverage"}), "coverage", c_name) with webapp.mightNotFound("coverage", coveragestore=cs_name): ws.delete_coveragemodel(c_name, cs_name) @@ -700,7 +711,7 @@ class files(object): # Create the store if it seems legit and it does not exist. if st_type == "datastores" or st_type == "coveragestores": st_type = st_type[:-1] # Remove trailing 's' - with webapp.mightConflict("dataStore", workspace=ws_name): + with webapp.mightConflict("Workspace", workspace=ws_name): ws.create_store(st_type, st_name, {}) # Finaly check if its OK now. with webapp.mightNotFound(message="Store {exception} does not exist " @@ -823,7 +834,7 @@ class style(object): def GET(self, s_name, format): """Return style <s>.""" - with webapp.mightNotFound(): + with webapp.mightNotFound(message="Style \"%s\" does not exist." % s_name): style = mra.get_style(s_name) if format == "sld": @@ -840,19 +851,13 @@ class style(object): def PUT(self, s_name, format): """Modify style <s>.""" - #TODO: Also update layers using this style. - with webapp.mightNotFound(): + # TODO: Also update layers using this style. + with webapp.mightNotFound(message="Style \"%s\" does not exist." % s_name): mra.delete_style(s_name) data = web.data() mra.create_style(s_name, data) - @HTTPCompatible() - def DELETE(self, s_name, format): - """Delete style <s>.""" - - #TODO: Maybe check for layers using this style? - with webapp.mightNotFound(): - mra.delete_style(s_name) + # TODO: def DELETE(... class layers(object): """Layers container. @@ -939,38 +944,42 @@ class layer(object): "coverage": ("coverage", "coveragestore") }[layer.get_mra_metadata("type")] - # Check CLASSGROUP - dflt_style = layer.ms.classgroup - if dflt_style == None: - # If is 'None': take the first style as would MapServer. - for s_name in layer.iter_styles(): - dflt_style = s_name - break - - return {"layer" : { + response = {"layer": { "name": l_name, "type": layer.get_type_name(), - "defaultStyle": { - "name": dflt_style, - "href": "%s/styles/%s.%s" % (web.ctx.home, dflt_style, format), - }, - "styles": [{ - # TODO: Add attr class="linked-hash-set" - "name": s_name, - "href": "%s/styles/%s.%s" % (web.ctx.home, s_name, format), - } for s_name in layer.iter_styles() if s_name != dflt_style], "resource": { # TODO: Add attr class="featureType|coverage" "name": layer.get_mra_metadata("name"), "href": "%s/workspaces/%s/%ss/%s/%ss/%s.%s" % ( web.ctx.home, layer.get_mra_metadata("workspace"), - store_type, layer.get_mra_metadata("storage"), data_type, layer.get_mra_metadata("name"), format), + store_type, layer.get_mra_metadata("storage"), + data_type, layer.get_mra_metadata("name"), format), }, "enabled": bool(layer.ms.status), # TODO because it's fictitious... # "attribution" => TODO? # "path" => TODO? - } - } + }} + + # Check CLASSGROUP + dflt_style = layer.ms.classgroup + if dflt_style == None: + # If is 'None': take the first style as would MapServer. + for s_name in layer.iter_styles(): + dflt_style = s_name + break + if dflt_style == None: + return response + + response.update({"defaultStyle": {"name": dflt_style, + "href": "%s/styles/%s.%s" % (web.ctx.home, dflt_style, format)},}) + + styles = [{"name": s_name, + "href": "%s/styles/%s.%s" % (web.ctx.home, s_name, format), + } for s_name in layer.iter_styles() if s_name != dflt_style] + if not styles: + return response + + return response.update({"styles": styles}) @HTTPCompatible() def PUT(self, l_name, format): @@ -1087,6 +1096,9 @@ class layerfields(object): with webapp.mightNotFound(): layer = mf.get_layer(l_name) + if layer.get_type_name() == "RASTER": + return {"fields": []} + fields = [{ "name": layer.get_metadata("gml_%s_alias" % field, None), "type": layer.get_metadata("gml_%s_type" % field, None),