diff --git a/src/mapfile.py b/src/mapfile.py index 5e2e3077f13888ea23056acc55acb69fcd79e982..1b6c356a947ad76538ea6bb9ace33d61733153f0 100644 --- a/src/mapfile.py +++ b/src/mapfile.py @@ -51,8 +51,11 @@ class MetadataMixin(object): def get_store_connection_string(info): cparam = info["connectionParameters"] if cparam.get("dbtype", "") == "postgis": - return "PG:dbname=%s port=%s host=%s user=%s password=%s" % ( - cparam["database"], cparam["port"], cparam["host"], cparam["user"], cparam["password"]) + # First mandatory + url = "PG:dbname=%s port=%s host=%s " % (cparam["database"], cparam["port"], cparam["host"]) + # Then optionals: + url += " ".join("%s=%s" % (p, cparam[p]) for p in ["user", "password"] if p in cparam) + return url elif "url" in cparam: url = urlparse.urlparse(cparam["url"]) if url.scheme != "file" or url.netloc: @@ -142,8 +145,6 @@ class Layer(MetadataMixin): # Mostly because we haven't got the proper declarations, we fallback to # an html parser, which luckily is much more forgiving. from xml.dom.minidom import parseString - - print "SLD:\n\n%s\n" % new_sld xmlsld = parseString(new_sld) try: @@ -166,7 +167,29 @@ class Layer(MetadataMixin): mf.ms.removeLayer(ms_template_layer.index) - def set_default_style(self, mf, s_name): + def set_default_style(self, mf): + + if self.ms.type == mapscript.MS_LAYER_POINT: + self.ms.tolerance = 8 + self.ms.toleranceunits = 6 + s_name = 'default_point' + elif self.ms.type == mapscript.MS_LAYER_LINE: + self.ms.tolerance = 8 + self.ms.toleranceunits = 6 + s_name = 'default_line' + elif self.ms.type == mapscript.MS_LAYER_POLYGON: + self.ms.tolerance = 0 + self.ms.toleranceunits = 6 + s_name = 'default_polygon' + else: + return + + try: + style = open(os.path.join(os.path.dirname(__file__), "%s.sld" % s_name)).read() + except IOError, OSError: + return + + self.add_style_sld(mf, s_name, style) self.ms.classgroup = s_name def remove_style(self, s_name): @@ -302,8 +325,7 @@ class FeatureTypeModel(LayerModel): cparam = info["connectionParameters"] if cparam.get("dbtype", None) in ["postgis", "postgres", "postgresql"]: self.ms.connectiontype = mapscript.MS_POSTGIS - self.ms.connection = "dbname=%s port=%s host=%s user=%s password=%s" % ( - cparam["database"], cparam["port"], cparam["host"], cparam["user"], cparam["password"]) + self.ms.connection = get_store_connection_string(info) self.ms.data = "%s FROM %s" % (ds[ft_name].get_geometry_column(), ft_name) self.set_metadata("ows_extent", "%s %s %s %s" % (ft.get_extent().minX(), ft.get_extent().minY(), @@ -920,29 +942,11 @@ class Mapfile(MetadataMixin): model.configure_layer(ws, layer, l_enabled) - if layer.ms.type == mapscript.MS_LAYER_POINT: - layer.ms.tolerance = 8 - layer.ms.toleranceunits = 6 - s_name = 'default_point' - elif layer.ms.type == mapscript.MS_LAYER_LINE: - layer.ms.tolerance = 8 - layer.ms.toleranceunits = 6 - s_name = 'default_line' - elif layer.ms.type == mapscript.MS_LAYER_POLYGON: - layer.ms.tolerance = 0 - layer.ms.toleranceunits = 6 - s_name = 'default_polygon' - - try: - style = open(os.path.join(os.path.dirname(__file__), "%s.sld" % s_name)).read() - except IOError, OSError: - raise IOError, OSError - - layer.add_style_sld(self, s_name, style) - layer.set_default_style(self, s_name) + layer.set_default_style(self) def delete_layer(self, l_name): layer = self.get_layer(l_name) + self.ms.removeLayer(layer.ms.index) # Layergroups diff --git a/src/server.py b/src/server.py index eea80095ff61cae6c1ec612cc236467f188c206c..9b3dbe5658673aee4e24f4e035ffa275ccd7557e 100755 --- a/src/server.py +++ b/src/server.py @@ -186,23 +186,9 @@ class datastore(object): with webapp.mightNotFound("dataStore", workspace=ws_name): info = ws.get_datastore_info(ds_name) + print "DS info:", info connectionParameters = info["connectionParameters"] - entries = {} - if "url" in connectionParameters: - entries["url"] = connectionParameters["url"] - elif "dbtype" in connectionParameters: - entries["dbtype"] = connectionParameters["dbtype"] - entries["database"] = connectionParameters["database"] - entries["host"] = connectionParameters["host"] - entries["port"] = connectionParameters["port"] - entries["user"] = connectionParameters["user"] - entries["password"] = connectionParameters["password"] - else: - raise webapp.NotImplemented() - - entries["namespace"] = None # TODO - return {"dataStore": { "name": info["name"], "enabled": True, # TODO @@ -215,7 +201,7 @@ class datastore(object): "featureTypes": href("%s/maps/%s/workspaces/%s/datastores/%s/featuretypes.%s" % ( web.ctx.home, map_name, ws.name, ds_name, format) ), - "connectionParameters": Entries(entries, tag_name="entry") + "connectionParameters": Entries(connectionParameters, tag_name="entry") } } @@ -227,6 +213,8 @@ class datastore(object): if ds_name != data.pop("name"): raise webapp.Forbidden("Can't change the name of a data store.") + print "Updating with: %s" % data + with webapp.mightNotFound("dataStore", workspace=ws_name): ws.update_datastore(ds_name, data) ws.save() diff --git a/src/stores.py b/src/stores.py index 4dffa892b22f19d2a9503a4108c1b81631b759f5..5a6d8f1e0a75f888956609f424b2256559b2f503 100644 --- a/src/stores.py +++ b/src/stores.py @@ -308,7 +308,6 @@ class Datastore(object): The first argument to __init__ can also directly be a gdal/ogr object. """ - self.backend = path if isinstance(path, ogr.DataSource) else ogr.Open(path) if self.backend == None: raise ValueError("Datastore backend could not be opened using '%s'." % path)