def publishLayer(self, layer, fields=None): if layer.type() == layer.VectorLayer: if layer.featureCount() == 0: self.logError( "Layer contains zero features and cannot be published") return if layer.dataProvider().name( ) == "postgres" and self.useOriginalDataSource: from .postgis import PostgisServer uri = QgsDataSourceUri(layer.source()) db = PostgisServer("temp", uri.authConfigId(), uri.host(), uri.port(), uri.schema(), uri.database()) self._publishVectorLayerFromPostgis(layer, db) elif self.storage in [ self.FILE_BASED, self.POSTGIS_MANAGED_BY_GEOSERVER ]: if layer.source() not in self._exportedLayers: if self.storage == self.POSTGIS_MANAGED_BY_GEOSERVER: path = exportLayer(layer, fields, toShapefile=True, force=True, log=self) basename = os.path.splitext(path)[0] zipfilename = basename + ".zip" with ZipFile(zipfilename, 'w') as z: for ext in [".shp", ".shx", ".prj", ".dbf"]: filetozip = basename + ext z.write(filetozip, arcname=os.path.basename(filetozip)) self._exportedLayers[layer.source()] = zipfilename else: path = exportLayer(layer, fields, log=self) self._exportedLayers[layer.source()] = path filename = self._exportedLayers[layer.source()] if self.storage == self.FILE_BASED: self._publishVectorLayerFromFile(layer, filename) else: self._publishVectorLayerFromFileToPostgis(layer, filename) elif self.storage == self.POSTGIS_MANAGED_BY_BRIDGE: try: from .servers import allServers db = allServers()[self.postgisdb] except KeyError: raise Exception( QCoreApplication.translate( "GeocatBridge", "Cannot find the selected PostGIS database")) db.importLayer(layer, fields) self._publishVectorLayerFromPostgis(layer, db) elif layer.type() == layer.RasterLayer: if layer.source() not in self._exportedLayers: path = exportLayer(layer, fields, log=self) self._exportedLayers[layer.source()] = path filename = self._exportedLayers[layer.source()] self._publishRasterLayer(filename, layer.name()) self._clearCache()
def fromOtherLayerUri(uri: QgsDataSourceUri): histoEventUri = QgsDataSourceUri() histoEventUri.setConnection(uri.host(), uri.port(), uri.database(), uri.username(), uri.password(), uri.sslMode(), uri.authConfigId()) histoEventUri.setDataSource(uri.schema(), "histo_event", None, None, "id") return HistoEvent(histoEventUri)
def addConnectionConfig(cls, conn_name, uri): """Necessary to allow db_manager to have the list of connections get from settings.""" uri = QgsDataSourceUri(uri) settings = QgsSettings() baseKey = "/PostgreSQL/connections/" baseKey += conn_name settings.setValue(baseKey + "/service", uri.service()) settings.setValue(baseKey + "/host", uri.host()) settings.setValue(baseKey + "/port", uri.port()) settings.setValue(baseKey + "/database", uri.database()) if uri.username(): settings.setValue(baseKey + "/username", uri.username()) if uri.password(): settings.setValue(baseKey + "/password", uri.password()) if uri.authConfigId(): settings.setValue(baseKey + "/authcfg", uri.authConfigId()) if uri.sslMode(): settings.setValue(baseKey + "/sslmode", uri.sslMode())
def publishLayer(self, layer, fields=None): lyr_title, safe_name = lyr_utils.getLayerTitleAndName(layer) if layer.type() == layer.VectorLayer: if layer.featureCount() == 0: self.logError(f"Layer '{lyr_title}' contains zero features and cannot be published") return if layer.dataProvider().name() == "postgres" and self.useOriginalDataSource: try: from geocatbridge.servers.models.postgis import PostgisServer except (ImportError, ModuleNotFoundError): raise Exception(self.translate(getAppName(), "Cannot find or import PostgisServer class")) else: uri = QgsDataSourceUri(layer.source()) db = PostgisServer( "temp", uri.authConfigId(), uri.host(), uri.port(), uri.schema(), uri.database()) self._publishVectorLayerFromPostgis(layer, db) elif self.storage != GeoserverStorage.POSTGIS_BRIDGE: src_path, src_name, src_ext = lyr_utils.getLayerSourceInfo(layer) filename = self._exported_layers.get(src_path) if not filename: if self.storage == GeoserverStorage.POSTGIS_GEOSERVER: shp_name = exportLayer(layer, fields, to_shapefile=True, force=True, logger=self) basename = os.path.splitext(shp_name)[0] filename = basename + ".zip" with ZipFile(filename, 'w') as z: for ext in (".shp", ".shx", ".prj", ".dbf"): filetozip = basename + ext z.write(filetozip, arcname=os.path.basename(filetozip)) else: filename = exportLayer(layer, fields, logger=self) self._exported_layers[src_path] = filename if self.storage == GeoserverStorage.FILE_BASED: self._publishVectorLayerFromFile(layer, filename) else: self._publishVectorLayerFromFileToPostgis(layer, filename) elif self.storage == GeoserverStorage.POSTGIS_BRIDGE: db = manager.getServer(self.postgisdb) if not db: raise Exception(self.translate(getAppName(), "Cannot find the selected PostGIS database")) db.importLayer(layer, fields) self._publishVectorLayerFromPostgis(layer, db) elif layer.type() == layer.RasterLayer: if layer.source() not in self._exported_layers: path = exportLayer(layer, fields, logger=self) self._exported_layers[layer.source()] = path filename = self._exported_layers[layer.source()] self._publishRasterLayer(filename, safe_name) self._clearCache()