inasafe/inasafe

View on GitHub
safe/definitions/reports/components.py

Summary

Maintainability
D
2 days
Test Coverage
# coding=utf-8
"""Contains definitions about Report components.

"""


from safe.definitions.concepts import concepts
from safe.definitions.exposure import (
    exposure_structure, exposure_road, exposure_land_cover)
from safe.definitions.fields import (
    affected_field,
    total_affected_field,
    total_not_affected_field,
    total_not_exposed_field,
    population_exposed_per_mmi_field,
    population_displaced_per_mmi,
    fatalities_per_mmi_field,
    population_count_field,
    displaced_field,
    fatalities_field,
    affected_productivity_field,
    affected_production_cost_field,
    affected_production_value_field,
    exposure_total_affected_field,
    exposure_total_not_affected_field,
    exposure_total_not_exposed_field)
from safe.definitions.reports import (
    jinja2_component_type,
    qgis_composer_component_type,
    qt_renderer_component_type,
    svg_product_tag,
    png_product_tag,
    infographic_product_tag,
    final_product_tag,
    html_product_tag,
    table_product_tag,
    map_product_tag,
    pdf_product_tag,
    template_product_tag,
    qpt_product_tag)
from safe.definitions.styles import charcoal_black
from safe.report.extractors.action_notes import (
    action_checklist_extractor,
    notes_assumptions_extractor,
    action_checklist_report_extractor,
    action_checklist_report_pdf_extractor)
from safe.report.extractors.aggregate_postprocessors import (
    aggregation_postprocessors_extractor)
from safe.report.extractors.aggregate_result import (
    aggregation_result_extractor)
from safe.report.extractors.analysis_detail import analysis_detail_extractor
from safe.report.extractors.analysis_provenance_details import (
    analysis_provenance_details_extractor,
    analysis_provenance_details_simplified_extractor,
    analysis_provenance_details_report_extractor,
    analysis_provenance_details_pdf_extractor)
from safe.report.extractors.analysis_question import (
    analysis_question_extractor)
from safe.report.extractors.composer import (
    qgis_composer_extractor,
    qgis_composer_infographic_extractor)
from safe.report.extractors.general_report import general_report_extractor
from safe.report.extractors.impact_table import (
    impact_table_extractor,
    impact_table_pdf_extractor)
from safe.report.extractors.infographics import (
    population_chart_legend_extractor,
    infographic_people_section_notes_extractor)
from safe.report.extractors.minimum_needs import minimum_needs_extractor
from safe.report.extractors.mmi_detail import mmi_detail_extractor
from safe.report.extractors.population_chart import (
    population_chart_extractor,
    population_chart_to_png_extractor)
from safe.report.processors.default import (
    qgis_composer_renderer,
    jinja2_renderer,
    qgis_composer_html_renderer,
    qt_svg_to_png_renderer)
from safe.report.report_metadata import (
    Jinja2ComponentsMetadata,
    QgisComposerComponentsMetadata)
from safe.utilities.i18n import tr
from safe.utilities.resources import resources_path

__copyright__ = "Copyright 2016, The InaSAFE Project"
__license__ = "GPL version 3"
__email__ = "info@inasafe.org"
__revision__ = '$Format:%H$'


# Individual report component
analysis_question_component = {
    'key': 'analysis-question',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': analysis_question_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'analysis-result-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'analysis-question.html',
    'extra_args': {
        'header': tr('Analysis question')
    }
}

