예제 #1
0
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'
         }]]
    }
예제 #2
0
def get_awc_reports_system_usage(domain,
                                 config,
                                 month,
                                 prev_month,
                                 two_before,
                                 loc_level,
                                 show_test=False):
    def get_data_for(filters, date):
        queryset = AggAwcMonthly.objects.filter(
            month=datetime(*date), **filters).values(loc_level).annotate(
                awc_open=Sum('awc_days_open'),
                weighed=Sum('wer_weighed'),
                all=Sum('wer_eligible'),
            )
        if not show_test:
            queryset = apply_exclude(domain, queryset)
        return queryset

    chart_data = DailyAttendanceView.objects.filter(
        pse_date__range=(datetime(*two_before), datetime(*month)),
        **config).values('pse_date', 'aggregation_level').annotate(
            awc_count=Sum('awc_open_count'),
            attended_children=Avg('attended_children_percent')).order_by(
                'pse_date')

    if not show_test:
        chart_data = apply_exclude(domain, chart_data)

    awc_count_chart = []
    attended_children_chart = []
    for row in chart_data:
        date = row['pse_date']
        date_in_milliseconds = int(date.strftime("%s")) * 1000
        awc_count_chart.append([date_in_milliseconds, row['awc_count']])
        attended_children_chart.append(
            [date_in_milliseconds, row['attended_children'] or 0])

    this_month_data = get_data_for(config, month)
    prev_month_data = get_data_for(config, prev_month)

    return {
        'kpi': [[{
            'label':
            _('AWC Days Open'),
            'help_text':
            _(("The total number of days the AWC is open in the given month. The AWC is expected to "
               "be open 6 days a week (Not on Sundays and public holidays)")),
            'percent':
            percent_increase(
                'awc_open',
                this_month_data,
                prev_month_data,
            ),
            'value':
            get_value(this_month_data, 'awc_open'),
            'all':
            '',
            'format':
            'number',
            'frequency':
            'month'
        }, {
            'label':
            _(("Percentage of eligible children (ICDS beneficiaries between 0-6 years) "
               "who have been weighed in the current month")),
            'help_text':
            _('Percentage of AWCs with a functional toilet'),
            'percent':
            percent_diff('weighed', this_month_data, prev_month_data, 'all'),
            'value':
            get_value(this_month_data, 'weighed'),
            'all':
            get_value(this_month_data, 'all'),
            'format':
            'percent_and_div',
            'frequency':
            'month'
        }]],
        'charts': [[{
            'key': 'AWC Days Open Per Week',
            'values': awc_count_chart,
            "classed": "dashed",
        }],
                   [{
                       'key': 'PSE- Average Weekly Attendance',
                       'values': attended_children_chart,
                       "classed": "dashed",
                   }]],
    }
