def testWFST10(self): """Test WFS-T 1.0 (read-write)""" endpoint = self.__class__.basetestpath + '/fake_qgis_http_endpoint_WFS_T_1.0' with open(sanitize(endpoint, '?SERVICE=WFS?REQUEST=GetCapabilities?VERSION=1.0.0'), 'wb') as f: f.write(""" <WFS_Capabilities version="1.0.0" xmlns="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc"> <FeatureTypeList> <Operations> <Query/> <Insert/> <Update/> <Delete/> </Operations> <FeatureType> <Name>my:typename</Name> <Title>Title</Title> <Abstract>Abstract</Abstract> <SRS>EPSG:4326</SRS> <LatLongBoundingBox minx="-71.123" miny="66.33" maxx="-65.32" maxy="78.3"/> </FeatureType> </FeatureTypeList> </WFS_Capabilities>""") with open(sanitize(endpoint, '?SERVICE=WFS&REQUEST=DescribeFeatureType&VERSION=1.0.0&TYPENAME=my:typename'), 'wb') as f: f.write(""" <xsd:schema xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://my"> <xsd:import namespace="http://www.opengis.net/gml"/> <xsd:complexType name="my:typenameType"> <xsd:complexContent> <xsd:extension base="gml:AbstractFeatureType"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="0" name="intfield" nillable="true" type="xsd:int"/> <xsd:element maxOccurs="1" minOccurs="0" name="longfield" nillable="true" type="xsd:long"/> <xsd:element maxOccurs="1" minOccurs="0" name="stringfield" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="geometryProperty" nillable="true" type="gml:PointPropertyType"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:element name="typename" substitutionGroup="gml:_Feature" type="my:typenameType"/> </xsd:schema> """) vl = QgsVectorLayer(u"url='http://" + endpoint + u"' typename='my:typename' version='1.0.0'", u'test', u'WFS') assert vl.isValid() self.assertEqual(vl.dataProvider().capabilities(), QgsVectorDataProvider.AddFeatures + QgsVectorDataProvider.ChangeAttributeValues + QgsVectorDataProvider.ChangeGeometries + QgsVectorDataProvider.DeleteFeatures) (ret, _) = vl.dataProvider().addFeatures([QgsFeature()]) assert not ret self.assertEqual(vl.featureCount(), 0) assert not vl.dataProvider().deleteFeatures([0]) self.assertEqual(vl.featureCount(), 0) assert not vl.dataProvider().changeGeometryValues({0: QgsGeometry.fromWkt('Point (3 50)')}) assert not vl.dataProvider().changeAttributeValues({0: {0: 0}}) # Test addFeatures with open(sanitize(endpoint, '?SERVICE=WFS&POSTDATA=<Transaction xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" service="WFS" xsi:schemaLocation="http://my http://fake_qgis_http_endpoint?REQUEST=DescribeFeatureType&VERSION=1.0.0&TYPENAME=my:typename" xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml"><Insert xmlns="http://www.opengis.net/wfs"><typename xmlns="http://my"><intfield xmlns="http://my">1</intfield><longfield xmlns="http://my">1234567890123</longfield><stringfield xmlns="http://my">foo</stringfield><geometryProperty xmlns="http://my"><gml:Point srsName="EPSG:4326"><gml:coordinates cs="," ts=" ">2,49</gml:coordinates></gml:Point></geometryProperty></typename></Insert></Transaction>'), 'wb') as f: f.write(""" <wfs:WFS_TransactionResponse version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc"> <wfs:InsertResult> <ogc:FeatureId fid="typename.1" /> </wfs:InsertResult> <wfs:TransactionResult> <wfs:Status> <wfs:SUCCESS/> </wfs:Status> </wfs:TransactionResult> </wfs:WFS_TransactionResponse> """) f = QgsFeature() f.setAttributes([1, 1234567890123, 'foo']) f.setGeometry(QgsGeometry.fromWkt('Point (2 49)')) (ret, fl) = vl.dataProvider().addFeatures([f]) assert ret self.assertEqual(fl[0].id(), 1) self.assertEqual(vl.featureCount(), 1) values = [f['intfield'] for f in vl.getFeatures()] self.assertEqual(values, [1]) values = [f['longfield'] for f in vl.getFeatures()] self.assertEqual(values, [1234567890123]) values = [f['stringfield'] for f in vl.getFeatures()] self.assertEqual(values, ['foo']) got = [f.geometry() for f in vl.getFeatures()][0].geometry() self.assertEqual((got.x(), got.y()), (2.0, 49.0)) # Test changeGeometryValues with open(sanitize(endpoint, '?SERVICE=WFS&POSTDATA=<Transaction xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" service="WFS" xsi:schemaLocation="http://my http://fake_qgis_http_endpoint?REQUEST=DescribeFeatureType&VERSION=1.0.0&TYPENAME=my:typename" xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml"><Update xmlns="http://www.opengis.net/wfs" typeName="my:typename"><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">geometryProperty</Name><Value xmlns="http://www.opengis.net/wfs"><gml:Point srsName="EPSG:4326"><gml:coordinates cs="," ts=" ">3,50</gml:coordinates></gml:Point></Value></Property><Filter xmlns="http://www.opengis.net/ogc"><FeatureId xmlns="http://www.opengis.net/ogc" fid="typename.1"/></Filter></Update></Transaction>'), 'wb') as f: f.write(""" <wfs:WFS_TransactionResponse version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc"> <wfs:TransactionResult> <wfs:Status> <wfs:SUCCESS/> </wfs:Status> </wfs:TransactionResult> </wfs:WFS_TransactionResponse> """) ret = vl.dataProvider().changeGeometryValues({1: QgsGeometry.fromWkt('Point (3 50)')}) assert ret got = [f.geometry() for f in vl.getFeatures()][0].geometry() self.assertEqual((got.x(), got.y()), (3.0, 50.0)) values = [f['intfield'] for f in vl.getFeatures()] self.assertEqual(values, [1]) values = [f['longfield'] for f in vl.getFeatures()] self.assertEqual(values, [1234567890123]) values = [f['stringfield'] for f in vl.getFeatures()] self.assertEqual(values, ['foo']) # Test changeAttributeValues with open(sanitize(endpoint, '?SERVICE=WFS&POSTDATA=<Transaction xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" service="WFS" xsi:schemaLocation="http://my http://fake_qgis_http_endpoint?REQUEST=DescribeFeatureType&VERSION=1.0.0&TYPENAME=my:typename" xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml"><Update xmlns="http://www.opengis.net/wfs" typeName="my:typename"><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">intfield</Name><Value xmlns="http://www.opengis.net/wfs">2</Value></Property><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">longfield</Name><Value xmlns="http://www.opengis.net/wfs">3</Value></Property><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">stringfield</Name><Value xmlns="http://www.opengis.net/wfs">bar</Value></Property><Filter xmlns="http://www.opengis.net/ogc"><FeatureId xmlns="http://www.opengis.net/ogc" fid="typename.1"/></Filter></Update></Transaction>'), 'wb') as f: f.write(""" <wfs:WFS_TransactionResponse version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc"> <wfs:TransactionResult> <wfs:Status> <wfs:SUCCESS/> </wfs:Status> </wfs:TransactionResult> </wfs:WFS_TransactionResponse> """) assert vl.dataProvider().changeAttributeValues({1: {0: 2, 1: 3, 2: "bar"}}) values = [f['intfield'] for f in vl.getFeatures()] self.assertEqual(values, [2]) values = [f['longfield'] for f in vl.getFeatures()] self.assertEqual(values, [3]) values = [f['stringfield'] for f in vl.getFeatures()] self.assertEqual(values, ['bar']) got = [f.geometry() for f in vl.getFeatures()][0].geometry() self.assertEqual((got.x(), got.y()), (3.0, 50.0)) # Test deleteFeatures with open(sanitize(endpoint, '?SERVICE=WFS&POSTDATA=<Transaction xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" service="WFS" xsi:schemaLocation="http://my http://fake_qgis_http_endpoint?REQUEST=DescribeFeatureType&VERSION=1.0.0&TYPENAME=my:typename" xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml"><Delete xmlns="http://www.opengis.net/wfs" typeName="my:typename"><Filter xmlns="http://www.opengis.net/ogc"><FeatureId xmlns="http://www.opengis.net/ogc" fid="typename.1"/></Filter></Delete></Transaction>'), 'wb') as f: f.write(""" <wfs:WFS_TransactionResponse version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc"> <wfs:TransactionResult> <wfs:Status> <wfs:SUCCESS/> </wfs:Status> </wfs:TransactionResult> </wfs:WFS_TransactionResponse> """) assert vl.dataProvider().deleteFeatures([1]) self.assertEqual(vl.featureCount(), 0)
def testWFST10(self): """Test WFS-T 1.0 (read-write)""" endpoint = self.__class__.basetestpath + '/fake_qgis_http_endpoint_WFS_T_1.0' with open( sanitize(endpoint, '?SERVICE=WFS?REQUEST=GetCapabilities?VERSION=1.0.0'), 'wb') as f: f.write(""" <WFS_Capabilities version="1.0.0" xmlns="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc"> <FeatureTypeList> <Operations> <Query/> <Insert/> <Update/> <Delete/> </Operations> <FeatureType> <Name>my:typename</Name> <Title>Title</Title> <Abstract>Abstract</Abstract> <SRS>EPSG:4326</SRS> <LatLongBoundingBox minx="-71.123" miny="66.33" maxx="-65.32" maxy="78.3"/> </FeatureType> </FeatureTypeList> </WFS_Capabilities>""") with open( sanitize( endpoint, '?SERVICE=WFS&REQUEST=DescribeFeatureType&VERSION=1.0.0&TYPENAME=my:typename' ), 'wb') as f: f.write(""" <xsd:schema xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://my"> <xsd:import namespace="http://www.opengis.net/gml"/> <xsd:complexType name="my:typenameType"> <xsd:complexContent> <xsd:extension base="gml:AbstractFeatureType"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="0" name="intfield" nillable="true" type="xsd:int"/> <xsd:element maxOccurs="1" minOccurs="0" name="longfield" nillable="true" type="xsd:long"/> <xsd:element maxOccurs="1" minOccurs="0" name="stringfield" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="geometryProperty" nillable="true" type="gml:PointPropertyType"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:element name="typename" substitutionGroup="gml:_Feature" type="my:typenameType"/> </xsd:schema> """) vl = QgsVectorLayer( u"url='http://" + endpoint + u"' typename='my:typename' version='1.0.0'", u'test', u'WFS') assert vl.isValid() self.assertEquals( vl.dataProvider().capabilities(), QgsVectorDataProvider.AddFeatures + QgsVectorDataProvider.ChangeAttributeValues + QgsVectorDataProvider.ChangeGeometries + QgsVectorDataProvider.DeleteFeatures) (ret, _) = vl.dataProvider().addFeatures([QgsFeature()]) assert not ret self.assertEquals(vl.featureCount(), 0) assert not vl.dataProvider().deleteFeatures([0]) self.assertEquals(vl.featureCount(), 0) assert not vl.dataProvider().changeGeometryValues( {0: QgsGeometry.fromWkt('Point (3 50)')}) assert not vl.dataProvider().changeAttributeValues({0: {0: 0}}) # Test addFeatures with open( sanitize( endpoint, '?SERVICE=WFS&POSTDATA=<Transaction xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" service="WFS" xsi:schemaLocation="http://my http://fake_qgis_http_endpoint?REQUEST=DescribeFeatureType&VERSION=1.0.0&TYPENAME=my:typename" xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml"><Insert xmlns="http://www.opengis.net/wfs"><typename xmlns="http://my"><intfield xmlns="http://my">1</intfield><longfield xmlns="http://my">1234567890123</longfield><stringfield xmlns="http://my">foo</stringfield><geometryProperty xmlns="http://my"><gml:Point srsName="EPSG:4326"><gml:coordinates cs="," ts=" ">2,49</gml:coordinates></gml:Point></geometryProperty></typename></Insert></Transaction>' ), 'wb') as f: f.write(""" <wfs:WFS_TransactionResponse version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc"> <wfs:InsertResult> <ogc:FeatureId fid="typename.1" /> </wfs:InsertResult> <wfs:TransactionResult> <wfs:Status> <wfs:SUCCESS/> </wfs:Status> </wfs:TransactionResult> </wfs:WFS_TransactionResponse> """) f = QgsFeature() f.setAttributes([1, 1234567890123, 'foo']) f.setGeometry(QgsGeometry.fromWkt('Point (2 49)')) (ret, fl) = vl.dataProvider().addFeatures([f]) assert ret self.assertEquals(fl[0].id(), 1) self.assertEquals(vl.featureCount(), 1) values = [f['intfield'] for f in vl.getFeatures()] self.assertEquals(values, [1]) values = [f['longfield'] for f in vl.getFeatures()] self.assertEquals(values, [1234567890123]) values = [f['stringfield'] for f in vl.getFeatures()] self.assertEquals(values, ['foo']) got = [f.geometry() for f in vl.getFeatures()][0].geometry() self.assertEquals((got.x(), got.y()), (2.0, 49.0)) # Test changeGeometryValues with open( sanitize( endpoint, '?SERVICE=WFS&POSTDATA=<Transaction xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" service="WFS" xsi:schemaLocation="http://my http://fake_qgis_http_endpoint?REQUEST=DescribeFeatureType&VERSION=1.0.0&TYPENAME=my:typename" xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml"><Update xmlns="http://www.opengis.net/wfs" typeName="my:typename"><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">geometryProperty</Name><Value xmlns="http://www.opengis.net/wfs"><gml:Point srsName="EPSG:4326"><gml:coordinates cs="," ts=" ">3,50</gml:coordinates></gml:Point></Value></Property><Filter xmlns="http://www.opengis.net/ogc"><FeatureId xmlns="http://www.opengis.net/ogc" fid="typename.1"/></Filter></Update></Transaction>' ), 'wb') as f: f.write(""" <wfs:WFS_TransactionResponse version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc"> <wfs:TransactionResult> <wfs:Status> <wfs:SUCCESS/> </wfs:Status> </wfs:TransactionResult> </wfs:WFS_TransactionResponse> """) ret = vl.dataProvider().changeGeometryValues( {1: QgsGeometry.fromWkt('Point (3 50)')}) assert ret got = [f.geometry() for f in vl.getFeatures()][0].geometry() self.assertEquals((got.x(), got.y()), (3.0, 50.0)) values = [f['intfield'] for f in vl.getFeatures()] self.assertEquals(values, [1]) values = [f['longfield'] for f in vl.getFeatures()] self.assertEquals(values, [1234567890123]) values = [f['stringfield'] for f in vl.getFeatures()] self.assertEquals(values, ['foo']) # Test changeAttributeValues with open( sanitize( endpoint, '?SERVICE=WFS&POSTDATA=<Transaction xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" service="WFS" xsi:schemaLocation="http://my http://fake_qgis_http_endpoint?REQUEST=DescribeFeatureType&VERSION=1.0.0&TYPENAME=my:typename" xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml"><Update xmlns="http://www.opengis.net/wfs" typeName="my:typename"><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">intfield</Name><Value xmlns="http://www.opengis.net/wfs">2</Value></Property><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">longfield</Name><Value xmlns="http://www.opengis.net/wfs">3</Value></Property><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">stringfield</Name><Value xmlns="http://www.opengis.net/wfs">bar</Value></Property><Filter xmlns="http://www.opengis.net/ogc"><FeatureId xmlns="http://www.opengis.net/ogc" fid="typename.1"/></Filter></Update></Transaction>' ), 'wb') as f: f.write(""" <wfs:WFS_TransactionResponse version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc"> <wfs:TransactionResult> <wfs:Status> <wfs:SUCCESS/> </wfs:Status> </wfs:TransactionResult> </wfs:WFS_TransactionResponse> """) assert vl.dataProvider().changeAttributeValues( {1: { 0: 2, 1: 3, 2: "bar" }}) values = [f['intfield'] for f in vl.getFeatures()] self.assertEquals(values, [2]) values = [f['longfield'] for f in vl.getFeatures()] self.assertEquals(values, [3]) values = [f['stringfield'] for f in vl.getFeatures()] self.assertEquals(values, ['bar']) got = [f.geometry() for f in vl.getFeatures()][0].geometry() self.assertEquals((got.x(), got.y()), (3.0, 50.0)) # Test deleteFeatures with open( sanitize( endpoint, '?SERVICE=WFS&POSTDATA=<Transaction xmlns="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" service="WFS" xsi:schemaLocation="http://my http://fake_qgis_http_endpoint?REQUEST=DescribeFeatureType&VERSION=1.0.0&TYPENAME=my:typename" xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml"><Delete xmlns="http://www.opengis.net/wfs" typeName="my:typename"><Filter xmlns="http://www.opengis.net/ogc"><FeatureId xmlns="http://www.opengis.net/ogc" fid="typename.1"/></Filter></Delete></Transaction>' ), 'wb') as f: f.write(""" <wfs:WFS_TransactionResponse version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc"> <wfs:TransactionResult> <wfs:Status> <wfs:SUCCESS/> </wfs:Status> </wfs:TransactionResult> </wfs:WFS_TransactionResponse> """) assert vl.dataProvider().deleteFeatures([1]) self.assertEquals(vl.featureCount(), 0)