From c7b22592de1f48fef8621fa9d864ccb6a11c4214 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Fri, 22 Oct 2021 12:36:39 +0200 Subject: [PATCH] #26 Annual conservation report * enhancements for report2excel functionality * improvements for report2html layout + --- .../templates/analysis/reports/detail.html | 2 +- .../reports/includes/eco_account/amount.html | 14 +-- .../reports/includes/old_data/amount.html | 40 ++++++ .../card_old_interventions.html | 2 +- .../includes/old_intervention/amount.html | 30 ----- analysis/utils/excel/excel.py | 46 +++---- analysis/utils/excel/excel_report.xlsx | Bin 6433 -> 10693 bytes analysis/utils/report.py | 114 +++++++++++++----- locale/de/LC_MESSAGES/django.po | 16 +-- 9 files changed, 158 insertions(+), 106 deletions(-) create mode 100644 analysis/templates/analysis/reports/includes/old_data/amount.html rename analysis/templates/analysis/reports/includes/{old_intervention => old_data}/card_old_interventions.html (97%) delete mode 100644 analysis/templates/analysis/reports/includes/old_intervention/amount.html diff --git a/analysis/templates/analysis/reports/detail.html b/analysis/templates/analysis/reports/detail.html index 9cdae7d2..ac4f08e2 100644 --- a/analysis/templates/analysis/reports/detail.html +++ b/analysis/templates/analysis/reports/detail.html @@ -31,6 +31,6 @@ {% include 'analysis/reports/includes/intervention/card_intervention.html' %} {% include 'analysis/reports/includes/compensation/card_compensation.html' %} {% include 'analysis/reports/includes/eco_account/card_eco_account.html' %} - {% include 'analysis/reports/includes/old_intervention/card_old_interventions.html' %} + {% include 'analysis/reports/includes/old_data/card_old_interventions.html' %} {% endblock %} \ No newline at end of file diff --git a/analysis/templates/analysis/reports/includes/eco_account/amount.html b/analysis/templates/analysis/reports/includes/eco_account/amount.html index becdfff9..668250e6 100644 --- a/analysis/templates/analysis/reports/includes/eco_account/amount.html +++ b/analysis/templates/analysis/reports/includes/eco_account/amount.html @@ -2,10 +2,6 @@

{% trans 'Amount' %}

- {% blocktrans %} - Checked = Has been checked by the registration office according to LKompVzVo - {% endblocktrans %} -
{% blocktrans %} Recorded = Has been checked and published by the conservation office {% endblocktrans %} @@ -14,18 +10,14 @@ - - - - + + - - - +
{% trans 'Before' %} LKompVzVo{% trans 'After' %} LKompVzVo{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}{% trans 'Total' %}{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}{% trans 'Total' %}
{{report.eco_account_report.queryset_old_count|default_if_zero:"-"}}{{report.eco_account_report.queryset_count|default_if_zero:"-"}} {{report.eco_account_report.queryset_recorded_count|default_if_zero:"-"}}{{report.eco_account_report.queryset_total_count|default_if_zero:"-"}}{{report.eco_account_report.queryset_count|default_if_zero:"-"}}
diff --git a/analysis/templates/analysis/reports/includes/old_data/amount.html b/analysis/templates/analysis/reports/includes/old_data/amount.html new file mode 100644 index 00000000..cd79cb6f --- /dev/null +++ b/analysis/templates/analysis/reports/includes/old_data/amount.html @@ -0,0 +1,40 @@ +{% load i18n fontawesome_5 ksp_filters %} + +

{% trans 'Amount' %}