예제 #3
0
def get_awc_report_demographics(domain, config, month, show_test=False):
    selected_month = datetime(*month)

    chart = AggChildHealthMonthly.objects.filter(
        month=selected_month,
        **config).values('age_tranche', 'aggregation_level').annotate(
            valid=Sum('valid_in_month')).order_by('age_tranche')

    if not show_test:
        chart = apply_exclude(domain, chart)

    chart_data = OrderedDict()
    chart_data.update({'0-1 month': 0})
    chart_data.update({'1-6 months': 0})
    chart_data.update({'6-12 months': 0})
    chart_data.update({'1-3 years': 0})
    chart_data.update({'3-6 years': 0})

    for chart_row in chart:
        if chart_row['age_tranche']:
            age = int(chart_row['age_tranche'])
            valid = chart_row['valid']
            chart_data[match_age(age)] += valid

    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') +
                                   Sum('cases_person_adolescent_girls_15_18')),
                person_adolescent_all=(
                    Sum('cases_person_adolescent_girls_11_14_all') +
                    Sum('cases_person_adolescent_girls_15_18_all')),
                person_aadhaar=Sum('cases_person_has_aadhaar'),
                all_persons=Sum('cases_person_beneficiary'))

        if not show_test:
            queryset = apply_exclude(domain, queryset)
        return queryset

    yesterday = datetime.now() - relativedelta(days=1)
    two_days_ago = yesterday - relativedelta(days=1)
    now = datetime.utcnow()
    previous_month = selected_month - relativedelta(months=1)
    if selected_month.month == now.month and selected_month.year == now.year:
        config['date'] = yesterday
        data = get_data_for(AggAwcDailyView, config)
        config['date'] = two_days_ago
        prev_data = get_data_for(AggAwcDailyView, config)
        frequency = 'day'
    else:
        config['month'] = selected_month
        data = get_data_for(AggAwcMonthly, config)
        config['month'] = previous_month
        prev_data = get_data_for(AggAwcMonthly, config)
        frequency = 'month'

    return {
        'chart': [{
            'key':
            'Children (0-6 years)',
            'values': [[key, value] for key, value in chart_data.iteritems()],
            "classed":
            "dashed",
        }],
        'kpi':
        [[{
            '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':
            '',
            'format':
            'number',
            'frequency':
            frequency
        },
          {
              'label':
              _('Percent Adhaar-seeded Beneficiaries'),
              'help_text':
              _('Percentage of ICDS beneficiaries whose Adhaar identification has been captured'
                ),
              'percent':
              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
          }],
         [{
             'label':
             _('Children (0-6 years)'),
             'help_text':
             _('Total number of children registered between the age of 0 - 6 years'
               ),
             'percent':
             percent_increase('child_health_all', data, prev_data),
             'color':
             'green'
             if percent_increase('child_health_all', data, prev_data) > 0 else
             'red',
             'value':
             get_value(data, 'child_health_all'),
             'all':
             None,
             'format':
             'number',
             'frequency':
             frequency,
         }, {
             'label':
             _('Children (0-6 years) enrolled for ICDS services'),
             'help_text':
             _(("Total number of children registered between the age of 0 - 6 years "
                "and enrolled for ICDS services")),
             'percent':
             percent_increase('child_health', data, prev_data),
             'color':
             'green' if percent_increase('child_health', data, prev_data) > 0
             else 'red',
             'value':
             get_value(data, 'child_health'),
             'all':
             None,
             'format':
             'number',
             'frequency':
             frequency
         }],
         [
             {
                 'label':
                 _('Pregnant Women'),
                 'help_text':
                 _("Total number of pregnant women registered"),
                 'percent':
                 percent_increase(
                     'ccs_pregnant_all',
                     data,
                     prev_data,
                 ),
                 'color':
                 'green'
                 if percent_increase('ccs_pregnant_all', data, prev_data) > 0
                 else 'red',
                 'value':
                 get_value(data, 'ccs_pregnant_all'),
                 'all':
                 '',
                 'format':
                 'number',
                 'frequency':
                 frequency
             },
             {
                 'label':
                 _('Pregnant Women enrolled for ICDS services'),
                 'help_text':
                 _('Total number of pregnant women registered and enrolled for ICDS services'
                   ),
                 'percent':
                 percent_increase('ccs_pregnant', data, prev_data),
                 'color':
                 'green'
                 if percent_increase('ccs_pregnant', data, prev_data) > 0 else
                 'red',
                 'value':
                 get_value(data, 'ccs_pregnant'),
                 'all':
                 None,
                 'format':
                 'number',
                 'frequency':
                 frequency
             },
         ],
         [
             {
                 'label':
                 _('Lactating Mothers'),
                 'help_text':
                 _('Total number of lactating women registered'),
                 'percent':
                 percent_increase('css_lactating_all', data, prev_data),
                 'color':
                 'green'
                 if percent_increase('css_lactating_all', data, prev_data) > 0
                 else 'red',
                 'value':
                 get_value(data, 'css_lactating_all'),
                 'all':
                 '',
                 'format':
                 'number',
                 'frequency':
                 frequency
             },
             {
                 'label':
                 _('Lactating Women enrolled for ICDS services'),
                 'help_text':
                 _('Total number of lactating women registered and enrolled for ICDS services'
                   ),
                 'percent':
                 percent_increase('css_lactating', data, prev_data),
                 'color':
                 'green'
                 if percent_increase('css_lactating', data, prev_data) > 0 else
                 'red',
                 'value':
                 get_value(data, 'css_lactating'),
                 'all':
                 None,
                 'format':
                 'number',
                 'frequency':
                 frequency
             },
         ],
         [{
             'label':
             _('Adolescent Girls (11-18 years)'),
             'help_text':
             _('Total number of adolescent girls (11 - 18 years) who are registered'
               ),
             'percent':
             percent_increase(
                 'person_adolescent_all',
                 data,
                 prev_data,
             ),
             'color':
             'green'
             if percent_increase('person_adolescent_all', data, prev_data) > 0
             else 'red',
             'value':
             get_value(data, 'person_adolescent_all'),
             'all':
             '',
             'format':
             'number',
             'frequency':
             frequency
         }, {
             'label':
             _('Adolescent Girls (11-18 years) enrolled for ICDS services'),
             'help_text':
             _(("Total number of adolescent girls (11 - 18 years) "
                "who are registered and enrolled for ICDS services")),
             'percent':
             percent_increase('person_adolescent', data, prev_data),
             'color':
             'green'
             if percent_increase('person_adolescent', data, prev_data) > 0 else
             'red',
             'value':
             get_value(data, 'person_adolescent'),
             'all':
             None,
             'format':
             'number',
             'frequency':
             frequency
         }]]
    }
