def upload(self, layer, workspace=None, overwrite=True, name=None, storename=None, title=None): '''uploads the specified layer''' if isinstance(layer, basestring): layer = layers.resolveLayer(layer) name = name or layer.name() title = title or name # name is usually xml-fixed-up by now name = xmlNameFixUp(name) if storename is not None: storename = xmlNameFixUp(storename) settings = QSettings() restApi = bool(settings.value("/OpenGeo/Settings/GeoServer/UseRestApi", True, bool)) if layer.type() not in (layer.RasterLayer, layer.VectorLayer): msg = layer.name() + ' is not a valid raster or vector layer' raise Exception(msg) provider = layer.dataProvider() try: if provider.name() == 'postgres': self._publishExisting(layer, workspace, overwrite, name, storename=storename) elif restApi: self._uploadRest(layer, workspace, overwrite, name) else: self._uploadImporter(layer, workspace, overwrite, name) except UploadError, e: msg = ('Could not save the layer %s, there was an upload ' 'error: %s' % (layer.name(), str(e))) e.args = (msg,) raise
def publishLayer(self, layer, workspace=None, overwrite=True, name=None, storename=None, title=None): ''' Publishes a QGIS layer. It creates the corresponding store and the layer itself. If a pre-upload hook is set, its runs it and publishes the resulting layer layer: the layer to publish, whether as a QgsMapLayer object or its name in the QGIS TOC. workspace: the workspace to publish to. USes the default workspace if not passed or None name: the name for the published layer. Uses the QGIS layer name if not passed or None storename: the name for layer's store, if different than layer name, e.g. when creating a PG data store ''' if isinstance(layer, basestring): layer = layers.resolveLayer(layer) name = name or layer.name() title = title or name name = xmlNameFixUp(name) gslayer = self.catalog.get_layer(name) if gslayer is not None and not overwrite: return sld = self.publishStyle(layer, overwrite, name) layer = self.preprocess(layer) if storename is not None: storename = xmlNameFixUp(storename) self.upload(layer, workspace, overwrite, name, storename=storename, title=title) if sld is not None: #assign style to created store publishing = self.catalog.get_layer(name) publishing.default_style = self.catalog.get_style(name) self.catalog.save(publishing)
def testGSNameStaticUtils(self): n = xmlNameFixUp('My PG connection') self.assertTrue(n == 'My_PG_connection') n = xmlNameFixUp('0Name_with_number') self.assertTrue(n == '_0Name_with_number') n = xmlNameFixUp('xml_starts_name') self.assertTrue(n == '_xml_starts_name') n = xmlNameFixUp(':Name_startswith_punctuation') self.assertTrue(n == '_:Name_startswith_punctuation') nr = xmlNameRegex() self.assertTrue(QRegExp(nr, 0).isValid()) nrm = xmlNameRegexMsg() self.assertTrue('XML name' in nrm)
def testGSNameStaticUtils(self): n = xmlNameFixUp('My PG connection') self.assertTrue(n == 'My_PG_connection') n = xmlNameFixUp('0Name_with_number') self.assertTrue(n == '_0Name_with_number') n = xmlNameFixUp('xml_starts_name') self.assertTrue(n == '_xml_starts_name') n = xmlNameFixUp(':Name_startswith_punctuation') self.assertTrue(n == '_:Name_startswith_punctuation') nr = xmlNameRegex() self.assertTrue(QRegExp(nr, 0).isValid()) nrm = xmlNameRegexMsg() self.assertTrue('XML name' in nrm)
def publishLayer (self, layer, workspace=None, overwrite=True, name=None, storename=None, title=None): ''' Publishes a QGIS layer. It creates the corresponding store and the layer itself. If a pre-upload hook is set, its runs it and publishes the resulting layer layer: the layer to publish, whether as a QgsMapLayer object or its name in the QGIS TOC. workspace: the workspace to publish to. USes the default workspace if not passed or None name: the name for the published layer. Uses the QGIS layer name if not passed or None storename: the name for layer's store, if different than layer name, e.g. when creating a PG data store ''' if isinstance(layer, basestring): layer = layers.resolveLayer(layer) name = name or layer.name() title = title or name name = xmlNameFixUp(name) gslayer = self.catalog.get_layer(name) if gslayer is not None and not overwrite: return sld = self.publishStyle(layer, overwrite, name) layer = self.preprocess(layer) if storename is not None: storename = xmlNameFixUp(storename) self.upload(layer, workspace, overwrite, name, storename=storename, title=title) if sld is not None: #assign style to created store publishing = self.catalog.get_layer(name) publishing.default_style = self.catalog.get_style(name) self.catalog.save(publishing)
def upload(self, layer, workspace=None, overwrite=True, name=None, storename=None, title=None): '''uploads the specified layer''' if isinstance(layer, basestring): layer = layers.resolveLayer(layer) name = name or layer.name() title = title or name # name is usually xml-fixed-up by now name = xmlNameFixUp(name) if storename is not None: storename = xmlNameFixUp(storename) settings = QSettings() restApi = bool( settings.value("/OpenGeo/Settings/GeoServer/UseRestApi", True, bool)) if layer.type() not in (layer.RasterLayer, layer.VectorLayer): msg = layer.name() + ' is not a valid raster or vector layer' raise Exception(msg) provider = layer.dataProvider() try: if provider.name() == 'postgres': self._publishExisting(layer, workspace, overwrite, name, storename=storename) elif restApi: self._uploadRest(layer, workspace, overwrite, name) else: self._uploadImporter(layer, workspace, overwrite, name) except UploadError, e: msg = ('Could not save the layer %s, there was an upload ' 'error: %s' % (layer.name(), str(e))) e.args = (msg, ) raise
def testGSNameWidgetInit(self): nw = GSNameWidget( namemsg='Sample is generated from PostgreSQL connection name', name=xmlNameFixUp('My PG connection'), nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=['name_one', 'name_two', 'name_three'], unique=False, maxlength=10) self.assertEqual(nw.nameBox.count(), 4) # name is prepended to list
def testGSNameWidgetInit(self): nw = GSNameWidget( namemsg='Sample is generated from PostgreSQL connection name', name=xmlNameFixUp('My PG connection'), nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=['name_one', 'name_two', 'name_three'], unique=False, maxlength=10) self.assertEqual(nw.nameBox.count(), 4) # name is prepended to list
def publishGroup(self, name, destName=None, workspace=None, overwrite=False, overwriteLayers=False): ''' Publishes a group in the given catalog name: the name of the QGIS group to publish. It will also be used as the GeoServer layergroup name workspace: The workspace to add the group to overwrite: if True, it will overwrite a previous group with the specified name, if it exists overwriteLayers: if False, in case a layer in the group is not found in the specified workspace, the corresponding layer from the current QGIS project will be published, but all layers of the group that can be found in the GeoServer workspace will not be published. If True, all layers in the group are published, even if layers with the same name exist in the workspace ''' groups = layers.getGroups() if name not in groups: raise Exception("The specified group does not exist") destName = xmlNameFixUp(destName) if destName is not None \ else xmlNameFixUp(name) gsgroup = self.catalog.get_layergroup(destName) if gsgroup is not None and not overwrite: return group = groups[name] for layer in group: lyrname = xmlNameFixUp(layer.name()) gslayer = self.catalog.get_layer(lyrname) if gslayer is None or overwriteLayers: self.publishLayer(layer, workspace, True, lyrname) names = [xmlNameFixUp(layer.name()) for layer in group] layergroup = self.catalog.create_layergroup(destName, names, names) self.catalog.save(layergroup)
def __init__(self, **kwargs): unique = kwargs.get('unique', False) super(PostGisTableNameDialog, self).__init__( boxtitle='Table name', boxmsg='Define valid table name', name=xmlNameFixUp(kwargs.get('name', '')), namemsg=kwargs.get('namemsg', ''), nameregex=kwargs.get('nameregex', xmlNameRegex()), nameregexmsg=kwargs.get('nameregexmsg', xmlNameRegexMsg()), names=kwargs.get('names', None), unique=unique, maxlength=kwargs.get('maxlength', 0), parent=kwargs.get('parent', None))
def publishGroup(self, name, destName = None, workspace = None, overwrite = False, overwriteLayers = False): ''' Publishes a group in the given catalog name: the name of the QGIS group to publish. It will also be used as the GeoServer layergroup name workspace: The workspace to add the group to overwrite: if True, it will overwrite a previous group with the specified name, if it exists overwriteLayers: if False, in case a layer in the group is not found in the specified workspace, the corresponding layer from the current QGIS project will be published, but all layers of the group that can be found in the GeoServer workspace will not be published. If True, all layers in the group are published, even if layers with the same name exist in the workspace ''' groups = layers.getGroups() if name not in groups: raise Exception("The specified group does not exist") destName = xmlNameFixUp(destName) if destName is not None \ else xmlNameFixUp(name) gsgroup = self.catalog.get_layergroup(destName) if gsgroup is not None and not overwrite: return group = groups[name] for layer in group: lyrname = xmlNameFixUp(layer.name()) gslayer = self.catalog.get_layer(lyrname) if gslayer is None or overwriteLayers: self.publishLayer(layer, workspace, True, lyrname) names = [xmlNameFixUp(layer.name()) for layer in group] layergroup = self.catalog.create_layergroup(destName, names, names) self.catalog.save(layergroup)
def __init__(self, kind, **kwargs): unique = kwargs.get('unique', False) super(GSXmlNameDialog, self).__init__( boxtitle='GeoServer {0} name'.format(kind), boxmsg='Define unique {0}'.format(kind) + ' or overwrite existing' if not unique else '', name=xmlNameFixUp(kwargs.get('name', '')), namemsg=kwargs.get('namemsg', ''), nameregex=kwargs.get('nameregex', xmlNameRegex()), nameregexmsg=kwargs.get('nameregexmsg', xmlNameRegexMsg()), names=kwargs.get('names', None), unique=unique, maxlength=kwargs.get('maxlength', 0), parent=kwargs.get('parent', None))
def setupUi(self): self.resize(600, 350) self.setWindowTitle("Publish Group") vertlayout = QtGui.QVBoxLayout(self) vertlayout.setSpacing(2) vertlayout.setMargin(6) horizlayout = QtGui.QHBoxLayout(self) # horizlayout.setSpacing(30) horizlayout.setMargin(0) self.nameLabel = QtGui.QLabel("Group name") self.nameLabel.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred)) self.nameBox = GSNameWidget( name=xmlNameFixUp(self.groupname), nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=self.groupnames, unique=not self.overwritegrp) self.nameBox.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)) horizlayout.addWidget(self.nameLabel) horizlayout.addWidget(self.nameBox) vertlayout.addLayout(horizlayout) self.lyrstable = PublishLayersDialog( {0: self.catalog}, self.layers, workspace=self.workspace, overwrite=self.overwritelyrs) self.lyrstable.buttonBox.setVisible(False) vertlayout.addWidget(self.lyrstable) self.buttonBox = QtGui.QDialogButtonBox( QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) self.okButton = self.buttonBox.button(QtGui.QDialogButtonBox.Ok) self.cancelButton = self.buttonBox.button(QtGui.QDialogButtonBox.Cancel) vertlayout.addWidget(self.buttonBox) self.setLayout(vertlayout) self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) self.nameBox.nameValidityChanged.connect(self.okButton.setEnabled) self.nameBox.overwritingChanged.connect(self.updateButtons) self.okButton.setEnabled(self.nameBox.isValid()) self.updateButtons(self.nameBox.overwritingName()) self.lyrstable.itemValidityChanged.connect(self.okButton.setEnabled) self.okButton.setEnabled(self.lyrstable.layerNamesValid())
def __init__(self, **kwargs): unique = kwargs.get('unique', False) super(PostGisTableNameDialog, self).__init__(boxtitle='Table name', boxmsg='Define valid table name', name=xmlNameFixUp(kwargs.get('name', '')), namemsg=kwargs.get('namemsg', ''), nameregex=kwargs.get('nameregex', xmlNameRegex()), nameregexmsg=kwargs.get('nameregexmsg', xmlNameRegexMsg()), names=kwargs.get('names', None), unique=unique, maxlength=kwargs.get('maxlength', 0), parent=kwargs.get('parent', None))
def __init__(self, kind, **kwargs): unique = kwargs.get('unique', False) super(GSXmlNameDialog, self).__init__(boxtitle='GeoServer {0} name'.format(kind), boxmsg='Define unique {0}'.format(kind) + ' or overwrite existing' if not unique else '', name=xmlNameFixUp(kwargs.get('name', '')), namemsg=kwargs.get('namemsg', ''), nameregex=kwargs.get('nameregex', xmlNameRegex()), nameregexmsg=kwargs.get('nameregexmsg', xmlNameRegexMsg()), names=kwargs.get('names', None), unique=unique, maxlength=kwargs.get('maxlength', 0), parent=kwargs.get('parent', None))
def testGSNameDialog(self): ndlg = GSNameDialog( boxtitle='GeoServer data store name', boxmsg='My groupbox message', namemsg='Sample is generated from PostgreSQL connection name.', name=xmlNameFixUp('My PG connection'), nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=['name_one', 'name_two', 'name_three'], unique=True, maxlength=10) # maxlength > 10 self.assertFalse(ndlg.okButton.isEnabled()) self.assertIsNone(ndlg.definedName()) self.assertFalse(ndlg.overwritingName()) # maxlength = 10 ndlg.nameBox.setName('my_pg_conn') self.assertTrue(ndlg.okButton.isEnabled()) self.assertEqual(ndlg.definedName(), 'my_pg_conn') self.assertFalse(ndlg.overwritingName()) # unique = True ndlg.nameBox.setName('name_one') self.assertIsNone(ndlg.definedName()) self.assertFalse(ndlg.okButton.isEnabled()) self.assertFalse(ndlg.overwritingName()) del ndlg # unique=False ndlg = GSNameDialog( boxtitle='GeoServer data store name', boxmsg='My groupbox message', name='name', names=['name_one', 'name_two', 'name_three'], unique=False) # not overwriting self.assertEqual(ndlg.definedName(), 'name') self.assertTrue(ndlg.okButton.isEnabled()) self.assertFalse(ndlg.overwritingName()) # overwriting ndlg.nameBox.setName('name_one') self.assertEqual(ndlg.definedName(), 'name_one') self.assertTrue(ndlg.okButton.isEnabled()) self.assertTrue(ndlg.overwritingName())
def testGSNameDialog(self): ndlg = GSNameDialog( boxtitle='GeoServer data store name', boxmsg='My groupbox message', namemsg='Sample is generated from PostgreSQL connection name.', name=xmlNameFixUp('My PG connection'), nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=['name_one', 'name_two', 'name_three'], unique=True, maxlength=10) # maxlength > 10 self.assertFalse(ndlg.okButton.isEnabled()) self.assertIsNone(ndlg.definedName()) self.assertFalse(ndlg.overwritingName()) # maxlength = 10 ndlg.nameBox.setName('my_pg_conn') self.assertTrue(ndlg.okButton.isEnabled()) self.assertEqual(ndlg.definedName(), 'my_pg_conn') self.assertFalse(ndlg.overwritingName()) # unique = True ndlg.nameBox.setName('name_one') self.assertIsNone(ndlg.definedName()) self.assertFalse(ndlg.okButton.isEnabled()) self.assertFalse(ndlg.overwritingName()) del ndlg # unique=False ndlg = GSNameDialog( boxtitle='GeoServer data store name', boxmsg='My groupbox message', name='name', names=['name_one', 'name_two', 'name_three'], unique=False) # not overwriting self.assertEqual(ndlg.definedName(), 'name') self.assertTrue(ndlg.okButton.isEnabled()) self.assertFalse(ndlg.overwritingName()) # overwriting ndlg.nameBox.setName('name_one') self.assertEqual(ndlg.definedName(), 'name_one') self.assertTrue(ndlg.okButton.isEnabled()) self.assertTrue(ndlg.overwritingName())
def publishDraggedStyle(explorer, layerName, catalogItem, name=None): catalog = catalogItem.element ogcat = OGCatalog(catalog) toUpdate = [catalogItem.stylesItem] if name is not None: stylename = name else: styles = [style.name for style in catalog.get_styles()] try: stylename = getGSStyleName(name=xmlNameFixUp(layerName), names=styles, unique=False) except UserCanceledOperation: return False return explorer.run(ogcat.publishStyle, "Publish style from layer '" + layerName + "'", toUpdate, layerName, True, stylename)
def setupUi(self): self.resize(600, 350) self.setWindowTitle("Publish Group") vertlayout = QtGui.QVBoxLayout(self) vertlayout.setSpacing(2) vertlayout.setMargin(6) horizlayout = QtGui.QHBoxLayout(self) # horizlayout.setSpacing(30) horizlayout.setMargin(0) self.nameLabel = QtGui.QLabel("Group name") self.nameLabel.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred)) self.nameBox = GSNameWidget( name=xmlNameFixUp(self.groupname), nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=self.groupnames, unique=not self.overwritegrp, ) self.nameBox.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)) horizlayout.addWidget(self.nameLabel) horizlayout.addWidget(self.nameBox) vertlayout.addLayout(horizlayout) self.lyrstable = PublishLayersDialog( {0: self.catalog}, self.layers, workspace=self.workspace, overwrite=self.overwritelyrs ) self.lyrstable.buttonBox.setVisible(False) vertlayout.addWidget(self.lyrstable) self.buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) self.okButton = self.buttonBox.button(QtGui.QDialogButtonBox.Ok) self.cancelButton = self.buttonBox.button(QtGui.QDialogButtonBox.Cancel) vertlayout.addWidget(self.buttonBox) self.setLayout(vertlayout) self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) self.nameBox.nameValidityChanged.connect(self.okButton.setEnabled) self.nameBox.overwritingChanged.connect(self.updateButtons) self.okButton.setEnabled(self.nameBox.isValid()) self.updateButtons(self.nameBox.overwritingName()) self.lyrstable.itemValidityChanged.connect(self.okButton.setEnabled) self.okButton.setEnabled(self.lyrstable.layerNamesValid())
def publishDraggedLayer(explorer, layer, workspace): cat = workspace.catalog ogcat = OGCatalog(cat) gslayers = [lyr.name for lyr in cat.get_layers()] layername = layer.name() if qgislayers.isPostGisLayer(layer): layername += "_table" try: lyrname = getGSLayerName(name=xmlNameFixUp(layername), names=gslayers, unique=False) except UserCanceledOperation: return False return explorer.run(ogcat.publishLayer, "Publish layer from layer '" + lyrname + "'", [], layer, workspace, True, lyrname)
def publishDraggedStyle(explorer, layerName, catalogItem, name=None): catalog = catalogItem.element ogcat = OGCatalog(catalog) toUpdate = [catalogItem.stylesItem] if name is not None: stylename = name else: styles = [style.name for style in catalog.get_styles()] try: stylename = getGSStyleName(name=xmlNameFixUp(layerName), names=styles, unique=False) except UserCanceledOperation: return False return explorer.run(ogcat.publishStyle, "Publish style from layer '" + layerName + "'", toUpdate, layerName, True, stylename)
def publishDraggedLayer(explorer, layer, workspace): cat = workspace.catalog ogcat = OGCatalog(cat) gslayers = [lyr.name for lyr in cat.get_layers()] layername = layer.name() if qgislayers.isPostGisLayer(layer): layername += "_table" try: lyrname = getGSLayerName(name=xmlNameFixUp(layername), names=gslayers, unique=False) except UserCanceledOperation: return False return explorer.run(ogcat.publishLayer, "Publish layer from layer '" + lyrname + "'", [], layer, workspace, True, lyrname)
def publishDraggedTable(tree, explorer, table, workspace): if not xmlNameIsValid(table.name, xmlNameRegex()): QtGui.QMessageBox.warning( explorer, "Invalid name", ("The table name (%s) is not a valid XML name.\n" + "This could cause problems when published to GeoServer.\n" + "Please rename it and retry publishing.") % table.name) return False cat = workspace.catalog if int(table.srid) == 0: explorer.setWarning("PostGIS table '{0}' has no SRID; ESPG:4326 will " "be assigned.".format(table.name)) gslayers = [lyr.name for lyr in cat.get_layers()] try: lyrname = getGSLayerName(name=xmlNameFixUp(table.name + "_table"), names=gslayers, unique=False) except UserCanceledOperation: return False catItem = tree.findFirstItem(cat) toUpdate = [catItem.layersItem] res = explorer.run(publishTable, "Publish table from table '" + table.name + "'", toUpdate, table, cat, workspace, True, lyrname) if res: # add existing style to layer, or later some operations may fail, # like malformed XML when getting capabilities for OWS connections pglyr = cat.get_layer(lyrname) pgitem = tree.findFirstItem(pglyr) if pgitem is None: print "pgitem not found" return False if not pgitem.addStyleToLayer(explorer): # handles refresh of item # user cancelled AddStyleToLayerDialog noDefaultStyleError(explorer, lyrname) return False else: catItem.layersItem.refreshContent(explorer) return res
def publishDraggedTable(tree, explorer, table, workspace): if not xmlNameIsValid(table.name, xmlNameRegex()): QtGui.QMessageBox.warning(explorer, "Invalid name", ("The table name (%s) is not a valid XML name.\n" + "This could cause problems when published to GeoServer.\n" + "Please rename it and retry publishing.") % table.name) return False cat = workspace.catalog if int(table.srid) == 0: explorer.setWarning("PostGIS table '{0}' has no SRID; ESPG:4326 will " "be assigned.".format(table.name)) gslayers = [lyr.name for lyr in cat.get_layers()] try: lyrname = getGSLayerName(name=xmlNameFixUp(table.name + "_table"), names=gslayers, unique=False) except UserCanceledOperation: return False catItem = tree.findFirstItem(cat) toUpdate = [catItem.layersItem] res = explorer.run(publishTable, "Publish table from table '" + table.name + "'", toUpdate, table, cat, workspace, True, lyrname) if res: # add existing style to layer, or later some operations may fail, # like malformed XML when getting capabilities for OWS connections pglyr = cat.get_layer(lyrname) pgitem = tree.findFirstItem(pglyr) if pgitem is None: print "pgitem not found" return False if not pgitem.addStyleToLayer(explorer): # handles refresh of item # user cancelled AddStyleToLayerDialog noDefaultStyleError(explorer, lyrname) return False else: catItem.layersItem.refreshContent(explorer) return res
def addDraggedStyleToLayer(tree, explorer, styleItem, layerItem): catalog = layerItem.element.catalog catItem = tree.findFirstItem(catalog) toUpdate = [catItem.layersItem] if isinstance(styleItem, QgsStyleItem): styleName = styleItem.element.name() # = layer name styles = [style.name for style in catalog.get_styles()] try: stylname = getGSStyleName(name=xmlNameFixUp(styleName), names=styles, unique=False) except UserCanceledOperation: return False if not publishDraggedStyle(explorer, styleName, catItem, name=stylname): return False style = catalog.get_style(stylname) toUpdate.append(catItem.stylesItem) else: style = styleItem.element layer = layerItem.element if not hasattr(layer, "default_style") or layer.default_style is None: # if default style is missing, make dragged style the layer's default # without a default style, some GeoServer operations may fail layer.default_style = style else: # add to layer's additional styles styles = layer.styles styles.append(style) layer.styles = styles return explorer.run( catalog.save, "Add style '" + style.name + "' to layer '" + layer.name + "'", toUpdate, layer)
def addDraggedStyleToLayer(tree, explorer, styleItem, layerItem): catalog = layerItem.element.catalog catItem = tree.findFirstItem(catalog) toUpdate = [catItem.layersItem] if isinstance(styleItem, QgsStyleItem): styleName = styleItem.element.name() # = layer name styles = [style.name for style in catalog.get_styles()] try: stylname = getGSStyleName(name=xmlNameFixUp(styleName), names=styles, unique=False) except UserCanceledOperation: return False if not publishDraggedStyle(explorer, styleName, catItem, name=stylname): return False style = catalog.get_style(stylname) toUpdate.append(catItem.stylesItem) else: style = styleItem.element layer = layerItem.element if not hasattr(layer, "default_style") or layer.default_style is None: # if default style is missing, make dragged style the layer's default # without a default style, some GeoServer operations may fail layer.default_style = style else: # add to layer's additional styles styles = layer.styles styles.append(style) layer.styles = styles return explorer.run( catalog.save, "Add style '" + style.name + "' to layer '" + layer.name + "'", toUpdate, layer)
def setTableContent(self): self.table.setRowCount(len(self.layers)) cat = self.catalogs.values()[0] catlayers = [lyr.name for lyr in cat.get_layers()] for idx, layer in enumerate(self.layers): lyritem = QtGui.QTableWidgetItem(layer.name()) lyritem.setToolTip(layer.name()) lyritem.setFlags(QtCore.Qt.ItemIsEnabled) self.table.setItem(idx, self.getColumn("Layer"), lyritem) lyrname = layer.name() if layers.isPostGisLayer(layer): lyrname += "_table" nameBox = GSNameWidget( name=xmlNameFixUp(lyrname), nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=catlayers, unique=not self.overwrite) self.table.setCellWidget(idx, self.getColumn(self.name), nameBox) self.nameBoxes.append(nameBox) overwriteBox = QtGui.QCheckBox() overwriteBox.setEnabled(False) overwriteBox.setToolTip("Overwrite existing layer") self.table.setCellWidget(idx, self.getColumn(self.ow), overwriteBox) nameBox.nameValidityChanged.connect(self.validateNames) nameBox.overwritingChanged[bool].connect(overwriteBox.setChecked) overwriteBox.setChecked(nameBox.overwritingName()) # initial update if self.showCatalogCol: catalogBox = QtGui.QComboBox() catalogBox.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) catalogBox.addItems(self.catalogs.keys()) catalogBox.currentIndexChanged.connect(partial(self.catalogHasChanged, idx)) self.table.setCellWidget(idx, self.getColumn(self.cat), catalogBox) workspaceBox = QtGui.QComboBox() workspaceBox.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) if self.workspace is not None: workspaces = [self.workspace] defaultName = None else: workspaces = cat.get_workspaces() try: defaultWorkspace = cat.get_default_workspace() defaultWorkspace.fetch() defaultName = defaultWorkspace.dom.find('name').text except: defaultName = None workspaceNames = [w.name for w in workspaces] workspaceBox.addItems(workspaceNames) if defaultName is not None: workspaceBox.setCurrentIndex(workspaceNames.index(defaultName)) self.table.setCellWidget(idx, self.getColumn(self.wrksp), workspaceBox)
def initGui(self): self.setWindowTitle('Publish layer') layout = QtGui.QVBoxLayout() gridLayout = QtGui.QGridLayout() gridLayout.setSpacing(10) gridLayout.setMargin(10) catalogLabel = QtGui.QLabel('Catalog') catalogLabel.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) gridLayout.addWidget(catalogLabel, 0, 0) self.catalogBox = QtGui.QComboBox() self.catalogBox.addItems(self.catalogs.keys()) self.catalogBox.currentIndexChanged.connect(self.catalogHasChanged) gridLayout.addWidget(self.catalogBox, 0, 1) workspaceLabel = QtGui.QLabel('Workspace') workspaceLabel.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) gridLayout.addWidget(workspaceLabel, 1, 0) self.workspaceBox = QtGui.QComboBox() cat = self.catalogs[self.catalogs.keys()[0]] self.workspaces = cat.get_workspaces() try: defaultWorkspace = cat.get_default_workspace() defaultWorkspace.fetch() defaultName = defaultWorkspace.dom.find('name').text except: defaultName = None workspaceNames = [w.name for w in self.workspaces] self.workspaceBox.addItems(workspaceNames) if defaultName is not None: self.workspaceBox.setCurrentIndex( workspaceNames.index(defaultName)) gridLayout.addWidget(self.workspaceBox, 1, 1) nameLabel = QtGui.QLabel('Layer') nameLabel.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) gridLayout.addWidget(nameLabel, 2, 0) gslayers = [lyr.name for lyr in cat.get_layers()] name = '' # handle PG Table, whose name attribute is not callable if self.layer is not None and hasattr(self.layer, 'name'): if isinstance(self.layer, Table): name = self.layer.name + "_table" else: # QgsMapLayer name = self.layer.name() if layers.isPostGisLayer(self.layer): name += "_table" self.nameBox = GSNameWidget(name=xmlNameFixUp(name), nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=gslayers, unique=False) gridLayout.addWidget(self.nameBox, 2, 1) self.destGroupBox = QtGui.QGroupBox() self.destGroupBox.setLayout(gridLayout) layout.addWidget(self.destGroupBox) self.spacer = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) layout.addItem(self.spacer) self.buttonBox = QtGui.QDialogButtonBox( QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) self.okButton = self.buttonBox.button(QtGui.QDialogButtonBox.Ok) self.cancelButton = self.buttonBox.button( QtGui.QDialogButtonBox.Cancel) layout.addWidget(self.buttonBox) self.setLayout(layout) self.nameBox.nameValidityChanged.connect(self.okButton.setEnabled) self.nameBox.overwritingChanged.connect(self.updateButtons) self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) # respond to intial validation self.okButton.setEnabled(self.nameBox.isValid()) self.updateButtons(self.nameBox.overwritingName()) self.resize(400, 160)
def updateNameBox(self, name): self.nameBox.setName(xmlNameFixUp(name))
def _publishExisting(self, layer, workspace, overwrite, name, storename=None): uri = QgsDataSourceURI(layer.dataProvider().dataSourceUri()) # check for table.name conflict in existing layer names where the # table.name is not the same as the user-chosen layer name, # i.e. unintended overwrite resource = self.catalog.get_resource(uri.table()) if resource is not None and uri.table() != name: raise Exception("QGIS PostGIS layer has table name conflict with " "existing GeoServer layer name: {0}\n" "You may need to rename GeoServer layer name." .format(uri.table())) conname = self.getConnectionNameFromLayer(layer) storename = xmlNameFixUp(storename or conname) if not xmlNameIsValid(storename): raise Exception("Database connection name is invalid XML and can " "not be auto-fixed: {0} -> {1}" .format(conname, storename)) if not uri.username(): raise Exception("GeoServer requires database connection's username " "to be defined") store = createPGFeatureStore(self.catalog, storename, workspace = workspace, overwrite = overwrite, host = uri.host(), database = uri.database(), schema = uri.schema(), port = uri.port(), user = uri.username(), passwd = uri.password()) if store is not None: rscname = name if uri.table() != name else uri.table() grpswlyr = [] if overwrite: # TODO: How do we honor *unchecked* user setting of # "Delete resource when deleting layer" here? # Is it an issue, if overwrite is expected? # We will soon have two layers with slightly different names, # a temp based upon table.name, the other possibly existing # layer with the same custom name, which may belong to group(s). # If so, remove existing layer from any layer group, before # continuing on with layer delete and renaming of new feature # type layer to custom name, then add new resultant layer back # to any layer groups the existing layer belonged to. Phew! flyr = self.catalog.get_layer(rscname) if flyr is not None: grpswlyr = groupsWithLayer(self.catalog, flyr) if grpswlyr: removeLayerFromGroups(self.catalog, flyr, grpswlyr) self.catalog.delete(flyr) # TODO: What about when the layer name is the same, but the # underlying db connection/store has changed? Not an issue? # The layer is deleted, which is correct, but the original # db store and feature type will not be changed. A conflict? frsc = store.get_resources(name=rscname) if frsc is not None: self.catalog.delete(frsc) # for dbs the name has to be the table name, initially ftype = self.catalog.publish_featuretype(uri.table(), store, layer.crs().authid()) # once table-based feature type created, switch name to user-chosen if ftype.name != rscname: ftype.dirty["name"] = rscname self.catalog.save(ftype) # now re-add to any previously assigned-to layer groups if overwrite and grpswlyr: ftype = self.catalog.get_resource(rscname) if ftype: addLayerToGroups(self.catalog, ftype, grpswlyr, workspace=workspace)
def initGui(self): verticalLayout = QtGui.QVBoxLayout() buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Close) self.okButton = buttonBox.button(QtGui.QDialogButtonBox.Ok) self.cancelButton = buttonBox.button(QtGui.QDialogButtonBox.Close) self.setWindowTitle('Create style from layer') horizontalLayout = QtGui.QHBoxLayout() horizontalLayout.setMargin(0) layerLabel = QtGui.QLabel('Layer') layerLabel.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) self.layerBox = QtGui.QComboBox() self.alllayers = [layer.name() for layer in layers.getAllLayers()] self.layerBox.addItems(self.alllayers) self.layerBox.setMinimumWidth(250) horizontalLayout.addWidget(layerLabel) horizontalLayout.addWidget(self.layerBox) verticalLayout.addLayout(horizontalLayout) horizontalLayout = QtGui.QHBoxLayout() horizontalLayout.setMargin(0) nameLabel = QtGui.QLabel('Name') nameLabel.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) defaultname = '' if len(self.alllayers) > 0: defaultname = xmlNameFixUp(self.alllayers[0]) self.nameBox = GSNameWidget( namemsg='', name=defaultname, nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=self.styles, unique=False) self.nameBox.setMinimumWidth(250) horizontalLayout.addWidget(nameLabel) horizontalLayout.addWidget(self.nameBox) verticalLayout.addLayout(horizontalLayout) self.groupBox = QtGui.QGroupBox() self.groupBox.setTitle("") self.groupBox.setLayout(verticalLayout) layout = QtGui.QVBoxLayout() layout.addWidget(self.groupBox) layout.addWidget(buttonBox) self.setLayout(layout) buttonBox.accepted.connect(self.okPressed) buttonBox.rejected.connect(self.cancelPressed) self.layerBox.currentIndexChanged[str].connect(self.updateNameBox) self.nameBox.nameValidityChanged.connect(self.okButton.setEnabled) self.nameBox.overwritingChanged.connect(self.updateButtons) self.okButton.setEnabled(self.nameBox.isValid()) self.updateButtons(self.nameBox.overwritingName()) self.resize(400,150)
def setTableContent(self): self.table.setRowCount(len(self.layers)) cat = self.catalogs.values()[0] catlayers = [lyr.name for lyr in cat.get_layers()] for idx, layer in enumerate(self.layers): lyritem = QtGui.QTableWidgetItem(layer.name()) lyritem.setToolTip(layer.name()) lyritem.setFlags(QtCore.Qt.ItemIsEnabled) self.table.setItem(idx, self.getColumn("Layer"), lyritem) lyrname = layer.name() if layers.isPostGisLayer(layer): lyrname += "_table" nameBox = GSNameWidget(name=xmlNameFixUp(lyrname), nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=catlayers, unique=not self.overwrite) self.table.setCellWidget(idx, self.getColumn(self.name), nameBox) self.nameBoxes.append(nameBox) overwriteBox = QtGui.QCheckBox() overwriteBox.setEnabled(False) overwriteBox.setToolTip("Overwrite existing layer") self.table.setCellWidget(idx, self.getColumn(self.ow), overwriteBox) nameBox.nameValidityChanged.connect(self.validateNames) nameBox.overwritingChanged[bool].connect(overwriteBox.setChecked) overwriteBox.setChecked( nameBox.overwritingName()) # initial update if self.showCatalogCol: catalogBox = QtGui.QComboBox() catalogBox.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) catalogBox.addItems(self.catalogs.keys()) catalogBox.currentIndexChanged.connect( partial(self.catalogHasChanged, idx)) self.table.setCellWidget(idx, self.getColumn(self.cat), catalogBox) workspaceBox = QtGui.QComboBox() workspaceBox.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) if self.workspace is not None: workspaces = [self.workspace] defaultName = None else: workspaces = cat.get_workspaces() try: defaultWorkspace = cat.get_default_workspace() defaultWorkspace.fetch() defaultName = defaultWorkspace.dom.find('name').text except: defaultName = None workspaceNames = [w.name for w in workspaces] workspaceBox.addItems(workspaceNames) if defaultName is not None: workspaceBox.setCurrentIndex(workspaceNames.index(defaultName)) self.table.setCellWidget(idx, self.getColumn(self.wrksp), workspaceBox)
def _publishExisting(self, layer, workspace, overwrite, name, storename=None): uri = QgsDataSourceURI(layer.dataProvider().dataSourceUri()) # check for table.name conflict in existing layer names where the # table.name is not the same as the user-chosen layer name, # i.e. unintended overwrite resource = self.catalog.get_resource(uri.table()) if resource is not None and uri.table() != name: raise Exception( "QGIS PostGIS layer has table name conflict with " "existing GeoServer layer name: {0}\n" "You may need to rename GeoServer layer name.".format( uri.table())) conname = self.getConnectionNameFromLayer(layer) storename = xmlNameFixUp(storename or conname) if not xmlNameIsValid(storename): raise Exception("Database connection name is invalid XML and can " "not be auto-fixed: {0} -> {1}".format( conname, storename)) if not uri.username(): raise Exception( "GeoServer requires database connection's username " "to be defined") store = createPGFeatureStore(self.catalog, storename, workspace=workspace, overwrite=overwrite, host=uri.host(), database=uri.database(), schema=uri.schema(), port=uri.port(), user=uri.username(), passwd=uri.password()) if store is not None: rscname = name if uri.table() != name else uri.table() grpswlyr = [] if overwrite: # TODO: How do we honor *unchecked* user setting of # "Delete resource when deleting layer" here? # Is it an issue, if overwrite is expected? # We will soon have two layers with slightly different names, # a temp based upon table.name, the other possibly existing # layer with the same custom name, which may belong to group(s). # If so, remove existing layer from any layer group, before # continuing on with layer delete and renaming of new feature # type layer to custom name, then add new resultant layer back # to any layer groups the existing layer belonged to. Phew! flyr = self.catalog.get_layer(rscname) if flyr is not None: grpswlyr = groupsWithLayer(self.catalog, flyr) if grpswlyr: removeLayerFromGroups(self.catalog, flyr, grpswlyr) self.catalog.delete(flyr) # TODO: What about when the layer name is the same, but the # underlying db connection/store has changed? Not an issue? # The layer is deleted, which is correct, but the original # db store and feature type will not be changed. A conflict? frsc = store.get_resources(name=rscname) if frsc is not None: self.catalog.delete(frsc) # for dbs the name has to be the table name, initially ftype = self.catalog.publish_featuretype(uri.table(), store, layer.crs().authid()) # once table-based feature type created, switch name to user-chosen if ftype.name != rscname: ftype.dirty["name"] = rscname self.catalog.save(ftype) # now re-add to any previously assigned-to layer groups if overwrite and grpswlyr: ftype = self.catalog.get_resource(rscname) if ftype: addLayerToGroups(self.catalog, ftype, grpswlyr, workspace=workspace)
def publishTable(table, catalog = None, workspace = None, overwrite=True, name=None, storename=None): if catalog is None: pass lyrname = xmlNameFixUp(name) # usually fixed up by now # check for table.name conflict in existing layer names where the table.name # is not the same as the user-chosen layer name, i.e. unintended overwrite resource = catalog.get_resource(table.name) if resource is not None and table.name != lyrname: raise Exception("PostGIS table name conflicts with " "existing GeoServer layer name: {0}\n" "You may need to rename GeoServer layer name." .format(table.name)) workspace = workspace if workspace is not None else catalog.get_default_workspace() connection = table.conn geodb = connection.geodb conname = "{0}_{1}".format(connection.name, table.schema) storename = xmlNameFixUp(storename or conname) if not xmlNameIsValid(storename): raise Exception("Database connection name is invalid XML and can " "not be auto-fixed: {0} -> {1}" .format(conname, storename)) if not geodb.user: raise Exception("GeoServer requires database connection's username " "to be defined") store = createPGFeatureStore(catalog, storename, workspace = workspace, overwrite = True, host = geodb.host, database = geodb.dbname, schema = table.schema, port = geodb.port, user = geodb.user, passwd = geodb.passwd) if store is not None: rscname = name if table.name != name else table.name grpswlyr = [] if overwrite: # See notes about possible issues in OGCatalog._publishExisting() flyr = catalog.get_layer(rscname) if flyr is not None: grpswlyr = groupsWithLayer(catalog, flyr) if grpswlyr: removeLayerFromGroups(catalog, flyr, grpswlyr) catalog.delete(flyr) frsc = store.get_resources(name=rscname) if frsc is not None: catalog.delete(frsc) epsg = table.srid if int(table.srid) != 0 else 4326 ftype = catalog.publish_featuretype(table.name, store, "EPSG:" + str(epsg)) # once table-based layer created, switch name to user-chosen if table.name != rscname: ftype.dirty["name"] = rscname ftype.dirty["title"] = rscname catalog.save(ftype) if overwrite and grpswlyr: ftype = catalog.get_resource(rscname) if ftype: addLayerToGroups(catalog, ftype, grpswlyr, workspace=workspace)
def initGui(self): verticalLayout = QtGui.QVBoxLayout() buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Close) self.okButton = buttonBox.button(QtGui.QDialogButtonBox.Ok) self.cancelButton = buttonBox.button(QtGui.QDialogButtonBox.Close) self.setWindowTitle('Publish style') horizontalLayout = QtGui.QHBoxLayout() horizontalLayout.setMargin(0) catalogLabel = QtGui.QLabel('Catalog') catalogLabel.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) self.catalogBox = QtGui.QComboBox() self.catalogBox.addItems(self.catalognames) self.catalogBox.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)) horizontalLayout.addWidget(catalogLabel) horizontalLayout.addWidget(self.catalogBox) verticalLayout.addLayout(horizontalLayout) horizontalLayout = QtGui.QHBoxLayout() horizontalLayout.setMargin(0) nameLabel = QtGui.QLabel('Name') nameLabel.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) self.nameBox = GSNameWidget( namemsg='', name=xmlNameFixUp(self.layername), nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=[], unique=False) self.nameBox.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)) horizontalLayout.addWidget(nameLabel) horizontalLayout.addWidget(self.nameBox) verticalLayout.addLayout(horizontalLayout) self.groupBox = QtGui.QGroupBox() self.groupBox.setTitle("") self.groupBox.setLayout(verticalLayout) layout = QtGui.QVBoxLayout() layout.addWidget(self.groupBox) layout.addWidget(buttonBox) self.setLayout(layout) buttonBox.accepted.connect(self.okPressed) buttonBox.rejected.connect(self.cancelPressed) self.catalogBox.currentIndexChanged[str].connect(self.updateCatalogStyles) self.nameBox.nameValidityChanged.connect(self.okButton.setEnabled) self.nameBox.overwritingChanged.connect(self.updateButtons) self.updateCatalogStyles(self.catalogBox.currentText()) self.okButton.setEnabled(self.nameBox.isValid()) self.updateButtons(self.nameBox.overwritingName()) self.resize(400,200)
def publishTable(table, catalog=None, workspace=None, overwrite=True, name=None, storename=None): if catalog is None: pass lyrname = xmlNameFixUp(name) # usually fixed up by now # check for table.name conflict in existing layer names where the table.name # is not the same as the user-chosen layer name, i.e. unintended overwrite resource = catalog.get_resource(table.name) if resource is not None and table.name != lyrname: raise Exception("PostGIS table name conflicts with " "existing GeoServer layer name: {0}\n" "You may need to rename GeoServer layer name.".format( table.name)) workspace = workspace if workspace is not None else catalog.get_default_workspace( ) connection = table.conn geodb = connection.geodb conname = "{0}_{1}".format(connection.name, table.schema) storename = xmlNameFixUp(storename or conname) if not xmlNameIsValid(storename): raise Exception("Database connection name is invalid XML and can " "not be auto-fixed: {0} -> {1}".format( conname, storename)) if not geodb.user: raise Exception("GeoServer requires database connection's username " "to be defined") store = createPGFeatureStore(catalog, storename, workspace=workspace, overwrite=True, host=geodb.host, database=geodb.dbname, schema=table.schema, port=geodb.port, user=geodb.user, passwd=geodb.passwd) if store is not None: rscname = name if table.name != name else table.name grpswlyr = [] if overwrite: # See notes about possible issues in OGCatalog._publishExisting() flyr = catalog.get_layer(rscname) if flyr is not None: grpswlyr = groupsWithLayer(catalog, flyr) if grpswlyr: removeLayerFromGroups(catalog, flyr, grpswlyr) catalog.delete(flyr) frsc = store.get_resources(name=rscname) if frsc is not None: catalog.delete(frsc) epsg = table.srid if int(table.srid) != 0 else 4326 ftype = catalog.publish_featuretype(table.name, store, "EPSG:" + str(epsg)) # once table-based layer created, switch name to user-chosen if table.name != rscname: ftype.dirty["name"] = rscname ftype.dirty["title"] = rscname catalog.save(ftype) if overwrite and grpswlyr: ftype = catalog.get_resource(rscname) if ftype: addLayerToGroups(catalog, ftype, grpswlyr, workspace=workspace)
def initGui(self): self.setWindowTitle('Publish layer') layout = QtGui.QVBoxLayout() gridLayout = QtGui.QGridLayout() gridLayout.setSpacing(10) gridLayout.setMargin(10) catalogLabel = QtGui.QLabel('Catalog') catalogLabel.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) gridLayout.addWidget(catalogLabel, 0, 0) self.catalogBox = QtGui.QComboBox() self.catalogBox.addItems(self.catalogs.keys()) self.catalogBox.currentIndexChanged.connect(self.catalogHasChanged) gridLayout.addWidget(self.catalogBox, 0, 1) workspaceLabel = QtGui.QLabel('Workspace') workspaceLabel.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) gridLayout.addWidget(workspaceLabel, 1, 0) self.workspaceBox = QtGui.QComboBox() cat = self.catalogs[self.catalogs.keys()[0]] self.workspaces = cat.get_workspaces() try: defaultWorkspace = cat.get_default_workspace() defaultWorkspace.fetch() defaultName = defaultWorkspace.dom.find('name').text except: defaultName = None workspaceNames = [w.name for w in self.workspaces] self.workspaceBox.addItems(workspaceNames) if defaultName is not None: self.workspaceBox.setCurrentIndex(workspaceNames.index(defaultName)) gridLayout.addWidget(self.workspaceBox, 1, 1) nameLabel = QtGui.QLabel('Layer') nameLabel.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed)) gridLayout.addWidget(nameLabel, 2, 0) gslayers = [lyr.name for lyr in cat.get_layers()] name = '' # handle PG Table, whose name attribute is not callable if self.layer is not None and hasattr(self.layer, 'name'): if isinstance(self.layer, Table): name = self.layer.name + "_table" else: # QgsMapLayer name = self.layer.name() if layers.isPostGisLayer(self.layer): name += "_table" self.nameBox = GSNameWidget( name=xmlNameFixUp(name), nameregex=xmlNameRegex(), nameregexmsg=xmlNameRegexMsg(), names=gslayers, unique=False) gridLayout.addWidget(self.nameBox, 2, 1) self.destGroupBox = QtGui.QGroupBox() self.destGroupBox.setLayout(gridLayout) layout.addWidget(self.destGroupBox) self.spacer = QtGui.QSpacerItem(20,40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) layout.addItem(self.spacer) self.buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) self.okButton = self.buttonBox.button(QtGui.QDialogButtonBox.Ok) self.cancelButton = self.buttonBox.button(QtGui.QDialogButtonBox.Cancel) layout.addWidget(self.buttonBox) self.setLayout(layout) self.nameBox.nameValidityChanged.connect(self.okButton.setEnabled) self.nameBox.overwritingChanged.connect(self.updateButtons) self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) # respond to intial validation self.okButton.setEnabled(self.nameBox.isValid()) self.updateButtons(self.nameBox.overwritingName()) self.resize(400,160)