diff --git a/src/headless/celery_app.py b/src/headless/celery_app.py index b0961ee..a01a751 100644 --- a/src/headless/celery_app.py +++ b/src/headless/celery_app.py @@ -1,8 +1,7 @@ # coding=utf-8 -import importlib +import contextlib import json import os -import qgis # noqa from celery import Celery from headless import settings as headless_settings @@ -12,6 +11,7 @@ from headless.utils import set_logger, get_headless_logger from safe.gui.tools.minimum_needs.needs_profile import NeedsProfile from safe.utilities.settings import import_setting +from safe.utilities.utilities import reload_inasafe_modules __copyright__ = "Copyright 2018, The InaSAFE Project" __license__ = "GPL version 3" @@ -77,42 +77,7 @@ def load_minimum_needs(locale='en_US'): profile.save() -def reload_definitions(): - """Brute force reload all related InaSAFE definitions to apply - current locale.""" - package_list = [ - # Reload minimum needs - 'safe.definitions.minimum_needs', - # Reload everything that depends on minimum_needs - 'safe.definitions.fields', - 'safe.definitions', - - # Reload min needs postprocessors - 'safe.processors.minimum_needs_post_processors', - # Reload everything that depends on postprocessors - 'safe.processors', - 'safe.impact_function.postprocessors', - 'safe.impact_function', - - # Reload everything that depends on reporting - 'safe.report.extractors.aggregate_postprocessors', - 'safe.report.extractors.minimum_needs', - 'safe.report' - ] - for p in package_list: - reload(importlib.import_module(p)) - - from safe.definitions import minimum_needs - from safe import processors - LOGGER.debug('Minimum Needs list:') - for m in minimum_needs.minimum_needs_fields: - LOGGER.debug(m) - - LOGGER.debug('Minimum Needs Processors list:') - for m in processors.minimum_needs_post_processors: - LOGGER.debug(m) - - +@contextlib.contextmanager def start_inasafe(locale='en_US'): """Initialize QGIS application and prepare InaSAFE settings. @@ -122,42 +87,45 @@ def start_inasafe(locale='en_US'): :return: Tuple of QGIS application object and IFACE. :rtype: tuple """ - set_logger() - - # Initialize qgis_app - from safe.test.utilities import get_qgis_app - QGIS_APP, CANVAS, IFACE, PARENT = get_qgis_app(locale) - - # Setting - from safe.utilities.settings import set_setting - - # Reload default settings first - from safe.definitions import default_settings - from safe.utilities import settings - reload(default_settings) - reload(settings) - reload(headless_settings) - - load_inasafe_settings() - load_minimum_needs(locale) - - # reload minimum needs definitions - # redeclarations are needed for report - reload_definitions() - - # Load QGIS Expression - from safe.utilities.expressions import qgis_expressions # noqa - - if headless_settings.OUTPUT_DIRECTORY: - try: - os.makedirs(headless_settings.OUTPUT_DIRECTORY) - except OSError: - if not os.path.isdir(headless_settings.OUTPUT_DIRECTORY): - raise - set_setting( - 'defaultUserDirectory', headless_settings.OUTPUT_DIRECTORY) - - return QGIS_APP, IFACE + try: + set_logger() + + # Initialize qgis_app + from safe.test.utilities import get_qgis_app + QGIS_APP, CANVAS, IFACE, PARENT = get_qgis_app(locale) + + # Setting + from safe.utilities.settings import set_setting + + # Reload default settings first + from safe.definitions import default_settings + from safe.utilities import settings + reload(default_settings) + reload(settings) + reload(headless_settings) + + load_inasafe_settings() + load_minimum_needs(locale) + + # reload minimum needs definitions + # redeclarations are needed for report + reload_inasafe_modules() + + # Load QGIS Expression + from safe.utilities.expressions import qgis_expressions # noqa + + if headless_settings.OUTPUT_DIRECTORY: + try: + os.makedirs(headless_settings.OUTPUT_DIRECTORY) + except OSError: + if not os.path.isdir(headless_settings.OUTPUT_DIRECTORY): + raise + set_setting( + 'defaultUserDirectory', headless_settings.OUTPUT_DIRECTORY) + + yield QGIS_APP, IFACE + finally: + QGIS_APP.exit() class SentryCelery(Celery): diff --git a/src/headless/tasks/inasafe_wrapper.py b/src/headless/tasks/inasafe_wrapper.py index 07ca7b3..08acc6c 100644 --- a/src/headless/tasks/inasafe_wrapper.py +++ b/src/headless/tasks/inasafe_wrapper.py @@ -28,11 +28,11 @@ def get_keywords(layer_uri, keyword=None): :rtype: dict, basestring """ # Initialize QGIS and InaSAFE - start_inasafe() + with start_inasafe(): - reload(inasafe_analysis) - metadata = inasafe_analysis.get_keywords(layer_uri, keyword) - return metadata + reload(inasafe_analysis) + metadata = inasafe_analysis.get_keywords(layer_uri, keyword) + return metadata @app.task( @@ -74,13 +74,13 @@ def run_analysis( } """ # Initialize QGIS and InaSAFE - start_inasafe(locale) + with start_inasafe(locale): - reload(inasafe_analysis) - retval = inasafe_analysis.inasafe_analysis( - hazard_layer_uri, exposure_layer_uri, aggregation_layer_uri, crs) + reload(inasafe_analysis) + retval = inasafe_analysis.inasafe_analysis( + hazard_layer_uri, exposure_layer_uri, aggregation_layer_uri, crs) - return retval + return retval @app.task( @@ -133,13 +133,13 @@ def run_multi_exposure_analysis( } """ # Initialize QGIS and InaSAFE - start_inasafe(locale) + with start_inasafe(locale): - reload(inasafe_analysis) - retval = inasafe_analysis.inasafe_multi_exposure_analysis( - hazard_layer_uri, exposure_layer_uris, aggregation_layer_uri, crs) + reload(inasafe_analysis) + retval = inasafe_analysis.inasafe_multi_exposure_analysis( + hazard_layer_uri, exposure_layer_uris, aggregation_layer_uri, crs) - return retval + return retval @app.task( @@ -193,18 +193,19 @@ def generate_report( """ # Initialize QGIS and InaSAFE - _, IFACE = start_inasafe(locale) + with start_inasafe(locale) as app_instance: + __, IFACE = app_instance - reload(inasafe_analysis) - retval = inasafe_analysis.generate_report( - impact_layer_uri, - custom_report_template_uri, - custom_layer_order, - custom_legend_layer, - use_template_extent, - IFACE) + reload(inasafe_analysis) + retval = inasafe_analysis.generate_report( + impact_layer_uri, + custom_report_template_uri, + custom_layer_order, + custom_legend_layer, + use_template_extent, + IFACE) - return retval + return retval @app.task( @@ -246,11 +247,11 @@ def get_generated_report(impact_layer_uri): } """ # Initialize QGIS and InaSAFE - start_inasafe() + with start_inasafe(): - reload(inasafe_analysis) - result = inasafe_analysis.get_generated_report(impact_layer_uri) - return result + reload(inasafe_analysis) + result = inasafe_analysis.get_generated_report(impact_layer_uri) + return result @app.task( @@ -270,11 +271,11 @@ def generate_contour(layer_uri): current_datetime format: 25January2018_09h25-17.597909 """ # Initialize QGIS and InaSAFE - start_inasafe() + with start_inasafe(): - reload(inasafe_analysis) - result = inasafe_analysis.generate_contour(layer_uri) - return result + reload(inasafe_analysis) + result = inasafe_analysis.generate_contour(layer_uri) + return result @app.task( @@ -311,8 +312,8 @@ def push_to_geonode(layer_uri): } """ # Initialize QGIS and InaSAFE - start_inasafe() + with start_inasafe(): - reload(inasafe_analysis) - result = inasafe_analysis.push_to_geonode(layer_uri) - return result + reload(inasafe_analysis) + result = inasafe_analysis.push_to_geonode(layer_uri) + return result