From c388fe2d16781a0a5ce92aa1f38595501a7d6ec8 Mon Sep 17 00:00:00 2001 From: Samuel Piquet Date: Thu, 5 Oct 2023 11:47:08 +1100 Subject: [PATCH 1/4] Add inverse detail option to instance --- mis_builder/models/kpimatrix.py | 11 +++++++---- mis_builder/models/mis_report_instance.py | 5 ++++- mis_builder/report/mis_report_instance_qweb.xml | 5 ++++- mis_builder/report/mis_report_instance_xlsx.py | 2 +- mis_builder/views/mis_report_instance.xml | 1 + 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/mis_builder/models/kpimatrix.py b/mis_builder/models/kpimatrix.py index 7aaf43d44..51bf8ee25 100644 --- a/mis_builder/models/kpimatrix.py +++ b/mis_builder/models/kpimatrix.py @@ -432,17 +432,20 @@ def compute_sums(self): tooltips=False, ) - def iter_rows(self): + def iter_rows(self, inverse_detail=False): """Iterate rows in display order. yields KpiMatrixRow. """ for kpi_row in self._kpi_rows.values(): - yield kpi_row + if not inverse_detail: + yield kpi_row detail_rows = self._detail_rows[kpi_row.kpi].values() detail_rows = sorted(detail_rows, key=lambda r: r.label) for detail_row in detail_rows: yield detail_row + if inverse_detail: + yield kpi_row def iter_cols(self): """Iterate columns in display order. @@ -480,7 +483,7 @@ def get_account_name(self, account_id): self._load_account_names() return self._account_names[account_id] - def as_dict(self): + def as_dict(self, inverse_detail=False): header = [{"cols": []}, {"cols": []}] for col in self.iter_cols(): header[0]["cols"].append( @@ -500,7 +503,7 @@ def as_dict(self): ) body = [] - for row in self.iter_rows(): + for row in self.iter_rows(inverse_detail=inverse_detail): if ( row.style_props.hide_empty and row.is_empty() ) or row.style_props.hide_always: diff --git a/mis_builder/models/mis_report_instance.py b/mis_builder/models/mis_report_instance.py index b2f5b2969..8c0e92f66 100644 --- a/mis_builder/models/mis_report_instance.py +++ b/mis_builder/models/mis_report_instance.py @@ -563,6 +563,9 @@ def _compute_pivot_date(self): display_columns_description = fields.Boolean( help="Display the date range details in the column headers." ) + inverse_detail = fields.Boolean( + help="Show detail before KPI.", + ) comparison_mode = fields.Boolean( compute="_compute_comparison_mode", inverse="_inverse_comparison_mode" ) @@ -869,7 +872,7 @@ def _compute_matrix(self): def compute(self): self.ensure_one() kpi_matrix = self._compute_matrix() - return kpi_matrix.as_dict() + return kpi_matrix.as_dict(inverse_detail=self.inverse_detail) def drilldown(self, arg): self.ensure_one() diff --git a/mis_builder/report/mis_report_instance_qweb.xml b/mis_builder/report/mis_report_instance_qweb.xml index be0cde1d9..e12bb27e3 100644 --- a/mis_builder/report/mis_report_instance_qweb.xml +++ b/mis_builder/report/mis_report_instance_qweb.xml @@ -74,7 +74,10 @@
- +
+ From a13f928d0673af929b0a8d045c639deee055821d Mon Sep 17 00:00:00 2001 From: Samuel Piquet Date: Fri, 6 Oct 2023 09:44:31 +1100 Subject: [PATCH 2/4] [FIX] applied sbidoul comments --- mis_builder/models/kpimatrix.py | 10 +++++----- mis_builder/models/mis_report_instance.py | 6 +++--- mis_builder/report/mis_report_instance_qweb.xml | 2 +- mis_builder/report/mis_report_instance_xlsx.py | 2 +- mis_builder/views/mis_report_instance.xml | 5 ++++- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/mis_builder/models/kpimatrix.py b/mis_builder/models/kpimatrix.py index 51bf8ee25..3bf8ef360 100644 --- a/mis_builder/models/kpimatrix.py +++ b/mis_builder/models/kpimatrix.py @@ -432,19 +432,19 @@ def compute_sums(self): tooltips=False, ) - def iter_rows(self, inverse_detail=False): + def iter_rows(self, details_before_kpi=False): """Iterate rows in display order. yields KpiMatrixRow. """ for kpi_row in self._kpi_rows.values(): - if not inverse_detail: + if not details_before_kpi: yield kpi_row detail_rows = self._detail_rows[kpi_row.kpi].values() detail_rows = sorted(detail_rows, key=lambda r: r.label) for detail_row in detail_rows: yield detail_row - if inverse_detail: + if details_before_kpi: yield kpi_row def iter_cols(self): @@ -483,7 +483,7 @@ def get_account_name(self, account_id): self._load_account_names() return self._account_names[account_id] - def as_dict(self, inverse_detail=False): + def as_dict(self, details_before_kpi=False): header = [{"cols": []}, {"cols": []}] for col in self.iter_cols(): header[0]["cols"].append( @@ -503,7 +503,7 @@ def as_dict(self, inverse_detail=False): ) body = [] - for row in self.iter_rows(inverse_detail=inverse_detail): + for row in self.iter_rows(details_before_kpi=details_before_kpi): if ( row.style_props.hide_empty and row.is_empty() ) or row.style_props.hide_always: diff --git a/mis_builder/models/mis_report_instance.py b/mis_builder/models/mis_report_instance.py index 8c0e92f66..5b98b6358 100644 --- a/mis_builder/models/mis_report_instance.py +++ b/mis_builder/models/mis_report_instance.py @@ -563,8 +563,8 @@ def _compute_pivot_date(self): display_columns_description = fields.Boolean( help="Display the date range details in the column headers." ) - inverse_detail = fields.Boolean( - help="Show detail before KPI.", + details_before_kpi = fields.Boolean( + help="Show account details before KPI.", ) comparison_mode = fields.Boolean( compute="_compute_comparison_mode", inverse="_inverse_comparison_mode" @@ -872,7 +872,7 @@ def _compute_matrix(self): def compute(self): self.ensure_one() kpi_matrix = self._compute_matrix() - return kpi_matrix.as_dict(inverse_detail=self.inverse_detail) + return kpi_matrix.as_dict(details_before_kpi=self.details_before_kpi) def drilldown(self, arg): self.ensure_one() diff --git a/mis_builder/report/mis_report_instance_qweb.xml b/mis_builder/report/mis_report_instance_qweb.xml index e12bb27e3..33388bf72 100644 --- a/mis_builder/report/mis_report_instance_qweb.xml +++ b/mis_builder/report/mis_report_instance_qweb.xml @@ -75,7 +75,7 @@
+ - From 899f8c91f0d7d6f96a03ad6405c0b7cef31e48e4 Mon Sep 17 00:00:00 2001 From: Samuel Piquet Date: Fri, 6 Oct 2023 10:40:24 +1100 Subject: [PATCH 3/4] [IMP] Add test --- mis_builder/tests/test_mis_report_instance.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mis_builder/tests/test_mis_report_instance.py b/mis_builder/tests/test_mis_report_instance.py index 999a67837..1931e8288 100644 --- a/mis_builder/tests/test_mis_report_instance.py +++ b/mis_builder/tests/test_mis_report_instance.py @@ -592,3 +592,8 @@ def test_unprivileged(self): self.env, "mis_you", groups="base.group_user,account.group_account_user" ) self.report_instance.with_user(test_user).compute() + + def test_details_before_kpi(self): + self.report_instance.details_before_kpi = True + matrix_dict = self.report_instance.compute() + self.assertEqual(matrix_dict["body"][0]["parent_row_id"], "k1") From 82561adad618183be8b4d35aebb4de70e165f785 Mon Sep 17 00:00:00 2001 From: Samuel Piquet Date: Tue, 10 Oct 2023 15:31:29 +1100 Subject: [PATCH 4/4] [FIX] Tests in data sources instead of instance --- mis_builder/tests/test_data_sources.py | 10 ++++++++++ mis_builder/tests/test_mis_report_instance.py | 5 ----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/mis_builder/tests/test_data_sources.py b/mis_builder/tests/test_data_sources.py index e8cb1acc7..00694fbc0 100644 --- a/mis_builder/tests/test_data_sources.py +++ b/mis_builder/tests/test_data_sources.py @@ -219,3 +219,13 @@ def test_actuals_alt(self): self.p1.source_aml_model_id = aml_model.id matrix = self.instance._compute_matrix() assert_matrix(matrix, [[11, 13], [11, 30]]) + + def test_details_after_kpi(self): + self.instance.details_before_kpi = False + matrix_dict = self.instance.compute() + self.assertEqual(matrix_dict["body"][1]["row_id"], "k2") + + def test_details_before_kpi(self): + self.instance.details_before_kpi = True + matrix_dict = self.instance.compute() + self.assertEqual(matrix_dict["body"][1]["parent_row_id"], "k2") diff --git a/mis_builder/tests/test_mis_report_instance.py b/mis_builder/tests/test_mis_report_instance.py index 1931e8288..999a67837 100644 --- a/mis_builder/tests/test_mis_report_instance.py +++ b/mis_builder/tests/test_mis_report_instance.py @@ -592,8 +592,3 @@ def test_unprivileged(self): self.env, "mis_you", groups="base.group_user,account.group_account_user" ) self.report_instance.with_user(test_user).compute() - - def test_details_before_kpi(self): - self.report_instance.details_before_kpi = True - matrix_dict = self.report_instance.compute() - self.assertEqual(matrix_dict["body"][0]["parent_row_id"], "k1")