Skip to content

Commit b28bf20

Browse files
committedApr 21, 2023
Add api to determine attribute capabilities for QgsVectorLayerExporter
1 parent 308eb1d commit b28bf20

File tree

5 files changed

+72
-0
lines changed

5 files changed

+72
-0
lines changed
 

‎python/core/auto_generated/vector/qgsvectorlayerexporter.sip.in

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,13 @@ Returns the number of error messages encountered during the export.
103103
.. seealso:: :py:func:`errorMessage`
104104

105105
.. seealso:: :py:func:`errorCode`
106+
%End
107+
108+
Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities() const;
109+
%Docstring
110+
Returns the attribute capabilities of the exporter.
111+
112+
.. versionadded:: 3.32
106113
%End
107114

108115
virtual bool addFeatures( QgsFeatureList &features, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() );

‎src/core/qgis.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,24 @@ class CORE_EXPORT Qgis
654654
};
655655
Q_ENUM( VectorExportResult )
656656

657+
/**
658+
* Capabilities supported by a QgsVectorFileWriter object.
659+
* \since QGIS 3.32
660+
*/
661+
enum class VectorFileWriterCapability : int
662+
{
663+
FieldAliases = 1 << 0, //!< Writer can support field aliases
664+
FieldComments = 1 << 2, //!< Writer can support field comments
665+
};
666+
Q_ENUM( VectorFileWriterCapability )
667+
668+
/**
669+
* Capabilities supported by a QgsVectorFileWriter object.
670+
* \since QGIS 3.32
671+
*/
672+
Q_DECLARE_FLAGS( VectorFileWriterCapabilities, VectorFileWriterCapability )
673+
Q_FLAG( VectorFileWriterCapabilities )
674+
657675
/**
658676
* SqlLayerDefinitionCapability enum lists the arguments supported by the provider when creating SQL query layers.
659677
* \since QGIS 3.22
@@ -3554,6 +3572,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::LayerTreeFilterFlags )
35543572
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::LabelLinePlacementFlags )
35553573
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::LabelPolygonPlacementFlags )
35563574
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::DatabaseProviderConnectionCapabilities2 )
3575+
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::VectorFileWriterCapabilities )
35573576

35583577
// hack to workaround warnings when casting void pointers
35593578
// retrieved from QLibrary::resolve to function pointers.

‎src/core/vector/qgsvectorlayerexporter.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,11 @@ QString QgsVectorLayerExporter::errorMessage() const
200200
return mErrorMessage;
201201
}
202202

203+
Qgis::VectorDataProviderAttributeEditCapabilities QgsVectorLayerExporter::attributeEditCapabilities() const
204+
{
205+
return mProvider ? mProvider->attributeEditCapabilities() : Qgis::VectorDataProviderAttributeEditCapabilities();
206+
}
207+
203208
bool QgsVectorLayerExporter::addFeatures( QgsFeatureList &features, Flags flags )
204209
{
205210
QgsFeatureList::iterator fIt = features.begin();

‎src/core/vector/qgsvectorlayerexporter.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,13 @@ class CORE_EXPORT QgsVectorLayerExporter : public QgsFeatureSink
120120
*/
121121
int errorCount() const { return mErrorCount; }
122122

123+
/**
124+
* Returns the attribute capabilities of the exporter.
125+
*
126+
* \since QGIS 3.32
127+
*/
128+
Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities() const;
129+
123130
bool addFeatures( QgsFeatureList &features, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override;
124131
bool addFeature( QgsFeature &feature, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override;
125132
QString lastError() const override;

‎tests/src/python/test_provider_ogr.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3396,6 +3396,40 @@ def testFieldComment(self):
33963396
self.assertEqual(fields[2].name(), 'field2')
33973397
self.assertEqual(fields[2].comment(), '')
33983398

3399+
@unittest.skipIf(int(gdal.VersionInfo('VERSION_NUM')) < GDAL_COMPUTE_VERSION(3, 7, 0), "GDAL 3.7 required")
3400+
def test_exporter_capabilities(self):
3401+
with tempfile.TemporaryDirectory() as temp_dir:
3402+
dest_file_name = os.path.join(temp_dir,
3403+
'test_gpkg.gpkg')
3404+
3405+
layer = QgsVectorLayer("point?crs=epsg:4326&field=id:integer",
3406+
"Scratch point layer", "memory")
3407+
3408+
exporter = QgsVectorLayerExporter(dest_file_name,
3409+
'ogr',
3410+
layer.fields(),
3411+
layer.wkbType(),
3412+
layer.crs())
3413+
3414+
self.assertTrue(
3415+
exporter.attributeEditCapabilities() & Qgis.VectorDataProviderAttributeEditCapability.EditAlias)
3416+
self.assertTrue(
3417+
exporter.attributeEditCapabilities() & Qgis.VectorDataProviderAttributeEditCapability.EditComment)
3418+
3419+
dest_file_name = os.path.join(temp_dir,
3420+
'test_shp.shp')
3421+
3422+
exporter = QgsVectorLayerExporter(dest_file_name,
3423+
'ogr',
3424+
layer.fields(),
3425+
layer.wkbType(),
3426+
layer.crs())
3427+
3428+
self.assertFalse(
3429+
exporter.attributeEditCapabilities() & Qgis.VectorDataProviderAttributeEditCapability.EditAlias)
3430+
self.assertFalse(
3431+
exporter.attributeEditCapabilities() & Qgis.VectorDataProviderAttributeEditCapability.EditComment)
3432+
33993433

34003434
if __name__ == '__main__':
34013435
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.