Ejemplo n.º 1
0
def loadtest(request):
    # The multimech results api is kinda all over the place.
    # the docs are here: http://testutils.org/multi-mechanize/datastore.html

    scripts = ['submit_form.py', 'ota_restore.py']

    tests = []
    # datetime info seems to be buried in GlobalConfig.results[0].run_id,
    # which makes ORM-level sorting problematic
    for gc in Session.query(GlobalConfig).all()[::-1]:
        gc.scripts = dict((uc.script, uc) for uc in gc.user_group_configs)
        if gc.results:
            for script, uc in gc.scripts.items():
                uc.results = filter(
                    lambda res: res.user_group_name == uc.user_group,
                    gc.results
                )
            test = {
                'datetime': gc.results[0].run_id,
                'run_time': gc.run_time,
                'results': gc.results,
            }
            for script in scripts:
                test[script.split('.')[0]] = gc.scripts.get(script)
            tests.append(test)

    context = get_hqadmin_base_context(request)
    context.update({
        "tests": tests,
        "hide_filters": True,
    })

    date_axis = Axis(label="Date", dateFormat="%m/%d/%Y")
    tests_axis = Axis(label="Number of Tests in 30s")
    chart = LineChart("HQ Load Test Performance", date_axis, tests_axis)
    submit_data = []
    ota_data = []
    total_data = []
    max_val = 0
    max_date = None
    min_date = None
    for test in tests:
        date = test['datetime']
        total = len(test['results'])
        max_val = total if total > max_val else max_val
        max_date = date if not max_date or date > max_date else max_date
        min_date = date if not min_date or date < min_date else min_date
        submit_data.append({'x': date, 'y': len(test['submit_form'].results)})
        ota_data.append({'x': date, 'y': len(test['ota_restore'].results)})
        total_data.append({'x': date, 'y': total})

    deployments = [row['key'][1] for row in HqDeploy.get_list(settings.SERVER_ENVIRONMENT, min_date, max_date)]
    deploy_data = [{'x': min_date, 'y': 0}]
    for date in deployments:
        deploy_data.extend([{'x': date, 'y': 0}, {'x': date, 'y': max_val}, {'x': date, 'y': 0}])
    deploy_data.append({'x': max_date, 'y': 0})

    chart.add_dataset("Deployments", deploy_data)
    chart.add_dataset("Form Submission Count", submit_data)
    chart.add_dataset("OTA Restore Count", ota_data)
    chart.add_dataset("Total Count", total_data)

    context['charts'] = [chart]

    template = "hqadmin/loadtest.html"
    return render(request, template, context)
Ejemplo n.º 2
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 []
Ejemplo n.º 3
0
 def charts(self):
     chart = MultiBarChart(None, Axis(_('Sites')), Axis(''))
     chart.height = 400
     chart.marginBottom = 100
     chart.data = self.get_data_for_graph()
     return [chart]