예제 #4
0
def get_cas_reach_data(domain, now_date, config, show_test=False):
    now_date = datetime(*now_date)

    def get_data_for_awc_monthly(month, filters):
        level = filters['aggregation_level']
        queryset = AggAwcMonthly.objects.filter(
            month=month, **filters).values('aggregation_level').annotate(
                states=Sum('num_launched_states')
                if level <= 1 else Max('num_launched_states'),
                districts=Sum('num_launched_districts')
                if level <= 2 else Max('num_launched_districts'),
                blocks=Sum('num_launched_blocks')
                if level <= 3 else Max('num_launched_blocks'),
                sectors=Sum('num_launched_supervisors')
                if level <= 4 else Max('num_launched_supervisors'),
                awc_num_open=Sum('awc_num_open')
                if level <= 5 else Max('awc_num_open'),
                awcs=Sum('num_launched_awcs')
                if level <= 5 else Max('num_launched_awcs'),
                all_awcs=Sum('num_awcs') if level <= 5 else Max('num_awcs'))
        if not show_test:
            queryset = apply_exclude(domain, queryset)
        return queryset

    def get_data_for_daily_usage(date, filters):
        queryset = AggAwcDailyView.objects.filter(
            date=date, **filters).values('aggregation_level').annotate(
                daily_attendance=Sum('daily_attendance_open'))
        if not show_test:
            queryset = apply_exclude(domain, queryset)
        return queryset

    def get_data_for_ls_launched(month, filters):
        queryset = SystemUsageReportView.objects.filter(
            month=month, **filters).values('aggregation_level').annotate(
                ls_launched=Sum('num_supervisor_launched'))
        if not show_test:
            queryset = apply_exclude(domain, queryset)
        return queryset

    current_month = datetime(*config['month'])
    previous_month = datetime(*config['prev_month'])
    del config['month']
    del config['prev_month']

    awc_this_month_data = get_data_for_awc_monthly(current_month, config)
    awcs = get_value(awc_this_month_data, 'awcs')

    current_month_selected = (current_month.year == now_date.year
                              and current_month.month == now_date.month)

    if current_month_selected:
        date = now_date.date()
        daily_yesterday = None
        # keep the record in searched - current - month
        while daily_yesterday is None or (not daily_yesterday
                                          and date.day != 1):
            date -= relativedelta(days=1)
            daily_yesterday = get_data_for_daily_usage(date, config)
        daily_two_days_ago = None
        while daily_two_days_ago is None or (not daily_two_days_ago
                                             and date.day != 1):
            date -= relativedelta(days=1)
            daily_two_days_ago = get_data_for_daily_usage(date, config)
        daily_attendance_percent = percent_increase('daily_attendance',
                                                    daily_yesterday,
                                                    daily_two_days_ago)
        number_of_awc_open_yesterday = {
            'label':
            _('Number of AWCs Open yesterday'),
            'help_text':
            _(("Total Number of Angwanwadi Centers that were open yesterday "
               "by the AWW or the AWW helper")),
            'color':
            get_color_with_green_positive(daily_attendance_percent),
            'percent':
            daily_attendance_percent,
            'value':
            get_value(daily_yesterday, 'daily_attendance'),
            'all':
            awcs,
            'format':
            'number_and_percent',
            'frequency':
            'day',
            'redirect':
            'icds_cas_reach/awc_daily_status',
        }
    else:
        awc_prev_month_data = get_data_for_awc_monthly(previous_month, config)
        monthly_attendance_percent = percent_increase('awc_num_open',
                                                      awc_this_month_data,
                                                      awc_prev_month_data)
        number_of_awc_open_yesterday = {
            'help_text':
            _("Total Number of AWCs open for at least one day in month"),
            'label':
            _('Number of AWCs open for at least one day in month'),
            'color':
            get_color_with_green_positive(monthly_attendance_percent),
            'percent':
            monthly_attendance_percent,
            'value':
            get_value(awc_this_month_data, 'awc_num_open'),
            'all':
            awcs,
            'format':
            'number_and_percent',
            'frequency':
            'month',
        }

    awcs_launched = {
        'label': _('AWCs Launched'),
        'help_text': awcs_launched_help_text(),
        'color': None,
        'percent': None,
        'value': awcs,
        'all': None,
        'format': 'number',
        'frequency': 'month',
        'redirect': 'icds_cas_reach/awcs_covered'
    }

    sectors_covered = {
        'label': _('Sectors covered'),
        'help_text': _('Total Sectors that have launched ICDS CAS'),
        'percent': None,
        'value': get_value(awc_this_month_data, 'sectors'),
        'all': None,
        'format': 'number',
        'frequency': 'month',
    }

    blocks_covered = {
        'label': _('Blocks covered'),
        'help_text': _('Total Blocks that have launched ICDS CAS'),
        'percent': None,
        'value': get_value(awc_this_month_data, 'blocks'),
        'all': None,
        'format': 'number',
        'frequency': 'month',
    }

    districts_covered = {
        'label': _('Districts covered'),
        'help_text': _('Total Districts that have launched ICDS CAS'),
        'percent': None,
        'value': get_value(awc_this_month_data, 'districts'),
        'all': None,
        'format': 'number',
        'frequency': 'month',
    }

    states_covered = {
        'label': _('States/UTs covered'),
        'help_text': _('Total States that have launched ICDS CAS'),
        'percent': None,
        'value': get_value(awc_this_month_data, 'states'),
        'all': None,
        'format': 'number',
        'frequency': 'month',
    }

    ls_launched_data = get_data_for_ls_launched(current_month, config)
    number_of_lss_launched = {
        'label': _('LSs Launched'),
        'help_text': ls_launched_help_text(),
        'color': None,
        'percent': None,
        'value': get_value(ls_launched_data, 'ls_launched'),
        'all': None,
        'format': 'number',
        'frequency': 'month',
        'redirect': 'icds_cas_reach/ls_launched'
    }

    cas_reach_records = [[awcs_launched, number_of_awc_open_yesterday],
                         [number_of_lss_launched, sectors_covered],
                         [blocks_covered, districts_covered], [states_covered]]

    return {'records': cas_reach_records}