+ + {% blocktrans %} + Checked = Has been checked by the registration office according to LKompVzVo + {% endblocktrans %} +
+ {% blocktrans %} + Recorded = Has been checked and published by the conservation office + {% endblocktrans %} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
{% fa5_icon 'star' %} {% trans 'Type' %}{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}{% trans 'Total' %}
{% trans 'Intervention' %}{{report.old_data_report.queryset_intervention_recorded_count|default_if_zero:"-"}}{{report.old_data_report.queryset_intervention_count|default_if_zero:"-"}}
{% trans 'Compensation' %}{{report.old_data_report.queryset_comps_recorded_count|default_if_zero:"-"}}{{report.old_data_report.queryset_comps_count|default_if_zero:"-"}}
{% trans 'Eco-account' %}{{report.old_data_report.queryset_acc_recorded_count|default_if_zero:"-"}}{{report.old_data_report.queryset_acc_count|default_if_zero:"-"}}
+
\ No newline at end of file diff --git a/analysis/templates/analysis/reports/includes/old_intervention/card_old_interventions.html b/analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html similarity index 97% rename from analysis/templates/analysis/reports/includes/old_intervention/card_old_interventions.html rename to analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html index 3a272874..a25a5712 100644 --- a/analysis/templates/analysis/reports/includes/old_intervention/card_old_interventions.html +++ b/analysis/templates/analysis/reports/includes/old_data/card_old_interventions.html @@ -16,7 +16,7 @@
- {% include 'analysis/reports/includes/old_intervention/amount.html' %} + {% include 'analysis/reports/includes/old_data/amount.html' %}
diff --git a/analysis/templates/analysis/reports/includes/old_intervention/amount.html b/analysis/templates/analysis/reports/includes/old_intervention/amount.html deleted file mode 100644 index 8a6b4be0..00000000 --- a/analysis/templates/analysis/reports/includes/old_intervention/amount.html +++ /dev/null @@ -1,30 +0,0 @@ -{% load i18n fontawesome_5 ksp_filters %} - -

{% trans 'Amount' %}

- - {% blocktrans %} - Checked = Has been checked by the registration office according to LKompVzVo - {% endblocktrans %} -
- {% blocktrans %} - Recorded = Has been checked and published by the conservation office - {% endblocktrans %} -
-
- - - - - - - - - - - - - - - -
{% fa5_icon 'star' %} {% trans 'Checked' %}{% fa5_icon 'bookmark' %} {% trans 'Recorded' %}{% trans 'Total' %}
{{report.old_intervention_report.queryset_checked_count|default_if_zero:"-"}}{{report.old_intervention_report.queryset_recorded_count|default_if_zero:"-"}}{{report.old_intervention_report.queryset_count|default_if_zero:"-"}}
-
\ No newline at end of file diff --git a/analysis/utils/excel/excel.py b/analysis/utils/excel/excel.py index 69fbcdfe..611f6a0c 100644 --- a/analysis/utils/excel/excel.py +++ b/analysis/utils/excel/excel.py @@ -47,28 +47,30 @@ class TempExcelFile: Returns: """ - ws = self._workbook.active - # Always activate sheet protection - ws.protection.sheet = True - ws.protection.enable() - _rows = ws.iter_rows(start_row) - for row in _rows: - for cell in row: - val = cell.value - if val in self._template_map: - attr = self._template_map[val] - # If keyword '_iter' can be found inside the placeholder value it's an iterable and we - # need to process it differently - if isinstance(attr, dict): - # Read the iterable object and related attributes from the dict - _iter_obj = attr.get("iterable", None) - _attrs = attr.get("attrs", []) - self._add_cells_from_iterable(ws, cell, _iter_obj, _attrs) - # Since the sheet length did change now, we need to rerun this function starting with the new - # row counter - self._replace_template_placeholders(start_row=cell.row + len(_iter_obj)) - else: - cell.value = attr + sheets = self._workbook.worksheets + for sheet in sheets: + ws = sheet + # Always activate sheet protection + ws.protection.sheet = True + ws.protection.enable() + _rows = ws.iter_rows(start_row) + for row in _rows: + for cell in row: + val = cell.value + if val in self._template_map: + attr = self._template_map[val] + # If keyword '_iter' can be found inside the placeholder value it's an iterable and we + # need to process it differently + if isinstance(attr, dict): + # Read the iterable object and related attributes from the dict + _iter_obj = attr.get("iterable", None) + _attrs = attr.get("attrs", []) + self._add_cells_from_iterable(ws, cell, _iter_obj, _attrs) + # Since the sheet length did change now, we need to rerun this function starting with the new + # row counter + self._replace_template_placeholders(start_row=cell.row + len(_iter_obj)) + else: + cell.value = attr self._workbook.save(self._file.name) self._file.seek(0) self.stream = self._file.read() diff --git a/analysis/utils/excel/excel_report.xlsx b/analysis/utils/excel/excel_report.xlsx index 4383fbe8a80f4a056579b72136dc1c19759745bf..72cf1295461bac4f862d9bc163f7601c7c32ba20 100644 GIT binary patch literal 10693 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 delta 5748 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