@@ -2638,6 +2638,59 @@ def testDateTimeTimeZoneMilliseconds(self):
2638
2638
got = [feat for feat in vl .getFeatures ()]
2639
2639
self .assertEqual (got [0 ]["dt" ], new_dt )
2640
2640
2641
+ def testTransactionModeAutoWithFilter (self ):
2642
+
2643
+ temp_dir = QTemporaryDir ()
2644
+ temp_path = temp_dir .path ()
2645
+ filename = os .path .join (temp_path , "test.gpkg" )
2646
+ ds = ogr .GetDriverByName ("GPKG" ).CreateDataSource (filename )
2647
+ lyr = ds .CreateLayer ("points" , geom_type = ogr .wkbPoint )
2648
+ lyr .CreateField (ogr .FieldDefn ('name' , ogr .OFTString ))
2649
+ f = ogr .Feature (lyr .GetLayerDefn ())
2650
+ f ['name' ] = 'a'
2651
+ f .SetGeometry (ogr .CreateGeometryFromWkt ('POINT(1 2)' ))
2652
+ lyr .CreateFeature (f )
2653
+ f = None
2654
+ ds = None
2655
+ ds = None
2656
+
2657
+ vl = QgsVectorLayer (filename )
2658
+ self .assertTrue (vl .isValid ())
2659
+ self .assertEqual (vl .featureCount (), 1 )
2660
+ self .assertEqual (next (vl .getFeatures ())['name' ], 'a' )
2661
+
2662
+ p = QgsProject ()
2663
+ p .setAutoTransaction (True )
2664
+ self .assertTrue (p .addMapLayers ([vl ]))
2665
+ self .assertTrue (vl .setSubsetString ('"name" IN (\' a\' , \' b\' )' ))
2666
+ self .assertEqual (vl .featureCount (), 1 )
2667
+ self .assertTrue (vl .startEditing ())
2668
+
2669
+ # Add feature
2670
+ f = QgsFeature (vl .fields ())
2671
+ f .setAttribute ('name' , 'b' )
2672
+ g = QgsGeometry .fromWkt ('POINT(3 4)' )
2673
+ f .setGeometry (g )
2674
+
2675
+ # This triggers the issue because it sets the subset filter
2676
+ req = QgsFeatureRequest ()
2677
+ req .setFilterExpression ('"name" IS NULL' )
2678
+ self .assertEqual ([f for f in vl .getFeatures (req )], [])
2679
+
2680
+ self .assertTrue (vl .addFeatures ([f ]))
2681
+ self .assertTrue (vl .commitChanges ())
2682
+ self .assertEqual (vl .featureCount (), 2 )
2683
+ attrs = [f ['name' ] for f in vl .getFeatures ()]
2684
+ self .assertEqual (attrs , ['a' , 'b' ])
2685
+
2686
+ # verify
2687
+ del p
2688
+ vl2 = QgsVectorLayer (filename )
2689
+ self .assertTrue (vl2 .isValid ())
2690
+ self .assertEqual (vl2 .featureCount (), 2 )
2691
+ attrs = [f ['name' ] for f in vl2 .getFeatures ()]
2692
+ self .assertEqual (attrs , ['a' , 'b' ])
2693
+
2641
2694
2642
2695
if __name__ == '__main__' :
2643
2696
unittest .main ()
0 commit comments