def getPublishTask(self, parent): self.storeMetadata() self.storeFieldsToPublish() toPublish = self._toPublish() if self.tabOnOffline.currentIndex() == 0: if self.comboGeodataServer.currentIndex() != 0: geodataServer = geodataServers()[ self.comboGeodataServer.currentText()] else: geodataServer = None if self.comboMetadataServer.currentIndex() != 0: metadataServer = metadataServers()[ self.comboMetadataServer.currentText()] else: metadataServer = None onlySymbology = self.chkOnlySymbology.checkState() == Qt.Checked return PublishTask(toPublish, self.fieldsToPublish, onlySymbology, geodataServer, metadataServer, parent) else: return ExportTask(self.txtExportFolder.text(), toPublish, self.fieldsToPublish, self.chkExportData.isChecked(), self.chkExportMetadata.isChecked(), self.chkExportSymbology.isChecked())
def validateBeforePublication(self, to_publish): names = [] errors = set() for i in range(self.listLayers.count()): item = self.listLayers.item(i) widget = self.listLayers.itemWidget(item) if widget.checked(): name = widget.name() for c in "?&=#": if c in name: errors.add("Unsupported character in layer name: " + c) if name in names: errors.add("Several layers with the same name") names.append(name) if self.comboGeodataServer.currentIndex() != 0: geodata_server = geodataServers()[ self.comboGeodataServer.currentText()] geodata_server.validateGeodataBeforePublication( errors, to_publish, self.chkOnlySymbology.checkState() == Qt.Checked) if self.comboMetadataServer.currentIndex() != 0: metadata_server = metadataServers()[ self.comboMetadataServer.currentText()] metadata_server.validateMetadataBeforePublication(errors) if errors: html = f"<p><b>Cannot publish data.</b></p>" issues = "".join(f"<li>{e}</li>" for e in errors) if issues: html += f"<p>The following issues were found:<ul>{issues}</ul></p>" self.showHtmlMessage("Publish", html) return False else: return True
def validateBeforePublication(self, toPublish): names = [] errors = set() for i in range(self.listLayers.count()): item = self.listLayers.item(i) widget = self.listLayers.itemWidget(item) if widget.checked(): name = widget.name() for c in "?&=#": if c in name: errors.add("Unsupported character in layer name: " + c) if name in names: errors.add("Several layers with the same name") names.append(name) if self.comboGeodataServer.currentIndex() != 0: geodataServer = geodataServers()[ self.comboGeodataServer.currentText()] geodataServer.validateGeodataBeforePublication(errors, toPublish) if self.comboMetadataServer.currentIndex() != 0: metadataServer = metadataServers()[ self.comboMetadataServer.currentText()] metadataServer.validateMetadataBeforePublication(errors) if errors: txt = '''<p><b>Cannot publish data.</b></p> <p>The following issues were found:<p><ul><li>%s</li></ul> ''' % "</li><li>".join(errors) dlg = QgsMessageOutput.createMessageOutput() dlg.setTitle("Publish") dlg.setMessage(txt, QgsMessageOutput.MessageHtml) dlg.showMessage() return False else: return True
def getPublishTask(self, parent): if self.comboGeodataServer.currentIndex() != 0: geodataServer = geodataServers()[ self.comboGeodataServer.currentText()] else: geodataServer = None if self.comboMetadataServer.currentIndex() != 0: metadataServer = metadataServers()[ self.comboMetadataServer.currentText()] else: metadataServer = None self.storeMetadata() self.storeFieldsToPublish() toPublish = [] for i in range(self.listLayers.count()): item = self.listLayers.item(i) widget = self.listLayers.itemWidget(item) if widget.checked(): name = widget.name() toPublish.append(name) onlySymbology = self.chkOnlySymbology.checkState() == Qt.Checked return PublishTask(toPublish, self.fieldsToPublish, onlySymbology, geodataServer, metadataServer, parent)
def isDataOnServer(self, layer): try: server = geodataServers()[self.comboGeodataServer.currentText()] return server.layerExists(layer) except KeyError: return False except Exception as e: return False
def updateLayerIsDataPublished(self, name, value): self.isDataPublished[name] = value for i in range(self.listLayers.count()): item = self.listLayers.item(i) widget = self.listLayers.itemWidget(item) if widget.name() == name: server = geodataServers()[ self.comboGeodataServer.currentText()] if value else None widget.setDataPublished(server)
def updateLayersPublicationStatus(self, data=True, metadata=True): canPublish = True if data: try: dataServer = geodataServers()[ self.comboGeodataServer.currentText()] if dataServer.testConnection(): self.comboGeodataServer.setStyleSheet("QComboBox { }") else: self.comboGeodataServer.setStyleSheet( "QComboBox { border: 2px solid red; }") dataServer = None canPublish = False except KeyError: self.comboGeodataServer.setStyleSheet("QComboBox { }") dataServer = None if metadata: try: metadataServer = metadataServers()[ self.comboMetadataServer.currentText()] if metadataServer.testConnection(): self.comboMetadataServer.setStyleSheet("QComboBox { }") else: self.comboMetadataServer.setStyleSheet( "QComboBox { border: 2px solid red; }") metadataServer = None canPublish = False except KeyError: self.comboMetadataServer.setStyleSheet("QComboBox { }") metadataServer = None for i in range(self.listLayers.count()): item = self.listLayers.item(i) widget = self.listLayers.itemWidget(item) name = widget.name() if data: server = None if dataServer: self.isDataPublished[name] = self.isDataOnServer(name) server = dataServer if self.isDataPublished[name] else None widget.setDataPublished(server) if metadata: server = None if metadataServer: self.isMetadataPublished[name] = self.isMetadataOnServer( name) server = metadataServer if self.isMetadataPublished[ name] else None widget.setMetadataPublished(server) canPublish = canPublish and self.listLayers.count() self.btnPublish.setEnabled(canPublish) self.btnPublishOnBackground.setEnabled(canPublish)
def isDataOnServer(self, layer): try: server = geodataServers()[self.comboGeodataServer.currentText()] self.comboGeodataServer.setStyleSheet("QComboBox {}") return server.layerExists(layer) except KeyError: self.comboGeodataServer.setStyleSheet("QComboBox {}") return False except Exception as e: self.comboGeodataServer.setStyleSheet( "QComboBox { border: 2px solid red; }")
def __init__(self, parent): super(PublishWidget, self).__init__() self.isMetadataPublished = {} self.isDataPublished = {} self.currentRow = None self.currentLayer = None self.parent = parent self.fieldsToPublish = {} self.metadata = {} execute(self._setupUi) for s in geodataServers().values(): s.setupForProject()
def viewWms(self, name): layer = self.layerFromName(name) names = [layer.name()] bbox = layer.extent() if bbox.isEmpty(): bbox.grow(1) sbbox = ",".join([ str(v) for v in [ bbox.xMinimum(), bbox.yMinimum(), bbox.xMaximum(), bbox.yMaximum() ] ]) server = geodataServers()[self.comboGeodataServer.currentText()] server.openPreview(names, sbbox, layer.crs().authid())
def updateLayersPublicationStatus(self, data=True, metadata=True): for i in range(self.listLayers.count()): item = self.listLayers.item(i) widget = self.listLayers.itemWidget(item) name = widget.name() if data: self.isDataPublished[name] = self.isDataOnServer(name) server = geodataServers()[self.comboGeodataServer.currentText( )] if self.isDataPublished[name] else None widget.setDataPublished(server) if metadata: self.isMetadataPublished[name] = self.isMetadataOnServer(name) server = metadataServers()[ self.comboMetadataServer.currentText( )] if self.isMetadataPublished[name] else None widget.setMetadataPublished(server)
def updateServers(self): #TODO: do not call updateLayersPublicationStatus if not really needed self.comboGeodataServer.currentIndexChanged.disconnect( self.geodataServerChanged) self.comboMetadataServer.currentIndexChanged.disconnect( self.metadataServerChanged) self.populatecomboMetadataServer() current = self.comboGeodataServer.currentText() self.populatecomboGeodataServer() if current in geodataServers().keys(): self.comboGeodataServer.setCurrentText(current) current = self.comboMetadataServer.currentText() self.populatecomboMetadataServer() if current in metadataServers().keys(): self.comboMetadataServer.setCurrentText(current) self.updateLayersPublicationStatus() self.comboGeodataServer.currentIndexChanged.connect( self.geodataServerChanged) self.comboMetadataServer.currentIndexChanged.connect( self.metadataServerChanged)
def viewAllWms(self): server = geodataServers()[self.comboGeodataServer.currentText()] layers = self.publishableLayers() bbox = QgsRectangle() canvasCrs = iface.mapCanvas().mapSettings().destinationCrs() names = [] for layer in layers: if self.isDataPublished[layer.name()]: names.append(layer.name()) xform = QgsCoordinateTransform(layer.crs(), canvasCrs, QgsProject.instance()) extent = xform.transform(layer.extent()) bbox.combineExtentWith(extent) sbbox = ",".join([ str(v) for v in [ bbox.xMinimum(), bbox.yMinimum(), bbox.xMaximum(), bbox.yMaximum() ] ]) server.openPreview(names, sbbox, canvasCrs.authid())
def unpublishData(self, name): server = geodataServers()[self.comboGeodataServer.currentText()] server.deleteLayer(name) server.deleteStyle(name) self.updateLayerIsDataPublished(name, False)
def populatecomboGeodataServer(self): self.comboGeodataServer.clear() self.comboGeodataServer.addItem(self.tr("Do not publish data")) self.comboGeodataServer.addItems(geodataServers().keys())
def viewMetadata(self, name): server = geodataServers()[self.comboMetadataServer.currentText()] layer = self.layerFromName(name) uuid = uuidForLayer(layer) server.openMetadata(uuid)