예제 #1
0
 def rows(self):
     appointments_sent = self.unique('case_data')
     appointments_confirmed = self.unique('case_data', check_response_state=True)
     reminders_sent = self.unique('session_data')
     reminders_confirmed = self.unique('session_data', check_response_state=True)
     return [[
         appointments_sent,
         div(appointments_confirmed, appointments_sent, percent=True),
         div(reminders_confirmed, reminders_sent, percent=True),
         div(reminders_sent, appointments_sent),
         div(reminders_confirmed, appointments_sent),
     ]]
예제 #2
0
 def percent_over_time(self, field_name):
     values = []
     start, end = self.datespan.startdate_utc, self.datespan.enddate_utc
     while start <= end:
         base_query = self.gen_base_query(start)
         num = self.unique(field_name, True, base_query=base_query)
         denom = self.unique(field_name, base_query=base_query)
         values.append({
             "x": int(unix_time_millis(start)),
             "y": float(div(num, denom)) * 100,
         })
         start += timedelta(days=1)
     return values
예제 #3
0
    def rows(self):
        def row(header, mw_val, case_val):
            return [_(header), mw_val, case_val, mw_val + case_val]

        def verified_numbered_users(owner_type, ids=None, check_filters=False):
            if not ids and not check_filters:
                data = get_db().view('sms/verified_number_by_domain',
                    reduce=True,
                    startkey=[self.domain, owner_type],
                    endkey=[self.domain, owner_type, {}],
                ).one()
                return data["value"]
            else:
                owners = get_db().view('sms/verified_number_by_domain',
                    reduce=False,
                    startkey=[self.domain, owner_type],
                    endkey=[self.domain, owner_type, {}],
                ).all()
                return len(filter(lambda oid: oid in ids, [o["key"][2] for o in owners]))

        owner_ids = self.combined_user_ids if self.users_by_group else []
        case_ids = self.cases_by_case_group if self.cases_by_case_group else []

        check_filters = True if owner_ids or case_ids else False
        number = row("Number", verified_numbered_users("CommCareUser", owner_ids, check_filters=check_filters),
                     verified_numbered_users("CommCareCase", case_ids, check_filters=check_filters))

        def get_actives(recipient_type):
            return len(self.active_query(recipient_type)['facets']['couch_recipient']['terms'])

        active = row(_("Number Active"), get_actives("commcareuser"), get_actives("commcarecase"))

        perc_active = [_("% Active"),
                       div(active[1], number[1], True), div(active[2], number[2], True), div(active[3], number[3], True)]

        facets = self.messages_query()['facets']
        to_users, to_cases = 0, 0
        for term in facets['couch_recipient_doc_type']['terms']:
            if term['term'] == 'commcarecase':
                to_cases = term['count']
            elif term['term'] == 'commcareuser':
                to_users = term['count']
        messages = row(_("Number of SMS Messages, incoming and outgoing"), to_users, to_cases)

        avg_per_user = [_("Avg SMS Messages per User"),
                        div(messages[1], number[1]), div(messages[2], number[2]), div(messages[3], number[3])]
        avg_per_act_user = [_("Avg SMS Messages per Active User"),
                            div(messages[1], active[1]), div(messages[2], active[2]), div(messages[3], active[3])]

        return [number, active, perc_active, messages, avg_per_user, avg_per_act_user]