Ejemplo n.º 4
0
    def charts(self):
        case_finding_sql_data = self.case_finding_sql_data[0]
        sputum_conversion_report = ReportFactory.from_spec(
            StaticReportConfiguration.by_id('static-%s-sputum_conversion' %
                                            self.domain),
            include_prefilters=True)

        filter_values = {'date': self.datespan}

        locations_id = [
            Choice(value=location_id, display='')
            for location_id in self.report_config.locations_id if location_id
        ]

        if locations_id:
            filter_values['village'] = locations_id

        if self.report_config.is_migrated is not None:
            filter_values['is_migrated'] = Choice(
                value=self.report_config.is_migrated, display='')

        sputum_conversion_report.set_filter_values(filter_values)
        sputum_conversion_data = sputum_conversion_report.get_data()[0]
        charts_sql_data = self.charts_sql_data[0]
        treatment_outcome_sql_data = self.treatment_outcome_sql_data[0]

        default_value = {'sort_key': 0}

        chart = PieChart(title=_('Cases by Gender'), key='gender', values=[])
        chart.data = [{
            'label':
            _('Male'),
            'value':
            case_finding_sql_data.get('male_total', default_value)['sort_key']
        }, {
            'label':
            _('Female'),
            'value':
            case_finding_sql_data.get('female_total',
                                      default_value)['sort_key']
        }, {
            'label':
            _('Transgender'),
            'value':
            case_finding_sql_data.get('transgender_total',
                                      default_value)['sort_key']
        }]

        chart2 = MultiBarChart(_('Cases By Type'),
                               x_axis=Axis(''),
                               y_axis=Axis(''))
        chart2.stacked = False
        chart2.showLegend = False

        positive_smear = case_finding_sql_data.get('new_positive_tb_pulmonary',
                                                   default_value)['sort_key']
        negative_smear = case_finding_sql_data.get('new_negative_tb_pulmonary',
                                                   default_value)['sort_key']
        positive_extra_pulmonary = case_finding_sql_data.get(
            'new_positive_tb_extrapulmonary', default_value)['sort_key']

        relapse_cases = case_finding_sql_data.get('recurrent_positive_tb',
                                                  default_value)['sort_key']
        failure_cases = case_finding_sql_data.get('failure_positive_tb',
                                                  default_value)['sort_key']
        lfu_cases = case_finding_sql_data.get('lfu_positive_tb',
                                              default_value)['sort_key']
        others_cases = case_finding_sql_data.get('others_positive_tb',
                                                 default_value)['sort_key']

        chart2.add_dataset(_('New'), [{
            'x': 'Smear +ve',
            'y': positive_smear
        }, {
            'x': 'Smear -ve',
            'y': negative_smear
        }, {
            'x': 'EP',
            'y': positive_extra_pulmonary
        }])

        chart2.add_dataset(_('Retreatment'), [{
            'x': 'Relapse',
            'y': relapse_cases
        }, {
            'x': 'Failure',
            'y': failure_cases
        }, {
            'x': 'Treatment After Default',
            'y': lfu_cases
        }, {
            'x': 'Others',
            'y': others_cases
        }])

        chart3 = MultiBarChart('Sputum Conversion By Patient Type', Axis(''),
                               Axis(''))
        chart3.stacked = True

        chart3.add_dataset('Positive', [
            {
                'x':
                _('New Sputum +ve (2 month IP)'),
                'y':
                sputum_conversion_data.get(
                    'new_sputum_positive_patient_2months_ip', 0)
            },
            {
                'x':
                _('New Sputum +ve (3 month IP)'),
                'y':
                sputum_conversion_data.get(
                    'new_sputum_positive_patient_3months_ip', 0)
            },
            {
                'x':
                _('Cat II (3 month IP)'),
                'y':
                sputum_conversion_data.get('positive_endofip_patients_cat2', 0)
            },
        ])

        chart3.add_dataset(_('Negative'), [
            {
                'x':
                _('New Sputum +ve (2 month IP)'),
                'y':
                sputum_conversion_data.get(
                    'new_sputum_negative_patient_2months_ip', 0)
            },
            {
                'x':
                _('New Sputum +ve (3 month IP)'),
                'y':
                sputum_conversion_data.get(
                    'new_sputum_negative_patient_3months_ip', 0)
            },
            {
                'x':
                _('Cat II (3 month IP)'),
                'y':
                sputum_conversion_data.get('negative_endofip_patients_cat2', 0)
            },
        ])

        chart3.add_dataset('NA', [
            {
                'x':
                _('New Sputum +ve (2 month IP)'),
                'y':
                sputum_conversion_data.get('new_sputum_na_patient_2months_ip',
                                           0)
            },
            {
                'x':
                _('New Sputum +ve (3 month IP)'),
                'y':
                sputum_conversion_data.get('new_sputum_na_patient_3months_ip',
                                           0)
            },
            {
                'x': _('Cat II (3 month IP)'),
                'y': sputum_conversion_data.get('na_endofip_patients_cat2', 0)
            },
        ])

        chart4 = PieChart(title=_('Total number of patients by category'),
                          key='',
                          values=[])
        chart4.data = [{
            'label':
            _('Cat1'),
            'value':
            charts_sql_data.get('cat1_patients', default_value)['sort_key']
        }, {
            'label':
            _('Cat2'),
            'value':
            charts_sql_data.get('cat2_patients', default_value)['sort_key']
        }]

        chart5 = MultiBarChart('Outcome By Type', Axis(''), Axis(''))
        chart5.stacked = True

        chart5.add_dataset(_('Cured'), [{
            'x':
            _('New'),
            'y':
            treatment_outcome_sql_data.get('new_patients_cured',
                                           default_value)['sort_key']
        }, {
            'x':
            _('Retreatment'),
            'y':
            treatment_outcome_sql_data.get('recurrent_patients_cured',
                                           default_value)['sort_key']
        }])
        chart5.add_dataset('Treatment Complete', [{
            'x':
            _('New'),
            'y':
            treatment_outcome_sql_data.get('new_patients_treatment_complete',
                                           default_value)['sort_key']
        }, {
            'x':
            _('Retreatment'),
            'y':
            treatment_outcome_sql_data.get(
                'recurrent_patients_treatment_complete',
                default_value)['sort_key']
        }])
        chart5.add_dataset('Died', [{
            'x':
            _('New'),
            'y':
            treatment_outcome_sql_data.get('new_patients_died',
                                           default_value)['sort_key']
        }, {
            'x':
            _('Retreatment'),
            'y':
            treatment_outcome_sql_data.get('recurrent_patients_died',
                                           default_value)['sort_key']
        }])
        chart5.add_dataset(_('Failure'), [{
            'x':
            _('New'),
            'y':
            treatment_outcome_sql_data.get('new_patients_treatment_failure',
                                           default_value)['sort_key']
        }, {
            'x':
            _('Retreatment'),
            'y':
            treatment_outcome_sql_data.get(
                'recurrent_patients_treatment_failure',
                default_value)['sort_key']
        }])
        chart5.add_dataset(_('Loss to Follow-up'), [{
            'x':
            _('New'),
            'y':
            treatment_outcome_sql_data.get('new_patients_loss_to_follow_up',
                                           default_value)['sort_key']
        }, {
            'x':
            _('Retreatment'),
            'y':
            treatment_outcome_sql_data.get(
                'recurrent_patients_loss_to_follow_up',
                default_value)['sort_key']
        }])
        chart5.add_dataset(_('Regimen Changed'), [{
            'x':
            _('New'),
            'y':
            treatment_outcome_sql_data.get('new_patients_regimen_changed',
                                           default_value)['sort_key']
        }, {
            'x':
            _('Retreatment'),
            'y':
            treatment_outcome_sql_data.get(
                'recurrent_patients_regimen_changed',
                default_value)['sort_key']
        }])
        chart5.add_dataset('Not Evaluated', [{
            'x':
            _('New'),
            'y':
            treatment_outcome_sql_data.get('new_patients_not_evaluated',
                                           default_value)['sort_key']
        }, {
            'x':
            _('Retreatment'),
            'y':
            treatment_outcome_sql_data.get('recurrent_patients_not_evaluated',
                                           default_value)['sort_key']
        }])

        return [chart, chart2, chart3, chart4, chart5]
