diff --git a/python/core/auto_generated/qgsprojectservervalidator.sip.in b/python/core/auto_generated/qgsprojectservervalidator.sip.in index 01b7ae4662b..e4d564d9e1f 100644 --- a/python/core/auto_generated/qgsprojectservervalidator.sip.in +++ b/python/core/auto_generated/qgsprojectservervalidator.sip.in @@ -31,8 +31,10 @@ Constructor for QgsProjectServerValidator. enum ValidationError { DuplicatedNames, - ShortNames, - Encoding + LayerShortName, + LayerEncoding, + ProjectShortName, + ProjectRootNameConflict, }; static QString displayValidationError( QgsProjectServerValidator::ValidationError error ); diff --git a/src/core/qgsprojectservervalidator.cpp b/src/core/qgsprojectservervalidator.cpp index 5f8563bee4e..b89d38d5e5d 100644 --- a/src/core/qgsprojectservervalidator.cpp +++ b/src/core/qgsprojectservervalidator.cpp @@ -26,12 +26,16 @@ QString QgsProjectServerValidator::displayValidationError( QgsProjectServerValid { switch ( error ) { - case QgsProjectServerValidator::Encoding: + case QgsProjectServerValidator::LayerEncoding: return QObject::tr( "Encoding is not correctly set. A non 'System' encoding is required" ); - case QgsProjectServerValidator::ShortNames: + case QgsProjectServerValidator::LayerShortName: return QObject::tr( "Layer short name is not valid. It must start with an unaccented alphabetical letter, followed by any alphanumeric letters, dot, dash or underscore" ); case QgsProjectServerValidator::DuplicatedNames: return QObject::tr( "One or more layers or groups have the same name or short name. Both the 'name' and 'short name' for layers and groups must be unique" ); + case QgsProjectServerValidator::ProjectShortName: + return QObject::tr( "The project root name (either the project short name or project title) is not valid. It must start with an unaccented alphabetical letter, followed by any alphanumeric letters, dot, dash or underscore" ); + case QgsProjectServerValidator::ProjectRootNameConflict: + return QObject::tr( "The project root name (either the project short name or project title) is already used by a layer or a group" ); } return QString(); } @@ -119,13 +123,34 @@ bool QgsProjectServerValidator::validate( QgsProject *project, QListreadEntry( QStringLiteral( "WMSRootName" ), QStringLiteral( "/" ), "" ); + if ( rootLayerName.isEmpty() && !project->title().isEmpty() ) + { + rootLayerName = project->title(); + } + if ( !rootLayerName.isEmpty() ) + { + if ( owsNames.count( rootLayerName ) >= 1 ) + { + result = false; + results << ValidationResult( QgsProjectServerValidator::ProjectRootNameConflict, rootLayerName ); + } + + if ( !snRegExp.exactMatch( rootLayerName ) ) + { + result = false; + results << ValidationResult( QgsProjectServerValidator::ProjectShortName, rootLayerName ); + } } return result; diff --git a/src/core/qgsprojectservervalidator.h b/src/core/qgsprojectservervalidator.h index b96587e3cba..5d708cd6f4b 100644 --- a/src/core/qgsprojectservervalidator.h +++ b/src/core/qgsprojectservervalidator.h @@ -45,9 +45,11 @@ class CORE_EXPORT QgsProjectServerValidator */ enum ValidationError { - DuplicatedNames = 0, //!< Error related to a duplicated layer name in the layer tree. - ShortNames = 1, //!< Layer short name is well formatted. - Encoding = 2 //!< Encoding is not set correctly. + DuplicatedNames = 0, //!< A duplicated layer/group name in the layer tree. + LayerShortName = 1, //!< Layer/group short name is not valid. + LayerEncoding = 2, //!< Encoding is not correctly set on a vector layer. + ProjectShortName = 3, //!< The project short name is not valid. + ProjectRootNameConflict = 4, //!< The project root name is already used by a layer or a group. }; /** diff --git a/tests/src/python/test_qgsprojectservervalidator.py b/tests/src/python/test_qgsprojectservervalidator.py index 4ac13ad6517..511be6bd2cf 100644 --- a/tests/src/python/test_qgsprojectservervalidator.py +++ b/tests/src/python/test_qgsprojectservervalidator.py @@ -49,7 +49,7 @@ class TestQgsprojectServerValidator(unittest.TestCase): valid, results = QgsProjectServerValidator.validate(project) self.assertFalse(valid) self.assertEqual(1, len(results)) - self.assertEqual(QgsProjectServerValidator.ShortNames, results[0].error) + self.assertEqual(QgsProjectServerValidator.LayerShortName, results[0].error) # Not valid, same short name as the first layer name layer_1.setShortName('layer_1') @@ -77,6 +77,40 @@ class TestQgsprojectServerValidator(unittest.TestCase): self.assertTrue(valid) self.assertEqual(0, len(results)) + # Not valid, the project title is invalid + project.setTitle('@ layer 1') + valid, results = QgsProjectServerValidator.validate(project) + self.assertFalse(valid) + self.assertEqual(1, len(results)) + self.assertEqual(QgsProjectServerValidator.ProjectShortName, results[0].error) + + # Valid project title + project.setTitle('project_title') + valid, results = QgsProjectServerValidator.validate(project) + self.assertTrue(valid) + self.assertEqual(0, len(results)) + + # Valid despite the bad project title, use project short name + project.setTitle('@ layer 1') + project.writeEntry('WMSRootName', '/', 'project_short_name') + valid, results = QgsProjectServerValidator.validate(project) + self.assertTrue(valid) + self.assertEqual(0, len(results)) + + # Not valid project short name + project.setTitle('project_title') + project.writeEntry('WMSRootName', '/', 'project with space') + valid, results = QgsProjectServerValidator.validate(project) + self.assertFalse(valid) + self.assertEqual(1, len(results)) + self.assertEqual(QgsProjectServerValidator.ProjectShortName, results[0].error) + + # Not valid, duplicated project short name + project.writeEntry('WMSRootName', '/', 'layer_1') + valid, results = QgsProjectServerValidator.validate(project) + self.assertEqual(1, len(results)) + self.assertEqual(QgsProjectServerValidator.ProjectRootNameConflict, results[0].error) + if __name__ == '__main__': unittest.main()