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, }