예제 #1
0
파일: display.py 프로젝트: dimagi/bhoma
 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
예제 #2
0
파일: report_tags.py 프로젝트: dimagi/bhoma
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
                     })