general_report_component = {
    'key': 'general-report',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': general_report_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'general-report-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'general-report.html',
    'extra_args': {
        'header': tr('General Report'),
        'table_header_format': tr('Estimated {title} affected per {unit}'),
        'hazard_header': tr('Hazard Zone'),
        # Used to customize header.
        # See issue inasafe#3688: remove all 'total' words
        'reported_fields_header': tr('Exposure status'),
        'reported_fields': [
            {
                'header': affected_field['name'],
                'field': total_affected_field,
                'multi_exposure_field': exposure_total_affected_field
            },
            {
                # specify it directly since there is no field for
                # unaffected only.
                'header': tr('Not Affected'),
                'field': total_not_affected_field,
                'multi_exposure_field': exposure_total_not_affected_field
            },
            {
                'header': tr('Not Exposed'),
                'field': total_not_exposed_field,
                'multi_exposure_field': exposure_total_not_exposed_field
            },
            {
                'header': displaced_field['name'],
                'field': displaced_field
            },
            {
                'header': fatalities_field['name'],
                'field': fatalities_field
            }
        ],
        'concept_notes': {
            'population_concepts': [
                concepts['exposed_people'],
                concepts['affected_people'],
                concepts['displaced_people']
            ],
            'general_concepts': [
                concepts['affected']
            ],
            'note_format': '{name}: {description}'
        }
    }
}

mmi_detail_component = {
    'key': 'mmi-detail',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': mmi_detail_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'mmi-detail-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'mmi-detail.html',
    'extra_args': {
        'header': tr('MMI Detail'),
        'mmi_header': tr('MMI'),
        # used to customize header
        'reported_fields': [
            {
                'header': tr('Exposed'),
                'field': population_exposed_per_mmi_field
            },
            {
                'header': tr('Displaced'),
                'field': population_displaced_per_mmi
            },
            {
                'header': tr('Fatalities'),
                'field': fatalities_per_mmi_field
            }
        ],
        'total_fields': [
            # TODO: change to total exposed population field once it is
            # available
            population_count_field,
            displaced_field,
            fatalities_field
        ],
        'total_header': tr('Total'),
    }
}

analysis_detail_component = {
    'key': 'analysis-detail',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': analysis_detail_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'analysis-detail-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'analysis-detail.html',
    'extra_args': {
        'exposure_type_header_mapping': {
            # In the report, exposure type is usually singular
            # We can also use this to rename exposure name
            exposure_structure['key']: tr('Structure'),
            exposure_road['key']: tr('Road'),
            exposure_land_cover['key']: tr('Land cover')
        },
        'hazard_class_header_mapping': {
            'affected': {
                'header': tr('Affected'),
                # this is color for background in affected column in
                # hex #rgb format. Don't declare this for default bootstrap
                # background
                # 'color': affected_column_background.name()
            },
            'not_affected': {
                'header': tr('Not affected')
            }
        },
        'group_border_color': charcoal_black.name(),
        'breakdown_header_type_format': tr('{exposure} type'),
        'breakdown_header_class_format': tr('{exposure} class'),
        'header': tr('Analysis Detail'),
        'table_header_format': tr(
            'Estimated {title} {unit} affected by {exposure} type'),
        'notes': [],
        'extra_table_header_format': tr(
            'Estimated loss by affected {exposure} type'),
        'exposure_extra_fields': {
            exposure_land_cover['key']: [
                affected_productivity_field,
                affected_production_cost_field,
                affected_production_value_field,
            ],
        },
        'place_with_population': {
            'header': tr('Total exposed population')
        }
    }
}

action_checklist_component = {
    'key': 'action-checklist',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': action_checklist_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'action-checklist-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'action-note-categorized.html',
    'extra_args': {
        'header': tr('Action Checklist')
    }
}

