Skip to content

Commit 8cd810e

Browse files
committed
Return false from QgsVectorLayer::addFeatures if adding features failed
1 parent fcb6c2b commit 8cd810e

File tree

2 files changed

+79
-4
lines changed

2 files changed

+79
-4
lines changed

src/core/qgsvectorlayereditbuffer.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,14 @@ bool QgsVectorLayerEditBuffer::addFeatures( QgsFeatureList& features )
135135
if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::AddFeatures ) )
136136
return false;
137137

138+
bool result = true;
138139
for ( QgsFeatureList::iterator iter = features.begin(); iter != features.end(); ++iter )
139140
{
140-
addFeature( *iter );
141+
result = result && addFeature( *iter );
141142
}
142143

143144
L->updateExtents();
144-
return true;
145+
return result;
145146
}
146147

147148

tests/src/python/test_qgsvectorlayer.py

+76-2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ def createEmptyLayer():
5454
return layer
5555

5656

57+
def createEmptyLayerWithFields():
58+
layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer", "addfeat", "memory")
59+
assert layer.pendingFeatureCount() == 0
60+
return layer
61+
62+
5763
def createLayerWithOnePoint():
5864
layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer",
5965
"addfeat", "memory")
@@ -168,8 +174,8 @@ def test_FeatureCount(self):
168174
# ADD FEATURE
169175

170176
def test_AddFeature(self):
171-
layer = createEmptyLayer()
172-
feat = QgsFeature()
177+
layer = createEmptyLayerWithFields()
178+
feat = QgsFeature(layer.fields())
173179
feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(1, 2)))
174180

175181
def checkAfter():
@@ -197,6 +203,12 @@ def checkBefore():
197203

198204
# add feature
199205
layer.startEditing()
206+
207+
# try adding feature with incorrect number of fields
208+
bad_feature = QgsFeature()
209+
self.assertFalse(layer.addFeature(bad_feature))
210+
211+
# add good feature
200212
self.assertTrue(layer.addFeature(feat))
201213

202214
checkAfter()
@@ -213,6 +225,68 @@ def checkBefore():
213225
checkAfter()
214226
self.assertEqual(layer.dataProvider().featureCount(), 1)
215227

228+
# ADD FEATURES
229+
230+
def test_AddFeatures(self):
231+
layer = createEmptyLayerWithFields()
232+
feat1 = QgsFeature(layer.fields())
233+
feat1.setGeometry(QgsGeometry.fromPoint(QgsPoint(1, 2)))
234+
feat2 = QgsFeature(layer.fields())
235+
feat2.setGeometry(QgsGeometry.fromPoint(QgsPoint(11, 12)))
236+
237+
def checkAfter():
238+
self.assertEqual(layer.pendingFeatureCount(), 2)
239+
240+
# check select+nextFeature
241+
it = layer.getFeatures()
242+
f1 = next(it)
243+
self.assertEqual(f1.geometry().asPoint(), QgsPoint(1, 2))
244+
f2 = next(it)
245+
self.assertEqual(f2.geometry().asPoint(), QgsPoint(11, 12))
246+
247+
# check feature at id
248+
f1_1 = next(layer.getFeatures(QgsFeatureRequest(f1.id())))
249+
self.assertEqual(f1_1.geometry().asPoint(), QgsPoint(1, 2))
250+
f2_1 = next(layer.getFeatures(QgsFeatureRequest(f2.id())))
251+
self.assertEqual(f2_1.geometry().asPoint(), QgsPoint(11, 12))
252+
253+
def checkBefore():
254+
self.assertEqual(layer.pendingFeatureCount(), 0)
255+
256+
# check select+nextFeature
257+
with self.assertRaises(StopIteration):
258+
next(layer.getFeatures())
259+
260+
checkBefore()
261+
262+
# try to add feature without editing mode
263+
self.assertFalse(layer.addFeatures([feat1, feat2]))
264+
265+
# add feature
266+
layer.startEditing()
267+
268+
# try adding feature with incorrect number of fields
269+
bad_feature = QgsFeature()
270+
self.assertFalse(layer.addFeatures([bad_feature]))
271+
272+
# add good features
273+
self.assertTrue(layer.addFeatures([feat1, feat2]))
274+
275+
checkAfter()
276+
self.assertEqual(layer.dataProvider().featureCount(), 0)
277+
278+
# now try undo/redo
279+
layer.undoStack().undo()
280+
layer.undoStack().undo()
281+
checkBefore()
282+
layer.undoStack().redo()
283+
layer.undoStack().redo()
284+
checkAfter()
285+
286+
self.assertTrue(layer.commitChanges())
287+
288+
checkAfter()
289+
self.assertEqual(layer.dataProvider().featureCount(), 2)
216290
# DELETE FEATURE
217291

218292
def test_DeleteFeature(self):

0 commit comments

Comments
 (0)