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 []
Example #3
0
    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 []