Ejemplo n.º 5
0
 def charts(self):
     if 'location_id' in self.request.GET:  # hack: only get data if we're loading an actual report
         chart = MultiBarChart(None, Axis(_('Products')),
                               Axis(_('% of Facilities'), ',.1d'))
         chart.data = self.get_data_for_graph()
         return [chart]
Ejemplo n.º 6
0
    def charts(self):
        chart = PNAMultiBarChart(None, Axis('Location'),
                                 Axis('Amount', format='i'))
        chart.height = 550
        chart.marginBottom = 150
        chart.rotateLabels = -45
        chart.showControls = False

        def data_to_chart(quantities_list):
            quantities_to_return = []
            locations_data = {}
            added_locations = []

            quantities_list = sorted(quantities_list,
                                     key=lambda x: x['location_name'])
            for quantity in quantities_list:
                location_name = quantity['location_name']
                location_id = quantity['location_id']
                for product in quantity['products']:
                    final_pna_stock_valuation = product[
                        'final_pna_stock_valuation']
                    if location_id not in added_locations:
                        added_locations.append(location_id)
                        locations_data[location_id] = {
                            'location_name': location_name,
                            'final_pna_stock_valuation':
                            final_pna_stock_valuation,
                        }
                    else:
                        locations_data[location_id][
                            'final_pna_stock_valuation'] += final_pna_stock_valuation

            sorted_locations_data_values = sorted(
                locations_data.values(), key=lambda x: x['location_name'])
            for location_info in sorted_locations_data_values:
                location_name = location_info['location_name']
                final_pna_stock_valuation = location_info[
                    'final_pna_stock_valuation']
                pna = final_pna_stock_valuation if final_pna_stock_valuation != 0 else 0
                quantities_to_return.append([
                    location_name, {
                        'html': '{:.2f} %'.format(pna),
                        'sort_key': pna
                    }
                ])

            return quantities_to_return

        def get_data_for_graph():
            com = []
            rows = data_to_chart(self.clean_rows)
            for row in rows:
                com.append({"x": row[0], "y": row[1]['sort_key']})

            return [
                {
                    "key": 'Valeur des stocks PNA disponible',
                    'values': com
                },
            ]

        chart.data = get_data_for_graph()
        return [chart]
