def __init__(self, report_slug, name, keys, values): super(ClinicReportDisplayRow, self).__init__(name, keys, values) self.report_slug = report_slug if "Clinic" in self.keys: self.clinic_code = self.keys["Clinic"] self.keys["Clinic"] = clinic_display(self.clinic_code) else: self.clinic_code = None
def render_summary_graph(report): """ Generate a graph that plots all the pi indicators for each clinic from the data in the ReportDisplay object """ if report is None or len(report.rows) == 0: return # Create array of all indicator data by month for each clinic headings = report.get_display_value_keys() slugs = report.get_slug_keys() report_data = [] for row in report.rows: ordered_values = [row.get_value(key).graph_value if row.get_value(key) else 0 for key in slugs] # hack - for the CHW PI report just blank this field out. Everything else can work the same clinic = row.keys['Clinic'] if "Clinic" in row.keys else "" row_with_clinic = list(itertools.chain([clinic], [row.keys['Month']], [row.keys['Year']], [ordered_values])) report_data.append(row_with_clinic) # sort by clinic sorted_data=sorted(report_data, key=lambda data: data[0]) # create a clinic list, date list for display on plot, combine data for same clinic clinic_list=[] date_list=[] data_by_clinic=[] for entry in sorted_data: if entry[0] not in clinic_list: clinic_list.append(entry[0]) date_list.append([datetime(entry[2], entry[1], 1)]) data_by_clinic.append(entry[3:]) else: data_by_clinic[-1] = data_by_clinic[-1] + entry[3:] date_list[-1] = date_list[-1] + [datetime(entry[2], entry[1], 1)] # go through data for each clinic, add y-axis point for plotting based on # number of months plotted for each clinic check that data value valid, # create list with data values that don't exist for plotting height_per_indicator = 50 num_indicators = len(ordered_values) plot_height =[] display_data = [] valid_data = [] for row in data_by_clinic: display_row = [] valid_row = [] increment_val = len(row) + 1 y_value = 1 indicator_counter = 0 month_counter = 0 for month in row: display_month = [] valid_value = [] for x_value in month: if x_value != "N/A": data_value = x_value valid = "True" else: data_value = 0 valid = "False" display_month.append([data_value, y_value]) valid_value.append(valid) if indicator_counter < (num_indicators-1): y_value += increment_val indicator_counter += 1 else: # reset condition month_counter += 1 y_value = month_counter+1 indicator_counter = 0 display_row.append(display_month) valid_row.append(valid_value) display_data.append(display_row) valid_data.append(valid_row) plot_height.append(len(row)*num_indicators*height_per_indicator + height_per_indicator) # add clinic name clinic_name_list=[] for clinic in clinic_list: clinic_name_list.append(clinic_display(clinic)) descriptions = report.get_descriptions() # sort by date and render for display display_dates = [[d.strftime("%B %Y") for d in sorted(inner_list)] for inner_list in date_list] return render_to_string("reports/partials/report_summary_graph.html", {"headings": json.dumps(headings), "rows": display_data, "height": plot_height, "clinic_names": clinic_name_list, "dates": display_dates, "descriptions": descriptions, "titles": report.get_display_value_keys(), "valid_data": valid_data })