Пример #1
0
 def viewMetadata(self, layer_id):
     server = manager.getMetadataServer(self.comboMetadataServer.currentText())
     if not server:
         return
     layer = getLayerById(layer_id)
     uuid = uuidForLayer(layer)
     server.openMetadata(uuid)
Пример #2
0
 def unpublishMetadata(self, layer_id):
     server = manager.getMetadataServer(self.comboMetadataServer.currentText())
     if not server:
         return False
     uuid = uuidForLayer(getLayerById(layer_id))
     server.deleteMetadata(uuid)
     self.updateLayerIsMetadataPublished(layer_id, None)
     return True
Пример #3
0
 def viewWms(self, layer_id):
     server = manager.getGeodataServer(self.comboGeodataServer.currentText())
     if not server:
         return
     layer = getLayerById(layer_id)
     _, name = getLayerTitleAndName(layer)
     bbox = layer.extent()
     if bbox.isEmpty():
         bbox.grow(1)
     self.previewWebService(server, [name], bbox, layer.crs().authid())
Пример #4
0
 def unpublishData(self, layer_id):
     server = manager.getGeodataServer(self.comboGeodataServer.currentText())
     if not server:
         return
     layer = getLayerById(layer_id)
     _, name = getLayerTitleAndName(layer)
     if server.deleteLayer(name):
         # Deletion was successful: silently try to remove style (should have been removed already)
         server.deleteStyle(name)
         # Mark layer as deleted
         self.updateLayerIsDataPublished(layer_id, None)
Пример #5
0
    def updateOnlineLayersPublicationStatus(self, data: bool = True, metadata: bool = True) -> bool:
        """ Validates online tab servers and updates layer status. """

        if self.tabOnOffline.currentWidget() != self.tabOnline:
            # Current tab is not the online publish tab
            return True

        can_publish = True
        data_server = manager.getGeodataServer(self.comboGeodataServer.currentText())
        metadata_server = manager.getMetadataServer(self.comboMetadataServer.currentText())

        errors = set()
        if data:
            self.comboGeodataServer.setStyleSheet("QComboBox { }")
            if data_server and not data_server.testConnection(errors):
                self.comboGeodataServer.setStyleSheet("QComboBox { border: 2px solid red; }")
                can_publish = False

        if metadata:
            self.comboMetadataServer.setStyleSheet("QComboBox { }")
            if metadata_server and not metadata_server.testConnection(errors):
                self.comboMetadataServer.setStyleSheet("QComboBox { border: 2px solid red; }")
                can_publish = False

        # Show errors (if there are any)
        for e in errors:
            self.showErrorBar("Error", e)

        for i in range(self.listLayers.count()):
            item = self.listLayers.item(i)
            widget = self.listLayers.itemWidget(item)
            layer = getLayerById(widget.id)
            if data:
                server = None
                if data_server:
                    self.isDataPublished[layer.id()] = self.isDataOnServer(layer)
                    server = data_server if self.isDataPublished.get(layer.id()) else None
                widget.setDataPublished(server)
            if metadata:
                server = None
                if metadata_server:
                    self.isMetadataPublished[layer.id()] = self.isMetadataOnServer(layer)
                    server = metadata_server if self.isMetadataPublished[layer.id()] else None
                widget.setMetadataPublished(server)

        can_publish = can_publish and self.listLayers.count()
        return can_publish
Пример #6
0
 def populateTree(self):
     for lyr_name in (lyr_utils.getLayerById(id_).name() for id_ in self.layer_ids):
         item = QTreeWidgetItem()
         item.setText(0, lyr_name)
         subitem = QTreeWidgetItem()
         subitem.setText(0, "Publish symbology")
         subitem.setIcon(0, SYMBOLOGY_ICON)
         item.addChild(subitem)
         subitem = QTreeWidgetItem()
         subitem.setText(0, "Publish data")
         subitem.setIcon(0, DATA_ICON)
         item.addChild(subitem)            
         subitem = QTreeWidgetItem()
         subitem.setText(0, "Publish metadata")
         subitem.setIcon(0, METADATA_ICON)
         item.addChild(subitem)            
         self.treeWidget.addTopLevelItem(item)
         item.setExpanded(False)
     item = QTreeWidgetItem()
     item.setText(0, "Create layer groups")
     item.setIcon(0, GROUPS_ICON)
     self.treeWidget.addTopLevelItem(item)
     QCoreApplication.processEvents()