예제 #5
0
def get_awc_reports_pse(config, month, domain, show_test=False):
    selected_month = datetime(*month)
    last_30_days = (selected_month - relativedelta(days=30))
    last_months = (selected_month - relativedelta(months=1))
    last_three_months = (selected_month - relativedelta(months=3))
    last_day_of_selected_month = (
        selected_month + relativedelta(months=1)) - relativedelta(days=1)

    map_image_data = DailyAttendanceView.objects.filter(
        pse_date__range=(selected_month, last_day_of_selected_month),
        **config).values('awc_name', 'form_location_lat', 'form_location_long',
                         'image_name', 'doc_id',
                         'pse_date').order_by('-pse_date')

    kpi_data_tm = AggAwcMonthly.objects.filter(
        month=selected_month,
        **config).values('awc_name').annotate(days_open=Sum('awc_days_open'))
    kpi_data_lm = AggAwcMonthly.objects.filter(
        month=last_months,
        **config).values('awc_name').annotate(days_open=Sum('awc_days_open'))

    open_count_data = DailyAttendanceView.objects.filter(
        pse_date__range=(last_three_months, last_day_of_selected_month),
        **config).values('awc_name', 'pse_date').annotate(
            open_count=Sum('awc_open_count'), ).order_by('pse_date')

    daily_attendance = DailyAttendanceView.objects.filter(
        pse_date__range=(selected_month, last_day_of_selected_month),
        **config).values('awc_name', 'pse_date').annotate(
            avg_percent=Avg('attended_children_percent'),
            attended=Sum('attended_children'),
            eligible=Sum('eligible_children'))

    if not show_test:
        map_image_data = apply_exclude(domain, map_image_data)
        kpi_data_tm = apply_exclude(domain, kpi_data_tm)
        kpi_data_lm = apply_exclude(domain, kpi_data_lm)
        open_count_data = apply_exclude(domain, open_count_data)
        daily_attendance = apply_exclude(domain, daily_attendance)

    attended_children_chart = {}
    dates = [
        dt for dt in rrule(
            DAILY, dtstart=selected_month, until=last_day_of_selected_month)
    ]
    for date in dates:
        attended_children_chart[int(date.strftime("%s")) * 1000] = {
            'avg_percent': 0,
            'attended': 0,
            'eligible': 0
        }

    open_count_chart = {}
    for chart_row in open_count_data:
        first_day_of_week = chart_row['pse_date'] - timedelta(
            days=chart_row['pse_date'].isoweekday() - 1)
        pse_week = int(first_day_of_week.strftime("%s")) * 1000

        if pse_week in open_count_chart:
            open_count_chart[pse_week] += (chart_row['open_count'] or 0)
        else:
            open_count_chart[pse_week] = (chart_row['open_count'] or 0)

    for daily_attendance_row in daily_attendance:
        pse_day = int(daily_attendance_row['pse_date'].strftime("%s")) * 1000
        attended_children_chart[pse_day] = {
            'avg_percent': daily_attendance_row['avg_percent'] or 0,
            'attended': daily_attendance_row['attended'] or 0,
            'eligible': daily_attendance_row['eligible'] or 0
        }

    map_data = {}

    date_to_image_data = {}

    for map_row in map_image_data:
        lat = map_row['form_location_lat']
        long = map_row['form_location_long']
        awc_name = map_row['awc_name']
        image_name = map_row['image_name']
        doc_id = map_row['doc_id']
        pse_date = map_row['pse_date']
        if lat and long:
            key = doc_id.replace('-', '')
            map_data.update({
                key: {
                    'lat': float(lat),
                    'lng': float(long),
                    'focus': 'true',
                    'message': awc_name,
                }
            })
        if image_name:
            date_str = pse_date.strftime("%d/%m/%Y")
            date_to_image_data[date_str] = map_row

    images = []
    tmp_image = []

    for idx, date in enumerate(
            rrule(DAILY,
                  dtstart=selected_month,
                  until=last_day_of_selected_month)):
        date_str = date.strftime("%d/%m/%Y")
        image_data = date_to_image_data.get(date_str)

        if image_data:
            image_name = image_data['image_name']
            doc_id = image_data['doc_id']

            tmp_image.append({
                'id':
                idx,
                'image':
                absolute_reverse('api_form_attachment',
                                 args=(domain, doc_id, image_name)),
                'date':
                date_str
            })
        else:
            tmp_image.append({'id': idx, 'image': None, 'date': date_str})

        if (idx + 1) % 4 == 0:
            images.append(tmp_image)
            tmp_image = []

    if tmp_image:
        images.append(tmp_image)

    return {
        'kpi': [[{
            'label':
            _('AWC Days Open'),
            'help_text':
            _(("""
                        Total number of days the AWC is open in the given month.
                        The AWC is expected to be open 6 days a week (Not on Sundays and public holidays)
                        """)),
            'percent':
            percent_increase(
                'days_open',
                kpi_data_tm,
                kpi_data_lm,
            ),
            'value':
            get_value(kpi_data_tm, 'days_open'),
            'all':
            '',
            'format':
            'number',
            'frequency':
            'month',
            'color':
            'green' if percent_increase(
                'days_open',
                kpi_data_tm,
                kpi_data_lm,
            ) > 0 else 'red',
        }]],
        'charts':
        [[{
            'key':
            'AWC Days Open per week',
            'values':
            sorted([
                dict(x=x_val, y=y_val)
                for x_val, y_val in open_count_chart.iteritems()
            ],
                   key=lambda d: d['x']),
            "strokeWidth":
            2,
            "classed":
            "dashed",
            "color":
            BLUE
        }],
         [
             {
                 'key':
                 'PSE - Daily Attendance',
                 'values':
                 sorted([
                     dict(x=x_val,
                          y=y_val['avg_percent'],
                          attended=y_val['attended'],
                          eligible=y_val['eligible'])
                     for x_val, y_val in attended_children_chart.iteritems()
                 ],
                        key=lambda d: d['x']),
                 "strokeWidth":
                 2,
                 "classed":
                 "dashed",
                 "color":
                 BLUE
             },
         ]],
        'map': {
            'markers': map_data,
        },
        'images':
        images
    }