notes_assumptions_component = {
    'key': 'notes-assumptions',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': notes_assumptions_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'notes-assumptions-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'action-note-categorized.html',
    'extra_args': {
        'header': tr('Notes and assumptions'),
        'analysis_notes': {
            'item_header': tr('analysis notes'),
            'item_list': [
                tr('Columns and rows containing only 0 or "No data" values '
                   'are excluded from the tables.')
            ]
        },
        'affected_note_format': {
            'item_header': tr('affected notes'),
            'item_list': [
                tr('Exposures in the following hazard classes are considered '
                   'affected: {hazard_classes}')
            ]
        },
        'displacement_rates_note_format': {
            'item_header': tr('displacement rates notes'),
            'item_list': [
                tr('For this analysis, the following displacement rates were '
                   'used: {rate_description}')
            ]
        },
        'hazard_displacement_rates_note_format': tr(
            '{name} - {displacement_rate:.0%}'),
        'fatality_rates_note_format': {
            'item_header': tr('fatality rates notes'),
            'item_list': [
                tr('For this analysis, the following fatality rates were '
                   'used: {rate_description}')
            ]
        },
        'hazard_fatality_rates_note_format': tr(
            '{name} - {fatality_rate}%')
    }
}

minimum_needs_component = {
    'key': 'minimum-needs',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': minimum_needs_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'minimum-needs-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'minimum-needs.html',
    'extra_args': {
        'header': tr('Minimum needs'),
        'header_frequency_format': tr(
            'Relief items to be provided {frequency}'),
        'header_additional_needs_format': tr(
            'Additional items to be provided {frequency}'),
        'total_header': tr('Total'),
        'need_header_format': tr('{name} [{unit_abbreviation}]'),
        'zero_displaced_message': tr(
            'Analysis produced 0 displaced count. No calculations produced.')
    }
}

aggregation_result_component = {
    'key': 'aggregation-result',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': aggregation_result_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'aggregation-result-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'aggregation-result.html',
    'extra_args': {
        'header': tr('Aggregation Result'),
        'notes': [],
        'table_header_format': tr(
            'Estimated {title} {unit} affected by aggregation area'),
        'aggregation_area_default_header': tr('Aggregation area'),
        'total_header': tr('Total'),
        'total_in_aggregation_header': tr('Total'),
    }
}

aggregation_postprocessors_component = {
    'key': 'aggregation-postprocessors',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': aggregation_postprocessors_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'aggregation-postprocessors-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'aggregation-postprocessors.html',
    'extra_args': {
        'header': tr('Detailed demographic breakdown'),
        'sections': {
            'minimum_needs': {
                'header': tr('Estimated number of minimum needs per week')
            }
        },
        'defaults': {
            'aggregation_header': tr('Aggregation area'),
            'total_population_header': tr('Total Displaced Population'),
            'total_header': tr('Total'),
            'notes': [],
            'section_header_format': tr(
                'Estimated number of people displaced by {header_name} '
                'per aggregation area'),
            'section_header_format_no_aggregation': tr(
                'Estimated number of people displaced by {header_name} '),
            'group_header_format': tr('{header_name} breakdown'),
            'zero_displaced_message': tr(
                'Analysis produced 0 displaced count. '
                'No calculations produced.'),
            'no_gender_rate_message': tr(
                'Gender ratio is not found. '
                'No calculations produced.'),
            'no_age_rate_message': tr(
                'Age ratio is not found. '
                'No calculations produced.'),
            'no_vulnerability_rate_message': tr(
                'Vulnerability ratio is not found. '
                'No calculations produced.')
        }
    }
}

analysis_provenance_details_component = {
    'key': 'analysis-provenance-details',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': analysis_provenance_details_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'analysis-provenance-details-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'analysis-provenance-details.html',
    'extra_args': {
        'defaults': {
            'source': tr('source not available'),
            'reference': tr('reference unspecified'),
            'aggregation_not_used': tr('not used')
        },
        'header': {
            'analysis_detail': tr('Analysis details')
        },
        'provenance_format': {
            'impact_function_header': tr('Impact Function'),
            'hazard_header': tr('Hazard'),
            'exposure_header': tr('Exposure'),
            'aggregation_header': tr('Aggregation'),
            'analysis_environment_header': tr('Analysis Environment')
        }
    }
}

