Example #1
0
    def get_popup_info(self, values):
        if not values:
            return

        info = []

        for feature_line in (self.featureline_set.filter(visible=True).
                             order_by('order_using')):
            if feature_line.name in values:
                if feature_line.render_as == RENDER_GC_COLUMN:
                    data = json.loads(values[feature_line.name])
                    url = google_column_chart_url(data)
                    values[feature_line.name] = url
                    if url == '':
                        feature_line.render_as = RENDER_NONE
                    else:
                        feature_line.render_as = RENDER_IMAGE
                    feature_line.show_label = 'false'
                else:
                    feature_line.show_label = 'true'
                info.append(
                    {'name': (feature_line.description or feature_line.name),
                     'value': values[feature_line.name],
                     'render_as': feature_line.render_as,
                     'show_label': feature_line.show_label,
                     })
        return info
def popup_info(feature_line, value):
    """Return dict with info for the WMS popup.

    It should return a dict with three items:

    - **label_on_separate_line**: the output is normally a two-column
      table. When this option is set to True, the label is printed on a line
      of its own with the value on a whole line of its own, below. Used for
      big google graphs.

    - **label**: the label. Shown in the first column.

    - **value**: the value to show. Use ``mark_safe()`` when returning a bunch
      of html. Note that we do some html rendering here ourselves instead of
      in the template as we know which rendering methods to use here in this
      file. The template *used* to be littered with exceptions, being tightly
      coupled to the constants in this file. Not anymore.

    The value is rendered based on the ``render_as`` attribute of the
    featureline. See :ref:`popup-choices` for the available choices.

    """
    render_as = feature_line.render_as
    replacement_link_text = None
    label = feature_line.description or feature_line.name
    if render_as in [RENDER_GC_COLUMN, RENDER_IMAGE_FULLWIDTH]:
        label_on_separate_line = True
    else:
        label_on_separate_line = False

    # First some special cases that "convert" themselves to other renderers.
    if render_as == RENDER_GC_COLUMN:
        try:
            json_data = json.loads(value)
            if json_data is None:
                # See https://github.com/nens/deltaportaal/issues/4
                logger.warn(
                    "https://github.com/nens/deltaportaal/issues/4 "
                    "hits again")
                raise ValueError("Somehow the json data doesn't exist???")
            value = google_column_chart_url(json_data)
        except (TypeError, ValueError):
            logger.exception(
                "Exception when loading json google chart data")
            value = ''
        if value != '':
            render_as = RENDER_IMAGE
        else:
            render_as = RENDER_TEXT
            value = _("Error converting data to a graph")
    elif render_as == RENDER_XLS_DATE:
        try:
            date_value = float(value)
        except ValueError:
            logger.warn("Not a float-like value for XLS date: %r", value)
            return
        value = xls_date_to_string(date_value)
        render_as = RENDER_TEXT
    elif render_as == RENDER_URL_LIKE:
        # Quite brittle, but equal to the code from the template that it
        # replaces.
        value = 'http://' + value
        render_as = RENDER_URL
    elif render_as == RENDER_URL_MORE_LINK:
        replacement_link_text = _("Click here for more information")
        if not 'http://' in value:
            value = 'http://' + value
            # Yes, this means we could do the same for RENDER_URL_LIKE
            # options, but I'm leaving that one alone for the moment.
        render_as = RENDER_URL
    elif render_as == RENDER_INTEGER:
        try:
            value = float(value)
        except ValueError:
            logger.warn("Not a number-like value: %r", value)
            return
        value = unicode(int(round(value)))
        render_as = RENDER_TEXT
    elif render_as == RENDER_TWO_DECIMALS:
        try:
            value = float(value)
        except ValueError:
            logger.warn("Not a number-like value: %r", value)
            return
        value = '%0.2f' % value
        render_as = RENDER_TEXT

    # OK, now the actual rendering. Only text, url and image renderers are
    # left.
    if render_as == RENDER_TEXT:
        pass  # value is fine.
    elif render_as == RENDER_IMAGE:
        value = mark_safe('<img src="%s" />' % value)
    elif render_as == RENDER_IMAGE_FULLWIDTH:
        value = mark_safe('<img src="%s" class="wms-full-width-image" />' % value)
    elif render_as == RENDER_URL:
        link_text = replacement_link_text or value
        value = mark_safe(LINK_TEMPLATE % {'url': value,
                                           'link_text': link_text})

    return {
        'label': label,
        'label_on_separate_line': label_on_separate_line,
        'value': value,
        }