Example #1
0
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
Example #2
0
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