|
17 | 17 | import shutil |
18 | 18 | import glob |
19 | 19 | import osgeo.gdal |
| 20 | +import osgeo.ogr |
20 | 21 | import sys |
21 | 22 |
|
22 | 23 | from qgis.core import QgsFeature, QgsField, QgsGeometry, QgsVectorLayer, QgsFeatureRequest, QgsVectorDataProvider |
|
25 | 26 | from utilities import unitTestDataPath |
26 | 27 | from providertestbase import ProviderTestCase |
27 | 28 |
|
28 | | -try: |
29 | | - from osgeo import gdal |
30 | | - gdal_ok = True |
31 | | -except: |
32 | | - gdal_ok = False |
33 | | - |
34 | 29 | start_app() |
35 | 30 | TEST_DATA_DIR = unitTestDataPath() |
36 | 31 |
|
@@ -205,11 +200,9 @@ def testUpdateMode(self): |
205 | 200 | self.assertTrue(vl.dataProvider().deleteFeatures([fid])) |
206 | 201 |
|
207 | 202 | # Check that it has really disappeared |
208 | | - if gdal_ok: |
209 | | - gdal.PushErrorHandler('CPLQuietErrorHandler') |
| 203 | + osgeo.gdal.PushErrorHandler('CPLQuietErrorHandler') |
210 | 204 | features = [f_iter for f_iter in vl.getFeatures(QgsFeatureRequest().setFilterFid(fid))] |
211 | | - if gdal_ok: |
212 | | - gdal.PopErrorHandler() |
| 205 | + osgeo.gdal.PopErrorHandler() |
213 | 206 | self.assertEquals(features, []) |
214 | 207 |
|
215 | 208 | self.assertTrue(vl.dataProvider().addAttributes([QgsField("new_field", QVariant.Int, "integer")])) |
@@ -358,5 +351,34 @@ def testDeleteGeometry(self): |
358 | 351 | fet = next(vl.getFeatures()) |
359 | 352 | self.assertIsNone(fet.geometry()) |
360 | 353 |
|
| 354 | + def testDeleteShapes(self): |
| 355 | + ''' Test fix for #11007 ''' |
| 356 | + |
| 357 | + tmpdir = tempfile.mkdtemp() |
| 358 | + self.dirs_to_cleanup.append(tmpdir) |
| 359 | + srcpath = os.path.join(TEST_DATA_DIR, 'provider') |
| 360 | + for file in glob.glob(os.path.join(srcpath, 'shapefile.*')): |
| 361 | + shutil.copy(os.path.join(srcpath, file), tmpdir) |
| 362 | + datasource = os.path.join(tmpdir, 'shapefile.shp') |
| 363 | + |
| 364 | + vl = QgsVectorLayer(u'{}|layerid=0'.format(datasource), u'test', u'ogr') |
| 365 | + feature_count = vl.featureCount() |
| 366 | + # Start an iterator that will open a new connection |
| 367 | + iterator = vl.getFeatures() |
| 368 | + f = next(iterator) |
| 369 | + |
| 370 | + # Delete a feature |
| 371 | + self.assertTrue(vl.startEditing()) |
| 372 | + self.assertTrue(vl.deleteFeature(1)) |
| 373 | + self.assertTrue(vl.commitChanges()) |
| 374 | + |
| 375 | + # Test the content of the shapefile while it is still opened |
| 376 | + ds = osgeo.ogr.Open(datasource) |
| 377 | + # Test repacking has been done |
| 378 | + self.assertTrue(ds.GetLayer(0).GetFeatureCount(), feature_count - 1) |
| 379 | + ds = None |
| 380 | + |
| 381 | + vl = None |
| 382 | + |
361 | 383 | if __name__ == '__main__': |
362 | 384 | unittest.main() |
0 commit comments