From 2baddb98ab01d2a34e646e5c32748968e06b3857 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexa=20Valentov=C3=A1?= <git@imaniti.org>
Date: Fri, 4 Oct 2024 00:38:57 +0200
Subject: [PATCH] update team display, better import

---
 .../commands/octopus_people_import.py         | 10 ++--
 ...ctoctopuspersonpage_originating_display.py | 18 +++++++
 district/models.py                            | 52 +++++++++++++------
 district/tasks.py                             |  4 ++
 .../migrations/0011_octopusperson_position.py | 18 +++++++
 shared/models/main.py                         |  7 +++
 shared/people_import.py                       | 42 +++++++++++----
 7 files changed, 122 insertions(+), 29 deletions(-)
 create mode 100644 district/migrations/0292_districtoctopuspersonpage_originating_display.py
 create mode 100644 shared/migrations/0011_octopusperson_position.py

diff --git a/district/management/commands/octopus_people_import.py b/district/management/commands/octopus_people_import.py
index 82c81cd5..5c9e17b8 100644
--- a/district/management/commands/octopus_people_import.py
+++ b/district/management/commands/octopus_people_import.py
@@ -10,7 +10,7 @@ class Command(BaseCommand):
 
     def handle(self, *args, **options):
         for people_page in DistrictPeoplePage.objects.all():
-            for shortcut in people_page.get_syncable_octopus_groups():
+            for group in people_page.get_syncable_octopus_groups():
                 collection_id = people_page.root_page.image_collection_id
 
                 if collection_id is None:
@@ -19,11 +19,12 @@ class Command(BaseCommand):
                 import_people_from_group.delay(
                     people_page.id,
                     collection_id,
-                    shortcut,
+                    group["shortcut"],
+                    group["title"],
                 )
 
         for people_page in DistrictPeoplePage.objects.all():
-            for shortcut in people_page.get_syncable_octopus_teams():
+            for team in people_page.get_syncable_octopus_teams():
                 collection_id = people_page.root_page.image_collection_id
 
                 if collection_id is None:
@@ -32,5 +33,6 @@ class Command(BaseCommand):
                 import_people_from_team.delay(
                     people_page.id,
                     collection_id,
-                    shortcut,
+                    team["shortcut"],
+                    team["title"],
                 )
diff --git a/district/migrations/0292_districtoctopuspersonpage_originating_display.py b/district/migrations/0292_districtoctopuspersonpage_originating_display.py
new file mode 100644
index 00000000..2e2e761f
--- /dev/null
+++ b/district/migrations/0292_districtoctopuspersonpage_originating_display.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.0.7 on 2024-10-03 21:54
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('district', '0291_alter_districtpeoplepage_content'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='districtoctopuspersonpage',
+            name='originating_display',
+            field=models.CharField(blank=True, help_text='Název týmu nebo skupiny, ze kterých byla tato osba importována.', max_length=128, null=True, verbose_name='Název týmu/skupiny'),
+        ),
+    ]
diff --git a/district/models.py b/district/models.py
index c702a273..f04cff97 100644
--- a/district/models.py
+++ b/district/models.py
@@ -376,6 +376,14 @@ class DistrictOctopusPersonPage(
         null=True,
     )
 
