def charts(self): chart = LineChart(_("Messages over time"), None, Axis(_('# of Messages'), ',.1d')) chart.data = { _("Keywords"): self.es_histogram(WORKFLOW_KEYWORD), _("Reminders"): self.es_histogram(WORKFLOW_REMINDER), _("Broadcasts"): self.es_histogram(WORKFLOW_BROADCAST), } chart.data_needs_formatting = True chart.x_axis_uses_dates = True return [chart]
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): chart = LineChart(_("Appointment Reminders"), None, None) chart.data = [ { "key": _("% Appointments Confirmed"), "values": self.percent_over_time('case_data'), }, { "key": _("% Reminders Confirmed"), "values": self.percent_over_time('session_data'), }, ] chart.x_axis_uses_dates = True return [chart]
def charts(self): rows = self.rows date_index = len(self.place_types) startdate = self.datespan.startdate enddate = self.datespan.enddate date_axis = Axis(label="Date", dateFormat="%b %d") tests_axis = Axis(label="Number of Tests") chart = LineChart("Number of Tests Per Day", date_axis, tests_axis) for row in rows: data_points = [] for n, day in enumerate(self.daterange(startdate, enddate)): x = day y = 0 if row[date_index + n + 1] == "--" else row[date_index + n + 1] data_points.append({'x': x, 'y': y['sort_key']}) chart.add_dataset(row[date_index-1] + "(" + row[date_index] + ")", data_points) return [chart]
def loadtest(request): # The multimech results api is kinda all over the place. # the docs are here: http://testutils.org/multi-mechanize/datastore.html db_settings = settings.DATABASES["default"] db_settings['PORT'] = db_settings.get('PORT', '') or '5432' db_url = "postgresql://{USER}:{PASSWORD}@{HOST}:{PORT}/{NAME}".format( **db_settings) engine = create_engine(db_url) session = sessionmaker(bind=engine) current = session() 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 current.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 loadtest(request): # The multimech results api is kinda all over the place. # the docs are here: http://testutils.org/multi-mechanize/datastore.html db_settings = settings.DATABASES["default"] db_settings['PORT'] = db_settings.get('PORT', '') or '5432' db_url = "postgresql://{USER}:{PASSWORD}@{HOST}:{PORT}/{NAME}".format( **db_settings ) engine = create_engine(db_url) session = sessionmaker(bind=engine) current = session() 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 current.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 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]