Skip to content

Commit

Permalink
qgis server fixes:
Browse files Browse the repository at this point in the history
* support edit types based on edit widgets (adds qgis_gui dependency; fixes #12091)
* show null values (fixes #12114)
* only quote non-numeric non-null values in feature info
* fix crash on exit
* remove obsolete parser method and debug output
  • Loading branch information
jef-n committed Feb 13, 2015
1 parent 3294505 commit 1e9774f
Show file tree
Hide file tree
Showing 9 changed files with 64 additions and 74 deletions.
4 changes: 2 additions & 2 deletions src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ QgsEditorWidgetRegistry* QgsEditorWidgetRegistry::instance()
return &sInstance;
}

void QgsEditorWidgetRegistry::initEditors( QgsMapCanvas* mapCanvas, QgsMessageBar* messageBar )
void QgsEditorWidgetRegistry::initEditors( QgsMapCanvas *mapCanvas, QgsMessageBar *messageBar )
{
QgsEditorWidgetRegistry* reg = instance();
QgsEditorWidgetRegistry *reg = instance();
reg->registerWidget( "Classification", new QgsClassificationWidgetWrapperFactory( tr( "Classification" ) ) );
reg->registerWidget( "Range", new QgsRangeWidgetFactory( tr( "Range" ) ) );
reg->registerWidget( "UniqueValues", new QgsUniqueValueWidgetFactory( tr( "Unique Values" ) ) );
Expand Down
7 changes: 6 additions & 1 deletion src/server/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ ENDIF (WIN32)

QT4_WRAP_CPP(qgis_mapserv_MOC_SRCS ${qgis_mapserv_MOC_HDRS})

ADD_LIBRARY(qgis_server SHARED ${qgis_mapserv_SRCS} ${qgis_mapserv_MOC_SRCS} ${qgis_mapserv_HDRS} ${qgis_mapserv_MOC_HDRS} )
ADD_LIBRARY(qgis_server SHARED ${qgis_mapserv_SRCS} ${qgis_mapserv_MOC_SRCS} ${qgis_mapserv_HDRS} ${qgis_mapserv_MOC_HDRS})

#generate unversioned libs for android
IF (NOT ANDROID)
Expand All @@ -100,6 +100,7 @@ ENDIF (NOT ANDROID)

TARGET_LINK_LIBRARIES(qgis_server
qgis_core
qgis_gui
qgis_analysis
qgispython
${PROJ_LIBRARY}
Expand Down Expand Up @@ -155,13 +156,17 @@ INCLUDE_DIRECTORIES(
../core/symbology-ng
../core/composer
../core/layertree
../gui
../gui/editorwidgets
../gui/editorwidgets/core
../analysis/interpolation
../plugins/diagram_overlay
.
)

TARGET_LINK_LIBRARIES(qgis_mapserv.fcgi
qgis_core
qgis_gui
qgis_analysis
${PROJ_LIBRARY}
${FCGI_LIBRARY}
Expand Down
5 changes: 3 additions & 2 deletions src/server/qgis_map_serv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include "qgsnetworkaccessmanager.h"
#include "qgsmaplayerregistry.h"
#include "qgsserverlogger.h"
#include "qgseditorwidgetregistry.h"

#ifdef HAVE_SERVER_PYTHON_PLUGINS
#include "qgsserverplugins.h"
Expand Down Expand Up @@ -287,8 +288,6 @@ int main( int argc, char * argv[] )
QgsDebugMsg( "User DB PATH: " + QgsApplication::qgisUserDbFilePath() );
QgsDebugMsg( "SVG PATHS: " + QgsApplication::svgPaths().join( ":" ) );

// FIXME: what is this debug line for?
QgsDebugMsg( qgsapp.applicationDirPath() + "/qgis_wms_server.log" );
QgsApplication::createDB(); //init qgis.db (e.g. necessary for user crs)

QString defaultConfigFilePath;
Expand Down Expand Up @@ -337,6 +336,8 @@ int main( int argc, char * argv[] )
QMultiMap<int, QgsServerFilter*> pluginFilters = serverIface.filters();
#endif

QgsEditorWidgetRegistry::initEditors();

while ( fcgi_accept() >= 0 )
{
QgsMapLayerRegistry::instance()->removeAllMapLayers();
Expand Down
8 changes: 6 additions & 2 deletions src/server/qgsconfigcache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,12 @@

QgsConfigCache* QgsConfigCache::instance()
{
static QgsConfigCache mInstance;
return &mInstance;
static QgsConfigCache *instance = 0;

if ( !instance )
instance = new QgsConfigCache();

return instance;
}

QgsConfigCache::QgsConfigCache()
Expand Down
1 change: 0 additions & 1 deletion src/server/qgsconfigcache.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ class QgsConfigCache: public QObject

private:
QgsConfigCache();
static QgsConfigCache* mInstance;

/**Check for configuration file updates (remove entry from cache if file changes)*/
QFileSystemWatcher mFileSystemWatcher;
Expand Down
4 changes: 2 additions & 2 deletions src/server/qgshttprequesthandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -368,8 +368,8 @@ void QgsHttpRequestHandler::setGetFeatureInfoResponse( const QDomDocument& infoD
QDomElement attributeElement = attributeNodeList.at( k ).toElement();
if ( infoFormat == "text/plain" )
{
featureInfoString.append( attributeElement.attribute( "name" ) + " = '" +
attributeElement.attribute( "value" ) + "'\n" );
featureInfoString.append( attributeElement.attribute( "name" ) + " = " +
attributeElement.attribute( "value" ) + "\n" );
}
else if ( infoFormat == "text/html" )
{
Expand Down
51 changes: 7 additions & 44 deletions src/server/qgsserverprojectparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "qgsmaplayerregistry.h"
#include "qgsmslayercache.h"
#include "qgsrasterlayer.h"
#include "qgseditorwidgetregistry.h"

#include <QDomDocument>
#include <QFileInfo>
Expand Down Expand Up @@ -241,6 +242,12 @@ QgsMapLayer* QgsServerProjectParser::createLayerFromElement( const QDomElement&

if ( layer )
{
if ( layer->type() == QgsMapLayer::VectorLayer )
{
// see QgsEditorWidgetRegistry::mapLayerAdded()
QObject::connect( layer, SIGNAL( readCustomSymbology( const QDomElement&, QString& ) ), QgsEditorWidgetRegistry::instance(), SLOT( readSymbology( const QDomElement&, QString& ) ) );
}

layer->readLayerXML( const_cast<QDomElement&>( elem ) ); //should be changed to const in QgsMapLayer
layer->setLayerName( layerName( elem ) );
if ( useCache )
Expand Down Expand Up @@ -919,50 +926,6 @@ QStringList QgsServerProjectParser::supportedOutputCrsList() const
return crsList;
}

//not very nice, needs to be kept in sync with QgsVectorLayer class...
QString QgsServerProjectParser::editTypeString( QgsVectorLayer::EditType type )
{
switch ( type )
{
case QgsVectorLayer::LineEdit:
return "LineEdit";
case QgsVectorLayer::UniqueValues:
return "UniqueValues";
case QgsVectorLayer::UniqueValuesEditable:
return "UniqueValuesEditable";
case QgsVectorLayer::ValueMap:
return "ValueMap";
case QgsVectorLayer::Classification:
return "Classification";
case QgsVectorLayer::EditRange:
return "EditRange";
case QgsVectorLayer::SliderRange:
return "SliderRange";
case QgsVectorLayer::CheckBox:
return "CheckBox";
case QgsVectorLayer::FileName:
return "FileName";
case QgsVectorLayer::Enumeration:
return "Enumeration";
case QgsVectorLayer::Immutable:
return "Immutable";
case QgsVectorLayer::Hidden:
return "Hidden";
case QgsVectorLayer::TextEdit:
return "TextEdit";
case QgsVectorLayer::Calendar:
return "Calendar";
case QgsVectorLayer::DialRange:
return "DialRange";
case QgsVectorLayer::ValueRelation:
return "ValueRelation";
case QgsVectorLayer::UuidGenerator:
return "UuidGenerator";
default:
return "Unknown";
}
}

QString QgsServerProjectParser::projectTitle() const
{
if ( !mXMLDoc )
Expand Down
2 changes: 0 additions & 2 deletions src/server/qgsserverprojectparser.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,6 @@ class QgsServerProjectParser

QStringList supportedOutputCrsList() const;

static QString editTypeString( QgsVectorLayer::EditType type );

const QList<QDomElement>& projectLayerElements() const { return mProjectLayerElements; }

const QList<QDomElement>& legendGroupElements() const { return mLegendGroupElements; }
Expand Down
56 changes: 38 additions & 18 deletions src/server/qgswmsserver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2094,7 +2094,26 @@ int QgsWMSServer::featureInfoFromVectorLayer( QgsVectorLayer* layer,

QDomElement attributeElement = infoDocument.createElement( "Attribute" );
attributeElement.setAttribute( "name", attributeName );
attributeElement.setAttribute( "value", replaceValueMapAndRelation( layer, i, QgsExpression::replaceExpressionText( featureAttributes[i].toString(), &feature, layer ) ) );

QString value;
if ( featureAttributes[i].isNull() )
value = QSettings().value( "qgis/nullValue", "NULL" ).toString();
else
{
value = replaceValueMapAndRelation( layer, i, QgsExpression::replaceExpressionText( featureAttributes[i].toString(), &feature, layer ) );

switch ( featureAttributes[i].type() )
{
case QVariant::Int:
case QVariant::LongLong:
case QVariant::Double:
break;
default:
value = "'" + value + "'";
}
}

attributeElement.setAttribute( "value", value );
featureElement.appendChild( attributeElement );
}

Expand Down Expand Up @@ -3054,42 +3073,43 @@ QString QgsWMSServer::replaceValueMapAndRelation( QgsVectorLayer* vl, int idx, c
QMap<QString, QVariant>::const_iterator vmapIt = cfg.constBegin();
for ( ; vmapIt != cfg.constEnd(); ++vmapIt )
{
if ( vmapIt.value().toString() == attributeVal )
if ( vmapIt.key() == attributeVal )
{
return vmapIt.key();
return vmapIt.value().toString();
}
}
return QString( "(%1)" ).arg( attributeVal );
}
else if ( type == "ValueRelation" )
{
QgsEditorWidgetConfig cfg( vl->editorWidgetV2Config( idx ) );
QgsVectorLayer* layer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( cfg.value( "Layer" ).toString() ) );
if ( !layer )
{
return attributeVal;
return QString( "(%1)" ).arg( attributeVal );
}

QString outputString;
if ( cfg.value( "AllowMulti" ).toBool() )
QString valueString = attributeVal;
QStringList valueList = cfg.value( "AllowMulti" ).toBool()
? valueString.remove( QChar( '{' ) ).remove( QChar( '}' ) ).split( "," )
: QStringList( valueString );
for ( int i = 0; i < valueList.size(); ++i )
{
QString valueString = attributeVal;
QStringList valueList = valueString.remove( QChar( '{' ) ).remove( QChar( '}' ) ).split( "," );
for ( int i = 0; i < valueList.size(); ++i )
if ( i > 0 )
{
if ( i > 0 )
{
outputString += ";";
}
outputString += relationValue(
valueList.at( i ),
layer,
cfg.value( "Key" ).toString(),
cfg.value( "Value" ).toString()
);
outputString += ";";
}
outputString += relationValue(
valueList.at( i ),
layer,
cfg.value( "Key" ).toString(),
cfg.value( "Value" ).toString()
);
}
return outputString;
}

return attributeVal;
}

Expand Down

0 comments on commit 1e9774f

Please sign in to comment.