def clean(self): if self.width < 0.0 or self.width > settings.CMSNVD3_MAX_CONT_DIM: raise ValidationError( _("Container width should be in interval [0, %s]." % settings.CMSNVD3_MAX_CONT_DIM)) if self.height < 0.0 or self.height > settings.CMSNVD3_MAX_CONT_DIM: raise ValidationError( _("Container height should be in interval [0, %s]." % settings.CMSNVD3_MAX_CONT_DIM)) if self.x_is_date and not self.x_date_format: raise ValidationError( _("X-axis is of date-format. \ You should provide valid format string in the <Date format string> field.")) xdata = _xdataloader(self.xdata) ydata = _ydataloader(self.ydata) if not all(map(lambda x: len(x) == len(xdata), ydata)): raise ValidationError(_("Length of one of the Y-data arrays not equal\ to length of the X-data array. Check input data."))
def render(self, context, instance, placeholder): error, html_container = None, None if instance.chart_type not in NVD3Model.CHART_TYPES: error = _('Chart type is not specified or of not valid type.') if not instance.container_name: container_name = uuid.uuid4().hex[:settings.CMSNVD3_ID_RANDOM_LENGTH] container_name = settings.CMSNVD3_CONT_ID_PREFIX + container_name elif re.match(r'[a-zA-Z0-9\-]+', instance.container_name): container_name = instance.container_name else: container_name = uuid.uuid4().hex[:settings.CMSNVD3_ID_RANDOM_LENGTH] container_name = settings.CMSNVD3_CONT_ID_PREFIX + container_name # xdata len == ydata len xdata = _xdataloader(instance.xdata) ydata = _ydataloader(instance.ydata) ynames = instance.ynames.split(settings.CMSNVD3_DATASEP) if not all(map(lambda x: len(x) == len(xdata), ydata)): # This is validation after data loading error = _("""Length of one of ydata arrays not equal\ to length of the xdata array. Check inputs.""") try: extra_attrs = ast.literal_eval(instance.attrs) except: extra_attrs = {} if xdata and ydata and not error: pars = {'x_is_date': instance.x_is_date, 'color_category': instance.color_category, 'name': container_name, } if instance.chart_type in ['multiBarChart']: pars.update({'x_axis_format': None}) if instance.x_is_date: pars.update({'x_axis_format': instance.x_date_format}) pars.update(extra_attrs) chart = eval(instance.chart_type)(**pars) if len(ynames) != len(ydata): ynames = map(lambda x: _('serie ') + str(x+1), range(len(ydata))) for yitem, yname in zip(ydata, ynames): chart.add_serie(name=yname, y=yitem, x=xdata) chart.display_container = False chart.buildcontent() outputhtml = chart.htmlcontent + '\n' chart_container = NVD3Chart() chart_container.name = str(container_name) chart_container.set_graph_height( _safe_int(instance.height) or settings.CMSNVD3_CONT_HEIGHT ) chart_container.set_graph_width( _safe_int(instance.width) or settings.CMSNVD3_CONT_WIDTH ) chart_container.buildcontainer() html_container = chart_container.container + '\n' if settings.CMSNVD3_D3JS_SOURCE.lower() == 'local': d3js_src = NVD3CMSPlugin.NVD3_STATIC + 'd3.min.js' else: d3js_src = settings.CMSNVD3_D3JS_SOURCE if settings.CMSNVD3_JS_SOURCE.lower() == 'local': nvd3js_src = NVD3CMSPlugin.NVD3_STATIC + 'nv.d3.min.js' else: nvd3js_src = settings.CMSNVD3_JS_SOURCE if settings.CMSNVD3_CSS.lower() == 'local': nvd3css_src = NVD3CMSPlugin.NVD3_STATIC + 'nv.d3.css' else: nvd3css_src = settings.CMSNVD3_CSS else: nvd3js_src,\ d3js_src, nvd3css_src, outputhtml = None, None, None, None if not error: error = "X-data or Y-data not defined correctly." context.update({'htmldata': outputhtml, 'error': error, 'htmlcontainer': html_container, 'd3js_src': d3js_src, 'nvd3js_src': nvd3js_src, 'nvd3css_src': nvd3css_src }) return context