예제 #6
0
def get_cas_reach_data(domain, now_date, config, show_test=False):
    now_date = datetime(*now_date)
    yesterday_date = (now_date - relativedelta(days=1)).date()
    two_days_ago = (now_date - relativedelta(days=2)).date()

    def get_data_for_awc_monthly(month, filters):
        level = filters['aggregation_level']
        queryset = AggAwcMonthly.objects.filter(
            month=month, **filters
        ).values(
            'aggregation_level'
        ).annotate(
            states=Sum('num_launched_states') if level <= 1 else Max('num_launched_states'),
            districts=Sum('num_launched_districts') if level <= 2 else Max('num_launched_districts'),
            blocks=Sum('num_launched_blocks') if level <= 3 else Max('num_launched_blocks'),
            supervisors=Sum('num_launched_supervisors') if level <= 4 else Max('num_launched_supervisors'),
            awcs=Sum('num_launched_awcs') if level <= 5 else Max('num_launched_awcs'),
            all_awcs=Sum('num_awcs') if level <= 5 else Max('num_awcs')
        )
        if not show_test:
            queryset = apply_exclude(domain, queryset)
        return queryset

    def get_data_for_daily_usage(date, filters):
        queryset = AggAwcDailyView.objects.filter(
            date=date, **filters
        ).values(
            'aggregation_level'
        ).annotate(
            awcs=Sum('num_awcs'),
            daily_attendance=Sum('daily_attendance_open')
        )
        if not show_test:
            queryset = apply_exclude(domain, queryset)
        return queryset

    current_month = datetime(*config['month'])
    previous_month = datetime(*config['prev_month'])
    del config['month']
    del config['prev_month']

    awc_this_month_data = get_data_for_awc_monthly(current_month, config)
    awc_prev_month_data = get_data_for_awc_monthly(previous_month, config)

    daily_yesterday = get_data_for_daily_usage(yesterday_date, config)
    daily_two_days_ago = get_data_for_daily_usage(two_days_ago, config)
    if not daily_yesterday:
        daily_yesterday = daily_two_days_ago
        daily_two_days_ago = get_data_for_daily_usage((now_date - relativedelta(days=3)).date(), config)

    daily_attendance_percent = percent_increase('daily_attendance', daily_yesterday, daily_two_days_ago)

    return {
        'records': [
            [
                {
                    'label': _('AWCs Launched'),
                    'help_text': _('Total AWCs that have launched ICDS-CAS. '
                                   'AWCs are considered launched after submitting at least '
                                   'one Household Registration form. '),
                    'percent': percent_increase('awcs', awc_this_month_data, awc_prev_month_data),
                    'color': 'green' if percent_increase(
                        'awcs',
                        awc_this_month_data,
                        awc_prev_month_data) > 0 else 'red',
                    'value': get_value(awc_this_month_data, 'awcs'),
                    'all': get_value(awc_this_month_data, 'all_awcs'),
                    'format': 'div',
                    'frequency': 'month',
                    'redirect': 'awcs_covered'
                },
                {
                    'label': _('Number of AWCs Open yesterday'),
                    'help_text': _(("Total Number of Angwanwadi Centers that were open yesterday "
                                    "by the AWW or the AWW helper")),
                    'color': 'green' if daily_attendance_percent > 0 else 'red',
                    'percent': daily_attendance_percent,
                    'value': get_value(daily_yesterday, 'daily_attendance'),
                    'all': get_value(daily_yesterday, 'awcs'),
                    'format': 'div',
                    'frequency': 'day',
                    'redirect': 'awc_daily_status'
                }
            ],
            [
                {
                    'label': _('Sectors covered'),
                    'help_text': _('Total Sectors that have launched ICDS CAS'),
                    'percent': None,
                    'value': get_value(awc_this_month_data, 'supervisors'),
                    'all': None,
                    'format': 'number',
                    'frequency': 'month',
                },
                {
                    'label': _('Blocks covered'),
                    'help_text': _('Total Blocks that have launched ICDS CAS'),
                    'percent': None,
                    'value': get_value(awc_this_month_data, 'blocks'),
                    'all': None,
                    'format': 'number',
                    'frequency': 'month',
                },
            ],
            [

                {
                    'label': _('Districts covered'),
                    'help_text': _('Total Districts that have launched ICDS CAS'),
                    'percent': None,
                    'value': get_value(awc_this_month_data, 'districts'),
                    'all': None,
                    'format': 'number',
                    'frequency': 'month',
                },
                {
                    'label': _('States/UTs covered'),
                    'help_text': _('Total States that have launched ICDS CAS'),
                    'percent': None,
                    'value': get_value(awc_this_month_data, 'states'),
                    'all': None,
                    'format': 'number',
                    'frequency': 'month',
                }
            ]
        ]
    }
예제 #7
0
def get_demographics_data(domain, now_date, config, show_test=False):
    now_date = datetime(*now_date)
    yesterday_date = (now_date - relativedelta(days=1)).date()
    two_days_ago = (now_date - relativedelta(days=2)).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') +
                                   Sum('cases_person_adolescent_girls_15_18')),
                person_adolescent_all=(
                    Sum('cases_person_adolescent_girls_11_14_all') +
                    Sum('cases_person_adolescent_girls_15_18_all')),
                person_aadhaar=Sum('cases_person_has_aadhaar'),
                all_persons=Sum('cases_person_beneficiary'))

        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'] = yesterday_date
        data = get_data_for(AggAwcDailyView, config)
        config['date'] = two_days_ago
        prev_data = get_data_for(AggAwcDailyView, config)
        if not data:
            data = prev_data
            config['date'] = (now_date - relativedelta(days=3)).date()
            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':
            'registered_household'
        }, {
            'label':
            _('Percent Aadhaar-seeded Beneficiaries'),
            'help_text':
            _(('Percentage of ICDS beneficiaries whose Aadhaar identification has been captured'
               )),
            'percent':
            percent_diff('person_aadhaar', data, prev_data, 'all_persons'),
            'color':
            'green' if percent_increase('person_aadhaar', data, prev_data) > 0
            else 'red',
            'value':
            get_value(data, 'person_aadhaar'),
            'all':
            get_value(data, 'all_persons'),
            'format':
            'percent_and_div',
            'frequency':
            frequency,
            'redirect':
            'adhaar'
        }],
         [{
             'label':
             _('Percent children (0-6 years) enrolled for ICDS services'),
             'help_text':
             _('Percentage of children registered between '
               '0-6 years old who are enrolled for ICDS services'),
             'percent':
             percent_diff('child_health', data, prev_data, 'child_health_all'),
             'color':
             'green' if percent_diff('child_health_all', 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':
             'enrolled_children'
         }, {
             'label':
             _('Percent pregnant women enrolled for ICDS services'),
             'help_text':
             _('Percentage of pregnant women registered who are enrolled for ICDS services'
               ),
             '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':
             'enrolled_women'
         }],
         [{
             'label':
             _('Percent lactating women enrolled for ICDS services'),
             'help_text':
             _('Percentage of lactating women registered who are enrolled for ICDS services'
               ),
             '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':
             'lactating_enrolled_women'
         }, {
             'label':
             _('Percent adolescent girls (11-18 years) enrolled for ICDS services'
               ),
             'help_text':
             _(("Percentage of adolescent girls registered between 11-18 years"
                " old who are enrolled for ICDS services")),
             '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':
             'adolescent_girls'
         }]]
    }
