From ba634614c2e7a47f3bc626b5013bb81dbf141a12 Mon Sep 17 00:00:00 2001
From: OndraRehounek <ondra.rehounek@seznam.cz>
Date: Fri, 15 Apr 2022 16:18:05 +0200
Subject: [PATCH] district & region: Fill redmine block on page save

---
 district/blocks.py                            |  7 +--
 district/models.py                            |  6 +++
 redmine_utils/functions.py                    | 45 ++++++++++++++++++
 redmine_utils/{utils.py => getters.py}        |  0
 .../commands/update_redmine_issues.py         | 47 +------------------
 region/blocks.py                              |  7 +--
 region/models.py                              |  6 +++
 shared/blocks.py                              |  7 +++
 8 files changed, 70 insertions(+), 55 deletions(-)
 create mode 100644 redmine_utils/functions.py
 rename redmine_utils/{utils.py => getters.py} (100%)

diff --git a/district/blocks.py b/district/blocks.py
index 693f061c..60d1573b 100644
--- a/district/blocks.py
+++ b/district/blocks.py
@@ -12,6 +12,8 @@ from wagtail.core.blocks import (
 from wagtail.core.blocks.struct_block import StructBlockValidationError
 from wagtail.images.blocks import ImageChooserBlock
 
+from shared.blocks import ProgramItemBlock
+
 
 class AddressBlock(StructBlock):
     title = CharBlock(label="Titulek", required=True)
@@ -213,11 +215,6 @@ class PersonUrlBlock(StructBlock):
     )
 
 
-class ProgramItemBlock(StructBlock):
-    title = CharBlock(label="Název", required=True)
-    completion_percentage = IntegerBlock(label="Procento dokonÄŤenĂ­", required=True)
-
-
 class StaticProgramBlock(StructBlock):
     headline = CharBlock(label="Titulek bloku", required=True)
     perex = TextBlock(label="Krátký text pod nadpisem", required=True)
diff --git a/district/models.py b/district/models.py
index 4c946bd7..e08306c8 100644
--- a/district/models.py
+++ b/district/models.py
@@ -872,6 +872,12 @@ class DistrictProgramPage(SubpageMixin, MetadataPageMixin, Page):
     class Meta:
         verbose_name = "Program"
 
+    def save(self, **kwargs):
+        from redmine_utils.functions import fill_data_from_redmine_for_page
+
+        fill_data_from_redmine_for_page(self)
+        return super().save(**kwargs)
+
 
 class DistrictCenterPage(CalendarMixin, SubpageMixin, MetadataPageMixin, Page):
     ### FIELDS
diff --git a/redmine_utils/functions.py b/redmine_utils/functions.py
new file mode 100644
index 00000000..f4e12ec8
--- /dev/null
+++ b/redmine_utils/functions.py
@@ -0,0 +1,45 @@
+from wagtail.core.blocks import StructValue
+
+from shared.blocks import ProgramItemBlock
+
+from .getters import get_issue_list, get_issue_overall_percentage
+
+
+def fill_data_from_redmine_for_page(page):
+    """
+    NaplnĂ­ hondnotu completion_percentage a program_items pro RedmineProgramBlock
+    pro danou Page (musĂ­ mĂ­t atribut content s blockem redmine_program_block)
+    """
+    for program_block in page.content:
+        if program_block.block_type == "redmine_program_block":
+            redmine_issue_id = program_block.value["redmine_issue"]
+            fill_overall_percentage_from_redmine(program_block.value, redmine_issue_id)
+            fill_program_items_from_redmine(program_block.value, redmine_issue_id)
+
+
+def fill_overall_percentage_from_redmine(program_block_value: dict, issue_id: int):
+    """
+    NaplnĂ­ hondnotu completion_percentage pro RedmineProgramBlock hodnoutou z Redmine.
+    """
+    program_block_value["completion_percentage"] = get_issue_overall_percentage(
+        issue_id
+    )
+
+
+def fill_program_items_from_redmine(program_block_value: dict, issue_id: int):
+    """
+    Naplní hondnotu program_items pro RedmineProgramBlock. Nejdříve hodnotu (list)
+    promaže a pak z getných issues naplní pomocí StructValue
+    """
+    issue_list = get_issue_list(issue_id)
+    program_block_value["program_items"].clear()
+
+    for issue in issue_list:
+        sv = StructValue(ProgramItemBlock)
+        sv.update(
+            {
+                "completion_percentage": issue.get("done_ratio", None),
+                "title": issue.get("subject", ""),
+            }
+        )
+        program_block_value["program_items"].append(sv)
diff --git a/redmine_utils/utils.py b/redmine_utils/getters.py
similarity index 100%
rename from redmine_utils/utils.py
rename to redmine_utils/getters.py
diff --git a/redmine_utils/management/commands/update_redmine_issues.py b/redmine_utils/management/commands/update_redmine_issues.py
index cc0ae3a5..b708361b 100644
--- a/redmine_utils/management/commands/update_redmine_issues.py
+++ b/redmine_utils/management/commands/update_redmine_issues.py
@@ -1,12 +1,9 @@
 from django.core.management.base import BaseCommand
