def shared_pagination_GET_params(self): user_data = DCTLToFIDAFilter.get_user_data(self.request_params, domain=self.domain) self.override_user_ids = user_data['leaf_user_ids'] params = super(CaseReport, self).shared_pagination_GET_params slugs = [ AllocatedToFilter.slug, 'hsph_region', 'hsph_district', 'hsph_site', 'startdate', 'enddate' ] for slug in slugs: params.append({ 'name': slug, 'value': self.request_params.get(slug, '') }) return params
def rows(self): user_data = DCTLToFIDAFilter.get_user_data( self.request_params, domain=self.domain) self.override_user_ids = user_data['leaf_user_ids'] db = get_db() site_map = self.selected_site_map or self.site_map # hack facilities = IHForCHFField.get_selected_facilities( site_map, domain=self.domain) facilities = facilities['ihf'] + facilities['chf'] rows = [] for user in self.users: for site_id in facilities: key = [self.domain, user.get('user_id'), site_id] data = db.view('hsph/facility_registrations', startkey=key + [self.datespan.startdate_param_utc], endkey=key + [self.datespan.enddate_param_utc], reduce=True, wrapper=lambda r: r['value'] ).first() if data: dctl = user_data['user_parent_map'][user['user_id']] rows.append([ self.facility_name_map[site_id], self.table_cell( user.get('raw_username'), user.get('username_in_report')), self.table_cell( dctl.raw_username, dctl.username_in_report), numeric_cell(data.get('facilityVisits', 0)), numeric_cell(data.get('birthRegistrations', 0)), numeric_cell(data.get('noPhoneDetails', 0)), numeric_cell(data.get('noAddress', 0)), numeric_cell(data.get('noContactInfo', 0)), ]) return rows
def shared_pagination_GET_params(self): user_data = DCTLToFIDAFilter.get_user_data( self.request_params, domain=self.domain) self.override_user_ids = user_data['leaf_user_ids'] params = super(CaseReport, self).shared_pagination_GET_params slugs = [ AllocatedToFilter.slug, 'hsph_region', 'hsph_district', 'hsph_site', 'startdate', 'enddate' ] for slug in slugs: params.append({ 'name': slug, 'value': self.request_params.get(slug, '') }) return params
def rows(self): user_data = DCTLToFIDAFilter.get_user_data(self.request_params, domain=self.domain) self.override_user_ids = user_data['leaf_user_ids'] user_site_map = get_user_site_map(self.domain) # ordered keys with default values keys = SortedDict([('fidaName', None), ('teamLeaderName', None), ('facilitiesCovered', 0), ('facilityVisits', 0), ('facilitiesVisitedLessThanTwicePerWeek', None), ('avgBirthRegistrationTime', None), ('birthRegistrationsPerVisit', None), ('noPhoneDetails', 0), ('noAddress', 0), ('noContactInfo', 0), ('homeVisitsAssigned', 0), ('homeVisitsCompleted', 0), ('homeVisitsCompletedPerDay', 0), ('homeVisitsOpenAt30Days', 0)]) rows = [] db = get_db() startdate = self.datespan.startdate_param_utc[:10] enddate = self.datespan.enddate_param_utc[:10] to_date = lambda string: datetime.datetime.strptime( string, "%Y-%m-%d").date() weeks = (to_date(enddate) - to_date(startdate)).days // 7 for user in self.users: user_id = user.user_id row = db.view('hsph/fida_performance', startkey=["all", self.domain, user_id, startdate], endkey=["all", self.domain, user_id, enddate], reduce=True, wrapper=lambda r: r['value']).first() or {} workingDays = db.view( 'hsph/fida_performance', startkey=["workingDays", self.domain, user_id, startdate], endkey=["workingDays", self.domain, user_id, enddate], reduce=False, wrapper=lambda r: r['value']['workingDay']).all() workingDays = set(workingDays) row['fidaName'] = self.table_cell(user.raw_username, user.username_in_report) dctl = user_data['user_parent_map'][user['user_id']] row['teamLeaderName'] = self.table_cell(dctl.raw_username, dctl.username_in_report) row['facilitiesCovered'] = len(user_site_map[user_id]) row['facilitiesVisitedLessThanTwicePerWeek'] = len( filter(lambda count: count < weeks * 2, [ row.get(site_id + 'Visits', 0) for site_id in user_site_map[user_id] ])) if row.get('avgBirthRegistrationTime'): row['avgBirthRegistrationTime'] = time.strftime( '%M:%S', time.gmtime(row['avgBirthRegistrationTime'])) else: row['avgBirthRegistrationTime'] = None if workingDays: row['homeVisitsCompletedPerDay'] = round( row.get('homeVisitsCompleted', 0) / float(len(workingDays)), 1) else: row['homeVisitsCompletedPerDay'] = 0.0 # These queries can fail if startdate is less than N days before # enddate. We just catch and supply a default value. try: row['homeVisitsAssigned'] = db.view( 'hsph/fida_performance', startkey=['assigned', self.domain, user_id, startdate], endkey=[ 'assigned', self.domain, user_id, datestring_minus_days(enddate, 21) ], reduce=True, wrapper=lambda r: r['value']['homeVisitsAssigned']).first( ) except restkit.errors.RequestFailed: row['homeVisitsAssigned'] = 0 try: row['homeVisitsOpenAt30Days'] = db.view( 'hsph/fida_performance', startkey=['open30Days', self.domain, user_id, startdate], endkey=[ 'open30Days', self.domain, user_id, datestring_minus_days(enddate, 29) ], reduce=True, wrapper=lambda r: r['value']['homeVisitsOpenAt30Days' ]).first() except restkit.errors.RequestFailed: row['homeVisitsOpenAt30Days'] = 0 list_row = [] for k, v in keys.items(): val = row.get(k, v) if val is None: val = '---' list_row.append(numeric_cell(val)) rows.append(list_row) return rows
def rows(self): user_data = DCTLToFIDAFilter.get_user_data(self.request_params, domain=self.domain) self.override_user_ids = user_data['leaf_user_ids'] startdate = self.datespan.startdate_param_utc[:10] enddate = self.datespan.enddate_param_utc[:10] all_keys = get_db().view('hsph/facility_wise_follow_up', reduce=True, group=True, group_level=5) rpt_keys = [] key_start = [] if not self.selected_site_map: self._selected_site_map = self.site_map facility_map = get_facility_map(self.domain) # make sure key elements are strings report_sites = [[str(item) for item in rk] for rk in self.generate_keys()] for entry in all_keys: if entry['key'][0:3] in report_sites: if self.individual: if entry['key'][-1] == self.individual: rpt_keys.append(entry) elif self.user_ids: if entry['key'][-1] in self.user_ids: rpt_keys.append(entry) else: rpt_keys = all_keys def get_view_results(case_type, start_dte, end_dte): my_start_key = key_start + [case_type] + [start_dte] if not start_dte: my_start_key = key_start + [case_type] data = get_db().view('hsph/facility_wise_follow_up', reduce=True, startkey=my_start_key, endkey=key_start + [case_type] + [end_dte]) return sum([item['value'] for item in data]) rows = [] today = date.today() for item in rpt_keys: key_start = item['key'] region_id, district_id, site_number, site_id, user_id = item['key'] region_name = self.get_region_name(region_id) district_name = self.get_district_name(region_id, district_id) site_name = facility_map.get(site_id, site_id) fida = self.usernames.get(user_id, "") births = get_view_results('births', startdate, enddate) open_cases = get_view_results('open_cases', startdate, enddate) # Not closed and If today < date_admission + 8 start = today - timedelta(days=7) not_yet_open_for_follow_up = get_view_results( 'needing_follow_up', start.strftime('%Y-%m-%d'), today.strftime('%Y-%m-%d')) # Not closed and if (date_admission + 8) <= today <= (date_admission + 21) start = today - timedelta(days=21) end = today - timedelta(days=8) open_for_cati_follow_up = get_view_results( 'needing_follow_up', start.strftime('%Y-%m-%d'), end.strftime('%Y-%m-%d')) # Not closed and today > date_admission+21 end = today - timedelta(days=22) open_for_fada_follow_up = get_view_results( 'needing_follow_up', "", end.strftime('%Y-%m-%d')) closed_cases = get_view_results('closed_cases', startdate, enddate) lost_to_follow_up = get_view_results('lost_to_follow_up', startdate, enddate) followed_up_by_call_center = get_view_results( 'followed_up_by_call_center', startdate, enddate) followed_up_by_field = get_view_results('followed_up_by_field', startdate, enddate) rows.append([ region_name, district_name, site_name, fida, births, open_cases, not_yet_open_for_follow_up, open_for_cati_follow_up, open_for_fada_follow_up, closed_cases, followed_up_by_call_center, followed_up_by_field, lost_to_follow_up ]) return rows
def rows(self): user_data = DCTLToFIDAFilter.get_user_data( self.request_params, domain=self.domain) self.override_user_ids = user_data['leaf_user_ids'] user_site_map = get_user_site_map(self.domain) # ordered keys with default values keys = SortedDict([ ('fidaName', None), ('teamLeaderName', None), ('facilitiesCovered', 0), ('facilityVisits', 0), ('facilitiesVisitedLessThanTwicePerWeek', None), ('avgBirthRegistrationTime', None), ('birthRegistrationsPerVisit', None), ('noPhoneDetails', 0), ('noAddress', 0), ('noContactInfo', 0), ('homeVisitsAssigned', 0), ('homeVisitsCompleted', 0), ('homeVisitsCompletedPerDay', 0), ('homeVisitsOpenAt30Days', 0) ]) rows = [] db = get_db() startdate = self.datespan.startdate_param_utc[:10] enddate = self.datespan.enddate_param_utc[:10] to_date = lambda string: datetime.datetime.strptime( string, "%Y-%m-%d").date() weeks = (to_date(enddate) - to_date(startdate)).days // 7 for user in self.users: user_id = user.get('user_id') row = db.view('hsph/fida_performance', startkey=["all", self.domain, user_id, startdate], endkey=["all", self.domain, user_id, enddate], reduce=True, wrapper=lambda r: r['value'] ).first() or {} workingDays = db.view('hsph/fida_performance', startkey=["workingDays", self.domain, user_id, startdate], endkey=["workingDays", self.domain, user_id, enddate], reduce=False, wrapper=lambda r: r['value']['workingDay']).all() workingDays = set(workingDays) row['fidaName'] = self.table_cell( user.get('raw_username'), user.get('username_in_report')) dctl = user_data['user_parent_map'][user['user_id']] row['teamLeaderName'] = self.table_cell( dctl.raw_username, dctl.username_in_report) row['facilitiesCovered'] = len(user_site_map[user_id]) row['facilitiesVisitedLessThanTwicePerWeek'] = len( filter( lambda count: count < weeks * 2, [row.get(site_id + 'Visits', 0) for site_id in user_site_map[user_id]] ) ) if row.get('avgBirthRegistrationTime'): row['avgBirthRegistrationTime'] = time.strftime( '%M:%S', time.gmtime(row['avgBirthRegistrationTime'])) else: row['avgBirthRegistrationTime'] = None if workingDays: row['homeVisitsCompletedPerDay'] = round( row.get('homeVisitsCompleted', 0) / float(len(workingDays)), 1) else: row['homeVisitsCompletedPerDay'] = 0.0 # These queries can fail if startdate is less than N days before # enddate. We just catch and supply a default value. try: row['homeVisitsAssigned'] = db.view('hsph/fida_performance', startkey=['assigned', self.domain, user_id, startdate], endkey=['assigned', self.domain, user_id, datestring_minus_days(enddate, 21)], reduce=True, wrapper=lambda r: r['value']['homeVisitsAssigned'] ).first() except restkit.errors.RequestFailed: row['homeVisitsAssigned'] = 0 try: row['homeVisitsOpenAt30Days'] = db.view('hsph/fida_performance', startkey=['open30Days', self.domain, user_id, startdate], endkey=['open30Days', self.domain, user_id, datestring_minus_days(enddate, 29)], reduce=True, wrapper=lambda r: r['value']['homeVisitsOpenAt30Days'] ).first() except restkit.errors.RequestFailed: row['homeVisitsOpenAt30Days'] = 0 list_row = [] for k, v in keys.items(): val = row.get(k, v) if val is None: val = '---' list_row.append(numeric_cell(val)) rows.append(list_row) return rows
def rows(self): user_data = DCTLToFIDAFilter.get_user_data( self.request_params, domain=self.domain) self.override_user_ids = user_data['leaf_user_ids'] startdate = self.datespan.startdate_param_utc[:10] enddate = self.datespan.enddate_param_utc[:10] all_keys = get_db().view('hsph/facility_wise_follow_up', reduce=True, group=True, group_level=5) rpt_keys = [] key_start = [] if not self.selected_site_map: self._selected_site_map = self.site_map facility_map = get_facility_map(self.domain) # make sure key elements are strings report_sites = [[str(item) for item in rk] for rk in self.generate_keys()] for entry in all_keys: if entry['key'][0:3] in report_sites: if self.individual: if entry['key'][-1] == self.individual: rpt_keys.append(entry) elif self.user_ids: if entry['key'][-1] in self.user_ids: rpt_keys.append(entry) else: rpt_keys = all_keys def get_view_results(case_type, start_dte, end_dte): my_start_key=key_start + [case_type] + [start_dte] if not start_dte: my_start_key = key_start + [case_type] data = get_db().view('hsph/facility_wise_follow_up', reduce=True, startkey=my_start_key, endkey=key_start + [case_type] + [end_dte] ) return sum([ item['value'] for item in data]) rows = [] today = date.today() for item in rpt_keys: key_start = item['key'] region_id, district_id, site_number, site_id, user_id = item['key'] region_name = self.get_region_name(region_id) district_name = self.get_district_name(region_id, district_id) site_name = facility_map.get(site_id, site_id) fida = self.usernames.get(user_id, "") births = get_view_results('births', startdate, enddate) open_cases = get_view_results('open_cases', startdate, enddate) # Not closed and If today < date_admission + 8 start = today - timedelta(days=7) not_yet_open_for_follow_up = get_view_results('needing_follow_up', start.strftime('%Y-%m-%d'), today.strftime('%Y-%m-%d')) # Not closed and if (date_admission + 8) <= today <= (date_admission + 21) start = today - timedelta(days=21) end = today - timedelta(days=8) open_for_cati_follow_up = get_view_results('needing_follow_up', start.strftime('%Y-%m-%d'), end.strftime('%Y-%m-%d')) # Not closed and today > date_admission+21 end = today - timedelta(days = 22) open_for_fada_follow_up = get_view_results('needing_follow_up', "", end.strftime('%Y-%m-%d')) closed_cases = get_view_results('closed_cases', startdate, enddate) lost_to_follow_up = get_view_results('lost_to_follow_up', startdate, enddate) followed_up_by_call_center = get_view_results( 'followed_up_by_call_center', startdate, enddate) followed_up_by_field = get_view_results('followed_up_by_field', startdate, enddate) rows.append([region_name, district_name, site_name, fida, births, open_cases, not_yet_open_for_follow_up, open_for_cati_follow_up, open_for_fada_follow_up, closed_cases, followed_up_by_call_center, followed_up_by_field, lost_to_follow_up]) return rows