Ejemplo n.º 7
0
    def get_chart(self, rows, x_label, y_label, data_provider):
        def _get_label_with_percentage(row):
            return "%s [%d: %s%%]" % (row[0]['html'], int(
                row[-2]['html']), str(int(row[-1]['html'][:-1])))

        if isinstance(data_provider, NutritionBirthWeightDetails):
            chart = PieChart(data_provider.chart_title, '',
                             [{
                                 'label': _get_label_with_percentage(row),
                                 'value': int(row[-1]['html'][:-1])
                             } for row in rows[2:]], ['red', 'green'])
            chart.showLabels = False
            chart.marginLeft = 20
            chart.marginRight = 0
            chart.marginBottom = 20
        elif isinstance(data_provider, DeliveryPlaceDetailsExtended):
            chart = PieChart(data_provider.chart_title, '',
                             [{
                                 'label': _get_label_with_percentage(row),
                                 'value': int(row[-1]['html'][:-1])
                             } for row in rows[1:]])
            chart.showLabels = False
        elif isinstance(data_provider,
                        (PostnatalCareOverview, ImmunizationOverview)):
            chart = MultiBarChart(data_provider.chart_title,
                                  x_axis=Axis(x_label),
                                  y_axis=Axis(y_label, '.2%'))
            chart.rotateLabels = -45
            chart.marginBottom = 150
            chart.marginLeft = 45
            chart.marginRight = 0

            if isinstance(data_provider, ImmunizationOverview):
                chart.stacked = True
                chart.add_dataset('Percentage',
                                  [{
                                      'x': row[0]['html'],
                                      'y': int(row[3]['html'][:-1]) / 100.0
                                  } for row in rows],
                                  color='green')
                chart.add_dataset('Dropout Percentage',
                                  [{
                                      'x': row[0]['html'],
                                      'y': int(row[-1]['html'][:-1]) / 100.0
                                  } for row in rows],
                                  color='red')
            else:
                chart.add_dataset('Percentage',
                                  [{
                                      'x': row[0]['html'],
                                      'y': int(row[-1]['html'][:-1]) / 100.0
                                  } for row in rows])
        elif isinstance(data_provider, AnteNatalCareServiceOverviewExtended):
            chart1 = MultiBarChart('ANC Visits',
                                   x_axis=Axis(x_label),
                                   y_axis=Axis(y_label, '.2%'))
            chart2 = MultiBarChart('Maternal TT & IFA',
                                   x_axis=Axis(x_label),
                                   y_axis=Axis(y_label, '.2%'))
            chart1.rotateLabels = -45
            chart2.rotateLabels = -45
            chart1.marginBottom = 150
            chart2.marginBottom = 150
            chart1.marginLeft = 20
            chart2.marginLeft = 45
            chart1.marginRight = 0
            chart2.marginRight = 0

            chart1.add_dataset('Percentage',
                               [{
                                   'x': row[0]['html'],
                                   'y': int(row[-1]['html'][:-1]) / 100.0
                               } for row in rows[1:6]])
            chart2.add_dataset('Percentage',
                               [{
                                   'x': row[0]['html'],
                                   'y': int(row[-1]['html'][:-1]) / 100.0
                               } for row in rows[6:12]])
            return [chart1, chart2]
        elif isinstance(data_provider, ChildrenDeathsByMonth):
            chart = MultiBarChart(data_provider.chart_title,
                                  x_axis=Axis(x_label, dateFormat="%B"),
                                  y_axis=Axis(y_label, '.2%'))
            chart.rotateLabels = -45
            chart.marginBottom = 50
            chart.marginLeft = 20
            chart.add_dataset('Percentage',
                              [{
                                  'x': row[0],
                                  'y': int(row[-1]['html'][:-1]) / 100.0
                              } for row in rows])
        else:
            chart = PieChart(data_provider.chart_title, '',
                             [{
                                 'label': _get_label_with_percentage(row),
                                 'value': int(row[-1]['html'][:-1])
                             } for row in rows])
            chart.showLabels = False
            chart.marginLeft = 20
            chart.marginRight = 0
            chart.marginBottom = 0
        return [chart]
