Exemple #1
0
    def get_ajax(self, params):
        try:
            data_source = self.data_source
            if len(data_source.inner_columns
                   ) > 50 and not DISABLE_COLUMN_LIMIT_IN_UCR.enabled(
                       self.domain):
                raise UserReportsError(
                    _("This report has too many columns to be displayed"))
            data_source.set_filter_values(self.filter_values)

            sort_column = params.get('iSortCol_0')
            sort_order = params.get('sSortDir_0', 'ASC')
            echo = int(params.get('sEcho', 1))
            if sort_column and echo != 1:
                data_source.set_order_by([
                    (data_source.top_level_columns[int(sort_column)].column_id,
                     sort_order.upper())
                ])

            datatables_params = DatatablesParams.from_request_dict(params)
            page = list(
                data_source.get_data(start=datatables_params.start,
                                     limit=datatables_params.count))
            total_records = data_source.get_total_records()
            total_row = data_source.get_total_row(
            ) if data_source.has_total_row else None
        except UserReportsError as e:
            if settings.DEBUG:
                raise
            return self.render_json_response({
                'error': e.message,
                'aaData': [],
                'iTotalRecords': 0,
                'iTotalDisplayRecords': 0,
            })
        except TableNotFoundWarning:
            if self.spec.report_meta.created_by_builder:
                msg = _(
                    "The database table backing your report does not exist yet. "
                    "Please wait while the report is populated.")
            else:
                msg = _(
                    "The database table backing your report does not exist yet. "
                    "You must rebuild the data source before viewing the report."
                )
            return self.render_json_response({'warning': msg})

        json_response = {
            'aaData': page,
            "sEcho": params.get('sEcho', 0),
            "iTotalRecords": total_records,
            "iTotalDisplayRecords": total_records,
        }
        if total_row is not None:
            json_response["total_row"] = total_row
        if data_source.data_source.config.backend_id == UCR_LABORATORY_BACKEND:
            compare_ucr_dbs.delay(self.domain, self.report_config_id,
                                  self.filter_values, sort_column, sort_order,
                                  params)
        return self.render_json_response(json_response)
Exemple #2
0
def generate_rows_and_filters(report_data_cache, report_config, restore_user,
                              row_to_element):
    """Generate restore row and filter elements
    :param row_to_element: function (
                deferred_fields, filter_options_by_field, row, index, is_total_row
            ) -> row_element
    """
    domain = restore_user.domain
    report, data_source = _get_report_and_data_source(report_config.report_id,
                                                      domain)

    # apply filters specified in report module
    all_filter_values = {
        filter_slug:
        restore_user.get_ucr_filter_value(filter,
                                          report.get_ui_filter(filter_slug))
        for filter_slug, filter in report_config.filters.items()
    }
    # apply all prefilters
    prefilters = [
        ReportFilterFactory.from_spec(p, report) for p in report.prefilters
    ]
    prefilter_values = {
        prefilter.name: prefilter.value()
        for prefilter in prefilters
    }
    all_filter_values.update(prefilter_values)
    # filter out nulls
    filter_values = {
        filter_slug: filter_value
        for filter_slug, filter_value in all_filter_values.items()
        if filter_value is not None
    }
    defer_filters = [
        report.get_ui_filter(filter_slug)
        for filter_slug, filter_value in all_filter_values.items()
        if filter_value is None and is_valid_mobile_select_filter_type(
            report.get_ui_filter(filter_slug))
    ]
    data_source.set_filter_values(filter_values)
    data_source.set_defer_fields([f.field for f in defer_filters])
    filter_options_by_field = defaultdict(set)

    row_elements = get_report_element(
        report_data_cache,
        report_config,
        data_source,
        {f.field
         for f in defer_filters},
        filter_options_by_field,
        row_to_element,
    )
    filters_elem = _get_filters_elem(defer_filters, filter_options_by_field,
                                     restore_user._couch_user)

    if (report_config.report_id in settings.UCR_COMPARISONS and
            COMPARE_UCR_REPORTS.enabled(uuid.uuid4().hex, NAMESPACE_OTHER)):
        compare_ucr_dbs.delay(domain, report_config.report_id, filter_values)

    return row_elements, filters_elem