Пример #7
0
    def run(self):
        def publishLayer(lyr, lyr_name):
            fields = None
            if lyr.type() == lyr.VectorLayer:
                fields = [
                    _name
                    for _name, publish in self.field_map[lyr.id()].items()
                    if publish
                ]
            self.geodata_server.publishLayer(lyr, fields)
            if self.metadata_server is not None:
                metadata_uuid = uuidForLayer(lyr)
                md_url = self.metadata_server.metadataUrl(metadata_uuid)
                self.geodata_server.setLayerMetadataLink(lyr_name, md_url)

        try:
            validator = QgsNativeMetadataValidator()

            # FIXME: remove or improve this
            # DONOTALLOW = 0
            ALLOW = 1
            ALLOWONLYDATA = 2

            allow_without_md = ALLOW  # pluginSetting("allowWithoutMetadata")

            if self.geodata_server is not None:
                self.geodata_server.prepareForPublishing(self.only_symbology)

            self.results = {}
            for i, layer_id in enumerate(self.layer_ids):
                if self.isCanceled():
                    return False
                warnings, errors = [], []
                self.setProgress(i * 100 / len(self.layer_ids))
                layer = lyr_utils.getLayerById(layer_id)
                name, safe_name = lyr_utils.getLayerTitleAndName(layer)
                if not lyr_utils.hasValidLayerName(layer):
                    try:
                        warnings.append(
                            f"Layer name '{name}' contains characters that may cause issues"
                        )
                    except UnicodeError:
                        warnings.append(
                            "Layer name contains characters that may cause issues"
                        )
                md_valid, _ = validator.validate(layer.metadata())
                if self.geodata_server is not None:
                    self.geodata_server.resetLogIssues()

                    # Publish style
                    self.stepStarted.emit(layer_id, SYMBOLOGY)
                    try:
                        self.geodata_server.publishStyle(layer)
                    except:
                        errors.append(traceback.format_exc())
                    self.stepFinished.emit(layer_id, SYMBOLOGY)

                    if self.only_symbology:
                        # Skip data publish if "only symbology" was checked
                        self.stepSkipped.emit(layer_id, DATA)
                    else:
                        # Publish data
                        self.stepStarted.emit(layer_id, DATA)
                        try:
                            if md_valid or allow_without_md in (ALLOW,
                                                                ALLOWONLYDATA):
                                publishLayer(layer, safe_name)
                            else:
                                self.stepStarted.emit(layer_id, DATA)
                                if md_valid or allow_without_md in (
                                        ALLOW, ALLOWONLYDATA):
                                    publishLayer(layer, safe_name)
                                else:
                                    self.geodata_server.logError(
                                        f"Layer '{name}' has invalid metadata. "
                                        f"Layer was not published")
                                self.stepFinished.emit(layer_id, DATA)
                        except:
                            errors.append(traceback.format_exc())
                        self.stepFinished.emit(layer_id, DATA)

                else:
                    # No geodata server selected: skip layer data and symbology
                    self.stepSkipped.emit(layer_id, SYMBOLOGY)
                    self.stepSkipped.emit(layer_id, DATA)

                if self.metadata_server is not None:
                    # User selected metadata server: publish metadata
                    try:
                        self.metadata_server.resetLogIssues()
                        if md_valid or allow_without_md == ALLOW:
                            wms = None
                            wfs = None
                            full_name = None
                            if self.geodata_server is not None:
                                full_name = self.geodata_server.fullLayerName(
                                    safe_name)
                                wms = self.geodata_server.getWmsUrl()
                                if layer.type() == layer.VectorLayer:
                                    wfs = self.geodata_server.getWfsUrl()
                            self.autofillMetadata(layer)
                            self.stepStarted.emit(layer_id, METADATA)
                            self.metadata_server.publishLayerMetadata(
                                layer, wms, wfs, full_name)
                            self.stepFinished.emit(layer_id, METADATA)
                        else:
                            self.metadata_server.logError(
                                f"Layer '{name}' has invalid metadata. "
                                f"Metadata was not published")
                    except:
                        errors.append(traceback.format_exc())
                else:
                    self.stepSkipped.emit(layer_id, METADATA)

                # Collect all layer-specific errors and warnings (if any)
                if self.geodata_server is not None:
                    w, e = self.geodata_server.getLogIssues()
                    warnings.extend(w)
                    errors.extend(e)
                if self.metadata_server is not None:
                    w, e = self.metadata_server.getLogIssues()
                    warnings.extend(w)
                    errors.extend(e)
                self.results[name] = (set(warnings), set(errors))

            # Create layer groups (if any)
            if self.geodata_server is not None:
                self.stepStarted.emit(None, GROUPS)
                try:
                    # FIXME (did this ever work?)
                    self.geodata_server.createGroups(self._layerGroups(),
                                                     self.layer_ids)
                except Exception as err:
                    # TODO: figure out where to properly put a warning or error message for this
                    feedback.logError(f"Could not create layer groups: {err}")
                finally:
                    try:
                        # Call closePublishing(): for GeoServer, this will set up vector tiles, if enabled
                        self.geodata_server.closePublishing()
                    except Exception as err:
                        feedback.logError(
                            f"Failed to finalize publish task: {err}")
                    self.stepFinished.emit(None, GROUPS)
            else:
                self.stepSkipped.emit(None, GROUPS)

            return True
        except Exception:
            self.exc_type, _, _ = sys.exc_info()
            self.exception = traceback.format_exc()
            return False