analysis_provenance_details_simplified_component = {
    'key': 'analysis-provenance-details-simplified',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': analysis_provenance_details_simplified_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'analysis-provenance-details-simplified-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'analysis-provenance-details-simplified.html',
    'extra_args': {
        'defaults': {
            'source': tr('source not available'),
            'reference': tr('reference unspecified'),
            'aggregation_not_used': tr('not used')
        },
        'header': {
            'analysis_detail': tr('Analysis details')
        },
        'provenance_format': {
            'hazard_header': tr('Hazard source'),
            'hazard_format': '{layer_name} - {source} - ',

            'exposure_header': tr('Exposure source'),
            'exposure_format': '{layer_name} - {source} - ',

            'aggregation_header': tr('Aggregation source'),
            'aggregation_format': '{layer_name} - {source} - ',

            'impact_function_header': tr('Impact Function'),
            'impact_function_format': '{impact_function_name}',
        }
    }
}

population_chart_svg_component = {
    'key': 'population-chart',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': population_chart_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.File,
    'output_path': 'population-chart.svg',
    'template': 'standard-template'
                '/jinja2/svg'
                '/donut-chart.svg',
    'tags': [svg_product_tag],
    'extra_args': {
        'chart_title': tr('Estimated total population'),
        'total_header': tr('Exposed')
    }
}

population_chart_png_component = {
    # This component depends on population_chart_svg_component
    'key': 'population-chart-png',
    'type': qt_renderer_component_type,
    'processor': qt_svg_to_png_renderer,
    'extractor': population_chart_to_png_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.File,
    'output_path': 'population-chart.png',
    'tags': [png_product_tag],
    'extra_args': {
        'width': 256,
        'height': 256
    }
}

population_chart_legend_component = {
    # This component depends on population_chart_png_component
    'key': 'population-chart-legend',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': population_chart_legend_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'population-chart-legend-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'population-chart-legend.html',
}

infographic_people_section_notes_component = {
    'key': 'infographic-people-section-notes',
    'type': jinja2_component_type,
    'processor': jinja2_renderer,
    'extractor': infographic_people_section_notes_extractor,
    'output_format': Jinja2ComponentsMetadata.OutputFormat.String,
    'output_path': 'infographic-people-section-notes-output.html',
    'template': 'standard-template/'
                'jinja2/'
                'infographic-people-section-notes.html',
    'extra_args': {
        'extra_note': tr(
            'In this analysis, people are considered to be affected if they '
            'are exposed to the hazard, and considered to be displaced if '
            'they exposed to high or medium hazard.'),
        'hazard_displacement_rates_note_format': tr(
            '{displacement_rate:.0%} affected in {name} {classification_unit}')
    }
}

population_infographic_component = {
    # This component depends on population_chart_png_component,
    # population_chart_legend_component, and
    # infographic_people_section_notes_component
    'key': 'population-infographic',
    'type': qgis_composer_component_type,
    'processor': qgis_composer_renderer,
    'extractor': qgis_composer_infographic_extractor,
    'output_format': {
        'map': QgisComposerComponentsMetadata.OutputFormat.PDF,
        'template': QgisComposerComponentsMetadata.OutputFormat.QPT
    },
    'output_path': {
        'map': 'infographic.pdf',
        'template': 'infographic.qpt'
    },
    'orientation': 'landscape',
    'page_dpi': 300,
    'page_width': 297,
    'page_height': 210,
    'template': '../qgis-composer-templates/'
                'infographic.qpt',
    'tags': [
        final_product_tag,
        infographic_product_tag,
        template_product_tag,
        pdf_product_tag,
        qpt_product_tag
    ],
    'extra_args': {
        'components': {
            'population-chart-legend': population_chart_legend_component,
            'infographic-people-section-notes': (
                infographic_people_section_notes_component)
        }
    },
}

