def test_sector_data(self): self.assertDictEqual( get_enrolled_women_sector_data('icds-cas', config={ 'month': (2017, 5, 1), 'state_id': 'st1', 'district_id': 'd1', 'block_id': 'b1', 'aggregation_level': 4 }, location_id='b1', loc_level='supervisor'), { "info": percent_pregnant_women_enrolled_help_text(), "tooltips_data": { "s2": { "valid": 24, "all": 24 }, "s1": { "valid": 17, "all": 17 } }, "chart_data": [{ "color": MapColors.BLUE, "classed": "dashed", "strokeWidth": 2, "values": [["s1", 17], ["s2", 24]], "key": "" }], "format": "number" })
def test_map_data(self): self.assertDictEqual( get_enrolled_women_data_map('icds-cas', config={ 'month': (2017, 5, 1), 'aggregation_level': 1 }, loc_level='state'), { "rightLegend": { "info": percent_pregnant_women_enrolled_help_text(), "average": '100.00', 'extended_info': [{ 'indicator': 'Number of pregnant women who are enrolled for Anganwadi Services:', 'value': "155" }, { 'indicator': 'Total number of pregnant women who are registered:', 'value': "155" }, { 'indicator': ('Percentage of registered pregnant women who are enrolled for Anganwadi Services:' ), 'value': '100.00%' }] }, "fills": { "Women": MapColors.BLUE, "Not Launched": MapColors.GREY, "defaultFill": MapColors.GREY }, "data": { 'st7': { 'all': 0, 'valid': 0, 'original_name': ['st7'], 'fillKey': 'Women' }, 'st1': { 'all': 70, 'valid': 70, 'original_name': ['st1'], 'fillKey': 'Women' }, 'st2': { 'all': 85, 'valid': 85, 'original_name': ['st2'], 'fillKey': 'Women' } }, "slug": "enrolled_women", "label": "" })
def get_enrolled_women_sector_data(domain, config, loc_level, location_id, show_test=False, icds_features_flag=False): group_by = ['%s_name' % loc_level] config['month'] = datetime(*config['month']) data = AggCcsRecordMonthly.objects.filter( **config).values(*group_by).annotate(valid=Sum('pregnant'), all=Sum('pregnant_all')).order_by( '%s_name' % loc_level) if not show_test: data = apply_exclude(domain, data) chart_data = {'blue': []} tooltips_data = defaultdict(lambda: {'valid': 0, 'all': 0}) if icds_features_flag: location_launched_status = get_location_launched_status( config, loc_level) else: location_launched_status = None for row in data: if location_launched_status: launched_status = location_launched_status.get(row['%s_name' % loc_level]) if launched_status is None or launched_status <= 0: continue valid = row['valid'] or 0 all_pregnant = row['all'] or 0 name = row['%s_name' % loc_level] row_values = {'valid': valid, 'all': all_pregnant} for prop, value in row_values.items(): tooltips_data[name][prop] += value chart_data['blue'].append([name, valid]) chart_data['blue'] = sorted(chart_data['blue']) return { "tooltips_data": dict(tooltips_data), "format": "number", "info": percent_pregnant_women_enrolled_help_text(), "chart_data": [{ "values": chart_data['blue'], "key": "", "strokeWidth": 2, "classed": "dashed", "color": MapColors.BLUE }] }
def get_enrolled_women_sector_data(domain, config, loc_level, location_id, show_test=False): group_by = ['%s_name' % loc_level] config['month'] = datetime(*config['month']) data = AggCcsRecordMonthly.objects.filter( **config).values(*group_by).annotate(valid=Sum('pregnant'), all=Sum('pregnant_all')).order_by( '%s_name' % loc_level) if not show_test: data = apply_exclude(domain, data) chart_data = {'blue': []} tooltips_data = defaultdict(lambda: {'valid': 0, 'all': 0}) loc_children = get_child_locations(domain, location_id, show_test) result_set = set() for row in data: valid = row['valid'] or 0 all_pregnant = row['all'] or 0 name = row['%s_name' % loc_level] result_set.add(name) row_values = {'valid': valid, 'all': all_pregnant} for prop, value in six.iteritems(row_values): tooltips_data[name][prop] += value chart_data['blue'].append([name, valid]) for sql_location in loc_children: if sql_location.name not in result_set: chart_data['blue'].append([sql_location.name, 0]) chart_data['blue'] = sorted(chart_data['blue']) return { "tooltips_data": dict(tooltips_data), "format": "number", "info": percent_pregnant_women_enrolled_help_text(), "chart_data": [{ "values": chart_data['blue'], "key": "", "strokeWidth": 2, "classed": "dashed", "color": MapColors.BLUE }] }
def test_map_name_is_different_data(self): self.assertDictEqual( get_enrolled_women_data_map( 'icds-cas', config={ 'month': (2017, 5, 1), 'state_id': 'st1', 'district_id': 'd1', 'aggregation_level': 3 }, loc_level='block', ), { "rightLegend": { "info": percent_pregnant_women_enrolled_help_text(), "average": '100.00', 'extended_info': [ { 'indicator': 'Number of pregnant women who are enrolled for Anganwadi Services:', 'value': "70" }, { 'indicator': 'Total number of pregnant women who are registered:', 'value': "70" }, { 'indicator': ( 'Percentage of registered pregnant women who are enrolled for Anganwadi Services:' ), 'value': '100.00%' } ] }, "fills": { "Women": MapColors.BLUE, "defaultFill": MapColors.GREY }, "data": { 'block_map': { 'valid': 70, 'all': 70, 'original_name': ['b1', 'b2'], 'fillKey': 'Women' } }, "slug": "enrolled_women", "label": "" } )
def test_sector_data(self): self.assertDictEqual( get_enrolled_women_sector_data( 'icds-cas', config={ 'month': (2017, 5, 1), 'state_id': 'st1', 'district_id': 'd1', 'block_id': 'b1', 'aggregation_level': 4 }, location_id='b1', loc_level='supervisor' ), { "info": percent_pregnant_women_enrolled_help_text(), "tooltips_data": { "s2": { "valid": 24, "all": 24 }, "s1": { "valid": 17, "all": 17 } }, "chart_data": [ { "color": MapColors.BLUE, "classed": "dashed", "strokeWidth": 2, "values": [ [ "s1", 17 ], [ "s2", 24 ] ], "key": "" } ], "format": "number" } )
def test_data_monthly_enrolled_women(self): data = get_demographics_data( 'icds-cas', (2017, 6, 1), { 'month': (2017, 5, 1), 'prev_month': (2017, 4, 1), 'aggregation_level': 1 }) expected = { "redirect": "demographics/enrolled_women", "all": 155, "format": "percent_and_div", "color": "red", "percent": 0.0, "value": 155, "label": PREGNANT_WOMEN_ENROLLED_FOR_ANGANWADI_SERVICES, "frequency": "month", "help_text": percent_pregnant_women_enrolled_help_text() } self.assertDictEqual(expected, data['records'][1][1])
def test_data_monthly_enrolled_women(self): data = get_demographics_data( 'icds-cas', (2017, 6, 1), { 'month': (2017, 5, 1), 'prev_month': (2017, 4, 1), 'aggregation_level': 1 }) expected = { "redirect": "demographics/enrolled_women", "all": 155, "format": "percent_and_div", "color": "red", "percent": 0.0, "value": 155, "label": "Percent pregnant women enrolled for Anganwadi Services", "frequency": "month", "help_text": percent_pregnant_women_enrolled_help_text() } self.assertDictEqual(expected, data['records'][1][1])
def test_data_daily_if_aggregation_script_fail_enrolled_women(self): data = get_demographics_data( 'icds-cas', (2017, 5, 30), { 'month': (2017, 5, 1), 'prev_month': (2017, 4, 1), 'aggregation_level': 1 }) expected = { "redirect": "demographics/enrolled_women", "all": 155, "format": "percent_and_div", "color": "green", "percent": "Data in the previous reporting period was 0", "value": 155, "label": "Percent pregnant women enrolled for Anganwadi Services", "frequency": "day", "help_text": percent_pregnant_women_enrolled_help_text() } self.assertDictEqual(expected, data['records'][1][1])
def test_data_monthly_enrolled_women(self): data = get_demographics_data( 'icds-cas', (2017, 6, 1), { 'month': (2017, 5, 1), 'prev_month': (2017, 4, 1), 'aggregation_level': 1 } ) expected = { "redirect": "demographics/enrolled_women", "all": 155, "format": "percent_and_div", "color": "red", "percent": 0.0, "value": 155, "label": "Percent pregnant women enrolled for Anganwadi Services", "frequency": "month", "help_text": percent_pregnant_women_enrolled_help_text() } self.assertDictEqual(expected, data['records'][1][1])
def test_data_daily_if_aggregation_script_fail_enrolled_women(self): data = get_demographics_data( 'icds-cas', (2017, 5, 30), { 'month': (2017, 5, 1), 'prev_month': (2017, 4, 1), 'aggregation_level': 1 } ) expected = { "redirect": "demographics/enrolled_women", "all": 155, "format": "percent_and_div", "color": "green", "percent": "Data in the previous reporting period was 0", "value": 155, "label": "Percent pregnant women enrolled for Anganwadi Services", "frequency": "day", "help_text": percent_pregnant_women_enrolled_help_text() } self.assertDictEqual(expected, data['records'][1][1])
def get_demographics_data(domain, now_date, config, show_test=False, beta=False): now_date = datetime(*now_date) current_month = datetime(*config['month']) previous_month = datetime(*config['prev_month']) del config['month'] del config['prev_month'] def get_data_for(query_class, filters): queryset = query_class.objects.filter( **filters).values('aggregation_level').annotate( household=Sum('cases_household'), child_health=Sum('cases_child_health'), child_health_all=Sum('cases_child_health_all'), ccs_pregnant=Sum('cases_ccs_pregnant'), ccs_pregnant_all=Sum('cases_ccs_pregnant_all'), css_lactating=Sum('cases_ccs_lactating'), css_lactating_all=Sum('cases_ccs_lactating_all'), person_adolescent=Sum('cases_person_adolescent_girls_11_14'), person_adolescent_all=Sum( 'cases_person_adolescent_girls_11_14_all'), person_aadhaar=Sum(person_has_aadhaar_column(beta)), all_persons=Sum(person_is_beneficiary_column(beta))) if not show_test: queryset = apply_exclude(domain, queryset) return queryset if current_month.month == now_date.month and current_month.year == now_date.year: config['date'] = now_date.date() data = None # keep the record in searched - current - month while data is None or (not data and config['date'].day != 1): config['date'] -= relativedelta(days=1) data = get_data_for(AggAwcDailyView, config) prev_data = None while prev_data is None or (not prev_data and config['date'].day != 1): config['date'] -= relativedelta(days=1) prev_data = get_data_for(AggAwcDailyView, config) frequency = 'day' else: config['month'] = current_month data = get_data_for(AggAwcMonthly, config) config['month'] = previous_month prev_data = get_data_for(AggAwcMonthly, config) frequency = 'month' return { 'records': [[{ 'label': _('Registered Households'), 'help_text': _('Total number of households registered'), 'percent': percent_increase('household', data, prev_data), 'color': get_color_with_green_positive( percent_increase('household', data, prev_data)), 'value': get_value(data, 'household'), 'all': None, 'format': 'number', 'frequency': frequency, 'redirect': 'demographics/registered_household' }, { 'label': _(AADHAR_SEEDED_BENEFICIARIES), 'help_text': percent_aadhaar_seeded_beneficiaries_help_text(), 'percent': percent_diff('person_aadhaar', data, prev_data, 'all_persons'), 'color': get_color_with_green_positive( percent_diff('person_aadhaar', data, prev_data, 'all_persons')), 'value': get_value(data, 'person_aadhaar'), 'all': get_value(data, 'all_persons'), 'format': 'percent_and_div', 'frequency': frequency, 'redirect': 'demographics/adhaar' }], [{ 'label': _(CHILDREN_ENROLLED_FOR_ANGANWADI_SERVICES), 'help_text': percent_children_enrolled_help_text(), 'percent': percent_diff('child_health', data, prev_data, 'child_health_all'), 'color': get_color_with_green_positive( percent_diff('child_health', data, prev_data, 'child_health_all')), 'value': get_value(data, 'child_health'), 'all': get_value(data, 'child_health_all'), 'format': 'percent_and_div', 'frequency': frequency, 'redirect': 'demographics/enrolled_children' }, { 'label': _(PREGNANT_WOMEN_ENROLLED_FOR_ANGANWADI_SERVICES), 'help_text': percent_pregnant_women_enrolled_help_text(), 'percent': percent_diff('ccs_pregnant', data, prev_data, 'ccs_pregnant_all'), 'color': get_color_with_green_positive( percent_diff('ccs_pregnant', data, prev_data, 'ccs_pregnant_all')), 'value': get_value(data, 'ccs_pregnant'), 'all': get_value(data, 'ccs_pregnant_all'), 'format': 'percent_and_div', 'frequency': frequency, 'redirect': 'demographics/enrolled_women' }], [{ 'label': _(LACTATING_WOMEN_ENROLLED_FOR_ANGANWADI_SERVICES), 'help_text': percent_lactating_women_enrolled_help_text(), 'percent': percent_diff('css_lactating', data, prev_data, 'css_lactating_all'), 'color': get_color_with_green_positive( percent_diff('css_lactating', data, prev_data, 'css_lactating_all')), 'value': get_value(data, 'css_lactating'), 'all': get_value(data, 'css_lactating_all'), 'format': 'percent_and_div', 'frequency': frequency, 'redirect': 'demographics/lactating_enrolled_women' }, { 'label': _(ADOLESCENT_GIRLS_ENROLLED_FOR_ANGANWADI_SERVICES), 'help_text': percent_adolescent_girls_enrolled_help_text(), 'percent': percent_diff('person_adolescent', data, prev_data, 'person_adolescent_all'), 'color': get_color_with_green_positive( percent_diff('person_adolescent', data, prev_data, 'person_adolescent_all')), 'value': get_value(data, 'person_adolescent'), 'all': get_value(data, 'person_adolescent_all'), 'format': 'percent_and_div', 'frequency': frequency, 'redirect': 'demographics/adolescent_girls' }]] }
def get_enrolled_women_data_map(domain, config, loc_level, show_test=False, icds_features_flag=False): config['month'] = datetime(*config['month']) def get_data_for(filters): queryset = AggCcsRecordMonthly.objects.filter(**filters).values( '%s_name' % loc_level, '%s_map_location_name' % loc_level).annotate( valid=Sum('pregnant'), all=Sum('pregnant_all')).order_by( '%s_name' % loc_level, '%s_map_location_name' % loc_level) if not show_test: queryset = apply_exclude(domain, queryset) return queryset data_for_map = defaultdict(lambda: { 'valid': 0, 'all': 0, 'original_name': [], 'fillKey': 'Women' }) average = [] total_valid = 0 total = 0 location_launched_status = get_location_launched_status(config, loc_level) for row in get_data_for(config): if location_launched_status: launched_status = location_launched_status.get(row['%s_name' % loc_level]) if launched_status is None or launched_status <= 0: continue valid = row['valid'] or 0 all_pregnant = row['all'] or 0 name = row['%s_name' % loc_level] on_map_name = row['%s_map_location_name' % loc_level] or name average.append(valid) total_valid += valid total += all_pregnant data_for_map[on_map_name]['valid'] += valid data_for_map[on_map_name]['all'] += all_pregnant data_for_map[on_map_name]['original_name'].append(name) fills = OrderedDict() fills.update({'Women': MapColors.BLUE}) fills.update({'Not Launched': MapColors.GREY}) fills.update({'defaultFill': MapColors.GREY}) return { "slug": "enrolled_women", "label": "", "fills": fills, "rightLegend": { "average": '%.2f' % (total_valid * 100 / float(total or 1)), "info": percent_pregnant_women_enrolled_help_text(), "extended_info": [{ 'indicator': 'Number of pregnant women who are enrolled for Anganwadi Services:', 'value': indian_formatted_number(total_valid) }, { 'indicator': ('Total number of pregnant women who are registered:'), 'value': indian_formatted_number(total) }, { 'indicator': ('Percentage of registered pregnant women who are enrolled for Anganwadi Services:' ), 'value': '%.2f%%' % (total_valid * 100 / float(total or 1)) }] }, "data": dict(data_for_map), }
def get_enrolled_women_sector_data(domain, config, loc_level, location_id, show_test=False): group_by = ['%s_name' % loc_level] config['month'] = datetime(*config['month']) data = AggCcsRecordMonthly.objects.filter( **config ).values( *group_by ).annotate( valid=Sum('pregnant'), all=Sum('pregnant_all') ).order_by('%s_name' % loc_level) if not show_test: data = apply_exclude(domain, data) chart_data = { 'blue': [] } tooltips_data = defaultdict(lambda: { 'valid': 0, 'all': 0 }) loc_children = get_child_locations(domain, location_id, show_test) result_set = set() for row in data: valid = row['valid'] or 0 all_pregnant = row['all'] or 0 name = row['%s_name' % loc_level] result_set.add(name) row_values = { 'valid': valid, 'all': all_pregnant } for prop, value in six.iteritems(row_values): tooltips_data[name][prop] += value chart_data['blue'].append([ name, valid ]) for sql_location in loc_children: if sql_location.name not in result_set: chart_data['blue'].append([sql_location.name, 0]) chart_data['blue'] = sorted(chart_data['blue']) return { "tooltips_data": dict(tooltips_data), "format": "number", "info": percent_pregnant_women_enrolled_help_text(), "chart_data": [ { "values": chart_data['blue'], "key": "", "strokeWidth": 2, "classed": "dashed", "color": MapColors.BLUE } ] }
def get_enrolled_women_data_map(domain, config, loc_level, show_test=False): def get_data_for(filters): filters['month'] = datetime(*filters['month']) queryset = AggCcsRecordMonthly.objects.filter( **filters ).values( '%s_name' % loc_level, '%s_map_location_name' % loc_level ).annotate( valid=Sum('pregnant'), all=Sum('pregnant_all') ).order_by('%s_name' % loc_level, '%s_map_location_name' % loc_level) if not show_test: queryset = apply_exclude(domain, queryset) return queryset data_for_map = defaultdict(lambda: { 'valid': 0, 'all': 0, 'original_name': [], 'fillKey': 'Women' }) average = [] total_valid = 0 total = 0 for row in get_data_for(config): valid = row['valid'] or 0 all_pregnant = row['all'] or 0 name = row['%s_name' % loc_level] on_map_name = row['%s_map_location_name' % loc_level] or name average.append(valid) total_valid += valid total += all_pregnant data_for_map[on_map_name]['valid'] += valid data_for_map[on_map_name]['all'] += all_pregnant data_for_map[on_map_name]['original_name'].append(name) fills = OrderedDict() fills.update({'Women': MapColors.BLUE}) fills.update({'defaultFill': MapColors.GREY}) return { "slug": "enrolled_women", "label": "", "fills": fills, "rightLegend": { "average": '%.2f' % (total_valid * 100 / float(total or 1)), "info": percent_pregnant_women_enrolled_help_text(), "extended_info": [ { 'indicator': 'Number of pregnant women who are enrolled for Anganwadi Services:', 'value': indian_formatted_number(total_valid) }, { 'indicator': ( 'Total number of pregnant women who are registered:' ), 'value': indian_formatted_number(total) }, { 'indicator': ( 'Percentage of registered pregnant women who are enrolled for Anganwadi Services:' ), 'value': '%.2f%%' % (total_valid * 100 / float(total or 1)) } ] }, "data": dict(data_for_map), }
def get_demographics_data(domain, now_date, config, show_test=False, beta=False): now_date = datetime(*now_date) current_month = datetime(*config['month']) previous_month = datetime(*config['prev_month']) del config['month'] del config['prev_month'] def get_data_for(query_class, filters): queryset = query_class.objects.filter( **filters ).values( 'aggregation_level' ).annotate( household=Sum('cases_household'), child_health=Sum('cases_child_health'), child_health_all=Sum('cases_child_health_all'), ccs_pregnant=Sum('cases_ccs_pregnant'), ccs_pregnant_all=Sum('cases_ccs_pregnant_all'), css_lactating=Sum('cases_ccs_lactating'), css_lactating_all=Sum('cases_ccs_lactating_all'), person_adolescent=Sum('cases_person_adolescent_girls_11_14'), person_adolescent_all=Sum('cases_person_adolescent_girls_11_14_all'), person_aadhaar=Sum(person_has_aadhaar_column(beta)), all_persons=Sum(person_is_beneficiary_column(beta)) ) if not show_test: queryset = apply_exclude(domain, queryset) return queryset if current_month.month == now_date.month and current_month.year == now_date.year: config['date'] = now_date.date() data = None # keep the record in searched - current - month while data is None or (not data and config['date'].day != 1): config['date'] -= relativedelta(days=1) data = get_data_for(AggAwcDailyView, config) prev_data = None while prev_data is None or (not prev_data and config['date'].day != 1): config['date'] -= relativedelta(days=1) prev_data = get_data_for(AggAwcDailyView, config) frequency = 'day' else: config['month'] = current_month data = get_data_for(AggAwcMonthly, config) config['month'] = previous_month prev_data = get_data_for(AggAwcMonthly, config) frequency = 'month' return { 'records': [ [ { 'label': _('Registered Households'), 'help_text': _('Total number of households registered'), 'percent': percent_increase('household', data, prev_data), 'color': 'green' if percent_increase( 'household', data, prev_data) > 0 else 'red', 'value': get_value(data, 'household'), 'all': None, 'format': 'number', 'frequency': frequency, 'redirect': 'demographics/registered_household' }, { 'label': _('Percent Aadhaar-seeded Beneficiaries'), 'help_text': percent_aadhaar_seeded_beneficiaries_help_text(), 'percent': percent_diff( 'person_aadhaar', data, prev_data, 'all_persons' ), 'color': 'green' if percent_diff( 'person_aadhaar', data, prev_data, 'all_persons') > 0 else 'red', 'value': get_value(data, 'person_aadhaar'), 'all': get_value(data, 'all_persons'), 'format': 'percent_and_div', 'frequency': frequency, 'redirect': 'demographics/adhaar' } ], [ { 'label': _('Percent children (0-6 years) enrolled for Anganwadi Services'), 'help_text': percent_children_enrolled_help_text(), 'percent': percent_diff('child_health', data, prev_data, 'child_health_all'), 'color': 'green' if percent_diff( 'child_health', data, prev_data, 'child_health_all') > 0 else 'red', 'value': get_value(data, 'child_health'), 'all': get_value(data, 'child_health_all'), 'format': 'percent_and_div', 'frequency': frequency, 'redirect': 'demographics/enrolled_children' }, { 'label': _('Percent pregnant women enrolled for Anganwadi Services'), 'help_text': percent_pregnant_women_enrolled_help_text(), 'percent': percent_diff('ccs_pregnant', data, prev_data, 'ccs_pregnant_all'), 'color': 'green' if percent_diff( 'ccs_pregnant', data, prev_data, 'ccs_pregnant_all' ) > 0 else 'red', 'value': get_value(data, 'ccs_pregnant'), 'all': get_value(data, 'ccs_pregnant_all'), 'format': 'percent_and_div', 'frequency': frequency, 'redirect': 'demographics/enrolled_women' } ], [ { 'label': _('Percent lactating women enrolled for Anganwadi Services'), 'help_text': percent_lactating_women_enrolled_help_text(), 'percent': percent_diff('css_lactating', data, prev_data, 'css_lactating_all'), 'color': 'green' if percent_diff( 'css_lactating', data, prev_data, 'css_lactating_all' ) > 0 else 'red', 'value': get_value(data, 'css_lactating'), 'all': get_value(data, 'css_lactating_all'), 'format': 'percent_and_div', 'frequency': frequency, 'redirect': 'demographics/lactating_enrolled_women' }, { 'label': _('Percent adolescent girls (11-14 years) enrolled for Anganwadi Services'), 'help_text': percent_adolescent_girls_enrolled_help_text(), 'percent': percent_diff( 'person_adolescent', data, prev_data, 'person_adolescent_all' ), 'color': 'green' if percent_diff( 'person_adolescent', data, prev_data, 'person_adolescent_all' ) > 0 else 'red', 'value': get_value(data, 'person_adolescent'), 'all': get_value(data, 'person_adolescent_all'), 'format': 'percent_and_div', 'frequency': frequency, 'redirect': 'demographics/adolescent_girls' } ] ] }