def export_table(self): export_table = [] tz = get_timezone_for_domain(self.domain) self._get_filter_values() metadata = [ _('metadata'), [ [_('Report Name'), self.name], [ _('Generated On'), datetime.now(tz=tz).strftime('%Y-%m-%d %H:%M') ], ] + list(self._get_filter_values()) ] export_table.append(metadata) for report in self.reports: report_instance = report(self.request, domain=self.domain) rows = [[header.html for header in report_instance.headers.header]] report_table = [six.text_type(report.name[:28] + '...'), rows] export_table.append(report_table) for row in report_instance.rows: row_formatted = [] for element in row: if isinstance(element, dict): row_formatted.append(element['sort_key']) else: row_formatted.append(six.text_type(element)) rows.append(row_formatted) return export_table
def export_table(self): try: data = self.data_source data.set_filter_values(self.filter_values) data.set_order_by([(o['field'], o['order']) for o in self.spec.sort_expression]) except UserReportsError as e: return self.render_json_response({ 'error': e.message, }) raw_rows = list(data.get_data()) headers = [ column.header for column in self.data_source.inner_columns if column.data_tables_column.visible ] column_id_to_expanded_column_ids = get_expanded_columns( data.top_level_columns, data.config) column_ids = [] for column in self.spec.report_columns: if column.visible: column_ids.extend( column_id_to_expanded_column_ids.get( column.column_id, [column.column_id])) rows = [[raw_row[column_id] for column_id in column_ids] for raw_row in raw_rows] total_rows = [data.get_total_row()] if data.has_total_row else [] export_table = [[self.title, [headers] + rows + total_rows]] if INCLUDE_METADATA_IN_UCR_EXCEL_EXPORTS.enabled(self.domain): time_zone = get_timezone_for_domain(self.domain) export_table.append([ 'metadata', [ [_('Report Name'), self.title], [ _('Generated On'), datetime.now(time_zone).strftime('%Y-%m-%d %H:%M') ], ] + list(self._get_filter_values()) ]) return export_table
def timezone(self): timezone = None if self.recipient_is_an_individual_contact: try: timezone = self.recipient.get_time_zone() except ValidationError: pass if not timezone: timezone = get_timezone_for_domain(self.domain) if isinstance(timezone, tzinfo): return timezone if isinstance(timezone, basestring): try: return coerce_timezone_value(timezone) except ValidationError: pass return pytz.UTC
def timezone(self): timezone = None if self.recipient_type in ('CommCareCase', 'CommCareUser', 'WebUser'): try: timezone = self.recipient.get_time_zone() except ValidationError: pass if not timezone: timezone = get_timezone_for_domain(self.domain) if isinstance(timezone, tzinfo): return timezone if isinstance(timezone, basestring): try: return coerce_timezone_value(timezone) except ValidationError: pass return pytz.UTC
def get_table(self): """Generate a table of all rows of this report """ headers = [ column.header for column in self.data_source.inner_columns if column.data_tables_column.visible ] column_id_to_expanded_column_ids = get_expanded_columns( self.data_source.top_level_columns, self.data_source.config ) column_ids = [] for column in self.report_config.report_columns: if column.visible: column_ids.extend(column_id_to_expanded_column_ids.get(column.column_id, [column.column_id])) rows = [[raw_row[column_id] for column_id in column_ids] for raw_row in self.data_source.get_data()] total_rows = [self.data_source.get_total_row()] if self.data_source.has_total_row else [] export_table = [ [ self.title, [headers] + rows + total_rows ] ] if INCLUDE_METADATA_IN_UCR_EXCEL_EXPORTS.enabled(self.domain): time_zone = get_timezone_for_domain(self.domain) export_table.append([ 'metadata', [ [_('Report Name'), self.title], [_('Generated On'), datetime.now(time_zone).strftime('%Y-%m-%d %H:%M')], ] + list(self._get_filter_values()) ]) return export_table
def domain_timezone(self): try: return get_timezone_for_domain(self.domain) except ValidationError: return pytz.UTC
def get_timezone(self): if self.timezone: return coerce_timezone_value(self.timezone) else: return get_timezone_for_domain(self.domain)
def handle(self, days, *args, **options): email_to = options.get('email') # to iterate over repeat records we need time zone independent datetime # so find the difference between timezone needed and utc # For ex: IST is 5 hours 30 mins ahead of utc, so reduce that time in since # datetime to fetch repeat records from midnight IST on since datetime timezone = get_timezone_for_domain(DOMAIN) self.days = days self.till = datetime.datetime.now(tz=timezone) self.since = ( datetime.datetime(self.till.year, self.till.month, self.till.day) - datetime.timedelta(days=days) - datetime.timedelta(hours=5, minutes=30)) result_file_name = "nikshay_registration_notification_time_report_from_%s_till_%s.csv" % ( self.since.strftime('%Y-%m-%d-%H:%M:%S'), self.till.strftime('%Y-%m-%d-%H:%M:%S')) with open(result_file_name, 'w') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=[ "nikshay id", "form finished on", "form submitted on", "notification completed on", "form to submission", "submission to notification", "case id" ]) writer.writeheader() case_accessor = CaseAccessors(DOMAIN) for repeat_record in iter_repeat_records_by_domain( DOMAIN, repeater_id=REGISTRATION_REPEATER_ID, state=SUCCESS_STATE, since=self.since): episode_case_id = repeat_record.payload_id episode_case = case_accessor.get_case(episode_case_id) assert repeat_record.succeeded time_of_notification = pytz.utc.localize( repeat_record.last_checked).astimezone(timezone) # assert that # the last notification was the success one and # the time for last notification is same as that for the repeat record last_notification_attempt = repeat_record.attempts[-1] assert last_notification_attempt.succeeded assert repeat_record.last_checked == last_notification_attempt.datetime property_changed_info = get_latest_property_change_to_value( episode_case, "treatment_initiated", "yes_phi") xform = property_changed_info.transaction.form form_received_on = pytz.utc.localize( xform.received_on).astimezone(timezone) property_modified_on = parse_datetime( property_changed_info.modified_on).astimezone(timezone) writer.writerow({ 'nikshay id': episode_case.get_case_property('nikshay_id'), 'form finished on': property_modified_on.strftime('%Y-%m-%d-%H:%M:%S'), 'form submitted on': form_received_on.strftime('%Y-%m-%d-%H:%M:%S'), 'notification completed on': time_of_notification.strftime('%Y-%m-%d-%H:%M:%S'), 'form to submission': (form_received_on - property_modified_on), 'submission to notification': (time_of_notification - form_received_on), 'case id': episode_case.case_id }) if email_to: email_to = list(email_to) if not isinstance( email_to, six.string_types) else [email_to] csvfile = open(result_file_name) email = EmailMessage( subject="Nikshay Registration Notification Time Report", body= "Report for time taken for registration notifications for %s day(s)" % self.days, to=email_to, from_email=settings.DEFAULT_FROM_EMAIL) email.attach(filename=result_file_name, content=csvfile.read()) csvfile.close() email.send()