# Default impact report component for reusability
impact_report_component_metadata = [
    analysis_question_component,
    general_report_component,
    mmi_detail_component,
    analysis_detail_component,
    action_checklist_component,
    notes_assumptions_component,
    minimum_needs_component,
    aggregation_result_component,
    aggregation_postprocessors_component,
    analysis_provenance_details_simplified_component,
    analysis_provenance_details_component
]

# Standard HTML output for impact report
standard_impact_report_metadata_html = {
    'key': 'analysis-result-html',
    'name': 'analysis-result-html',
    'template_folder': resources_path('report-templates'),
    'components': impact_report_component_metadata + [
        {
            'key': 'impact-report',
            'type': jinja2_component_type,
            'processor': jinja2_renderer,
            'extractor': impact_table_extractor,
            'output_format': Jinja2ComponentsMetadata.OutputFormat.File,
            'output_path': 'impact-report-output.html',
            'resources': [
                resources_path('css'),
                resources_path('js')],
            'template': 'standard-template/'
                        'jinja2/'
                        'impact-report-layout.html',
            'tags': [
                final_product_tag,
                table_product_tag,
                html_product_tag
            ],
            'extra_args': {
                'components_list': {
                    'analysis_question': analysis_question_component,
                    'general_report': general_report_component,
                    'mmi_detail': mmi_detail_component,
                    'analysis_detail': analysis_detail_component,
                    'action_checklist': action_checklist_component,
                    'notes_assumptions': notes_assumptions_component,
                    'minimum_needs': minimum_needs_component,
                    'aggregation_result': aggregation_result_component,
                    'aggregation_postprocessors': (
                        aggregation_postprocessors_component),
                    'analysis_provenance_details_simplified': (
                        analysis_provenance_details_simplified_component)
                }
            }
        },
        {
            'key': 'action-checklist-report',
            'type': jinja2_component_type,
            'processor': jinja2_renderer,
            'extractor': action_checklist_report_extractor,
            'output_format': Jinja2ComponentsMetadata.OutputFormat.File,
            'output_path': 'action-checklist-output.html',
            'template': 'standard-template/'
                        'jinja2/'
                        'action-checklist-layout.html',
            'tags': [
                final_product_tag,
                table_product_tag,
                html_product_tag
            ],
            'extra_args': {
                'components_list': {
                    'analysis_question': analysis_question_component,
                    'action_checklist': action_checklist_component,
                    'analysis_provenance_details': (
                        analysis_provenance_details_simplified_component)
                }
            }
        },
        {
            'key': 'analysis-provenance-details-report',
            'type': jinja2_component_type,
            'processor': jinja2_renderer,
            'extractor': analysis_provenance_details_report_extractor,
            'output_format': Jinja2ComponentsMetadata.OutputFormat.File,
            'output_path': 'analysis-provenance-details-report-output.html',
            'template': 'standard-template/'
                        'jinja2/'
                        'analysis-provenance-details-layout.html',
            'tags': [
                final_product_tag,
                table_product_tag,
                html_product_tag
            ],
            'extra_args': {
                'components_list': {
                    'analysis_question': analysis_question_component,
                    'analysis_provenance_details': (
                        analysis_provenance_details_component)
                }
            }
        }
    ]
}

# Impact Report PDF
impact_report_pdf_component = {
    'key': 'impact-report-pdf',
    'type': qgis_composer_component_type,
    'processor': qgis_composer_html_renderer,
    'extractor': impact_table_pdf_extractor,
    'output_format': QgisComposerComponentsMetadata.OutputFormat.PDF,
    'output_path': 'impact-report-output.pdf',
    'tags': [
        final_product_tag,
        table_product_tag,
        pdf_product_tag
    ],
    'extra_args': {
        'html_report_component_key': 'impact-report'
    }
}

# Action Checklist Report PDF
action_checklist_pdf_component = {
    'key': 'action-checklist-pdf',
    'type': qgis_composer_component_type,
    'processor': qgis_composer_html_renderer,
    'extractor': action_checklist_report_pdf_extractor,
    'output_format': QgisComposerComponentsMetadata.OutputFormat.PDF,
    'output_path': 'action-checklist-output.pdf',
    'tags': [
        final_product_tag,
        table_product_tag,
        pdf_product_tag
    ]
}

