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