def testCreateSaveOpenStorageWithString(self): # Empty string in copy mode. A new database is created in a temporary # file. s0 = QgsAuxiliaryStorage() self.assertTrue(s0.isValid()) # saveAs should be used instead of save in case of an empty string # given to the constructor of QgsAuxiliaryStorage self.assertEqual(s0.fileName(), "") self.assertFalse(s0.save()) # Create a new auxiliary layer with 'pk' as key vl0 = createLayer() pkf = vl0.fields().field(vl0.fields().indexOf('pk')) al0 = s0.createAuxiliaryLayer(pkf, vl0) self.assertTrue(al0.isValid()) # Test the auxiliary key key = al0.joinInfo().targetFieldName() self.assertEqual(key, 'pk') # Add a field in auxiliary layer p = QgsPropertyDefinition('propName', QgsPropertyDefinition.DataTypeNumeric, '', '', 'user') self.assertTrue(al0.addAuxiliaryField(p)) # saveAs without saving the auxiliary layer, the auxiliary field is lost f = tmpPath() self.assertTrue(s0.saveAs(f)) # Open the previous database. s1 = QgsAuxiliaryStorage(f) self.assertTrue(s1.isValid()) # Load the auxiliary layer from auxiliary storage self.assertTrue(vl0.loadAuxiliaryLayer(s1, key)) # As the vl0 has not been saved before saving the storage, there # shouldn't have auxiliary fields self.assertEqual(len(vl0.auxiliaryLayer().auxiliaryFields()), 0) # Save the layer before saving the storage self.assertTrue(al0.save()) self.assertTrue(s0.saveAs(f)) # Open the previous database. s2 = QgsAuxiliaryStorage(f) self.assertTrue(s2.isValid()) # Load the auxiliary layer from auxiliary storage self.assertTrue(vl0.loadAuxiliaryLayer(s2, key)) # As the vl0 has been saved before saving the storage, there # should have 1 auxiliary field self.assertEqual(len(vl0.auxiliaryLayer().auxiliaryFields()), 1) # save is available on s2 self.assertTrue(s2.save())
def testClear(self): s = QgsAuxiliaryStorage() self.assertTrue(s.isValid()) # Create a new auxiliary layer with 'pk' as key vl = createLayer() pkf = vl.fields().field(vl.fields().indexOf('pk')) al = s.createAuxiliaryLayer(pkf, vl) self.assertTrue(al.isValid()) vl.setAuxiliaryLayer(al) # Add a field in auxiliary layer p = QgsPropertyDefinition('myprop', QgsPropertyDefinition.DataTypeNumeric, '', '', 'me') self.assertFalse(al.exists(p)) self.assertTrue(al.addAuxiliaryField(p)) self.assertTrue(al.exists(p)) # Count auxiliary features self.assertEqual(al.featureCount(), 0) # Set value for auxiliary fields req = QgsFeatureRequest().setFilterExpression("name = 'Honey'") f = QgsFeature() vl.getFeatures(req).nextFeature(f) self.assertTrue(f.isValid()) afName = QgsAuxiliaryLayer.nameFromProperty(p, True) index = vl.fields().indexOf(afName) vl.changeAttributeValue(f.id(), index, 333) # Count auxiliary features self.assertEqual(al.featureCount(), 1) # Clear and count al.clear() self.assertEqual(al.featureCount(), 0)
def testCreateSaveOpenStorageWithProject(self): # New project without fileName p = QgsProject() # Create storage s0 = QgsAuxiliaryStorage(p) self.assertTrue(s0.isValid()) # saveAs should be used instead of save in case of an empty string # given to the constructor of QgsAuxiliaryStorage self.assertEqual(s0.fileName(), "") self.assertFalse(s0.save()) # saveAs f = tmpPath() self.assertTrue(s0.saveAs(f))
def testCreateSaveOpenStorageWithProject(self): # New project without fileName p = QgsProject() # Create storage s0 = QgsAuxiliaryStorage(p) self.assertTrue(s0.isValid()) # saveAs should be used instead of save in case of an empty string # given to the constructor of QgsAuxiliaryStorage self.assertEqual(s0.fileName(), "") self.assertFalse(s0.save()) # saveAs f = tmpPath() self.assertTrue(s0.saveAs(f))
def testSetAuxiliaryLayer(self): s = QgsAuxiliaryStorage() self.assertTrue(s.isValid()) # Create a new auxiliary layer with 'pk' as key vl = createLayer() pkf = vl.fields().field(vl.fields().indexOf('pk')) al = s.createAuxiliaryLayer(pkf, vl) self.assertTrue(al.isValid()) vl.setAuxiliaryLayer(al) self.assertIsNotNone(vl.auxiliaryLayer()) # Clear auxiliary layer al.clear() # Remove auxiliary layer vl.setAuxiliaryLayer() self.assertIsNone(vl.auxiliaryLayer())
def testSetAuxiliaryLayer(self): s = QgsAuxiliaryStorage() self.assertTrue(s.isValid()) # Create a new auxiliary layer with 'pk' as key vl = createLayer() pkf = vl.fields().field(vl.fields().indexOf('pk')) al = s.createAuxiliaryLayer(pkf, vl) self.assertTrue(al.isValid()) vl.setAuxiliaryLayer(al) self.assertIsNotNone(vl.auxiliaryLayer()) # Clear auxiliary layer al.clear() # Remove auxiliary layer vl.setAuxiliaryLayer() self.assertIsNone(vl.auxiliaryLayer())
def testCreateProperty(self): s = QgsAuxiliaryStorage() self.assertTrue(s.isValid()) # Create a new auxiliary layer with 'pk' as key vl = createLayer() pkf = vl.fields().field(vl.fields().indexOf('pk')) al = s.createAuxiliaryLayer(pkf, vl) self.assertTrue(al.isValid()) vl.setAuxiliaryLayer(al) # Create a new labeling property on layer without labels key = QgsPalLayerSettings.PositionX index = QgsAuxiliaryLayer.createProperty(key, vl) self.assertEqual(index, -1) vl.setLabeling(QgsVectorLayerSimpleLabeling(QgsPalLayerSettings())) index = QgsAuxiliaryLayer.createProperty(key, vl) p = QgsPalLayerSettings.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex)
def testCreateProperty(self): s = QgsAuxiliaryStorage() self.assertTrue(s.isValid()) # Create a new auxiliary layer with 'pk' as key vl = createLayer() pkf = vl.fields().field(vl.fields().indexOf('pk')) al = s.createAuxiliaryLayer(pkf, vl) self.assertTrue(al.isValid()) vl.setAuxiliaryLayer(al) # Create a new labeling property on layer without labels key = QgsPalLayerSettings.PositionX index = QgsAuxiliaryLayer.createProperty(key, vl) self.assertEqual(index, -1) vl.setLabeling(QgsVectorLayerSimpleLabeling(QgsPalLayerSettings())) index = QgsAuxiliaryLayer.createProperty(key, vl) p = QgsPalLayerSettings.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex)
def testClear(self): s = QgsAuxiliaryStorage() self.assertTrue(s.isValid()) # Create a new auxiliary layer with 'pk' as key vl = createLayer() pkf = vl.fields().field(vl.fields().indexOf('pk')) al = s.createAuxiliaryLayer(pkf, vl) self.assertTrue(al.isValid()) vl.setAuxiliaryLayer(al) # Add a field in auxiliary layer p = QgsPropertyDefinition('myprop', QgsPropertyDefinition.DataTypeNumeric, '', '', 'me') self.assertFalse(al.exists(p)) self.assertTrue(al.addAuxiliaryField(p)) self.assertTrue(al.exists(p)) # Count auxiliary features self.assertEqual(al.featureCount(), 0) # Set value for auxiliary fields req = QgsFeatureRequest().setFilterExpression("name = 'Honey'") f = QgsFeature() vl.getFeatures(req).nextFeature(f) self.assertTrue(f.isValid()) afName = QgsAuxiliaryLayer.nameFromProperty(p, True) index = vl.fields().indexOf(afName) vl.changeAttributeValue(f.id(), index, 333) # Count auxiliary features self.assertEqual(al.featureCount(), 1) # Clear and count al.clear() self.assertEqual(al.featureCount(), 0)
def testAuxiliaryFieldWidgets(self): # Init storage s = QgsAuxiliaryStorage() self.assertTrue(s.isValid()) # Create a new auxiliary layer with 'pk' as key vl = createLayer() pkf = vl.fields().field(vl.fields().indexOf('pk')) al = s.createAuxiliaryLayer(pkf, vl) self.assertTrue(al.isValid()) # Set the auxiliary layer to the vector layer vl.setAuxiliaryLayer(al) # Add a visible property p = QgsPropertyDefinition('propName', QgsPropertyDefinition.DataTypeNumeric, '', '', 'user') self.assertTrue(al.addAuxiliaryField(p)) index = al.indexOfPropertyDefinition(p) self.assertFalse(al.isHiddenProperty(index)) afName = QgsAuxiliaryLayer.nameFromProperty(p, True) index = vl.fields().indexOf(afName) setup = vl.editorWidgetSetup(index) self.assertEqual(setup.type(), '') tested = False for c in vl.attributeTableConfig().columns(): if c.name == afName: self.assertFalse(c.hidden) tested = True break self.assertTrue(tested) # Add a hidden property p = QgsPalLayerSettings.propertyDefinitions()[ QgsPalLayerSettings.PositionX] self.assertTrue(al.addAuxiliaryField(p)) index = al.indexOfPropertyDefinition(p) self.assertTrue(al.isHiddenProperty(index)) afName = QgsAuxiliaryLayer.nameFromProperty(p, True) index = vl.fields().indexOf(afName) setup = vl.editorWidgetSetup(index) self.assertEqual(setup.type(), 'Hidden') tested = False for c in vl.attributeTableConfig().columns(): if c.name == afName: self.assertTrue(c.hidden) tested = True break self.assertTrue(tested) # Add a color property p = QgsSymbolLayer.propertyDefinitions()[ QgsSymbolLayer.PropertyFillColor] self.assertTrue(al.addAuxiliaryField(p)) index = al.indexOfPropertyDefinition(p) self.assertFalse(al.isHiddenProperty(index)) afName = QgsAuxiliaryLayer.nameFromProperty(p, True) index = vl.fields().indexOf(afName) setup = vl.editorWidgetSetup(index) self.assertEqual(setup.type(), 'Color')
def testCreatePropertyDiagram(self): s = QgsAuxiliaryStorage() self.assertTrue(s.isValid()) # Create a new auxiliary layer with 'pk' as key vl = createLayer() pkf = vl.fields().field(vl.fields().indexOf('pk')) al = s.createAuxiliaryLayer(pkf, vl) self.assertTrue(al.isValid()) vl.setAuxiliaryLayer(al) # Create a new labeling property on layer without labels key = QgsDiagramLayerSettings.PositionX index = QgsAuxiliaryLayer.createProperty(key, vl) self.assertEqual(index, -1) renderer = QgsSingleCategoryDiagramRenderer() diagram_settings = QgsDiagramLayerSettings() vl.setDiagramRenderer(renderer) vl.setDiagramLayerSettings(diagram_settings) index = QgsAuxiliaryLayer.createProperty(key, vl) p = QgsDiagramLayerSettings.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) settings = vl.diagramLayerSettings() self.assertTrue(settings.dataDefinedProperties().property(key).isActive()) self.assertEqual(settings.dataDefinedProperties().property(key).field(), "auxiliary_storage_diagram_positionx") # with existing property key = QgsDiagramLayerSettings.Distance settings = QgsDiagramLayerSettings() settings.dataDefinedProperties().setProperty(key, QgsProperty.fromExpression('$y + 20')) vl.setDiagramLayerSettings(settings) # without overwriting existing, property should be upgraded to coalesce("aux field", 'existing expression') type index = QgsAuxiliaryLayer.createProperty(key, vl, False) p = QgsDiagramLayerSettings.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) settings = vl.diagramLayerSettings() self.assertTrue(settings.dataDefinedProperties().property(key).isActive()) self.assertEqual(settings.dataDefinedProperties().property(key).asExpression(), 'coalesce("auxiliary_storage_diagram_distance",$y + 20)') # with overwrite existing key = QgsDiagramLayerSettings.PositionY settings = QgsDiagramLayerSettings() settings.dataDefinedProperties().setProperty(key, QgsProperty.fromExpression('$y > 20')) vl.setDiagramLayerSettings(settings) # existing property should be discarded index = QgsAuxiliaryLayer.createProperty(key, vl, True) p = QgsDiagramLayerSettings.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) settings = vl.diagramLayerSettings() self.assertTrue(settings.dataDefinedProperties().property(key).isActive()) self.assertEqual(settings.dataDefinedProperties().property(key).field(), 'auxiliary_storage_diagram_positiony')
def testCreateCalloutProperty(self): s = QgsAuxiliaryStorage() self.assertTrue(s.isValid()) # Create a new auxiliary layer with 'pk' as key vl = createLayer() pkf = vl.fields().field(vl.fields().indexOf('pk')) al = s.createAuxiliaryLayer(pkf, vl) self.assertTrue(al.isValid()) vl.setAuxiliaryLayer(al) # Create a new callout property on layer without labels key = QgsCallout.DestinationX index = QgsAuxiliaryLayer.createProperty(key, vl) self.assertEqual(index, -1) # Labeling, but no callouts settings = QgsPalLayerSettings() settings.setCallout(None) vl.setLabeling(QgsVectorLayerSimpleLabeling(settings)) index = QgsAuxiliaryLayer.createProperty(key, vl) self.assertEqual(index, -1) # callouts settings = QgsPalLayerSettings() callout = QgsSimpleLineCallout() callout.setEnabled(True) settings.setCallout(callout) vl.setLabeling(QgsVectorLayerSimpleLabeling(settings)) index = QgsAuxiliaryLayer.createProperty(key, vl) p = QgsCallout.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) settings = vl.labeling().settings() self.assertEqual(settings.callout().dataDefinedProperties().property(key), QgsProperty.fromField('auxiliary_storage_callouts_destinationx')) key2 = QgsCallout.DestinationY index = QgsAuxiliaryLayer.createProperty(key2, vl) p = QgsCallout.propertyDefinitions()[key2] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) settings = vl.labeling().settings() self.assertEqual(settings.callout().dataDefinedProperties().property(key), QgsProperty.fromField('auxiliary_storage_callouts_destinationx')) self.assertEqual(settings.callout().dataDefinedProperties().property(key2), QgsProperty.fromField('auxiliary_storage_callouts_destinationy')) # with existing property key = QgsCallout.OriginX settings = QgsPalLayerSettings() callout = QgsSimpleLineCallout() callout.dataDefinedProperties().setProperty(key, QgsProperty.fromExpression('$x + 20')) callout.setEnabled(True) settings.setCallout(callout) vl.setLabeling(QgsVectorLayerSimpleLabeling(settings)) # without overwriting existing, property should be upgraded to coalesce("aux field", 'existing expression') type index = QgsAuxiliaryLayer.createProperty(key, vl, False) p = QgsCallout.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) settings = vl.labeling().settings() self.assertTrue(settings.callout().dataDefinedProperties().property(key).isActive()) self.assertEqual(settings.callout().dataDefinedProperties().property(key).asExpression(), 'coalesce("auxiliary_storage_callouts_originx",$x + 20)') # with overwrite existing key = QgsCallout.OriginY callout = QgsSimpleLineCallout() callout.dataDefinedProperties().setProperty(key, QgsProperty.fromExpression('$y + 20')) settings.setCallout(callout) vl.setLabeling(QgsVectorLayerSimpleLabeling(settings)) # existing property should be discarded index = QgsAuxiliaryLayer.createProperty(key, vl, True) p = QgsCallout.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) settings = vl.labeling().settings() self.assertTrue(settings.callout().dataDefinedProperties().property(key).isActive()) self.assertEqual(settings.callout().dataDefinedProperties().property(key).field(), 'auxiliary_storage_callouts_originy')
def testCreateProperty(self): s = QgsAuxiliaryStorage() self.assertTrue(s.isValid()) # Create a new auxiliary layer with 'pk' as key vl = createLayer() pkf = vl.fields().field(vl.fields().indexOf('pk')) al = s.createAuxiliaryLayer(pkf, vl) self.assertTrue(al.isValid()) vl.setAuxiliaryLayer(al) # Create a new labeling property on layer without labels key = QgsPalLayerSettings.PositionX index = QgsAuxiliaryLayer.createProperty(key, vl) self.assertEqual(index, -1) vl.setLabeling(QgsVectorLayerSimpleLabeling(QgsPalLayerSettings())) index = QgsAuxiliaryLayer.createProperty(key, vl) p = QgsPalLayerSettings.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) # with existing property key = QgsPalLayerSettings.PositionY settings = QgsPalLayerSettings() settings.dataDefinedProperties().setProperty(key, QgsProperty.fromExpression('$y + 20')) vl.setLabeling(QgsVectorLayerSimpleLabeling(settings)) # without overwriting existing, property should be upgraded to coalesce("aux field", 'existing expression') type index = QgsAuxiliaryLayer.createProperty(key, vl, False) p = QgsPalLayerSettings.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) settings = vl.labeling().settings() self.assertTrue(settings.dataDefinedProperties().property(key).isActive()) self.assertEqual(settings.dataDefinedProperties().property(key).asExpression(), 'coalesce("auxiliary_storage_labeling_positiony",$y + 20)') # with existing but invalid field name key = QgsPalLayerSettings.PositionY settings = QgsPalLayerSettings() settings.dataDefinedProperties().setProperty(key, QgsProperty.fromField('')) vl.setLabeling(QgsVectorLayerSimpleLabeling(settings)) # even when asked to not overwrite existing, this is an invalid property and should be overwritten index = QgsAuxiliaryLayer.createProperty(key, vl, False) p = QgsPalLayerSettings.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) settings = vl.labeling().settings() self.assertTrue(settings.dataDefinedProperties().property(key).isActive()) self.assertEqual(settings.dataDefinedProperties().property(key).asExpression(), '"auxiliary_storage_labeling_positiony"') # with existing valid field name key = QgsPalLayerSettings.PositionY settings = QgsPalLayerSettings() settings.dataDefinedProperties().setProperty(key, QgsProperty.fromField('asd')) vl.setLabeling(QgsVectorLayerSimpleLabeling(settings)) index = QgsAuxiliaryLayer.createProperty(key, vl, False) p = QgsPalLayerSettings.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) settings = vl.labeling().settings() self.assertTrue(settings.dataDefinedProperties().property(key).isActive()) self.assertEqual(settings.dataDefinedProperties().property(key).asExpression(), 'coalesce("auxiliary_storage_labeling_positiony","asd")') # with overwrite existing key = QgsPalLayerSettings.Show settings = QgsPalLayerSettings() settings.dataDefinedProperties().setProperty(key, QgsProperty.fromExpression('$y > 20')) vl.setLabeling(QgsVectorLayerSimpleLabeling(settings)) # existing property should be discarded index = QgsAuxiliaryLayer.createProperty(key, vl, True) p = QgsPalLayerSettings.propertyDefinitions()[key] afName = QgsAuxiliaryLayer.nameFromProperty(p, True) afIndex = vl.fields().indexOf(afName) self.assertEqual(index, afIndex) settings = vl.labeling().settings() self.assertTrue(settings.dataDefinedProperties().property(key).isActive()) self.assertEqual(settings.dataDefinedProperties().property(key).field(), 'auxiliary_storage_labeling_show')
def testAuxiliaryFieldWidgets(self): # Init storage s = QgsAuxiliaryStorage() self.assertTrue(s.isValid()) # Create a new auxiliary layer with 'pk' as key vl = createLayer() pkf = vl.fields().field(vl.fields().indexOf('pk')) al = s.createAuxiliaryLayer(pkf, vl) self.assertTrue(al.isValid()) # Set the auxiliary layer to the vector layer vl.setAuxiliaryLayer(al) # Add a visible property p = QgsPropertyDefinition('propName', QgsPropertyDefinition.DataTypeNumeric, '', '', 'user') self.assertTrue(al.addAuxiliaryField(p)) index = al.indexOfPropertyDefinition(p) self.assertFalse(al.isHiddenProperty(index)) afName = QgsAuxiliaryLayer.nameFromProperty(p, True) index = vl.fields().indexOf(afName) setup = vl.editorWidgetSetup(index) self.assertEqual(setup.type(), '') tested = False for c in vl.attributeTableConfig().columns(): if c.name == afName: self.assertFalse(c.hidden) tested = True break self.assertTrue(tested) # Add a hidden property p = QgsPalLayerSettings.propertyDefinitions()[QgsPalLayerSettings.PositionX] self.assertTrue(al.addAuxiliaryField(p)) index = al.indexOfPropertyDefinition(p) self.assertTrue(al.isHiddenProperty(index)) afName = QgsAuxiliaryLayer.nameFromProperty(p, True) index = vl.fields().indexOf(afName) setup = vl.editorWidgetSetup(index) self.assertEqual(setup.type(), 'Hidden') tested = False for c in vl.attributeTableConfig().columns(): if c.name == afName: self.assertTrue(c.hidden) tested = True break self.assertTrue(tested) # Add a color property p = QgsSymbolLayer.propertyDefinitions()[QgsSymbolLayer.PropertyFillColor] self.assertTrue(al.addAuxiliaryField(p)) index = al.indexOfPropertyDefinition(p) self.assertFalse(al.isHiddenProperty(index)) afName = QgsAuxiliaryLayer.nameFromProperty(p, True) index = vl.fields().indexOf(afName) setup = vl.editorWidgetSetup(index) self.assertEqual(setup.type(), 'Color')