def charts(self): product_availability = self.rows if product_availability: def convert_product_data_to_stack_chart(rows, chart_config): ret_data = [] for k in ['Stocked out', 'Not Stocked out', 'No Stock Data']: def calculate_percent(x, y): return float(x) / float((y or 1)) datalist = [] for row in rows: total = row['total'] if k == 'No Stock Data': datalist.append([row['product_code'], calculate_percent(row['without_data'], total), row['product_name']]) elif k == 'Stocked out': datalist.append([row['product_code'], calculate_percent(row['without_stock'], total), row['product_name']]) elif k == 'Not Stocked out': datalist.append([row['product_code'], calculate_percent(row['with_stock'], total), row['product_name']]) ret_data.append({'color': chart_config['label_color'][k], 'label': k, 'data': datalist}) return ret_data chart = EWSMultiBarChart('', x_axis=Axis('Products'), y_axis=Axis('', '%')) chart.rotateLabels = -45 chart.marginBottom = 120 chart.stacked = False chart.tooltipFormat = " on " chart.forceY = [0, 1] chart.product_code_map = { sql_product.code: sql_product.name for sql_product in SQLProduct.objects.filter(domain=self.domain) } chart.is_rendered_as_email = self.config.get('is_rendered_as_email', False) for row in convert_product_data_to_stack_chart(product_availability, self.chart_config): chart.add_dataset(row['label'], [ {'x': r[0], 'y': r[1], 'name': r[2]} for r in sorted(row['data'], key=lambda x: x[0])], color=row['color'] ) return [chart] return []
def charts(self): product_availability = self.rows if product_availability: def convert_product_data_to_stack_chart(rows, chart_config): ret_data = [] for k in ["Stocked out", "Not Stocked out", "No Stock Data"]: def calculate_percent(x, y): return float(x) / float((y or 1)) datalist = [] for row in rows: total = row["total"] if k == "No Stock Data": datalist.append([row["product_code"], calculate_percent(row["without_data"], total)]) elif k == "Stocked out": datalist.append([row["product_code"], calculate_percent(row["without_stock"], total)]) elif k == "Not Stocked out": datalist.append([row["product_code"], calculate_percent(row["with_stock"], total)]) ret_data.append({"color": chart_config["label_color"][k], "label": k, "data": datalist}) return ret_data chart = EWSMultiBarChart("", x_axis=Axis("Products"), y_axis=Axis("", ".2%")) chart.rotateLabels = -45 chart.marginBottom = 120 chart.stacked = False chart.forceY = [0, 1] for row in convert_product_data_to_stack_chart(product_availability, self.chart_config): chart.add_dataset( row["label"], [{"x": r[0], "y": r[1]} for r in sorted(row["data"], key=lambda x: x[0])], color=row["color"], ) return [chart] return []