def testExportFeatureFieldFormatter(self): """ Test exporting a feature with formatting fields """ # source layer source = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer", "parent", "memory") pr = source.dataProvider() pf1 = QgsFeature() pf1.setFields(source.fields()) pf1.setAttributes(["test1", 1]) pf2 = QgsFeature() pf2.setFields(source.fields()) pf2.setAttributes(["test2", 2]) assert pr.addFeatures([pf1, pf2]) setup = QgsEditorWidgetSetup('ValueMap', {"map": {"one": 1, "two": 2, "three": 3}}) source.setEditorWidgetSetup(1, setup) exporter = QgsJsonExporter() exporter.setVectorLayer(source) expected = """{ "type":"Feature", "id":0, "geometry":null, "properties":{ "fldtxt":"test1", "fldint":"one" } }""" self.assertEqual(exporter.exportFeature(pf1), expected)
def testCategories(self): layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer", "addfeat", "memory") layer.setEditorWidgetSetup(1, QgsEditorWidgetSetup("ValueMap", {'map': [{'One': '1'}, {'Two': '2'}]})) result = QgsCategorizedSymbolRenderer.createCategories([1, 2, 3], QgsMarkerSymbol(), layer, 'fldint') self.assertEqual(result[0].label(), 'One') self.assertEqual(result[1].label(), 'Two') self.assertEqual(result[2].label(), '(3)')
def testExportFeaturesWithLocale_regression20053(self): """ Test exporting feature export with range widgets and locale different than C Regression: https://issues.qgis.org/issues/20053 - decimal separator in csv files """ source = QgsVectorLayer("Point?field=name:string&field=cost:double&field=population:int&field=date:date", "parent", "memory") self.assertTrue(source.isValid()) fields = source.fields() feature = QgsFeature(fields, 5) feature.setGeometry(QgsGeometry(QgsPoint(5, 6))) feature.setAttributes(['Valsier Peninsula', 6.8, 198000, '2018-09-10']) exporter = QgsJsonExporter() # single feature expected = """{ "features": [ { "geometry": { "coordinates": [ 5.0, 6.0 ], "type": "Point" }, "id": 5, "properties": { "cost": 6.8, "date": "2018-09-10", "name": "Valsier Peninsula", "population": 198000 }, "type": "Feature" } ], "type": "FeatureCollection" }""" self.assertEqual(exporter.exportFeatures([feature], 2), expected) setup = QgsEditorWidgetSetup('Range', { 'AllowNull': True, 'Max': 2147483647, 'Min': -2147483648, 'Precision': 4, 'Step': 1, 'Style': 'SpinBox' } ) source.setEditorWidgetSetup(1, setup) source.setEditorWidgetSetup(2, setup) QLocale.setDefault(QLocale('it')) exporter.setVectorLayer(source) self.assertEqual(exporter.exportFeatures([feature], 2), expected)
def testExportAttributes(self): """ test exporting feature's attributes to JSON object """ fields = QgsFields() # test empty attributes feature = QgsFeature(fields, 5) expected = "{}" self.assertEqual(QgsJsonUtils.exportAttributes(feature), expected) # test feature with attributes fields.append(QgsField("name", QVariant.String)) fields.append(QgsField("cost", QVariant.Double)) fields.append(QgsField("population", QVariant.Int)) feature = QgsFeature(fields, 5) feature.setGeometry(QgsGeometry(QgsPoint(5, 6))) feature.setAttributes(['Valsier Peninsula', 6.8, 198]) expected = """{"name":"Valsier Peninsula", "cost":6.8, "population":198}""" self.assertEqual(QgsJsonUtils.exportAttributes(feature), expected) # test using field formatters source = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer", "parent", "memory") pf1 = QgsFeature() pf1.setFields(source.fields()) pf1.setAttributes(["test1", 1]) setup = QgsEditorWidgetSetup('ValueMap', {"map": {"one": 1, "two": 2, "three": 3}}) source.setEditorWidgetSetup(1, setup) expected = """{"fldtxt":"test1", "fldint":"one"}""" self.assertEqual(QgsJsonUtils.exportAttributes(pf1, source), expected)
def testExportFeatureRelations(self): """ Test exporting a feature with relations """ #parent layer parent = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer&field=foreignkey:integer", "parent", "memory") pr = parent.dataProvider() pf1 = QgsFeature() pf1.setFields(parent.fields()) pf1.setAttributes(["test1", 67, 123]) pf2 = QgsFeature() pf2.setFields(parent.fields()) pf2.setAttributes(["test2", 68, 124]) assert pr.addFeatures([pf1, pf2]) #child layer child = QgsVectorLayer( "Point?field=x:string&field=y:integer&field=z:integer", "referencedlayer", "memory") pr = child.dataProvider() f1 = QgsFeature() f1.setFields(child.fields()) f1.setAttributes(["foo", 123, 321]) f2 = QgsFeature() f2.setFields(child.fields()) f2.setAttributes(["bar", 123, 654]) f3 = QgsFeature() f3.setFields(child.fields()) f3.setAttributes(["foobar", 124, 554]) assert pr.addFeatures([f1, f2, f3]) QgsProject.instance().addMapLayers([child, parent]) rel = QgsRelation() rel.setId('rel1') rel.setName('relation one') rel.setReferencingLayer(child.id()) rel.setReferencedLayer(parent.id()) rel.addFieldPair('y', 'foreignkey') QgsProject.instance().relationManager().addRelation(rel) exporter = QgsJsonExporter() exporter.setVectorLayer(parent) self.assertEqual(exporter.vectorLayer(), parent) exporter.setIncludeRelated(True) self.assertEqual(exporter.includeRelated(), True) expected = """{ "type":"Feature", "id":0, "geometry":null, "properties":{ "fldtxt":"test1", "fldint":67, "foreignkey":123, "relation one":[{"x":"foo", "y":123, "z":321}, {"x":"bar", "y":123, "z":654}] } }""" self.assertEqual(exporter.exportFeature(pf1), expected) expected = """{ "type":"Feature", "id":0, "geometry":null, "properties":{ "fldtxt":"test2", "fldint":68, "foreignkey":124, "relation one":[{"x":"foobar", "y":124, "z":554}] } }""" self.assertEqual(exporter.exportFeature(pf2), expected) # with field formatter setup = QgsEditorWidgetSetup('ValueMap', {"map": {"apples": 123, "bananas": 124}}) child.setEditorWidgetSetup(1, setup) expected = """{ "type":"Feature", "id":0, "geometry":null, "properties":{ "fldtxt":"test1", "fldint":67, "foreignkey":123, "relation one":[{"x":"foo", "y":"apples", "z":321}, {"x":"bar", "y":"apples", "z":654}] } }""" self.assertEqual(exporter.exportFeature(pf1), expected) # test excluding related attributes exporter.setIncludeRelated(False) self.assertEqual(exporter.includeRelated(), False) expected = """{ "type":"Feature", "id":0, "geometry":null, "properties":{ "fldtxt":"test2", "fldint":68, "foreignkey":124 } }""" self.assertEqual(exporter.exportFeature(pf2), expected) # test without vector layer set exporter.setIncludeRelated(True) exporter.setVectorLayer(None) expected = """{ "type":"Feature", "id":0, "geometry":null, "properties":{ "fldtxt":"test2", "fldint":68, "foreignkey":124 } }""" self.assertEqual(exporter.exportFeature(pf2), expected)