Skip to content

Commit e850c82

Browse files
authoredJun 12, 2017
Merge pull request #4604 from boundlessgeo/postgis_merge_features_port3_fix#15741
Fix Postgis Merge selected features regression (fix #15741)
2 parents 1be9997 + ac1a579 commit e850c82

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed
 

‎src/core/qgsvectordataprovider.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class CORE_EXPORT QgsVectorDataProvider : public QgsDataProvider, public QgsFeat
5656
Q_OBJECT
5757

5858
friend class QgsTransaction;
59+
friend class QgsVectorLayerEditBuffer;
5960

6061
public:
6162

‎src/core/qgsvectorlayereditbuffer.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,35 @@ bool QgsVectorLayerEditBuffer::commitChanges( QStringList &commitErrors )
310310
// no yes => changeAttributeValues
311311
// yes yes => changeFeatures
312312

313+
// to fix https://issues.qgis.org/issues/15741
314+
// first of all check if feature to add is compatible with provider type
315+
// this check have to be done before all checks to avoid to clear internal
316+
// buffer if some of next steps success.
317+
if ( success && !mAddedFeatures.isEmpty() )
318+
{
319+
if ( cap & QgsVectorDataProvider::AddFeatures )
320+
{
321+
for ( QgsFeature f : mAddedFeatures )
322+
{
323+
if ( ( ! f.hasGeometry() ) ||
324+
( f.geometry().wkbType() == provider->wkbType() ) )
325+
continue;
326+
327+
if ( provider->convertToProviderType( f.geometry() ).isNull() )
328+
{
329+
commitErrors << tr( "ERROR: %n feature(s) not added - geometry type is not compatible with the current layer.", "not added features count", mAddedFeatures.size() );
330+
success = false;
331+
break;
332+
}
333+
}
334+
}
335+
else
336+
{
337+
commitErrors << tr( "ERROR: %n feature(s) not added - provider doesn't support adding features.", "not added features count", mAddedFeatures.size() );
338+
success = false;
339+
}
340+
}
341+
313342
//
314343
// update geometries
315344
//

‎tests/src/python/test_qgsvectorlayereditbuffer.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ def createLayerWithOnePoint():
4444
return layer
4545

4646

47+
def createEmptyLinestringLayer():
48+
layer = QgsVectorLayer("Linestring?field=fldtxt:string&field=fldint:integer",
49+
"addfeat", "memory")
50+
assert layer.isValid()
51+
return layer
52+
53+
4754
class TestQgsVectorLayerEditBuffer(unittest.TestCase):
4855

4956
def testAddFeatures(self):
@@ -78,6 +85,27 @@ def testAddFeatures(self):
7885
self.assertTrue(layer.editBuffer().isFeatureAdded(new_feature_ids[0]))
7986
self.assertTrue(layer.editBuffer().isFeatureAdded(new_feature_ids[1]))
8087

88+
# check if error in case adding not adaptable geometry
89+
# eg. a Multiline in a Line
90+
layer = createEmptyLinestringLayer()
91+
self.assertTrue(layer.startEditing())
92+
93+
self.assertEqual(layer.editBuffer().addedFeatures(), {})
94+
self.assertFalse(layer.editBuffer().isFeatureAdded(1))
95+
self.assertFalse(layer.editBuffer().isFeatureAdded(3))
96+
97+
# add a features with a multi line geometry of not touched lines =>
98+
# cannot be forced to be linestring
99+
multiline = [
100+
[QgsPointXY(1, 1), QgsPointXY(2, 2)],
101+
[QgsPointXY(3, 3), QgsPointXY(4, 4)],
102+
]
103+
f1 = QgsFeature(layer.fields(), 1)
104+
f1.setGeometry(QgsGeometry.fromMultiPolyline(multiline))
105+
f1.setAttributes(["test", 123])
106+
self.assertTrue(layer.addFeatures([f1]))
107+
self.assertFalse(layer.commitChanges())
108+
81109
def testAddMultipleFeatures(self):
82110
# test adding multiple features to an edit buffer
83111
layer = createEmptyLayer()

0 commit comments

Comments
 (0)
Please sign in to comment.