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)
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): chart = MultiBarChart(None, Axis(_('Sites')), Axis('')) chart.height = 400 chart.marginBottom = 100 chart.data = self.get_data_for_graph() return [chart]
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]
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]
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]
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]
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]
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]
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]
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]