Ejemplo n.º 8
0
    def charts(self):
        chart = PNAMultiBarChart(None, Axis('Location'),
                                 Axis('Percent', format='.2f'))
        chart.height = 550
        chart.marginBottom = 150
        chart.rotateLabels = -45
        chart.showControls = False
        chart.forceY = [0, 100]

        def data_to_chart(quantities_list):
            quantities_to_return = []
            locations_data = {}
            added_locations = []

            for quantity in quantities_list:
                location_name = quantity['location_name']
                location_id = quantity['location_id']
                for product in quantity['products']:
                    amt_delivered_convenience = product[
                        'amt_delivered_convenience']
                    ideal_topup = product['ideal_topup']
                    if location_id not in added_locations:
                        added_locations.append(location_id)
                        locations_data[location_id] = {
                            'location_name': location_name,
                            'amt_delivered_convenience':
                            amt_delivered_convenience,
                            'ideal_topup': ideal_topup,
                        }
                    else:
                        locations_data[location_id][
                            'amt_delivered_convenience'] += amt_delivered_convenience
                        locations_data[location_id][
                            'ideal_topup'] += ideal_topup

            sorted_locations_data_values = sorted(
                locations_data.values(), key=lambda x: x['location_name'])
            for location_info in sorted_locations_data_values:
                location_name = location_info['location_name']
                amt_delivered_convenience = location_info[
                    'amt_delivered_convenience']
                ideal_topup = location_info['ideal_topup']
                percent = (amt_delivered_convenience / float(ideal_topup) * 100) \
                    if ideal_topup != 0 else 0
                quantities_to_return.append([
                    location_name, {
                        'html': '{:.2f} %'.format(percent),
                        'sort_key': percent
                    }
                ])

            return quantities_to_return

        def get_data_for_graph():
            com = []
            rows = data_to_chart(self.clean_rows)
            for row in rows:
                com.append({"x": row[0], "y": row[1]['sort_key']})

            return [
                {
                    "key": 'Taux de Satisfaction des produits',
                    'values': com
                },
            ]

        chart.data = get_data_for_graph()
        return [chart]
