mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-08 00:05:09 -04:00
215 lines
7.0 KiB
Python
215 lines
7.0 KiB
Python
###############################################################################
|
|
#
|
|
# CSW Client
|
|
# ---------------------------------------------------------
|
|
# QGIS Catalog Service client.
|
|
#
|
|
# Copyright (C) 2010 NextGIS (http://nextgis.org),
|
|
# Alexander Bruy (alexander.bruy@gmail.com),
|
|
# Maxim Dubinin (sim@gis-lab.info)
|
|
#
|
|
# Copyright (C) 2014 Tom Kralidis (tomkralidis@gmail.com)
|
|
#
|
|
# This source is free software; you can redistribute it and/or modify it under
|
|
# the terms of the GNU General Public License as published by the Free
|
|
# Software Foundation; either version 2 of the License, or (at your option)
|
|
# any later version.
|
|
#
|
|
# This code is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
# details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along
|
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
#
|
|
###############################################################################
|
|
|
|
import xml.etree.ElementTree as etree
|
|
|
|
from qgis.core import QgsSettings
|
|
from qgis.PyQt.QtWidgets import (
|
|
QDialog,
|
|
QDialogButtonBox,
|
|
QFileDialog,
|
|
QListWidgetItem,
|
|
QMessageBox,
|
|
) # noqa
|
|
|
|
from MetaSearch.util import get_connections_from_file, get_ui_class, prettify_xml
|
|
|
|
BASE_CLASS = get_ui_class("manageconnectionsdialog.ui")
|
|
|
|
|
|
class ManageConnectionsDialog(QDialog, BASE_CLASS):
|
|
"""manage connections"""
|
|
|
|
def __init__(self, mode):
|
|
"""init dialog"""
|
|
|
|
QDialog.__init__(self)
|
|
self.setupUi(self)
|
|
self.settings = QgsSettings()
|
|
self.filename = None
|
|
self.mode = mode # 0 - save, 1 - load
|
|
self.btnBrowse.clicked.connect(self.select_file)
|
|
self.manage_gui()
|
|
|
|
def manage_gui(self):
|
|
"""manage interface"""
|
|
|
|
if self.mode == 1:
|
|
self.label.setText(self.tr("Load from file"))
|
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setText(
|
|
self.tr("Load")
|
|
)
|
|
else:
|
|
self.label.setText(self.tr("Save to file"))
|
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setText(
|
|
self.tr("Save")
|
|
)
|
|
self.populate()
|
|
|
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
|
|
|
|
def select_file(self):
|
|
"""select file ops"""
|
|
|
|
label = self.tr("eXtensible Markup Language (*.xml *.XML)")
|
|
|
|
if self.mode == 0:
|
|
slabel = self.tr("Save Connections")
|
|
self.filename, filter = QFileDialog.getSaveFileName(
|
|
self, slabel, ".", label
|
|
)
|
|
else:
|
|
slabel = self.tr("Load Connections")
|
|
self.filename, selected_filter = QFileDialog.getOpenFileName(
|
|
self, slabel, ".", label
|
|
)
|
|
|
|
if not self.filename:
|
|
return
|
|
|
|
# ensure the user never omitted the extension from the file name
|
|
if not self.filename.lower().endswith(".xml"):
|
|
self.filename = "%s.xml" % self.filename
|
|
|
|
self.leFileName.setText(self.filename)
|
|
|
|
if self.mode == 1:
|
|
self.populate()
|
|
|
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(True)
|
|
|
|
def populate(self):
|
|
"""populate connections list from settings"""
|
|
|
|
if self.mode == 0:
|
|
self.settings.beginGroup("/MetaSearch/")
|
|
keys = self.settings.childGroups()
|
|
for key in keys:
|
|
item = QListWidgetItem(self.listConnections)
|
|
item.setText(key)
|
|
self.settings.endGroup()
|
|
|
|
else: # populate connections list from file
|
|
doc = get_connections_from_file(self, self.filename)
|
|
if doc is None:
|
|
self.filename = None
|
|
self.leFileName.clear()
|
|
self.listConnections.clear()
|
|
return
|
|
|
|
for catalog in doc.findall("csw"):
|
|
item = QListWidgetItem(self.listConnections)
|
|
item.setText(catalog.attrib.get("name"))
|
|
|
|
def save(self, connections):
|
|
"""save connections ops"""
|
|
|
|
doc = etree.Element("qgsCSWConnections")
|
|
doc.attrib["version"] = "1.0"
|
|
|
|
for conn in connections:
|
|
url = self.settings.value("/MetaSearch/%s/url" % conn)
|
|
type_ = self.settings.value("/MetaSearch/%s/catalog-type" % conn)
|
|
if url is not None:
|
|
connection = etree.SubElement(doc, "csw")
|
|
connection.attrib["name"] = conn
|
|
connection.attrib["type"] = type_ or "OGC CSW 2.0.2"
|
|
connection.attrib["url"] = url
|
|
|
|
# write to disk
|
|
with open(self.filename, "w") as fileobj:
|
|
fileobj.write(prettify_xml(etree.tostring(doc)))
|
|
QMessageBox.information(
|
|
self,
|
|
self.tr("Save Connections"),
|
|
self.tr("Saved to {0}.").format(self.filename),
|
|
)
|
|
self.reject()
|
|
|
|
def load(self, items):
|
|
"""load connections"""
|
|
|
|
self.settings.beginGroup("/MetaSearch/")
|
|
keys = self.settings.childGroups()
|
|
self.settings.endGroup()
|
|
|
|
exml = etree.parse(self.filename).getroot()
|
|
|
|
for catalog in exml.findall("csw"):
|
|
conn_name = catalog.attrib.get("name")
|
|
|
|
# process only selected connections
|
|
if conn_name not in items:
|
|
continue
|
|
|
|
# check for duplicates
|
|
if conn_name in keys:
|
|
label = self.tr("File {0} exists. Overwrite?").format(conn_name)
|
|
res = QMessageBox.warning(
|
|
self,
|
|
self.tr("Loading Connections"),
|
|
label,
|
|
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
|
|
)
|
|
if res != QMessageBox.StandardButton.Yes:
|
|
continue
|
|
|
|
# no dups detected or overwrite is allowed
|
|
url = "/MetaSearch/%s/url" % conn_name
|
|
type_ = "/MetaSearch/%s/catalog-type" % conn_name
|
|
self.settings.setValue(url, catalog.attrib.get("url"))
|
|
self.settings.setValue(
|
|
type_, catalog.attrib.get("catalog-type", "OGC CSW 2.0.2")
|
|
)
|
|
|
|
def accept(self):
|
|
"""accept connections"""
|
|
|
|
selection = self.listConnections.selectedItems()
|
|
if len(selection) == 0:
|
|
return
|
|
|
|
items = []
|
|
for sel in selection:
|
|
items.append(sel.text())
|
|
|
|
if self.mode == 0: # save
|
|
self.save(items)
|
|
else: # load
|
|
self.load(items)
|
|
|
|
self.filename = None
|
|
self.leFileName.clear()
|
|
self.listConnections.clear()
|
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
|
|
|
|
def reject(self):
|
|
"""back out of manage connections dialogue"""
|
|
|
|
QDialog.reject(self)
|