# Analysis Provenance Details Report PDF
analysis_provenance_details_pdf_component = {
    'key': 'analysis-provenance-details-report-pdf',
    'type': qgis_composer_component_type,
    'processor': qgis_composer_html_renderer,
    'extractor': analysis_provenance_details_pdf_extractor,
    'output_format': QgisComposerComponentsMetadata.OutputFormat.PDF,
    'output_path': 'analysis-provenance-details-report-output.pdf',
    'tags': [
        final_product_tag,
        table_product_tag,
        pdf_product_tag
    ]
}

# Standard PDF Output for impact report
standard_impact_report_metadata_pdf = {
    'key': 'analysis-result-pdf',
    'name': 'analysis-result-pdf',
    'template_folder': resources_path('report-templates'),
    'components': standard_impact_report_metadata_html['components'] + [
        impact_report_pdf_component,
        action_checklist_pdf_component,
        analysis_provenance_details_pdf_component
    ]
}

# Default multi exposure report components
multi_exposure_impact_report_component_metadata = [
    analysis_question_component,
    general_report_component
]

# Standard HTML output for multi exposure impact report
standard_multi_exposure_impact_report_metadata_html = {
    'key': 'multi-exposure-analysis-result-html',
    'name': 'multi-exposure-analysis-result-html',
    'template_folder': resources_path('report-templates'),
    'components': multi_exposure_impact_report_component_metadata + [
        {
            'key': 'multi-exposure-impact-report',
            'type': jinja2_component_type,
            'processor': jinja2_renderer,
            'extractor': impact_table_extractor,
            'output_format': Jinja2ComponentsMetadata.OutputFormat.File,
            'output_path': 'multi-exposure-impact-report-output.html',
            'resources': [
                resources_path('css'),
                resources_path('js')],
            'template': 'standard-template/'
                        'jinja2/'
                        'multi-exposure-impact-report-layout.html',
            'tags': [
                final_product_tag,
                table_product_tag,
                html_product_tag
            ],
            'extra_args': {
                'components_list': {
                    'analysis_question': analysis_question_component,
                    'general_report': general_report_component,
                }
            }
        },
    ]
}

# Standard PDF Output for impact report
standard_multi_exposure_impact_report_metadata_pdf = {
    'key': 'multi-exposure-analysis-result-pdf',
    'name': 'multi-exposure-analysis-result-pdf',
    'template_folder': resources_path('report-templates'),
    'components': (
        standard_multi_exposure_impact_report_metadata_html['components'] + (
            [
                # Impact Report PDF
                {
                    'key': 'multi-exposure-impact-report-pdf',
                    'type': qgis_composer_component_type,
                    'processor': qgis_composer_html_renderer,
                    'extractor': impact_table_pdf_extractor,
                    'output_format': (
                        QgisComposerComponentsMetadata.OutputFormat.PDF),
                    'output_path': 'multi-exposure-impact-report-output.pdf',
                    'tags': [
                        final_product_tag,
                        table_product_tag,
                        pdf_product_tag
                    ],
                    'extra_args': {
                        'html_report_component_key': (
                            'multi-exposure-impact-report')
                    }
                },
            ]
        )
    )
}