+    originating_display = models.CharField(
+        verbose_name="Název týmu/skupiny",
+        help_text="Název týmu nebo skupiny, ze kterých byla tato osba importována.",
+        max_length=128,
+        blank=True,
+        null=True,
+    )
+
     ### PANELS
 
     content_panels = Page.content_panels + [
@@ -429,11 +437,12 @@ class DistrictOctopusPersonPage(
 
     @property
     def position(self) -> None:
-        return None
+        return self.person.position
 
     @property
     def primary_group(self) -> None:
-        return None
+        print(self.originating_display)
+        return self.originating_display
 
     @property
     def perex(self):
@@ -634,11 +643,14 @@ class DistrictPeoplePage(MainPeoplePageMixin):
             [
                 HelpPanel(
                     content=mark_safe(
-                        "Pokud chceš importovat skupinu osob z Chobotnice, můžeš přidat do "
-                        "sekce <em>Lidé a týmy</em> blok <em>Skupina z Chobotnice</em>. Do "
-                        "zkratky skupiny můžeš vyplnit například <em>cen_ao_ved</em> pro "
-                        "skupinu <a href='https://pi2.cz/chobo-ao'>Administrativní odbor - "
-                        " vedení</a>."
+                        "Pokud chceš importovat osoby z Chobotnice, můžeš přidat do sekce "
+                        "<em>Lidé a týmy</em> blok <em>Skupina z Chobotnice</em> nebo <em>"
+                        "Tým z Chobotnice</em>. Jako zkratku skupiny můžeš vyplnit "
+                        "například <em>cen_ao_ved</em> pro skupinu "
+                        "<a href='https://pi2.cz/chobo-ao'>Administrativní odbor - vedení</a>."
+                        "Jako zkratku týmu můžeš vyplnit např. <em>TO-admin</em> pro tým"
+                        "<a href='https://pi2.cz/chobo-to'>Administrátoři TO</a>. Při sync. "
+                        "týmů se do pozice osoby propíše role v daném týmu."
                     ),
                 ),
                 FieldPanel("content"),
@@ -657,24 +669,34 @@ class DistrictPeoplePage(MainPeoplePageMixin):
     ### OTHERS
 
     def get_syncable_octopus_groups(self):
-        group_shortcuts = []
+        groups = []
 
         for block in self.content:
             if block.block_type == "octopus_group":
-                group_shortcuts.append(block.value["group_shortcut"])
+                groups.append({
+                    "shortcut": block.value["group_shortcut"],
+                    "title": block.value["title"],
+                })
 
-        # Don't duplicate groups needlessly
-        return list(set(group_shortcuts))
+        # Remove duplicates by converting to a set of tuples and back to a list of dicts
+        unique_groups = [dict(g) for g in {tuple(group.items()) for group in groups}]
+
+        return unique_groups
 
     def get_syncable_octopus_teams(self):
-        team_shortcuts = []
+        teams = []
 
         for block in self.content:
             if block.block_type == "octopus_team":
-                team_shortcuts.append(block.value["team_shortcut"])
+                teams.append({
+                    "shortcut": block.value["team_shortcut"],
+                    "title": block.value["title"],
+                })
+
+        # Remove duplicates by converting to a set of tuples and back to a list of dicts
+        unique_teams = [dict(t) for t in {tuple(team.items()) for team in teams}]
 
-        # Don't duplicate groups needlessly
-        return list(set(team_shortcuts))
+        return unique_teams
 
 
 class DistrictCalendarPage(SubpageMixin, MetadataPageMixin, CalendarMixin, Page):
diff --git a/district/tasks.py b/district/tasks.py
index 10565e5b..1064cec4 100644
--- a/district/tasks.py
+++ b/district/tasks.py
@@ -36,6 +36,7 @@ def import_people_from_group(
     people_parent_page_id,
     collection_id,
     group_shortcut,
+    group_display
 ):
     from .models import DistrictOctopusPersonPage, DistrictPeoplePage
 
@@ -55,6 +56,7 @@ def import_people_from_group(
         person_page_model=DistrictOctopusPersonPage,
         collection_id=collection_id,
         group_shortcut=group_shortcut,
+        group_display=group_display,
         lock_file_name=lock_file_name,
     ).perform_import()
 
@@ -64,6 +66,7 @@ def import_people_from_team(
     people_parent_page_id,
     collection_id,
     team_shortcut,
+    team_display,
 ):
     from .models import DistrictOctopusPersonPage, DistrictPeoplePage
 
@@ -83,5 +86,6 @@ def import_people_from_team(
         person_page_model=DistrictOctopusPersonPage,
         collection_id=collection_id,
         team_shortcut=team_shortcut,
+        team_display=team_display,
         lock_file_name=lock_file_name,
     ).perform_import()
diff --git a/shared/migrations/0011_octopusperson_position.py b/shared/migrations/0011_octopusperson_position.py
new file mode 100644
index 00000000..5c275970
--- /dev/null
+++ b/shared/migrations/0011_octopusperson_position.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.0.7 on 2024-10-03 21:13
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('shared', '0010_alter_octopusperson_photo'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='octopusperson',
+            name='position',
+            field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Pozice'),
+        ),
+    ]
diff --git a/shared/models/main.py b/shared/models/main.py
index e8c74d1d..188f1996 100644
--- a/shared/models/main.py
+++ b/shared/models/main.py
@@ -2184,6 +2184,13 @@ class OctopusPerson(models.Model):
         null=True,
     )
 
+    position = models.CharField(
+        "Pozice",
+        max_length=128,
+        blank=True,
+        null=True,
+    )
+
     facebook_url = models.CharField(
         "Facebook URL",
         blank=True,
diff --git a/shared/people_import.py b/shared/people_import.py
index 8359297c..08c9d07f 100644
--- a/shared/people_import.py
+++ b/shared/people_import.py
@@ -25,6 +25,7 @@ class PeopleGroupImporter:
         person_page_model,
         collection_id,
         group_shortcut,
+        group_display,
         lock_file_name,
     ):
         try:
@@ -33,6 +34,7 @@ class PeopleGroupImporter:
             self.person_page_model = person_page_model
             self.collection_id = collection_id
             self.group_shortcut = group_shortcut
+            self.group_display = group_display
             self.lock_file_name = lock_file_name
 
             self.new_user_count = 0
@@ -298,7 +300,7 @@ class PeopleGroupImporter:
 
         return md5.hexdigest()
 
-    def perform_import(self):
+    def ppeople_idserform_import(self):
         logger.info(
             "Started Octopus person sync for page %s", self.people_parent_page_id
         )
@@ -328,12 +330,16 @@ class PeopleGroupImporter:
                         person=person_instance,
                         is_automatically_created=True,
                         originating_group=self.group_shortcut,
+                        originating_display=self.group_display,
                         title=person_instance.display_name,
                     )
 
                     self.people_parent_page.add_child(instance=person_page)
 
                     person_page.save_revision().publish()
