From 9e3054816265facf5a569f4b4fdc45c2ce902a17 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomi=20Valentov=C3=A1?= <git@imaniti.org>
Date: Wed, 31 Jul 2024 13:49:47 +0200
Subject: [PATCH] finish octopus import

---
 district/forms.py                     | 24 +++++++++++++++++++++++-
 district/models.py                    |  7 +++++--
 shared/people_import.py               |  8 ++++++++
 shared/templatetags/people_filters.py |  2 +-
 4 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/district/forms.py b/district/forms.py
index 830224af..8ec53632 100644
--- a/district/forms.py
+++ b/district/forms.py
@@ -2,6 +2,8 @@ import os
 import tempfile
 
 from shared.forms import JekyllImportForm as SharedJekyllImportForm
+from wagtail.admin.forms import WagtailAdminPageForm
+from wagtail.models.media import Collection
 
 from .tasks import import_jekyll_articles
 from .tasks import import_people_from_group
@@ -25,4 +27,24 @@ class JekyllImportForm(SharedJekyllImportForm):
             url=self.cleaned_data["jekyll_repo_url"],
             dry_run=self.cleaned_data["dry_run"],
             use_git=True,
-        )
\ No newline at end of file
+        )
+
+
+class DistrictPeoplePageForm(WagtailAdminPageForm):
+    def save(self, *args, **kwargs):
+        # If anything inside the content field has changed,
+        # sync Octopus profiles just in case.
+        if "content" in self.changed_data:
+            collection_id = self.instance.root_page.image_collection_id
+
+            if collection_id is None:
+                collection_id = Collection.objects.first().id
+
+            for shortcut in self.instance.get_syncable_octopus_groups():
+                import_people_from_group.delay(
+                    self.instance.id,
+                    collection_id,
+                    shortcut,
+                )
+
+        return super().save(*args, **kwargs)
\ No newline at end of file
diff --git a/district/models.py b/district/models.py
index c87bab1d..21e60d28 100644
--- a/district/models.py
+++ b/district/models.py
@@ -71,7 +71,7 @@ from shared.utils import (
 )
 
 from . import blocks
-from .forms import JekyllImportForm
+from .forms import JekyllImportForm, DistrictPeoplePageForm
 
 CONTENT_BLOCKS = DEFAULT_CONTENT_BLOCKS + [
     ("chart", ChartBlock()),
@@ -575,6 +575,8 @@ class DistrictPersonPage(MainPersonPageMixin):
 
 
 class DistrictPeoplePage(MainPeoplePageMixin):
+    base_form_class = DistrictPeoplePageForm
+
     ### FIELDS
 
     content = StreamField(
@@ -614,7 +616,8 @@ class DistrictPeoplePage(MainPeoplePageMixin):
             if block.block_type == "octopus_group":
                 group_shortcuts.append(block.value["group_shortcut"])
 
-        return group_shortcuts
+        # Don't duplicate groups needlessly
+        return list(set(group_shortcuts))
 
 
 class DistrictCalendarPage(SubpageMixin, MetadataPageMixin, CalendarMixin, Page):
diff --git a/shared/people_import.py b/shared/people_import.py
index 26894a59..8c0fc83f 100644
--- a/shared/people_import.py
+++ b/shared/people_import.py
@@ -291,6 +291,14 @@ class PeopleGroupImporter:
                 person_page = self.person_page_model.objects.filter(person=person_instance).descendant_of(self.people_parent_page).first()
 
                 if person_page is None:
+                    if not isinstance(person_instance.display_name, str):
+                        logger.warning(
+                            "Skipping page creation for user %s, they have no display name",
+                            person_instance.username
+                        )
+                        
+                        continue
+
                     person_page = self.person_page_model(
                         person=person_instance,
                         is_automatically_created=True,
diff --git a/shared/templatetags/people_filters.py b/shared/templatetags/people_filters.py
index 2a172bbc..3d9e822a 100644
--- a/shared/templatetags/people_filters.py
+++ b/shared/templatetags/people_filters.py
@@ -8,7 +8,7 @@ def is_first_people_type(content, forloop):
     first_people_type_position = None
 
     for position, item in enumerate(content):
-        if item.block_type in ("people_group", "team_group"):
+        if item.block_type in ("octopus_group", "people_group", "team_group"):
             if first_people_type_position is None:
                 first_people_type_position = position
                 break
-- 
GitLab