map_report_extra_args = {
    'defaults': {
        'unknown_source': tr('Unknown'),
        'aggregation_not_used': tr('Not used')
    },
    'version-title': tr('Software'),
    'disclaimer-title': tr('Disclaimer'),
    'date-title': tr('Date'),
    'date-format': '%Y-%m-%d',
    'time-title': tr('Time'),
    'time-format': '%H:%M',
    'caution-title': tr('Note'),
    'caution-text': tr(
        'This assessment is a guide - we strongly recommend that '
        'you ground truth the results shown here before '
        'deploying resources and / or personnel.'),
    'version-text': tr('InaSAFE {version}'),
    'legend-title': tr('Legend'),
    'information-title': tr('Analysis information'),
    'supporters-title': tr('Report produced by'),
    'source-title': tr('Data Source'),
    'analysis-title': tr('Analysis Name'),
    'spatial-reference-title': tr('Reference'),
    'spatial-reference-format': tr(
        'Geographic Coordinates - {crs}')
}

map_report = {
    'key': 'inasafe-map-report',
    'name': 'inasafe-map-report',
    'template_folder': resources_path('report-templates'),
    'components': [
        {
            'key': 'inasafe-map-report-portrait',
            'type': qgis_composer_component_type,
            'processor': qgis_composer_renderer,
            'extractor': qgis_composer_extractor,
            'output_format': {
                'map': QgisComposerComponentsMetadata.OutputFormat.PDF,
                'template': QgisComposerComponentsMetadata.OutputFormat.QPT
            },
            'template': '../qgis-composer-templates/'
                        'inasafe-map-report-portrait.qpt',
            'tags': [
                final_product_tag,
                map_product_tag,
                template_product_tag,
                pdf_product_tag,
                qpt_product_tag
            ],
            'output_path': {
                'map': 'inasafe-map-report-portrait.pdf',
                'template': 'inasafe-map-report-portrait.qpt'
            },
            'extra_args': map_report_extra_args
        },
        {
            'key': 'inasafe-map-report-landscape',
            'type': qgis_composer_component_type,
            'processor': qgis_composer_renderer,
            'extractor': qgis_composer_extractor,
            'output_format': {
                'map': QgisComposerComponentsMetadata.OutputFormat.PDF,
                'template': QgisComposerComponentsMetadata.OutputFormat.QPT
            },
            'template': '../qgis-composer-templates/'
                        'inasafe-map-report-landscape.qpt',
            'tags': [
                final_product_tag,
                map_product_tag,
                template_product_tag,
                pdf_product_tag,
                qpt_product_tag
            ],
            'output_path': {
                'map': 'inasafe-map-report-landscape.pdf',
                'template': 'inasafe-map-report-landscape.qpt'
            },
            'orientation': 'landscape',
            'page_dpi': 300,
            'page_width': 297,
            'page_height': 210,
            'extra_args': map_report_extra_args
        }
    ]
}

map_report_component_boilerplate = {
    'key': 'boilerplate',  # should be updated if this component is used
    'type': qgis_composer_component_type,
    'processor': qgis_composer_renderer,
    'extractor': qgis_composer_extractor,
    'output_format': {
        'map': QgisComposerComponentsMetadata.OutputFormat.PDF,
        'template': QgisComposerComponentsMetadata.OutputFormat.QPT
    },
    'template': 'boilerplate.qpt',  # should be updated
    'tags': [
        final_product_tag,
        map_product_tag,
        template_product_tag,
        pdf_product_tag,
        qpt_product_tag
    ],
    'output_path': {
        'map': 'boilerplate.pdf',  # should be updated
        'template': 'boilerplate.qpt'  # should be updated
    },
    # we set the orientation is landscape by default
    'orientation': 'landscape',
    'page_dpi': 300,
    'page_width': 297,
    'page_height': 210,
    'extra_args': map_report_extra_args
}

infographic_report = {
    'key': 'infographic_report',
    'name': 'infographic_report',
    'template_folder': resources_path('report-templates'),
    'components': [
        population_chart_svg_component,
        population_chart_png_component,
        population_chart_legend_component,
        infographic_people_section_notes_component,
        population_infographic_component
    ]
}

all_default_report_components = [
    standard_impact_report_metadata_pdf,
    standard_multi_exposure_impact_report_metadata_pdf,
    map_report,
    infographic_report]