def prepare_analysis(analysis_id): """Prepare and run analysis :param analysis_id: analysis id of the object :type analysis_id: int :return: Celery Async Result :rtype: celery.result.AsyncResult """ analysis = Analysis.objects.get(id=analysis_id) # Set analysis start time Analysis.objects.filter(id=analysis_id).update( start_time=datetime.now()) analysis.refresh_from_db() hazard = get_layer_path(analysis.hazard_layer) exposure = get_layer_path(analysis.exposure_layer) aggregation = ( get_layer_path(analysis.aggregation_layer) if ( analysis.aggregation_layer) else None) # Create temporary aggregation layer if aggregation filter exists if aggregation: aggregation = prepare_aggregation_filter(analysis_id) # Execute analysis in chains: # - Run analysis # - Process analysis result tasks_chain = chain( run_analysis.s( hazard, exposure, aggregation, locale=analysis.language_code).set( queue=run_analysis.queue).set( time_limit=settings.INASAFE_ANALYSIS_RUN_TIME_LIMIT), process_impact_result.s(analysis_id).set( queue=process_impact_result.queue), clean_up_temp_aggregation.s(analysis_id).set( queue=clean_up_temp_aggregation.queue) ) result = tasks_chain.delay() # Parent information will be lost later. # What we should save is the run_analysis task result as this is the # chain's parent while result.parent: result = result.parent return result
def prepare_analysis(analysis_id): """Prepare and run analysis :param analysis_id: analysis id of the object :type analysis_id: int :return: Celery Async Result :rtype: celery.result.AsyncResult """ analysis = Analysis.objects.get(id=analysis_id) hazard = get_layer_path(analysis.hazard_layer) exposure = get_layer_path(analysis.exposure_layer) function = analysis.impact_function_id extent = analysis.user_extent if extent: # Reformat extent into list(float) extent = ast.literal_eval('[' + extent + ']') # Execute analysis in chains: # - Run analysis # - Process analysis result tasks_chain = chain( run_analysis.s( hazard, exposure, function, generate_report=True, requested_extent=extent, archive_impact=False ).set( queue='inasafe-headless-analysis').set( time_limit=settings.INASAFE_ANALYSIS_RUN_TIME_LIMIT), process_impact_result.s( analysis_id ).set(queue='geosafe') ) result = tasks_chain.delay() # Parent information will be lost later. # What we should save is the run_analysis task result as this is the # chain's parent return result.parent