Example #1
0
    def __init__(self, iface):
        QtGui.QDialog.__init__(self)
        # Set up the user interface from Designer.
        self.ui = Ui_UploadDialog()
        self.ui.setupUi(self)

        self.iface = iface

        myButton = self.ui.pbnUpload
        QtCore.QObject.connect(myButton, QtCore.SIGNAL('clicked()'),
                               self.uploadSelectedLayer)

        #Set up the table view
        self.layer_list = self.getProjectLayers()
        #self.model = ProjectLayerModel(layer_list)

        #self.tableView = self.ui.layerTableView
        #self.tableView.setModel(self.model)
        #self.resizeColumns()
        #self.tableView.setSortingEnabled(True)

        self.tableWidget = self.ui.layerTableWidget
        self.tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        self.populateLayerTable()
Example #2
0
class UploadDialog(QtGui.QDialog):
    def __init__(self, iface):
        QtGui.QDialog.__init__(self)
        # Set up the user interface from Designer.
        self.ui = Ui_UploadDialog()
        self.ui.setupUi(self)

        self.iface = iface

        myButton = self.ui.pbnUpload
        QtCore.QObject.connect(myButton, QtCore.SIGNAL('clicked()'),
                               self.uploadSelectedLayer)

        #Set up the table view
        self.layer_list = self.getProjectLayers()
        #self.model = ProjectLayerModel(layer_list)

        #self.tableView = self.ui.layerTableView
        #self.tableView.setModel(self.model)
        #self.resizeColumns()
        #self.tableView.setSortingEnabled(True)

        self.tableWidget = self.ui.layerTableWidget
        self.tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        self.populateLayerTable()

    def populateLayerTable(self):
        self.tableWidget.clear()
        self.tableWidget.setSortingEnabled(False)
        self.tableWidget.setRowCount(len(self.layer_list))
        headers = ["Title", "Abstract", "Keywords", "GS Name", "Workspace"]
        self.tableWidget.setColumnCount(len(headers))
        self.tableWidget.setHorizontalHeaderLabels(headers)

        for row, layer in enumerate(self.layer_list):
            self.tableWidget.setItem(row, 0, QtGui.QTableWidgetItem(layer['title']))
            self.tableWidget.setItem(row, 1, QtGui.QTableWidgetItem(layer['abstract']))
            self.tableWidget.setItem(row, 2, QtGui.QTableWidgetItem(layer['keywords']))
            self.tableWidget.setItem(row, 3, QtGui.QTableWidgetItem(layer['name']))
            combobox = self.createWorkspaceCombobox()
            self.tableWidget.setCellWidget(row, 4, combobox)

        self.tableWidget.setSortingEnabled(True)
        self.tableWidget.resizeColumnsToContents()

    # def resizeColumns(self):
    #     for column in range(3):
    #         self.tableView.resizeColumnToContents(column)

    def createWorkspaceCombobox(self):
        # Retrieve existing workspaces and fill a combox to give option to the users
        qgs_cat = QGSCatalog("http://localhost:8080/geoserver/rest", username="******", password="******")
        all_workspaces = qgs_cat.get_workspaces()
        all_workspaces = [workspace.name for workspace in all_workspaces]
        # Retrieve default workspace name
        req = requests.get(qgs_cat.get_default_workspace().href, auth=('admin', 'geoserver'))
        doc = etree.fromstring(req.content)
        default_name = doc.find('name')
        default_name = default_name.text if not None else None
        # Create and fill ComboBox
        combobox = QtGui.QComboBox()
        selected_index = -1
        for workspace in all_workspaces:
            if workspace == default_name and workspace is not None:
                combobox.addItem(workspace + " [default]")
                selected_index = combobox.findText(workspace + " [default]")
            else:
                combobox.addItem(workspace)
        if selected_index != -1:
            combobox.setCurrentIndex(selected_index)
        return combobox

    def uploadSelectedLayer(self):
        uploaded_layers = []
        qgs_cat = QGSCatalog("http://localhost:8080/geoserver/rest", username="******", password="******")

        selected_indexes = self.tableWidget.selectionModel().selectedRows()

        for row_index in selected_indexes:
            # from PyQt4.QtCore import pyqtRemoveInputHook; pyqtRemoveInputHook()
            # import pdb; pdb.set_trace()
 
            selected_layer_name = self.tableWidget.item(row_index.row(), 0).text()
            #Shouldn't require a loop but I didn't find a way to access directly a layer by id or by name
            for lyr in self.iface.mapCanvas().layers():
                if str(lyr.name()) == selected_layer_name:
                    file_path = QtCore.QFileInfo(lyr.dataProvider().dataSourceUri().section('|', 0, 0))

            workspace = self.tableWidget.cellWidget(row_index.row(), 4).currentText()
            if '[default]' in workspace:
                workspace = 'default'
            #TODO: support other sources of data (PostGIS...)
            upload_layer_to_gs(qgs_cat, str(selected_layer_name), str(file_path.absoluteFilePath()), workspace=str(workspace))
        return uploaded_layers

    def getProjectLayers(self):
        canvas = self.iface.mapCanvas()
        all_layers = canvas.layers()
        layer_list = []

        for layer in all_layers:
            layer_list.append({
                'title': str(layer.name()),
                'name': '',
                'abstract': '',
                'keywords': ''
            })
        return layer_list