예제 #8
0
def get_demographics_data(domain, yesterday, config, show_test=False):
    yesterday_date = datetime(*yesterday)
    two_days_ago = (yesterday_date - relativedelta(days=1)).date()

    def get_data_for(date, filters):
        queryset = AggAwcDailyView.objects.filter(
            date=date, **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_18'),
                person_adolescent_all=Sum(
                    'cases_person_adolescent_girls_11_18_all'),
                person_aadhaar=Sum('cases_person_has_aadhaar'),
                all_persons=Sum('cases_person'))

        if not show_test:
            queryset = apply_exclude(domain, queryset)
        return queryset

    yesterday_data = get_data_for(yesterday_date, config)
    two_days_ago_data = get_data_for(two_days_ago, config)

    return {
        'records':
        [[{
            'label':
            _('Registered Households'),
            'help_text':
            _('Total number of households registered'),
            'percent':
            percent_increase('household', yesterday_data, two_days_ago_data),
            'color':
            'green' if percent_increase('household', yesterday_data,
                                        two_days_ago_data) > 0 else 'red',
            'value':
            get_value(yesterday_data, 'household'),
            'all':
            None,
            'format':
            'number',
            'frequency':
            'day',
            'redirect':
            'registered_household'
        }, {
            'label':
            _('Children (0-6 years)'),
            'help_text':
            _('Total number of children registered between the age of 0 - 6 years'
              ),
            'percent':
            percent_increase('child_health_all', yesterday_data,
                             two_days_ago_data),
            'color':
            'green' if percent_increase('child_health_all', yesterday_data,
                                        two_days_ago_data) > 0 else 'red',
            'value':
            get_value(yesterday_data, 'child_health_all'),
            'all':
            None,
            'format':
            'number',
            'frequency':
            'day',
            'redirect':
            'enrolled_children'
        }],
         [{
             'label':
             _('Children (0-6 years) enrolled for ICDS services'),
             'help_text':
             _(("Total number of children registered between the age of 0 - 6 years "
                "and enrolled for ICDS services")),
             'percent':
             percent_increase('child_health', yesterday_data,
                              two_days_ago_data),
             'color':
             'green' if percent_increase('child_health', yesterday_data,
                                         two_days_ago_data) > 0 else 'red',
             'value':
             get_value(yesterday_data, 'child_health'),
             'all':
             None,
             'format':
             'number',
             'frequency':
             'day'
         }, {
             'label':
             _('Pregnant Women'),
             'help_text':
             _('Total number of pregnant women registered'),
             'percent':
             percent_increase('ccs_pregnant_all', yesterday_data,
                              two_days_ago_data),
             'color':
             'green' if percent_increase('ccs_pregnant_all', yesterday_data,
                                         two_days_ago_data) > 0 else 'red',
             'value':
             get_value(yesterday_data, 'ccs_pregnant_all'),
             'all':
             None,
             'format':
             'number',
             'frequency':
             'day',
             'redirect':
             'enrolled_women'
         }],
         [{
             'label':
             _('Pregnant Women enrolled for ICDS services'),
             'help_text':
             _('Total number of pregnant women registered and enrolled for ICDS services'
               ),
             'percent':
             percent_increase('ccs_pregnant', yesterday_data,
                              two_days_ago_data),
             'color':
             'green' if percent_increase('ccs_pregnant', yesterday_data,
                                         two_days_ago_data) > 0 else 'red',
             'value':
             get_value(yesterday_data, 'ccs_pregnant'),
             'all':
             None,
             'format':
             'number',
             'frequency':
             'day'
         }, {
             'label':
             _('Lactating Women'),
             'help_text':
             _('Total number of lactating women registered'),
             'percent':
             percent_increase('css_lactating_all', yesterday_data,
                              two_days_ago_data),
             'color':
             'green' if percent_increase('css_lactating_all', yesterday_data,
                                         two_days_ago_data) > 0 else 'red',
             'value':
             get_value(yesterday_data, 'css_lactating_all'),
             'all':
             None,
             'format':
             'number',
             'frequency':
             'day',
             'redirect':
             'lactating_enrolled_women'
         }],
         [{
             'label':
             _('Lactating Women enrolled for ICDS services'),
             'help_text':
             _('Total number of lactating women registered and enrolled for ICDS services'
               ),
             'percent':
             percent_increase('css_lactating', yesterday_data,
                              two_days_ago_data),
             'color':
             'green' if percent_increase('css_lactating', yesterday_data,
                                         two_days_ago_data) > 0 else 'red',
             'value':
             get_value(yesterday_data, 'css_lactating'),
             'all':
             None,
             'format':
             'number',
             'frequency':
             'day'
         }, {
             'label':
             _('Adolescent Girls (11-18 years)'),
             'help_text':
             _('Total number of adolescent girls (11 - 18 years) who are registered'
               ),
             'percent':
             percent_increase('person_adolescent_all', yesterday_data,
                              two_days_ago_data),
             'color':
             'green'
             if percent_increase('person_adolescent_all', yesterday_data,
                                 two_days_ago_data) > 0 else 'red',
             'value':
             get_value(yesterday_data, 'person_adolescent_all'),
             'all':
             None,
             'format':
             'number',
             'redirect':
             'adolescent_girls'
         }],
         [{
             'label':
             _('Adolescent Girls (11-18 years) enrolled for ICDS services'),
             'help_text':
             _(("Total number of adolescent girls (11 - 18 years) "
                "who are registered and enrolled for ICDS services")),
             'percent':
             percent_increase('person_adolescent', yesterday_data,
                              two_days_ago_data),
             'color':
             'green' if percent_increase('person_adolescent', yesterday_data,
                                         two_days_ago_data) > 0 else 'red',
             'value':
             get_value(yesterday_data, 'person_adolescent'),
             'all':
             None,
             'format':
             'number',
             'frequency':
             'day'
         }, {
             'label':
             _('Percent Adhaar Seeded Individuals'),
             'help_text':
             _(('Percentage of ICDS beneficiaries whose Adhaar identification has been captured'
                )),
             'percent':
             percent_diff('person_aadhaar', yesterday_data, two_days_ago_data,
                          'all_persons'),
             'color':
             'green' if percent_increase('person_aadhaar', yesterday_data,
                                         two_days_ago_data) > 0 else 'red',
             'value':
             get_value(yesterday_data, 'person_aadhaar'),
             'all':
             get_value(yesterday_data, 'all_persons'),
             'format':
             'percent_and_div',
             'frequency':
             'day',
             'redirect':
             'adhaar'
         }]]
    }
