def check_layer(layer, has_geometry=True): """Helper to check layer validity. This function wil; raise InvalidLayerError if the layer is invalid. :param layer: The layer to check. :type layer: QgsMapLayer :param has_geometry: If the layer must have a geometry. True by default. If it's a raster layer, we will no check this parameter. If we do not want to check the geometry type, we can set it to None. :type has_geometry: bool,None :raise: InvalidLayerError :return: Return True if the layer is valid. :rtype: bool """ if is_vector_layer(layer) or is_raster_layer(layer): if not layer.isValid(): raise InvalidLayerError('The layer is invalid : %s' % layer.publicSource()) if is_vector_layer(layer): sub_layers = layer.dataProvider().subLayers() if len(sub_layers) > 1: names = ';'.join(sub_layers) source = layer.source() raise InvalidLayerError( tr('The layer should not have many sublayers : {source} : ' '{names}').format(source=source, names=names)) # We only check the geometry if we have at least one feature. if layer.geometryType() == QgsWkbTypes.UnknownGeometry and ( layer.featureCount() != 0): raise InvalidLayerError( tr('The layer has not a valid geometry type.')) if layer.wkbType() == QgsWkbTypes.Unknown and ( layer.featureCount() != 0): raise InvalidLayerError( tr('The layer has not a valid geometry type.')) if isinstance(has_geometry, bool) and layer.featureCount() != 0: if layer.isSpatial() != has_geometry: raise InvalidLayerError( tr('The layer has not a correct geometry type.')) else: raise InvalidLayerError( tr('The layer is neither a raster nor a vector : {type}').format( type=type(layer))) return True
def check_layer(layer, has_geometry=True): """Helper to check layer validity. This function wil; raise InvalidLayerError if the layer is invalid. :param layer: The layer to check. :type layer: QgsMapLayer :param has_geometry: If the layer must have a geometry. True by default. If it's a raster layer, we will no check this parameter. If we do not want to check the geometry type, we can set it to None. :type has_geometry: bool :raise: InvalidLayerError :return: Return True if the layer is valid. :rtype: bool """ if is_vector_layer(layer) or is_raster_layer(layer): if not layer.isValid(): raise InvalidLayerError( 'The layer is invalid : %s' % layer.publicSource()) if is_vector_layer(layer): sub_layers = layer.dataProvider().subLayers() if len(sub_layers) > 1: names = ';'.join(sub_layers) source = layer.source() raise InvalidLayerError( tr('The layer should not have many sublayers : {source} : ' '{names}').format(source=source, names=names)) if layer.geometryType() == QGis.UnknownGeometry: raise InvalidLayerError( tr('The layer has not a valid geometry type.')) if layer.wkbType() == QgsWKBTypes.Unknown: raise InvalidLayerError( tr('The layer has not a valid geometry type.')) if isinstance(has_geometry, bool): if layer.hasGeometryType() != has_geometry: raise InvalidLayerError( tr('The layer has not a correct geometry type.')) else: raise InvalidLayerError( tr('The layer is neither a raster nor a vector : {type}').format( type=type(layer))) return True
def check_input_layer(layer, purpose): """Function to check if the layer is valid. The function will also set the monkey patching if needed. :param layer: The layer to test. :type layer: QgsMapLayer :param purpose: The expected purpose of the layer. :type purpose: basestring :return: A tuple with the status of the layer and an error message if needed. The status is 0 if everything was fine. The status is 1 if the client should fix something. :rtype: (int, m.Message) """ if not layer.isValid(): title = tr('The {purpose} layer is invalid').format(purpose=purpose) content = tr('The impact function needs a {exposure} layer to run. ' 'You must provide a valid {exposure} layer.').format( purpose=purpose) message = generate_input_error_message(title, m.Paragraph(content)) return PREPARE_FAILED_BAD_INPUT, message # We should read it using KeywordIO for the very beginning. To avoid # get the modified keywords in the patching. try: keywords = KeywordIO().read_keywords(layer) except NoKeywordsFoundError: title = tr('The {purpose} layer does not have keywords.').format( purpose=purpose) content = tr( 'The {purpose} layer does not have keywords. Use the wizard ' 'to assign keywords to the layer.').format(purpose=purpose) message = generate_input_error_message(title, m.Paragraph(content)) return PREPARE_FAILED_BAD_INPUT, message if keywords.get('layer_purpose') != purpose: title = tr('The expected {purpose} layer is not an {purpose}.') \ .format(purpose=purpose) content = tr('The expected {purpose} layer is not an {purpose}.') \ .format(purpose=purpose) message = generate_input_error_message(title, m.Paragraph(content)) return PREPARE_FAILED_BAD_INPUT, message version = keywords.get(inasafe_keyword_version_key) supported = is_keyword_version_supported(version) if not supported: parameters = { 'version': inasafe_keyword_version, 'source': layer.publicSource() } title = tr('The {purpose} layer is not up to date.').format( purpose=purpose) content = tr('The layer {source} must be updated to {version}.' ).format(**parameters) message = generate_input_error_message(title, m.Paragraph(content)) return PREPARE_FAILED_BAD_INPUT, message layer.keywords = keywords if is_vector_layer(layer): try: check_inasafe_fields(layer, keywords_only=True) except InvalidLayerError: title = tr('The {purpose} layer is not up to date.').format( purpose=purpose) content = tr( 'The layer {source} must be updated with the keyword ' 'wizard. Your fields which have been set in the keywords ' 'previously are not matching your layer.').format( source=layer.publicSource()) message = generate_input_error_message(title, m.Paragraph(content)) del layer.keywords return PREPARE_FAILED_BAD_INPUT, message return PREPARE_SUCCESS, None
def check_input_layer(layer, purpose): """Function to check if the layer is valid. The function will also set the monkey patching if needed. :param layer: The layer to test. :type layer: QgsMapLayer :param purpose: The expected purpose of the layer. :type purpose: basestring :return: A tuple with the status of the layer and an error message if needed. The status is 0 if everything was fine. The status is 1 if the client should fix something. :rtype: (int, m.Message) """ if not layer.isValid(): title = tr( 'The {purpose} layer is invalid').format(purpose=purpose) content = tr( 'The impact function needs a {exposure} layer to run. ' 'You must provide a valid {exposure} layer.').format( purpose=purpose) message = generate_input_error_message( title, m.Paragraph(content)) return PREPARE_FAILED_BAD_INPUT, message # We should read it using KeywordIO for the very beginning. To avoid # get the modified keywords in the patching. try: keywords = KeywordIO().read_keywords(layer) except NoKeywordsFoundError: title = tr( 'The {purpose} layer does not have keywords.').format( purpose=purpose) content = tr( 'The {purpose} layer does not have keywords. Use the wizard ' 'to assign keywords to the layer.').format(purpose=purpose) message = generate_input_error_message( title, m.Paragraph(content)) return PREPARE_FAILED_BAD_INPUT, message if keywords.get('layer_purpose') != purpose: title = tr('The expected {purpose} layer is not an {purpose}.') \ .format(purpose=purpose) content = tr('The expected {purpose} layer is not an {purpose}.') \ .format(purpose=purpose) message = generate_input_error_message( title, m.Paragraph(content)) return PREPARE_FAILED_BAD_INPUT, message version = keywords.get(inasafe_keyword_version_key) supported = is_keyword_version_supported(version) if not supported: parameters = { 'version': inasafe_keyword_version, 'source': layer.publicSource() } title = tr('The {purpose} layer is not up to date.').format( purpose=purpose) content = tr( 'The layer {source} must be updated to {version}.').format( **parameters) message = generate_input_error_message( title, m.Paragraph(content)) return PREPARE_FAILED_BAD_INPUT, message layer.keywords = keywords if is_vector_layer(layer): try: check_inasafe_fields(layer, keywords_only=True) except InvalidLayerError: title = tr('The {purpose} layer is not up to date.').format( purpose=purpose) content = tr( 'The layer {source} must be updated with the keyword ' 'wizard. Your fields which have been set in the keywords ' 'previously are not matching your layer.').format( source=layer.publicSource()) message = generate_input_error_message( title, m.Paragraph(content)) del layer.keywords return PREPARE_FAILED_BAD_INPUT, message return PREPARE_SUCCESS, None