Exemple #3
0
    def report_config_to_v2_fixture(report_config, restore_user):
        domain = restore_user.domain
        report, data_source = BaseReportFixturesProvider._get_report_and_data_source(
            report_config.report_id, domain)

        # apply filters specified in report module
        all_filter_values = {
            filter_slug: restore_user.get_ucr_filter_value(
                filter, report.get_ui_filter(filter_slug))
            for filter_slug, filter in report_config.filters.items()
        }
        # apply all prefilters
        prefilters = [
            ReportFilterFactory.from_spec(p, report) for p in report.prefilters
        ]
        prefilter_values = {
            prefilter.name: prefilter.value()
            for prefilter in prefilters
        }
        all_filter_values.update(prefilter_values)
        # filter out nulls
        filter_values = {
            filter_slug: filter_value
            for filter_slug, filter_value in all_filter_values.items()
            if filter_value is not None
        }
        defer_filters = {
            filter_slug: report.get_ui_filter(filter_slug)
            for filter_slug, filter_value in all_filter_values.items()
            if filter_value is None and is_valid_mobile_select_filter_type(
                report.get_ui_filter(filter_slug))
        }
        data_source.set_filter_values(filter_values)
        data_source.defer_filters(defer_filters)
        filter_options_by_field = defaultdict(set)

        rows_elem = ReportFixturesProviderV2._get_v2_report_elem(
            data_source,
            {ui_filter.field
             for ui_filter in defer_filters.values()}, filter_options_by_field)
        filters_elem = BaseReportFixturesProvider._get_filters_elem(
            defer_filters, filter_options_by_field, restore_user._couch_user)
        report_filter_elem = E.fixture(
            id=ReportFixturesProviderV2._report_filter_id(report_config.uuid))
        report_filter_elem.append(filters_elem)

        if (data_source.config.backend_id in UCR_SUPPORT_BOTH_BACKENDS
                and random.randint(0, MOBILE_UCR_RANDOM_THRESHOLD)
                == MOBILE_UCR_RANDOM_THRESHOLD):
            compare_ucr_dbs.delay(domain, report_config.report_id,
                                  filter_values)

        report_elem = E.fixture(id=ReportFixturesProviderV2._report_fixture_id(
            report_config.uuid),
                                user_id=restore_user.user_id,
                                report_id=report_config.report_id,
                                last_sync=_utcnow().isoformat(),
                                indexed='true')
        report_elem.append(rows_elem)
        return [report_filter_elem, report_elem]
