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 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
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]
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]
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
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]