37 #ifdef HAVE_SERVER_PYTHON_PLUGINS 41 const QDomDocument *describeDocument =
nullptr;
43 #ifdef HAVE_SERVER_PYTHON_PLUGINS 45 if ( cacheManager && cacheManager->
getCachedDocument( &doc, project, request, accessControl ) )
47 describeDocument = &doc;
57 describeDocument = &doc;
61 describeDocument = &doc;
63 response.
setHeader(
"Content-Type",
"text/xml; charset=utf-8" );
64 response.
write( describeDocument->toByteArray() );
80 if ( oFormat == QgsWfsParameters::Format::NONE )
82 QStringLiteral(
"OUTPUTFORMAT %1 is not supported" ).arg( wfsParameters.
outputFormatAsString() ) );
84 #ifdef HAVE_SERVER_PYTHON_PLUGINS 91 QDomElement schemaElement = doc.createElement( QStringLiteral(
"schema" ) );
92 schemaElement.setAttribute( QStringLiteral(
"xmlns" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema" ) );
93 schemaElement.setAttribute( QStringLiteral(
"xmlns:xsd" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema" ) );
94 schemaElement.setAttribute( QStringLiteral(
"xmlns:ogc" ),
OGC_NAMESPACE );
95 schemaElement.setAttribute( QStringLiteral(
"xmlns:gml" ),
GML_NAMESPACE );
96 schemaElement.setAttribute( QStringLiteral(
"xmlns:qgs" ),
QGS_NAMESPACE );
97 schemaElement.setAttribute( QStringLiteral(
"targetNamespace" ),
QGS_NAMESPACE );
98 schemaElement.setAttribute( QStringLiteral(
"elementFormDefault" ), QStringLiteral(
"qualified" ) );
99 schemaElement.setAttribute( QStringLiteral(
"version" ), QStringLiteral(
"1.0" ) );
100 doc.appendChild( schemaElement );
103 QDomElement importElement = doc.createElement( QStringLiteral(
"import" ) );
104 importElement.setAttribute( QStringLiteral(
"namespace" ),
GML_NAMESPACE );
105 if ( oFormat == QgsWfsParameters::Format::GML2 )
106 importElement.setAttribute( QStringLiteral(
"schemaLocation" ), QStringLiteral(
"http://schemas.opengis.net/gml/2.1.2/feature.xsd" ) );
107 else if ( oFormat == QgsWfsParameters::Format::GML3 )
108 importElement.setAttribute( QStringLiteral(
"schemaLocation" ), QStringLiteral(
"http://schemas.opengis.net/gml/3.1.1/base/gml.xsd" ) );
109 schemaElement.appendChild( importElement );
111 QStringList typeNameList;
112 QDomDocument queryDoc;
114 if ( queryDoc.setContent( parameters.value( QStringLiteral(
"REQUEST_BODY" ) ),
true, &errorMsg ) )
117 QDomElement queryDocElem = queryDoc.documentElement();
118 QDomNodeList docChildNodes = queryDocElem.childNodes();
119 if ( docChildNodes.size() )
121 for (
int i = 0; i < docChildNodes.size(); i++ )
123 QDomElement docChildElem = docChildNodes.at( i ).toElement();
124 if ( docChildElem.tagName() == QLatin1String(
"TypeName" ) )
126 QString
typeName = docChildElem.text().trimmed();
127 if ( typeName.contains(
':' ) )
128 typeNameList << typeName.section(
':', 1, 1 );
137 typeNameList = wfsParameters.
typeNames();
141 for (
int i = 0; i < wfsLayerIds.size(); ++i )
151 if ( !typeNameList.isEmpty() && !typeNameList.contains( name ) )
155 #ifdef HAVE_SERVER_PYTHON_PLUGINS 158 if ( !typeNameList.isEmpty() )
174 setSchemaLayer( schemaElement, doc, const_cast<QgsVectorLayer *>( vLayer ) );
190 QDomElement elementElem = doc.createElement( QStringLiteral(
"element" ) );
191 elementElem.setAttribute( QStringLiteral(
"name" ), typeName );
192 elementElem.setAttribute( QStringLiteral(
"type" ),
"qgs:" + typeName +
"Type" );
193 elementElem.setAttribute( QStringLiteral(
"substitutionGroup" ), QStringLiteral(
"gml:_Feature" ) );
194 parentElement.appendChild( elementElem );
197 QDomElement complexTypeElem = doc.createElement( QStringLiteral(
"complexType" ) );
198 complexTypeElem.setAttribute( QStringLiteral(
"name" ), typeName +
"Type" );
199 parentElement.appendChild( complexTypeElem );
202 QDomElement complexContentElem = doc.createElement( QStringLiteral(
"complexContent" ) );
203 complexTypeElem.appendChild( complexContentElem );
206 QDomElement extensionElem = doc.createElement( QStringLiteral(
"extension" ) );
207 extensionElem.setAttribute( QStringLiteral(
"base" ), QStringLiteral(
"gml:AbstractFeatureType" ) );
208 complexContentElem.appendChild( extensionElem );
211 QDomElement sequenceElem = doc.createElement( QStringLiteral(
"sequence" ) );
212 extensionElem.appendChild( sequenceElem );
217 QDomElement geomElem = doc.createElement( QStringLiteral(
"element" ) );
218 geomElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"geometry" ) );
225 geomElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"gml:PointPropertyType" ) );
229 geomElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"gml:LineStringPropertyType" ) );
233 geomElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"gml:PolygonPropertyType" ) );
237 geomElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"gml:MultiPointPropertyType" ) );
241 geomElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"gml:MultiLineStringPropertyType" ) );
245 geomElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"gml:MultiPolygonPropertyType" ) );
248 geomElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"gml:GeometryPropertyType" ) );
251 geomElem.setAttribute( QStringLiteral(
"minOccurs" ), QStringLiteral(
"0" ) );
252 geomElem.setAttribute( QStringLiteral(
"maxOccurs" ), QStringLiteral(
"1" ) );
253 sequenceElem.appendChild( geomElem );
260 for (
int idx = 0; idx < fields.
count(); ++idx )
263 QString attributeName = field.
name();
265 if ( layerExcludedAttributes.contains( attributeName ) )
271 QDomElement attElem = doc.createElement( QStringLiteral(
"element" ) );
272 attElem.setAttribute( QStringLiteral(
"name" ), attributeName.replace(
' ',
'_' ).replace(
cleanTagNameRegExp, QString() ) );
273 QVariant::Type attributeType = field.
type();
274 if ( attributeType == QVariant::Int )
276 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"int" ) );
278 else if ( attributeType == QVariant::UInt )
280 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"unsignedInt" ) );
282 else if ( attributeType == QVariant::LongLong )
284 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"long" ) );
286 else if ( attributeType == QVariant::ULongLong )
288 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"unsignedLong" ) );
290 else if ( attributeType == QVariant::Double )
293 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"integer" ) );
295 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"decimal" ) );
297 else if ( attributeType == QVariant::Bool )
299 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"boolean" ) );
301 else if ( attributeType == QVariant::Date )
303 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"date" ) );
305 else if ( attributeType == QVariant::Time )
307 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"time" ) );
309 else if ( attributeType == QVariant::DateTime )
311 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"dateTime" ) );
315 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"string" ) );
319 if ( setup.
type() == QStringLiteral(
"DateTime" ) )
322 const QVariantMap config = setup.
config();
323 const QString fieldFormat = config.value( QStringLiteral(
"field_format" ), fieldFormatter.
defaultFormat( field.
type() ) ).toString();
324 if ( fieldFormat == QStringLiteral(
"yyyy-MM-dd" ) )
325 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"date" ) );
326 else if ( fieldFormat == QStringLiteral(
"HH:mm:ss" ) )
327 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"time" ) );
329 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"dateTime" ) );
331 else if ( setup.
type() == QStringLiteral(
"Range" ) )
333 const QVariantMap config = setup.
config();
334 if ( config.contains( QStringLiteral(
"Precision" ) ) )
339 int configPrec( config[ QStringLiteral(
"Precision" ) ].toInt( &ok ) );
340 if ( ok && configPrec != field.
precision() )
342 if ( configPrec == 0 )
343 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"integer" ) );
345 attElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"decimal" ) );
352 attElem.setAttribute( QStringLiteral(
"nillable" ), QStringLiteral(
"true" ) );
355 sequenceElem.appendChild( attElem );
357 QString alias = field.
alias();
358 if ( !alias.isEmpty() )
360 attElem.setAttribute( QStringLiteral(
"alias" ), alias );
virtual void setHeader(const QString &key, const QString &value)=0
Set Header entry Add Header entry to the response Note that it is usually an error to set Header afte...
Base class for all map layer types.
void setSchemaLayer(QDomElement &parentElement, QDomDocument &doc, const QgsVectorLayer *layer)
const QString QGS_NAMESPACE
QSet< QString > excludeAttributesWfs() const
A set of attributes that are not advertised in WFS requests with QGIS server.
Format outputFormat() const
Returns format.
QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
QString outputFormatAsString() const
Returns OUTPUTFORMAT parameter as a string.
void writeDescribeFeatureType(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response)
Output WFS GetCapabilities response.
Container of fields for a vector layer.
QgsEditorWidgetSetup editorWidgetSetup() const
Gets the editor widget setup for the field.
virtual void write(const QString &data)
Write string This is a convenient method that will write directly to the underlying I/O device...
int count() const
Returns number of items.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
QString layerTypeName(const QgsMapLayer *layer)
Returns typename from vector layer.
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
Type
The WKB type describes the number of dimensions a geometry has.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QgsServerRequest::Parameters parameters() const
Returns a map of query parameters with keys converted to uppercase.
const QString GML_NAMESPACE
A helper class that centralizes caches accesses given by all the server cache filter plugins...
Encapsulates a QGIS project, including sets of map layers and their styles, layouts, annotations, canvases, etc.
Format
Output format for the response.
Encapsulate a field in an attribute table or data source.
bool getCachedDocument(QDomDocument *doc, const QgsProject *project, const QgsServerRequest &request, QgsAccessControl *accessControl) const
Returns cached document (or 0 if document not in cache) like capabilities.
const QString OGC_NAMESPACE
QgsServerRequest Class defining request interface passed to services QgsService::executeRequest() met...
const QRegExp cleanTagNameRegExp("(?![\\\-]).")
bool layerReadPermission(const QgsMapLayer *layer) const
Returns the layer read right.
QgsServerInterface Class defining interfaces exposed by QGIS Server and made available to plugins...
QgsFieldConstraints constraints
QDomDocument createDescribeFeatureTypeDocument(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request)
Create get capabilities document.
SERVER_EXPORT QStringList wfsLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published in WFS.
bool setCachedDocument(const QDomDocument *doc, const QgsProject *project, const QgsServerRequest &request, QgsAccessControl *accessControl) const
Updates or inserts the document in cache like capabilities.
virtual QgsServerCacheManager * cacheManager() const =0
Gets the registered server cache filters.
Exception thrown in case of malformed request.
A helper class that centralizes restrictions given by all the access control filter plugins...
QStringList typeNames() const
Returns TYPENAME parameter as list.
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
Exception thrown when data access violates access controls.
QgsServerResponse Class defining response interface passed to services QgsService::executeRequest() m...
virtual QgsAccessControl * accessControls() const =0
Gets the registered access control filters.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
This is the base class for vector data providers.
Represents a vector layer which manages a vector based data sets.
Provides an interface to retrieve and manipulate WFS parameters received from the client...
QMap< QString, QString > Parameters