Exemple #4
0
    def report_config_to_v2_fixture(report_config, restore_user):
        domain = restore_user.domain
        report, data_source = BaseReportFixturesProvider._get_report_and_data_source(
            report_config.report_id, domain)

        # apply filters specified in report module
        all_filter_values = {
            filter_slug: restore_user.get_ucr_filter_value(
                filter, report.get_ui_filter(filter_slug))
            for filter_slug, filter in report_config.filters.items()
        }
        # apply all prefilters
        prefilters = [
            ReportFilterFactory.from_spec(p, report) for p in report.prefilters
        ]
        prefilter_values = {
            prefilter.name: prefilter.value()
            for prefilter in prefilters
        }
        all_filter_values.update(prefilter_values)
        # filter out nulls
        filter_values = {
            filter_slug: filter_value
            for filter_slug, filter_value in all_filter_values.items()
            if filter_value is not None
        }
        defer_filters = [
            report.get_ui_filter(filter_slug)
            for filter_slug, filter_value in all_filter_values.items()
            if filter_value is None and is_valid_mobile_select_filter_type(
                report.get_ui_filter(filter_slug))
        ]
        data_source.set_filter_values(filter_values)
        data_source.set_defer_fields([f.field for f in defer_filters])
        filter_options_by_field = defaultdict(set)

        rows_elem = ReportFixturesProviderV2._get_v2_report_elem(
            data_source, {f.field
                          for f in defer_filters}, filter_options_by_field,
            _format_last_sync_time(domain, restore_user.user_id), restore_user)
        filters_elem = BaseReportFixturesProvider._get_filters_elem(
            defer_filters, filter_options_by_field, restore_user._couch_user)
        report_filter_elem = E.fixture(
            id=ReportFixturesProviderV2._report_filter_id(report_config.uuid))
        report_filter_elem.append(filters_elem)

        if (report_config.report_id in settings.UCR_COMPARISONS
                and COMPARE_UCR_REPORTS.enabled(uuid.uuid4().hex,
                                                NAMESPACE_OTHER)):
            compare_ucr_dbs.delay(domain, report_config.report_id,
                                  filter_values)

        report_elem = E.fixture(id=ReportFixturesProviderV2._report_fixture_id(
            report_config.uuid),
                                user_id=restore_user.user_id,
                                report_id=report_config.report_id,
                                indexed='true')
        report_elem.append(rows_elem)
        return [report_filter_elem, report_elem]
Exemple #5
0
    def get_ajax(self, params):
        try:
            data_source = self.data_source
            if len(data_source.inner_columns) > 50 and not DISABLE_COLUMN_LIMIT_IN_UCR.enabled(self.domain):
                raise UserReportsError(_("This report has too many columns to be displayed"))
            data_source.set_filter_values(self.filter_values)

            sort_column = params.get('iSortCol_0')
            sort_order = params.get('sSortDir_0', 'ASC')
            echo = int(params.get('sEcho', 1))
            if sort_column and echo != 1:
                data_source.set_order_by(
                    [(data_source.top_level_columns[int(sort_column)].column_id, sort_order.upper())]
                )

            datatables_params = DatatablesParams.from_request_dict(params)
            page = list(data_source.get_data(start=datatables_params.start, limit=datatables_params.count))
            total_records = data_source.get_total_records()
            total_row = data_source.get_total_row() if data_source.has_total_row else None
        except UserReportsError as e:
            if settings.DEBUG:
                raise
            return self.render_json_response({
                'error': e.message,
                'aaData': [],
                'iTotalRecords': 0,
                'iTotalDisplayRecords': 0,
            })
        except TableNotFoundWarning:
            if self.spec.report_meta.created_by_builder:
                msg = _(
                    "The database table backing your report does not exist yet. "
                    "Please wait while the report is populated."
                )
            else:
                msg = _(
                    "The database table backing your report does not exist yet. "
                    "You must rebuild the data source before viewing the report."
                )
            return self.render_json_response({
                'warning': msg
            })

        json_response = {
            'aaData': page,
            "sEcho": params.get('sEcho', 0),
            "iTotalRecords": total_records,
            "iTotalDisplayRecords": total_records,
        }
        if total_row is not None:
            json_response["total_row"] = total_row
        if data_source.data_source.config.backend_id == UCR_LABORATORY_BACKEND:
            compare_ucr_dbs.delay(
                self.domain, self.report_config_id, self.filter_values,
                sort_column, sort_order, params
            )
        return self.render_json_response(json_response)
    def report_config_to_v1_fixture(report_config, restore_user):
        domain = restore_user.domain
        report, data_source = BaseReportFixturesProvider._get_report_and_data_source(
            report_config.report_id, domain)

        # apply filters specified in report module
        all_filter_values = {
            filter_slug: restore_user.get_ucr_filter_value(
                filter, report.get_ui_filter(filter_slug))
            for filter_slug, filter in report_config.filters.items()
        }
        # apply all prefilters
        prefilters = [
            ReportFilterFactory.from_spec(p, report) for p in report.prefilters
        ]
        prefilter_values = {
            prefilter.name: prefilter.value()
            for prefilter in prefilters
        }
        all_filter_values.update(prefilter_values)
        # filter out nulls
        filter_values = {
            filter_slug: filter_value
            for filter_slug, filter_value in all_filter_values.items()
            if filter_value is not None
        }
        defer_filters = [
            report.get_ui_filter(filter_slug)
            for filter_slug, filter_value in all_filter_values.items()
            if filter_value is None and is_valid_mobile_select_filter_type(
                report.get_ui_filter(filter_slug))
        ]
        data_source.set_filter_values(filter_values)
        data_source.set_defer_fields([f.field for f in defer_filters])
        filter_options_by_field = defaultdict(set)

        rows_elem = ReportFixturesProvider._get_v1_report_elem(
            data_source, {ui_filter.field
                          for ui_filter in defer_filters},
            filter_options_by_field)
        filters_elem = BaseReportFixturesProvider._get_filters_elem(
            defer_filters, filter_options_by_field, restore_user._couch_user)

        if (report_config.report_id in settings.UCR_COMPARISONS
                and random.randint(0, UCR_COMPARISONS_THRESHOLD)
                == UCR_COMPARISONS_THRESHOLD):
            compare_ucr_dbs.delay(domain, report_config.report_id,
                                  filter_values)

        report_elem = E.report(id=report_config.uuid,
                               report_id=report_config.report_id)
        report_elem.append(filters_elem)
        report_elem.append(rows_elem)
        return report_elem