-from wagtail.core.blocks import StructValue
 
-from district.blocks import ProgramItemBlock
 from district.models import DistrictProgramPage
+from redmine_utils.functions import fill_data_from_redmine_for_page
 from region.models import RegionProgramPage
 
-from ...utils import get_issue_list, get_issue_overall_percentage
-
 
 class Command(BaseCommand):
     def handle(self, *args, **options):
@@ -20,47 +17,7 @@ class Command(BaseCommand):
 
         for model in updated_models:
             for page in model.objects.all():
-                for program_block in page.content:
-                    if program_block.block_type == "redmine_program_block":
-                        fill_data_from_redmine(program_block.value)
-
+                fill_data_from_redmine_for_page(page)
                 page.save()
 
         self.stdout.write("\nUpdating Redmine issues finished")
-
-
-def fill_data_from_redmine(program_block_value: dict):
-    """
-    NaplnĂ­ hondnotu completion_percentage a program_items pro RedmineProgramBlock
-    """
-    redmine_issue_id = program_block_value["redmine_issue"]
-    fill_overall_percentage_from_redmine(program_block_value, redmine_issue_id)
-    fill_program_items_from_redmine(program_block_value, redmine_issue_id)
-
-
-def fill_overall_percentage_from_redmine(program_block_value: dict, issue_id: int):
-    """
-    NaplnĂ­ hondnotu completion_percentage pro RedmineProgramBlock hodnoutou z Redmine.
-    """
-    program_block_value["completion_percentage"] = get_issue_overall_percentage(
-        issue_id
-    )
-
-
-def fill_program_items_from_redmine(program_block_value: dict, issue_id: int):
-    """
-    Naplní hondnotu program_items pro RedmineProgramBlock. Nejdříve hodnotu (list)
-    promaže a pak z getných issues naplní pomocí StructValue
-    """
-    issue_list = get_issue_list(issue_id)
-    program_block_value["program_items"].clear()
-
-    for issue in issue_list:
-        sv = StructValue(ProgramItemBlock)
-        sv.update(
-            {
-                "completion_percentage": issue.get("done_ratio", None),
-                "title": issue.get("subject", ""),
-            }
-        )
-        program_block_value["program_items"].append(sv)
diff --git a/region/blocks.py b/region/blocks.py
index e173f963..9513750f 100644
--- a/region/blocks.py
+++ b/region/blocks.py
@@ -12,6 +12,8 @@ from wagtail.core.blocks import (
 from wagtail.core.blocks.struct_block import StructBlockValidationError
 from wagtail.images.blocks import ImageChooserBlock
 
+from shared.blocks import ProgramItemBlock
+
 
 class AddressBlock(StructBlock):
     title = CharBlock(label="Titulek", required=True)
@@ -213,11 +215,6 @@ class PersonUrlBlock(StructBlock):
     )
 
 
-class ProgramItemBlock(StructBlock):
-    title = CharBlock(label="Název", required=True)
-    completion_percentage = IntegerBlock(label="Procento dokonÄŤenĂ­", required=True)
-
-
 class StaticProgramBlock(StructBlock):
     headline = CharBlock(label="Titulek bloku", required=True)
     perex = TextBlock(label="Krátký text pod nadpisem", required=True)
diff --git a/region/models.py b/region/models.py
index d1f6072b..15bf1bdf 100644
--- a/region/models.py
+++ b/region/models.py
@@ -859,6 +859,12 @@ class RegionProgramPage(SubpageMixin, MetadataPageMixin, Page):
     class Meta:
         verbose_name = "Program"
 
+    def save(self, **kwargs):
+        from redmine_utils.functions import fill_data_from_redmine_for_page
+
+        fill_data_from_redmine_for_page(self)
+        return super().save(**kwargs)
+
 
 class RegionCenterPage(CalendarMixin, SubpageMixin, MetadataPageMixin, Page):
     ### FIELDS
diff --git a/shared/blocks.py b/shared/blocks.py
index c4dbe9ae..846a082a 100644
--- a/shared/blocks.py
+++ b/shared/blocks.py
@@ -50,3 +50,10 @@ class MenuParentBlock(blocks.StructBlock):
     class Meta:
         label = "Podmenu"
         template = "styleguide/2.3.x/menu_parent.html"
+
+
+class ProgramItemBlock(blocks.StructBlock):
+    title = blocks.CharBlock(label="Název", required=True)
+    completion_percentage = blocks.IntegerBlock(
+        label="Procento dokonÄŤenĂ­", required=True
+    )
-- 
GitLab