+                else:
+                    person_page.originating_display = self.group_display
+                    person_page.save_revision().publish()
 
             # Delete old pages that correspond to profiles which aren't
             # part of the group we are importing anymore.
@@ -371,6 +377,7 @@ class PeopleTeamImporter:
         person_page_model,
         collection_id,
         team_shortcut,
+        team_display,
         lock_file_name,
     ):
         try:
@@ -379,6 +386,7 @@ class PeopleTeamImporter:
             self.person_page_model = person_page_model
             self.collection_id = collection_id
             self.team_shortcut = team_shortcut
+            self.team_display = team_display
             self.lock_file_name = lock_file_name
 
             self.new_user_count = 0
@@ -411,6 +419,7 @@ class PeopleTeamImporter:
                     edges {{
                       node {{
                         memberships {{
+                          roleDisplay
                           person {{
                             id
                           }}
@@ -424,13 +433,16 @@ class PeopleTeamImporter:
 
         result = self.client.execute(query)
 
-        user_ids = []
+        users = []
 
         for node in result["allTeams"]["edges"]:
             for membership in node["node"]["memberships"]:
-                user_ids.append(membership["person"]["id"])
+                users.append({
+                    "id": membership["person"]["id"],
+                    "role": membership["roleDisplay"]
+                })
 
-        return user_ids
+        return users
 
     def get_person_profile_from_id(self, id: str, kind: str):
         query = gql(
@@ -486,25 +498,30 @@ class PeopleTeamImporter:
     def get_processed_people_profiles(self, people_ids):
         people_profiles = {}
 
-        for person_id in people_ids:
+        for person in people_ids:
+            id = person["id"]
+            position = person["role"]
+
             prirotizied_profiles = []
 
             prirotizied_profiles.append(
-                self.get_person_profile_from_id(person_id, "POLITICAL")
+                self.get_person_profile_from_id(id, "POLITICAL")
             )
             prirotizied_profiles.append(
-                self.get_person_profile_from_id(person_id, "PIRATE")
+                self.get_person_profile_from_id(id, "PIRATE")
             )
 
             for profile in prirotizied_profiles:
                 if profile is None:
                     continue
 
-                people_profiles[person_id] = profile
+                people_profiles[id] = profile
                 break
 
-            if person_id not in people_profiles:
-                people_profiles[person_id] = None
+            if id not in people_profiles:
+                people_profiles[id] = None
+            else:
+                people_profiles[id]["position"] = position
 
         return people_profiles
 
@@ -540,6 +557,7 @@ class PeopleTeamImporter:
                 "degree_before": profile["person"]["degreeBeforeName"],
                 "degree_after": profile["person"]["degreeAfterName"],
                 "display_name": profile["person"]["displayName"],
+                "position": profile["position"]
             }
 
             if person is None:
@@ -674,12 +692,16 @@ class PeopleTeamImporter:
                         person=person_instance,
                         is_automatically_created=True,
                         originating_team=self.team_shortcut,
+                        originating_display=self.team_display,
                         title=person_instance.display_name,
                     )
 
                     self.people_parent_page.add_child(instance=person_page)
 
                     person_page.save_revision().publish()
+                else:
+                    person_page.originating_display = self.team_display
+                    person_page.save_revision().publish()
 
             # Delete old pages that correspond to profiles which aren't
             # part of the group we are importing anymore.
-- 
GitLab