Ejemplo n.º 9
0
    def charts(self):
        x_axis = 'Product'
        chart = PNAMultiBarChart(None, Axis(x_axis), Axis('Percent', format='.2f'))
        chart.height = 550
        chart.marginBottom = 150
        chart.forceY = [0, 100]
        chart.rotateLabels = -45
        chart.showControls = False

        def data_to_chart(stocks_list):
            stocks_to_return = []
            products_data = []
            added_products = []

            for stock in stocks_list:
                location_id = stock['location_id']
                location_name = stock['location_name']
                for product in stock['products']:
                    product_id = product['product_id']
                    product_name = product['product_name']
                    in_ppses = product['in_ppses']
                    all_ppses = product['all_ppses']
                    if product_id not in added_products:
                        added_products.append(product_id)
                        product_dict = {
                            'product_id': product_id,
                            'product_name': product_name,
                            'location_id': location_id,
                            'location_name': location_name,
                            'in_ppses': in_ppses,
                            'all_ppses': all_ppses,
                        }
                        products_data.append(product_dict)
                    else:
                        for product_data in products_data:
                            if product_data['product_id'] == product_id:
                                product_data['in_ppses'] += in_ppses
                                product_data['all_ppses'] += all_ppses

            products = sorted(products_data, key=lambda x: x['product_name'])
            for product in products:
                product_name = product['product_name']
                in_ppses = product['in_ppses']
                all_ppses = product['all_ppses']
                percent = (in_ppses / float(all_ppses)) * 100 if all_ppses != 0 else 0
                stocks_to_return.append([
                    product_name,
                    {
                        'html': '{}'.format(percent),
                        'sort_key': percent
                    }
                ])

            return stocks_to_return

        def get_data_for_graph():
            com = []

            rows = data_to_chart(self.clean_rows)
            for row in rows:
                com.append({"x": row[0], "y": row[1]['sort_key']})

            return [
                {
                    "key": 'Taux de disponibilité de la Gamme des produits',
                    'values': com
                },
            ]

        chart.data = get_data_for_graph()
        return [chart]
