Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
    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
Beispiel #6
0
 def domain_timezone(self):
     try:
         return get_timezone_for_domain(self.domain)
     except ValidationError:
         return pytz.UTC
Beispiel #7
0
 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()