def show_help(self): """Show usage info to the user.""" # Read the header and footer html snippets self.main_stacked_widget.setCurrentIndex(0) header = html_header() footer = html_footer() string = header message = options_help() string += message.to_html() string += footer self.help_web_view.setHtml(string)
def content(): """Helper method that returns just the content. This method was added so that the text could be reused in the dock_help module. .. versionadded:: 4.0.0 :returns: A message object without brand element. :rtype: safe.messaging.message.Message """ # We will store a contents section at the top for easy navigation table_of_contents = m.Message() # and this will be the main message that we create message = m.Message() _create_section_header( message, table_of_contents, 'overview', tr('Overview'), heading_level=1) ## # Credits and disclaimers ... ## _create_section_header( message, table_of_contents, 'disclaimer', tr('Disclaimer'), heading_level=2) message.add(m.Paragraph(definitions.messages.disclaimer())) _create_section_header( message, table_of_contents, 'limitations', tr('Limitations and License'), heading_level=2) bullets = m.BulletedList() for item in definitions.limitations(): bullets.add(item) message.add(bullets) ## # Basic concepts ... ## ## # Help dialog contents ... ## _create_section_header( message, table_of_contents, 'glossary', tr('Glossary of terms'), heading_level=1) last_group = None table = None for key, value in definitions.concepts.iteritems(): current_group = value['group'] if current_group != last_group: if last_group is not None: message.add(table) _create_section_header( message, table_of_contents, current_group.replace(' ', '-'), current_group, heading_level=2) table = _start_glossary_table(current_group) last_group = current_group row = m.Row() term = value['key'].replace('_', ' ').title() description = m.Message(value['description']) for citation in value['citations']: if citation['text'] in [None, '']: continue if citation['link'] in [None, '']: description.add(m.Paragraph(citation['text'])) else: description.add(m.Paragraph( m.Link(citation['link'], citation['text']))) row.add(m.Cell(term)) row.add(m.Cell(description)) url = _definition_icon_url(value) if url: row.add(m.Cell(m.Image(url, **MEDIUM_ICON_STYLE))) else: row.add(m.Cell('')) table.add(row) # ensure the last group's table is added message.add(table) ## # Help dialog contents ... ## _create_section_header( message, table_of_contents, 'core-functionality', tr('Core functionality and tools'), heading_level=1) _create_section_header( message, table_of_contents, 'dock', tr('The InaSAFE Dock'), heading_level=2) message.add(dock_help()) _create_section_header( message, table_of_contents, 'reports', tr('InaSAFE Reports'), heading_level=2) message.add(report_help()) _create_section_header( message, table_of_contents, 'extents', tr('Managing analysis extents with the extents selector'), heading_level=2) message.add(extent_help()) _create_section_header( message, table_of_contents, 'options', tr('InaSAFE Options'), heading_level=2) message.add(options_help()) _create_section_header( message, table_of_contents, 'batch-runner', tr('The Batch Runner'), heading_level=2) message.add(batch_help()) _create_section_header( message, table_of_contents, 'osm-downloader', tr('The OpenStreetmap Downloader'), heading_level=2) message.add(osm_help()) _create_section_header( message, table_of_contents, 'petabencana-downloader', tr('The PetaBencana Downloader'), heading_level=2) message.add(petabencana_help()) _create_section_header( message, table_of_contents, 'shakemap-converter', tr('The Shakemap Converter'), heading_level=2) message.add(shakemap_help()) _create_section_header( message, table_of_contents, 'multi-buffer-tool', tr('The Multi Buffer Tool'), heading_level=2) message.add(multi_buffer_help()) # Field mapping tool has a few added bits to enumerate the groups _create_section_header( message, table_of_contents, 'field-mapping-tool', tr('The Field Mapping Tool'), heading_level=2) message.add(field_mapping_tool_help()) _create_section_header( message, table_of_contents, 'exposure-groups', tr('Exposure Groups'), heading_level=3) message.add(m.Paragraph( 'The following demographic groups apply only to vector population ' 'exposure layers:' )) for group in population_field_groups: definition_to_message( group, message, table_of_contents, heading_level=4) _create_section_header( message, table_of_contents, 'aggregation-groups', tr('Aggregation Groups'), heading_level=3) message.add(m.Paragraph( 'The following demographic groups apply only to aggregation layers:' )) for group in aggregation_field_groups: definition_to_message( group, message, table_of_contents, heading_level=4) # End of field mapping tool help # Keep this last in the tool section please as it has subsections # and so uses the top level section style _create_section_header( message, table_of_contents, 'minimum-needs', tr('Minimum Needs'), heading_level=2) _create_section_header( message, table_of_contents, 'minimum-needs-tool', tr('The minimum needs tool'), heading_level=3) message.add(needs_help()) _create_section_header( message, table_of_contents, 'minimum-manager', tr('The minimum needs manager'), heading_level=3) message.add(needs_manager_help()) ## # Analysis workflow ## _create_section_header( message, table_of_contents, 'analysis-steps', tr('Analysis steps'), heading_level=1) _create_section_header( message, table_of_contents, 'analysis-internal-process', tr('Analysis internal process'), heading_level=2) analysis = definitions.concepts['analysis'] message.add(analysis['description']) url = _definition_screenshot_url(analysis) if url: message.add(m.Paragraph(m.Image(url), style_class='text-center')) _create_section_header( message, table_of_contents, 'analysis-progress-reporting', tr('Progress reporting steps'), heading_level=2) steps = definitions.analysis_steps.values() for step in steps: definition_to_message( step, message, table_of_contents, heading_level=3) ## # Hazard definitions ## _create_section_header( message, table_of_contents, 'hazards', tr('Hazard Concepts'), heading_level=1) hazard_category = definitions.hazard_category definition_to_message( hazard_category, message, table_of_contents, heading_level=2) hazards = definitions.hazards definition_to_message( hazards, message, table_of_contents, heading_level=2) ## # Exposure definitions ## _create_section_header( message, table_of_contents, 'exposures', tr('Exposure Concepts'), heading_level=1) exposures = definitions.exposures definition_to_message( exposures, message, table_of_contents, heading_level=2) ## # Defaults ## _create_section_header( message, table_of_contents, 'defaults', tr('InaSAFE Defaults'), heading_level=1) table = m.Table(style_class='table table-condensed table-striped') row = m.Row() row.add(m.Cell(tr('Name'), header=True)) row.add(m.Cell(tr('Default value'), header=True)) row.add(m.Cell(tr('Default min'), header=True)) row.add(m.Cell(tr('Default max'), header=True)) row.add(m.Cell(tr('Description'), header=True)) table.add(row) defaults = [ definitions.youth_ratio_default_value, definitions.adult_ratio_default_value, definitions.elderly_ratio_default_value, definitions.female_ratio_default_value, definitions.feature_rate_default_value ] for default in defaults: row = m.Row() row.add(m.Cell(default['name'])) row.add(m.Cell(default['default_value'])) row.add(m.Cell(default['min_value'])) row.add(m.Cell(default['max_value'])) row.add(m.Cell(default['description'])) table.add(row) message.add(table) ## # All Fields ## _create_section_header( message, table_of_contents, 'all-fields', tr('Fields'), heading_level=1) _create_section_header( message, table_of_contents, 'input-fields', tr('Input dataset fields'), heading_level=2) _create_fields_section( message, table_of_contents, tr('Exposure fields'), definitions.exposure_fields) _create_fields_section( message, table_of_contents, tr('Hazard fields'), definitions.hazard_fields) _create_fields_section( message, table_of_contents, tr('Aggregation fields'), definitions.aggregation_fields) _create_section_header( message, table_of_contents, 'output-fields', tr('Output dataset fields'), heading_level=2) _create_fields_section( message, table_of_contents, tr('Impact fields'), definitions.impact_fields) _create_fields_section( message, table_of_contents, tr('Aggregate hazard fields'), definitions.aggregate_hazard_fields) _create_fields_section( message, table_of_contents, tr('Aggregation summary fields'), definitions.aggregation_summary_fields) _create_fields_section( message, table_of_contents, tr('Exposure summary table fields'), definitions.exposure_summary_table_fields) _create_fields_section( message, table_of_contents, tr('Analysis fields'), definitions.analysis_fields) ## # Geometries ## _create_section_header( message, table_of_contents, 'geometries', tr('Layer Geometry Types'), heading_level=1) _create_section_header( message, table_of_contents, 'vector-geometries', tr('Vector'), heading_level=2) definition_to_message( definitions.layer_geometry_point, message, table_of_contents, heading_level=3) definition_to_message( definitions.layer_geometry_line, message, table_of_contents, heading_level=3) definition_to_message( definitions.layer_geometry_polygon, message, table_of_contents, heading_level=3) _create_section_header( message, table_of_contents, 'raster-geometries', tr('Raster'), heading_level=2) definition_to_message( definitions.layer_geometry_raster, message, table_of_contents, heading_level=3) ## # Layer Modes ## _create_section_header( message, table_of_contents, 'layer-modes', tr('Layer Modes'), heading_level=1) definition_to_message( definitions.layer_mode, message, table_of_contents, heading_level=2) ## # Layer Purposes ## _create_section_header( message, table_of_contents, 'layer-purposes', tr('Layer Purposes'), heading_level=1) definition_to_message( definitions.layer_purpose_hazard, message, table_of_contents, heading_level=2) definition_to_message( definitions.layer_purpose_exposure, message, table_of_contents, heading_level=2) definition_to_message( definitions.layer_purpose_aggregation, message, table_of_contents, heading_level=2) definition_to_message( definitions.layer_purpose_exposure_summary, message, table_of_contents, heading_level=2) definition_to_message( definitions.layer_purpose_aggregate_hazard_impacted, message, table_of_contents, heading_level=2) definition_to_message( definitions.layer_purpose_aggregation_summary, message, table_of_contents, heading_level=2) definition_to_message( definitions.layer_purpose_exposure_summary_table, message, table_of_contents, heading_level=2) definition_to_message( definitions.layer_purpose_profiling, message, table_of_contents, heading_level=2) ## # All units ## _create_section_header( message, table_of_contents, 'all-units', tr('All Units'), heading_level=1) table = m.Table(style_class='table table-condensed table-striped') row = m.Row() row.add(m.Cell(tr('Name'), header=True)) row.add(m.Cell(tr('Plural'), header=True)) row.add(m.Cell(tr('Abbreviation'), header=True)) row.add(m.Cell(tr('Details'), header=True)) table.add(row) for unit in definitions.units_all: row = m.Row() row.add(m.Cell(unit['name'])) row.add(m.Cell(unit['plural_name'])) row.add(m.Cell(unit['abbreviation'])) row.add(m.Cell(unit['description'])) table.add(row) message.add(table) ## # Post processors ## _create_section_header( message, table_of_contents, 'post-processors', tr('Post Processors'), heading_level=1) _create_section_header( message, table_of_contents, 'post-processor-input-types', tr('Post Processor Input Types'), heading_level=2) table = _create_post_processor_subtable( post_processor_input_types ) message.add(table) _create_section_header( message, table_of_contents, 'post-processor-input-values', tr('Post Processor Input Values'), heading_level=2) table = _create_post_processor_subtable( post_processor_input_values ) message.add(table) _create_section_header( message, table_of_contents, 'post-processor-process-values', tr('Post Processor Process Types'), heading_level=2) table = _create_post_processor_subtable( definitions.post_processor_process_types ) message.add(table) _create_section_header( message, table_of_contents, 'post-processors', tr('Post Processors'), heading_level=2) post_processors = safe.definitions.post_processors table = m.Table(style_class='table table-condensed table-striped') row = m.Row() row.add(m.Cell(tr('Name'), header=True)) row.add(m.Cell(tr('Input Fields'), header=True)) row.add(m.Cell(tr('Output Fields'), header=True)) table.add(row) for post_processor in post_processors: row = m.Row() row.add(m.Cell(post_processor['name'])) # Input fields bullets = m.BulletedList() for key, value in sorted(post_processor['input'].iteritems()): bullets.add(key) row.add(m.Cell(bullets)) # Output fields bullets = m.BulletedList() for key, value in sorted(post_processor['output'].iteritems()): name = value['value']['name'] formula_type = value['type']['key'] if formula_type == 'formula': formula = value['formula'] else: # We use python introspection because the processor # uses a python function for calculations formula = value['function'].__name__ formula += ' (' formula += value['function'].__doc__ formula += ')' bullets.add('%s %s. : %s' % ( name, formula_type, formula)) row.add(m.Cell(bullets)) table.add(row) # Add the descriptions row = m.Row() row.add(m.Cell('')) row.add(m.Cell(post_processor['description'], span=2)) table.add(row) message.add(table) ## # Reporting ## _create_section_header( message, table_of_contents, 'reporting', tr('Reporting'), heading_level=1) paragraph = m.Paragraph( m.ImportantText(tr('Note: ')), m.Text(tr( 'This section of the help documentation is intended for advanced ' 'users who want to modify reports which are produced by InaSAFE.' ))) message.add(paragraph) _create_section_header( message, table_of_contents, 'reporting-overview', tr('Overview'), heading_level=2) message.add(m.Paragraph(tr( 'Whenever InaSAFE completes an analysis, it will automatically ' 'generate a number of reports. Some of these reports are based on ' 'templates that are shipped with InaSAFE, and can be customised or ' 'over-ridden by creating your own templates. The following ' 'reports are produced in InaSAFE:' ))) table = m.Table(style_class='table table-condensed table-striped') row = m.Row() row.add(m.Cell(tr('Name'), header=True)) row.add(m.Cell(tr('Customisable?'), header=True)) row.add(m.Cell(tr('Example'), header=True)) row.add(m.Cell(tr('Description'), header=True)) table.add(row) for report in all_reports: row = m.Row() row.add(m.Cell(report['name'])) if report['customisable']: row.add(m.Cell(tr('Yes'))) else: row.add(m.Cell(tr('No'))) png_image_path = resources_path( 'img', 'screenshots', report['thumbnail']) row.add(m.Image(png_image_path, style_class='text-center')) row.add(m.Cell(report['description'])) table.add(row) message.add(table) message.add(m.Paragraph(tr( 'In the sections that follow, we provide more technical information ' 'about the custom QGIS Expressions and special template elements ' 'that can be used to customise your templates.' ))) _create_section_header( message, table_of_contents, 'reporting-expressions', tr('QGIS Expressions'), heading_level=2) message.add(m.Paragraph(tr( 'InaSAFE adds a number of expressions that can be used to ' 'conveniently obtain provenance data to the active analysis results. ' 'The expressions can also be used elsewhere in QGIS as needed.' '.' ))) table = m.Table(style_class='table table-condensed table-striped') row = m.Row() row.add(m.Cell(tr('Name'), header=True)) row.add(m.Cell(tr('Description'), header=True)) table.add(row) for expression_name, expression in sorted(qgis_expressions().iteritems()): row = m.Row() row.add(m.Cell(expression_name)) help = expression.helptext() # This pattern comes from python/qgis/core/__init__.py ≈ L79 pattern = r'<h3>(.*) function</h3><br>' help = re.sub(pattern, '', help) help = re.sub(r'\n', '<br>', help) row.add(m.Cell(help)) table.add(row) message.add(table) _create_section_header( message, table_of_contents, 'reporting-composer-elements', tr('Composer Elements'), heading_level=2) message.add(m.Paragraph(tr( 'InaSAFE looks for elements with specific id\'s on the composer ' 'page and replaces them with InaSAFE specific content.' ))) table = m.Table(style_class='table table-condensed table-striped') row = m.Row() row.add(m.Cell(tr('ID'), header=True)) row.add(m.Cell(tr('Description'), header=True)) table.add(row) for item in html_frame_elements: row = m.Row() row.add(m.Cell(item['id'])) row.add(m.Cell(item['description'])) table.add(row) message.add(table) ## # Developer documentation ## _create_section_header( message, table_of_contents, 'developer-guide', tr('Developer Guide'), heading_level=1) message.add(developer_help()) # Finally we add the table of contents at the top full_message = m.Message() # Contents is not a link so reset style style = SECTION_STYLE style['element_id'] = '' header = m.Heading(tr('Contents'), **style) full_message.add(header) full_message.add(table_of_contents) full_message.add(message) return full_message
def content(): """Helper method that returns just the content. This method was added so that the text could be reused in the dock_help module. .. versionadded:: 4.0.0 :returns: A message object without brand element. :rtype: safe.messaging.message.Message """ # We will store a contents section at the top for easy navigation table_of_contents = m.Message() # and this will be the main message that we create message = m.Message() _create_section_header(message, table_of_contents, 'overview', tr('Overview'), heading_level=1) ## # Credits and disclaimers ... ## _create_section_header(message, table_of_contents, 'disclaimer', tr('Disclaimer'), heading_level=2) message.add(m.Paragraph(definitions.messages.disclaimer())) _create_section_header(message, table_of_contents, 'limitations', tr('Limitations and License'), heading_level=2) bullets = m.BulletedList() for item in definitions.limitations(): bullets.add(item) message.add(bullets) ## # Basic concepts ... ## ## # Help dialog contents ... ## _create_section_header(message, table_of_contents, 'glossary', tr('Glossary of terms'), heading_level=1) last_group = None table = None for key, value in definitions.concepts.iteritems(): current_group = value['group'] if current_group != last_group: if last_group is not None: message.add(table) _create_section_header(message, table_of_contents, current_group.replace(' ', '-'), current_group, heading_level=2) table = _start_glossary_table(current_group) last_group = current_group row = m.Row() term = value['key'].replace('_', ' ').title() description = m.Message(value['description']) for citation in value['citations']: if citation['text'] in [None, '']: continue if citation['link'] in [None, '']: description.add(m.Paragraph(citation['text'])) else: description.add( m.Paragraph(m.Link(citation['link'], citation['text']))) row.add(m.Cell(term)) row.add(m.Cell(description)) url = _definition_icon_url(value) if url: row.add(m.Cell(m.Image(url, **MEDIUM_ICON_STYLE))) else: row.add(m.Cell('')) table.add(row) # ensure the last group's table is added message.add(table) ## # Help dialog contents ... ## _create_section_header(message, table_of_contents, 'core-functionality', tr('Core functionality and tools'), heading_level=1) _create_section_header(message, table_of_contents, 'dock', tr('The InaSAFE Dock'), heading_level=2) message.add(dock_help()) _create_section_header(message, table_of_contents, 'reports', tr('InaSAFE Reports'), heading_level=2) message.add(report_help()) _create_section_header( message, table_of_contents, 'extents', tr('Managing analysis extents with the extents selector'), heading_level=2) message.add(extent_help()) _create_section_header(message, table_of_contents, 'options', tr('InaSAFE Options'), heading_level=2) message.add(options_help()) _create_section_header(message, table_of_contents, 'batch-runner', tr('The Batch Runner'), heading_level=2) message.add(batch_help()) _create_section_header(message, table_of_contents, 'osm-downloader', tr('The OpenStreetmap Downloader'), heading_level=2) message.add(osm_help()) _create_section_header(message, table_of_contents, 'petabencana-downloader', tr('The PetaBencana Downloader'), heading_level=2) message.add(petabencana_help()) _create_section_header(message, table_of_contents, 'shakemap-converter', tr('The Shakemap Converter'), heading_level=2) message.add(shakemap_help()) _create_section_header(message, table_of_contents, 'multi-buffer-tool', tr('The Multi Buffer Tool'), heading_level=2) message.add(multi_buffer_help()) # Field mapping tool has a few added bits to enumerate the groups _create_section_header(message, table_of_contents, 'field-mapping-tool', tr('The Field Mapping Tool'), heading_level=2) message.add(field_mapping_tool_help()) _create_section_header(message, table_of_contents, 'exposure-groups', tr('Exposure Groups'), heading_level=3) message.add( m.Paragraph( 'The following demographic groups apply only to vector population ' 'exposure layers:')) for group in population_field_groups: definition_to_message(group, message, table_of_contents, heading_level=4) _create_section_header(message, table_of_contents, 'aggregation-groups', tr('Aggregation Groups'), heading_level=3) message.add( m.Paragraph( 'The following demographic groups apply only to aggregation layers:' )) for group in aggregation_field_groups: definition_to_message(group, message, table_of_contents, heading_level=4) # End of field mapping tool help # Keep this last in the tool section please as it has subsections # and so uses the top level section style _create_section_header(message, table_of_contents, 'minimum-needs', tr('Minimum Needs'), heading_level=2) _create_section_header(message, table_of_contents, 'minimum-needs-tool', tr('The minimum needs tool'), heading_level=3) message.add(needs_help()) _create_section_header(message, table_of_contents, 'minimum-manager', tr('The minimum needs manager'), heading_level=3) message.add(needs_manager_help()) ## # Analysis workflow ## _create_section_header(message, table_of_contents, 'analysis-steps', tr('Analysis steps'), heading_level=1) _create_section_header(message, table_of_contents, 'analysis-internal-process', tr('Analysis internal process'), heading_level=2) analysis = definitions.concepts['analysis'] message.add(analysis['description']) url = _definition_screenshot_url(analysis) if url: message.add(m.Paragraph(m.Image(url), style_class='text-center')) _create_section_header(message, table_of_contents, 'analysis-progress-reporting', tr('Progress reporting steps'), heading_level=2) steps = definitions.analysis_steps.values() for step in steps: definition_to_message(step, message, table_of_contents, heading_level=3) ## # Hazard definitions ## _create_section_header(message, table_of_contents, 'hazards', tr('Hazard Concepts'), heading_level=1) hazard_category = definitions.hazard_category definition_to_message(hazard_category, message, table_of_contents, heading_level=2) hazards = definitions.hazards definition_to_message(hazards, message, table_of_contents, heading_level=2) ## # Exposure definitions ## _create_section_header(message, table_of_contents, 'exposures', tr('Exposure Concepts'), heading_level=1) exposures = definitions.exposures definition_to_message(exposures, message, table_of_contents, heading_level=2) ## # Defaults ## _create_section_header(message, table_of_contents, 'defaults', tr('InaSAFE Defaults'), heading_level=1) table = m.Table(style_class='table table-condensed table-striped') row = m.Row() row.add(m.Cell(tr('Name'), header=True)) row.add(m.Cell(tr('Default value'), header=True)) row.add(m.Cell(tr('Default min'), header=True)) row.add(m.Cell(tr('Default max'), header=True)) row.add(m.Cell(tr('Description'), header=True)) table.add(row) defaults = [ definitions.youth_ratio_default_value, definitions.adult_ratio_default_value, definitions.elderly_ratio_default_value, definitions.female_ratio_default_value, definitions.feature_rate_default_value ] for default in defaults: row = m.Row() row.add(m.Cell(default['name'])) row.add(m.Cell(default['default_value'])) row.add(m.Cell(default['min_value'])) row.add(m.Cell(default['max_value'])) row.add(m.Cell(default['description'])) table.add(row) message.add(table) ## # All Fields ## _create_section_header(message, table_of_contents, 'all-fields', tr('Fields'), heading_level=1) _create_section_header(message, table_of_contents, 'input-fields', tr('Input dataset fields'), heading_level=2) _create_fields_section(message, table_of_contents, tr('Exposure fields'), definitions.exposure_fields) _create_fields_section(message, table_of_contents, tr('Hazard fields'), definitions.hazard_fields) _create_fields_section(message, table_of_contents, tr('Aggregation fields'), definitions.aggregation_fields) _create_section_header(message, table_of_contents, 'output-fields', tr('Output dataset fields'), heading_level=2) _create_fields_section(message, table_of_contents, tr('Impact fields'), definitions.impact_fields) _create_fields_section(message, table_of_contents, tr('Aggregate hazard fields'), definitions.aggregate_hazard_fields) _create_fields_section(message, table_of_contents, tr('Aggregation summary fields'), definitions.aggregation_summary_fields) _create_fields_section(message, table_of_contents, tr('Exposure summary table fields'), definitions.exposure_summary_table_fields) _create_fields_section(message, table_of_contents, tr('Analysis fields'), definitions.analysis_fields) ## # Geometries ## _create_section_header(message, table_of_contents, 'geometries', tr('Layer Geometry Types'), heading_level=1) _create_section_header(message, table_of_contents, 'vector-geometries', tr('Vector'), heading_level=2) definition_to_message(definitions.layer_geometry_point, message, table_of_contents, heading_level=3) definition_to_message(definitions.layer_geometry_line, message, table_of_contents, heading_level=3) definition_to_message(definitions.layer_geometry_polygon, message, table_of_contents, heading_level=3) _create_section_header(message, table_of_contents, 'raster-geometries', tr('Raster'), heading_level=2) definition_to_message(definitions.layer_geometry_raster, message, table_of_contents, heading_level=3) ## # Layer Modes ## _create_section_header(message, table_of_contents, 'layer-modes', tr('Layer Modes'), heading_level=1) definition_to_message(definitions.layer_mode, message, table_of_contents, heading_level=2) ## # Layer Purposes ## _create_section_header(message, table_of_contents, 'layer-purposes', tr('Layer Purposes'), heading_level=1) definition_to_message(definitions.layer_purpose_hazard, message, table_of_contents, heading_level=2) definition_to_message(definitions.layer_purpose_exposure, message, table_of_contents, heading_level=2) definition_to_message(definitions.layer_purpose_aggregation, message, table_of_contents, heading_level=2) definition_to_message(definitions.layer_purpose_exposure_summary, message, table_of_contents, heading_level=2) definition_to_message(definitions.layer_purpose_aggregate_hazard_impacted, message, table_of_contents, heading_level=2) definition_to_message(definitions.layer_purpose_aggregation_summary, message, table_of_contents, heading_level=2) definition_to_message(definitions.layer_purpose_exposure_summary_table, message, table_of_contents, heading_level=2) definition_to_message(definitions.layer_purpose_profiling, message, table_of_contents, heading_level=2) ## # All units ## _create_section_header(message, table_of_contents, 'all-units', tr('All Units'), heading_level=1) table = m.Table(style_class='table table-condensed table-striped') row = m.Row() row.add(m.Cell(tr('Name'), header=True)) row.add(m.Cell(tr('Plural'), header=True)) row.add(m.Cell(tr('Abbreviation'), header=True)) row.add(m.Cell(tr('Details'), header=True)) table.add(row) for unit in definitions.units_all: row = m.Row() row.add(m.Cell(unit['name'])) row.add(m.Cell(unit['plural_name'])) row.add(m.Cell(unit['abbreviation'])) row.add(m.Cell(unit['description'])) table.add(row) message.add(table) ## # Post processors ## _create_section_header(message, table_of_contents, 'post-processors', tr('Post Processors'), heading_level=1) _create_section_header(message, table_of_contents, 'post-processor-input-types', tr('Post Processor Input Types'), heading_level=2) table = _create_post_processor_subtable(post_processor_input_types) message.add(table) _create_section_header(message, table_of_contents, 'post-processor-input-values', tr('Post Processor Input Values'), heading_level=2) table = _create_post_processor_subtable(post_processor_input_values) message.add(table) _create_section_header(message, table_of_contents, 'post-processor-process-values', tr('Post Processor Process Types'), heading_level=2) table = _create_post_processor_subtable( definitions.post_processor_process_types) message.add(table) _create_section_header(message, table_of_contents, 'post-processors', tr('Post Processors'), heading_level=2) post_processors = safe.definitions.post_processors table = m.Table(style_class='table table-condensed table-striped') row = m.Row() row.add(m.Cell(tr('Name'), header=True)) row.add(m.Cell(tr('Input Fields'), header=True)) row.add(m.Cell(tr('Output Fields'), header=True)) table.add(row) for post_processor in post_processors: row = m.Row() row.add(m.Cell(post_processor['name'])) # Input fields bullets = m.BulletedList() for key, value in post_processor['input'].iteritems(): bullets.add(key) row.add(m.Cell(bullets)) # Output fields bullets = m.BulletedList() for key, value in post_processor['output'].iteritems(): name = value['value']['name'] formula_type = value['type']['key'] if formula_type == 'formula': formula = value['formula'] else: # We use python introspection because the processor # uses a python function for calculations formula = value['function'].__name__ formula += ' (' formula += value['function'].__doc__ formula += ')' bullets.add('%s %s. : %s' % (name, formula_type, formula)) row.add(m.Cell(bullets)) table.add(row) # Add the descriptions row = m.Row() row.add(m.Cell('')) row.add(m.Cell(post_processor['description'], span=2)) table.add(row) message.add(table) ## # Developer documentation ## _create_section_header(message, table_of_contents, 'developer-guide', tr('Developer Guide'), heading_level=1) message.add(developer_help()) # Finally we add the table of contents at the top full_message = m.Message() # Contents is not a link so reset style style = SECTION_STYLE style['element_id'] = '' header = m.Heading(tr('Contents'), **style) full_message.add(header) full_message.add(table_of_contents) full_message.add(message) return full_message