Ejemplo n.º 10
0
    def get_chart(self, rows, x_label, y_label, data_provider):
        def _get_label_with_percentage(row):
            return "%s [%s%%]" % (row[0], str(float(row[-1]['html'][:-1])))

        if isinstance(data_provider,
                      (ClosedMotherCasesBreakdown, ClosedChildCasesBreakdown)):
            chart = PieChart('', '', [{
                'label': _get_label_with_percentage(row),
                'value': float(row[-1]['html'][:-1])
            } for row in rows])
        elif isinstance(data_provider, NutritionBirthWeightDetails):
            chart = PieChart('BirthWeight', '', [{
                'label':
                "%s [%s%%]" %
                (row[0]['html'], str(float(row[-1]['html'][:-1]))),
                'value':
                float(row[-1]['html'][:-1])
            } for row in rows[1:]], ['red', 'green'])
        elif isinstance(data_provider, DeliveryPlaceDetailsExtended):
            chart = PieChart('', '', [{
                'label': _get_label_with_percentage(row),
                'value': float(row[-1]['html'][:-1])
            } for row in rows[1:]])
        elif isinstance(data_provider,
                        (PostnatalCareOverview, ImmunizationOverview)):
            chart = MultiBarChart('',
                                  x_axis=Axis(x_label),
                                  y_axis=Axis(y_label, '.2%'))
            chart.rotateLabels = -45
            chart.marginBottom = 120
            if isinstance(data_provider, ImmunizationOverview):
                chart.stacked = True
                chart.add_dataset('Percentage',
                                  [{
                                      'x': row[0]['html'],
                                      'y': float(row[3]['html'][:-1]) / 100
                                  } for row in rows],
                                  color='green')
                chart.add_dataset('Dropout Percentage',
                                  [{
                                      'x': row[0]['html'],
                                      'y': float(row[-1]['html'][:-1]) / 100
                                  } for row in rows],
                                  color='red')
            else:
                chart.add_dataset('Percentage',
                                  [{
                                      'x': row[0]['html'],
                                      'y': float(row[-1]['html'][:-1]) / 100
                                  } for row in rows])
        elif isinstance(data_provider, AnteNatalCareServiceOverviewExtended):
            chart1 = MultiBarChart('',
                                   x_axis=Axis(x_label),
                                   y_axis=Axis(y_label, '.2%'))
            chart2 = MultiBarChart('',
                                   x_axis=Axis(x_label),
                                   y_axis=Axis(y_label, '.2%'))
            chart1.rotateLabels = -45
            chart2.rotateLabels = -45
            chart1.marginBottom = 120
            chart2.marginBottom = 120
            chart1.add_dataset('Percentage',
                               [{
                                   'x': row[0]['html'],
                                   'y': float(row[-1]['html'][:-1]) / 100
                               } for row in rows[1:6]])
            chart2.add_dataset('Percentage',
                               [{
                                   'x': row[0]['html'],
                                   'y': float(row[-1]['html'][:-1]) / 100
                               } for row in rows[6:12]])
            return [chart1, chart2]
        elif isinstance(data_provider, ChildrenDeathsByMonth):
            chart = LineChart('Seasonal Variation of Child Deaths',
                              x_axis=Axis(x_label, dateFormat="%B"),
                              y_axis=Axis(y_label, '.2%'))
            chart.rotateLabels = -45
            chart.marginBottom = 120
            months_mapping = dict(
                (v, k) for k, v in enumerate(calendar.month_abbr))
            chart.add_dataset(
                'Percentage',
                [{
                    'x': datetime.date(1, months_mapping[row[0][:3]], 1),
                    'y': float(row[-1]['html'][:-1]) / 100
                } for row in rows])
        else:
            chart = PieChart('', '', [{
                'label':
                "%s [%s%%]" %
                (row[0]['html'], str(float(row[-1]['html'][:-1]))),
                'value':
                float(row[-1]['html'][:-1])
            } for row in rows])
        return [chart]
Ejemplo n.º 11
0
    def charts(self):
        chart = PNAMultiBarChart(None, Axis('Location'),
                                 Axis('Amount', format='i'))
        chart.height = 550
        chart.marginBottom = 150
        chart.rotateLabels = -45
        chart.showControls = False

        def data_to_chart(stocks_list):
            stocks_to_return = []
            products_data = []
            added_products = []

            for stock in stocks_list:
                sorted_stock = sorted(stock['products'],
                                      key=lambda x: x['product_name'])
                for product in sorted_stock:
                    product_id = product['product_id']
                    product_name = product['product_name']
                    actual_consumption = product['actual_consumption']
                    if product_id not in added_products:
                        added_products.append(product_id)
                        product_dict = {
                            'product_id': product_id,
                            'product_name': product_name,
                            'actual_consumption': actual_consumption,
                        }
                        products_data.append(product_dict)
                    else:
                        for product_data in products_data:
                            if product_data['product_id'] == product_id:
                                product_data[
                                    'actual_consumption'] += actual_consumption

            products = sorted(products_data, key=lambda x: x['product_name'])
            for product in products:
                product_name = product['product_name']
                actual_consumption = product['actual_consumption']
                consumption = actual_consumption if actual_consumption is not 0 else 0
                stocks_to_return.append([
                    product_name, {
                        'html': '{}'.format(consumption),
                        'sort_key': consumption
                    }
                ])

            return stocks_to_return

        def get_data_for_graph():
            com = []
            rows = data_to_chart(self.clean_rows)
            for row in rows:
                com.append({"x": row[0], "y": row[1]['sort_key']})

            return [
                {
                    "key": 'Consommation par produit au niveau national',
                    'values': com
                },
            ]

        chart.data = get_data_for_graph()
        return [chart]