예제 #9
0
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'
                }
            ]
        ]
    }
예제 #10
0
def get_awc_report_demographics(domain,
                                config,
                                now_date,
                                month,
                                show_test=False,
                                beta=False):
    selected_month = datetime(*month)
    now_date = datetime(*now_date)
    chart = AggChildHealthMonthly.objects.filter(
        month=selected_month,
        **config).values('age_tranche', 'aggregation_level').annotate(
            valid=Sum('valid_in_month')).order_by('age_tranche')

    if not show_test:
        chart = apply_exclude(domain, chart)

    chart_data = OrderedDict()
    chart_data.update({'0-1 month': 0})
    chart_data.update({'1-6 months': 0})
    chart_data.update({'6-12 months': 0})
    chart_data.update({'1-3 years': 0})
    chart_data.update({'3-6 years': 0})

    for chart_row in chart:
        if chart_row['age_tranche']:
            age = int(chart_row['age_tranche'])
            valid = chart_row['valid']
            chart_data[match_age(age)] += valid

    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

    yesterday = now_date - relativedelta(days=1)
    two_days_ago = yesterday - relativedelta(days=1)
    previous_month = selected_month - relativedelta(months=1)
    if selected_month.month == now_date.month and selected_month.year == now_date.year:
        config['date'] = yesterday
        data = get_data_for(AggAwcDailyView, config)
        config['date'] = two_days_ago
        prev_data = get_data_for(AggAwcDailyView, config)
        if not data:
            data = prev_data
            config['date'] = (two_days_ago - relativedelta(days=1)).date()
            prev_data = get_data_for(AggAwcDailyView, config)
        frequency = 'day'
    else:
        config['month'] = selected_month
        data = get_data_for(AggAwcMonthly, config)
        config['month'] = previous_month
        prev_data = get_data_for(AggAwcMonthly, config)
        frequency = 'month'

    return {
        'chart': [{
            'key':
            'Children (0-6 years)',
            'values':
            [[key, value] for key, value in six.iteritems(chart_data)],
            "classed":
            "dashed",
        }],
        'kpi':
        [[{
            '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':
            '',
            'format':
            'number',
            'frequency':
            frequency
        },
          {
              'label':
              _('Percent Aadhaar-seeded Beneficiaries'),
              'help_text':
              _('Of the total number of ICDS beneficiaries, the percentage whose Adhaar identification '
                'has been captured. '),
              '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
          }],
         [{
             'label':
             _('Percent children (0-6 years) enrolled for Anganwadi Services'),
             'help_text':
             _('Of the total number of children between 0-6 years, the percentage '
               'of children who are enrolled for Anganwadi Services'),
             'percent':
             percent_diff('child_health', data, prev_data, 'child_health_all'),
             'color':
             'green' if percent_diff('child_health_all', 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,
         }, {
             'label':
             _('Percent pregnant women enrolled for Anganwadi Services'),
             'help_text':
             _('Of the total number of pregnant women, the percentage of pregnant '
               'women enrolled for Anganwadi Services'),
             '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
         }],
         [{
             'label':
             _('Percent lactating women enrolled for Anganwadi Services'),
             'help_text':
             _('Of the total number of lactating women, the percentage of '
               'lactating women enrolled for Anganwadi Services'),
             '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
         }, {
             'label':
             _('Percent adolescent girls (11-14 years) enrolled for Anganwadi Services'
               ),
             'help_text':
             _(("Of the total number of adolescent girls (aged 11-14 years), the percentage "
                "of girls enrolled for Anganwadi Services")),
             '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
         }]]
    }
예제 #11
0
def get_cas_reach_data(domain, now_date, config, show_test=False):
    now_date = datetime(*now_date)

    def get_data_for_awc_monthly(month, filters):
        level = filters['aggregation_level']
        queryset = AggAwcMonthly.objects.filter(
            month=month, **filters
        ).values(
            'aggregation_level'
        ).annotate(
            states=Sum('num_launched_states') if level <= 1 else Max('num_launched_states'),
            districts=Sum('num_launched_districts') if level <= 2 else Max('num_launched_districts'),
            blocks=Sum('num_launched_blocks') if level <= 3 else Max('num_launched_blocks'),
            supervisors=Sum('num_launched_supervisors') if level <= 4 else Max('num_launched_supervisors'),
            awc_num_open=Sum('awc_num_open') if level <= 5 else Max('awc_num_open'),
            awcs=Sum('num_launched_awcs') if level <= 5 else Max('num_launched_awcs'),
            all_awcs=Sum('num_awcs') if level <= 5 else Max('num_awcs')
        )
        if not show_test:
            queryset = apply_exclude(domain, queryset)
        return queryset

    def get_data_for_daily_usage(date, filters):
        queryset = AggAwcDailyView.objects.filter(
            date=date, **filters
        ).values(
            'aggregation_level'
        ).annotate(
            awcs=Sum('num_launched_awcs'),
            daily_attendance=Sum('daily_attendance_open')
        )
        if not show_test:
            queryset = apply_exclude(domain, queryset)
        return queryset

    current_month = datetime(*config['month'])
    previous_month = datetime(*config['prev_month'])
    del config['month']
    del config['prev_month']

    awc_this_month_data = get_data_for_awc_monthly(current_month, config)
    awc_prev_month_data = get_data_for_awc_monthly(previous_month, config)

    current_month_selected = (current_month.year == now_date.year and current_month.month == now_date.month)

    if current_month_selected:
        date = now_date.date()
        daily_yesterday = None
        # keep the record in searched - current - month
        while daily_yesterday is None or (not daily_yesterday and date.day != 1):
            date -= relativedelta(days=1)
            daily_yesterday = get_data_for_daily_usage(date, config)
        daily_two_days_ago = None
        while daily_two_days_ago is None or (not daily_two_days_ago and date.day != 1):
            date -= relativedelta(days=1)
            daily_two_days_ago = get_data_for_daily_usage(date, config)
        daily_attendance_percent = percent_increase('daily_attendance', daily_yesterday, daily_two_days_ago)
        number_of_awc_open_yesterday = {
            'label': _('Number of AWCs Open yesterday'),
            'help_text': _(("Total Number of Angwanwadi Centers that were open yesterday "
                            "by the AWW or the AWW helper")),
            'color': get_color_with_green_positive(daily_attendance_percent),
            'percent': daily_attendance_percent,
            'value': get_value(daily_yesterday, 'daily_attendance'),
            'all': get_value(daily_yesterday, 'awcs'),
            'format': 'div',
            'frequency': 'day',
            'redirect': 'icds_cas_reach/awc_daily_status',
        }
    else:
        monthly_attendance_percent = percent_increase('awc_num_open', awc_this_month_data, awc_prev_month_data)
        number_of_awc_open_yesterday = {
            'help_text': _("Total Number of AWCs open for at least one day in month"),
            'label': _('Number of AWCs open for at least one day in month'),
            'color': get_color_with_green_positive(monthly_attendance_percent),
            'percent': monthly_attendance_percent,
            'value': get_value(awc_this_month_data, 'awc_num_open'),
            'all': get_value(awc_this_month_data, 'awcs'),
            'format': 'div',
            'frequency': 'month',
        }

    return {
        'records': [
            [
                {
                    'label': _('AWCs Launched'),
                    'help_text': awcs_launched_help_text(),
                    'color': None,
                    'percent': None,
                    'value': get_value(daily_yesterday if current_month_selected else awc_this_month_data, 'awcs'),
                    'all': None,
                    'format': 'number',
                    'frequency': 'month',
                    'redirect': 'icds_cas_reach/awcs_covered'
                },
                number_of_awc_open_yesterday
            ],
            [
                {
                    'label': _('Sectors covered'),
                    'help_text': _('Total Sectors that have launched ICDS CAS'),
                    'percent': None,
                    'value': get_value(awc_this_month_data, 'supervisors'),
                    'all': None,
                    'format': 'number',
                    'frequency': 'month',
                },
                {
                    'label': _('Blocks covered'),
                    'help_text': _('Total Blocks that have launched ICDS CAS'),
                    'percent': None,
                    'value': get_value(awc_this_month_data, 'blocks'),
                    'all': None,
                    'format': 'number',
                    'frequency': 'month',
                },
            ],
            [

                {
                    'label': _('Districts covered'),
                    'help_text': _('Total Districts that have launched ICDS CAS'),
                    'percent': None,
                    'value': get_value(awc_this_month_data, 'districts'),
                    'all': None,
                    'format': 'number',
                    'frequency': 'month',
                },
                {
                    'label': _('States/UTs covered'),
                    'help_text': _('Total States that have launched ICDS CAS'),
                    'percent': None,
                    'value': get_value(awc_this_month_data, 'states'),
                    'all': None,
                    'format': 'number',
                    'frequency': 'month',
                }
            ]
        ]
    }
예제 #12
0
def get_system_usage_data(yesterday, config):
    yesterday_date = datetime(*yesterday)
    two_days_ago = (yesterday_date - relativedelta(days=1)).date()

    def get_data_for(date, filters):
        return AggAwcDailyView.objects.filter(
            date=date, **filters).values('aggregation_level').annotate(
                awcs=Sum('awc_count'),
                daily_attendance=Sum('daily_attendance_open'),
                num_forms=Sum('usage_num_forms'),
                num_home_visits=Sum('usage_num_home_visit'),
                num_gmp=Sum('usage_num_gmp'),
                num_thr=Sum('usage_num_thr'))

    yesterday_data = get_data_for(yesterday_date, config)
    two_days_ago_data = get_data_for(two_days_ago, config)

    return {
        'records':
        [[{
            'label':
            _('Average number of household registration forms submitted yesterday'
              ),
            'help_text':
            _('Average number of household registration forms submitted by AWWs yesterday.'
              ),
            'percent':
            percent_increase('num_forms', yesterday_data, two_days_ago_data),
            'value':
            get_value(yesterday_data, 'num_forms'),
            'all':
            get_value(yesterday_data, 'awcs'),
            'format':
            'number'
        }],
         [{
             'label':
             _('Average number of Home Visit forms submitted yesterday'),
             'help_text':
             _(("Average number of home visit forms submitted yesterday. Home visit forms are "
                "Birth Preparedness, Delivery, Post Natal Care, Exclusive breastfeeding and "
                "Complementary feeding")),
             'percent':
             percent_increase('num_home_visits', yesterday_data,
                              two_days_ago_data),
             'value':
             get_value(yesterday_data, 'num_home_visits'),
             'all':
             get_value(yesterday_data, 'awcs'),
             'format':
             'number'
         }, {
             'label':
             _('Average number of Growth Monitoring forms submitted yesterday'
               ),
             'help_text':
             _('Average number of growth monitoring forms (GMP) submitted yesterday'
               ),
             'percent':
             percent_increase('num_gmp', yesterday_data, two_days_ago_data),
             'value':
             get_value(yesterday_data, 'num_gmp'),
             'all':
             get_value(yesterday_data, 'awcs'),
             'format':
             'number'
         }],
         [{
             'label':
             _('Average number of Take Home Ration forms submitted yesterday'),
             'help_text':
             _('Average number of Take Home Rations (THR) forms submitted yesterday'
               ),
             'percent':
             percent_increase('num_thr', yesterday_data, two_days_ago_data),
             'value':
             get_value(yesterday_data, 'num_thr'),
             'all':
             get_value(yesterday_data, 'awcs'),
             'format':
             'number'
         }]]
    }