Exemple #7
0
    def report_config_to_v2_fixture(report_config, restore_user):
        domain = restore_user.domain
        report, data_source = BaseReportFixturesProvider._get_report_and_data_source(
            report_config.report_id, domain)

        # apply filters specified in report module
        all_filter_values = {
            filter_slug: restore_user.get_ucr_filter_value(filter, report.get_ui_filter(filter_slug))
            for filter_slug, filter in report_config.filters.items()
        }
        # apply all prefilters
        prefilters = [ReportFilterFactory.from_spec(p, report) for p in report.prefilters]
        prefilter_values = {prefilter.name: prefilter.value() for prefilter in prefilters}
        all_filter_values.update(prefilter_values)
        # filter out nulls
        filter_values = {
            filter_slug: filter_value for filter_slug, filter_value in all_filter_values.items()
            if filter_value is not None
        }
        defer_filters = [
            report.get_ui_filter(filter_slug)
            for filter_slug, filter_value in all_filter_values.items()
            if filter_value is None and is_valid_mobile_select_filter_type(report.get_ui_filter(filter_slug))
        ]
        data_source.set_filter_values(filter_values)
        data_source.set_defer_fields([f.field for f in defer_filters])
        filter_options_by_field = defaultdict(set)

        rows_elem = ReportFixturesProviderV2._get_v2_report_elem(
            data_source,
            {f.field for f in defer_filters},
            filter_options_by_field,
            _last_sync_time(domain, restore_user.user_id),
        )
        filters_elem = BaseReportFixturesProvider._get_filters_elem(
            defer_filters, filter_options_by_field, restore_user._couch_user)
        report_filter_elem = E.fixture(id=ReportFixturesProviderV2._report_filter_id(report_config.uuid))
        report_filter_elem.append(filters_elem)

        if (report_config.report_id in settings.UCR_COMPARISONS and
                random.randint(0, UCR_COMPARISONS_THRESHOLD) == UCR_COMPARISONS_THRESHOLD):
            compare_ucr_dbs.delay(domain, report_config.report_id, filter_values)

        report_elem = E.fixture(
            id=ReportFixturesProviderV2._report_fixture_id(report_config.uuid), user_id=restore_user.user_id,
            report_id=report_config.report_id, indexed='true'
        )
        report_elem.append(rows_elem)
        return [report_filter_elem, report_elem]