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