def _dict_to_row(keyword_value, keyword_property=None):
        """Helper to make a message row from a keyword where value is a dict.

        .. versionadded:: 3.2

        Use this when constructing a table from keywords to display as
        part of a message object. This variant will unpack the dict and
        present it nicely in the keyword value area as a nested table in the
        cell.

        We are expecting keyword value would be something like this:

            "{'high': ['Kawasan Rawan Bencana III'], "
            "'medium': ['Kawasan Rawan Bencana II'], "
            "'low': ['Kawasan Rawan Bencana I']}"

        Or by passing a python dict object with similar layout to above.

        i.e. A string representation of a dict where the values are lists.

        :param keyword_value: Value of the keyword to be rendered. This must
            be a string representation of a dict, or a dict.
        :type keyword_value: basestring, dict

        :param keyword_property: The definition of the keyword property.
        :type keyword_property: dict, None

        :returns: A table to be added into a cell in the keywords table.
        :rtype: safe.messaging.items.table
        """
        if isinstance(keyword_value, str):
            keyword_value = literal_eval(keyword_value)
        table = m.Table(style_class='table table-condensed')
        # Sorting the key
        for key in sorted(keyword_value.keys()):
            value = keyword_value[key]
            row = m.Row()
            # First the heading
            if keyword_property is None:
                if definition(key):
                    name = definition(key)['name']
                else:
                    name = tr(key.replace('_', ' ').capitalize())
            else:
                default_name = tr(key.replace('_', ' ').capitalize())
                name = keyword_property.get('member_names', {}).get(
                    key, default_name)

            row.add(m.Cell(m.ImportantText(name)))
            # Then the value. If it contains more than one element we
            # present it as a bullet list, otherwise just as simple text
            if isinstance(value, (tuple, list, dict, set)):
                if len(value) > 1:
                    bullets = m.BulletedList()
                    for item in value:
                        bullets.add(item)
                    row.add(m.Cell(bullets))
                elif len(value) == 0:
                    row.add(m.Cell(""))
                else:
                    row.add(m.Cell(value[0]))
            else:
                if keyword_property == property_extra_keywords:
                    key_definition = definition(key)
                    if key_definition and key_definition.get('options'):
                        value_definition = definition(value)
                        if value_definition:
                            value = value_definition.get('name', value)
                    elif key_definition and key_definition.get(
                            'type') == datetime:
                        try:
                            value = datetime.strptime(value, key_definition[
                                'store_format'])
                            value = value.strftime(
                                key_definition['show_format'])
                        except ValueError:
                            try:
                                value = datetime.strptime(
                                    value, key_definition['store_format2'])
                                value = value.strftime(
                                    key_definition['show_format'])
                            except ValueError:
                                pass
                row.add(m.Cell(value))

            table.add(row)
        return table
Helper to make a message row from a keyword where value is a dict.

        .. versionadded:: 3.2

        Use this when constructing a table from keywords to display as
        part of a message object. This variant will unpack the dict and
        present it nicely in the keyword value area as a nested table in the
        cell.

        We are expecting keyword value would be something like this:

            "{'high': ['Kawasan Rawan Bencana III'], "
            "'medium': ['Kawasan Rawan Bencana II'], "
            "'low': ['Kawasan Rawan Bencana I']}"

        Or by passing a python dict object with similar layout to above.

        i.e. A string representation of a dict where the values are lists.

        :param keyword_value: Value of the keyword to be rendered. This must
            be a string representation of a dict, or a dict.
        :type keyword_value: basestring, dict

        :param keyword_property: The definition of the keyword property.
        :type keyword_property: dict, None

        :returns: A table to be added into a cell in the keywords table.
        :rtype: safe.messaging.items.table