diff --git a/district/migrations/0263_districtoctopuspersonpage_is_automatically_created_and_more.py b/district/migrations/0263_districtoctopuspersonpage_is_automatically_created_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..52e49402b5c7741f6e330276fbc756a6d7c2351f --- /dev/null +++ b/district/migrations/0263_districtoctopuspersonpage_is_automatically_created_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 5.0.7 on 2024-07-30 17:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('district', '0262_alter_districtcenterpage_content_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='districtoctopuspersonpage', + name='is_automatically_created', + field=models.BooleanField(default=True, help_text='Pokud vytváříš stránku pro osobu z Chobotnice manuálně, toto pole by nemělo být zaškrtlé. V ostatních případech ho zaškrtlé nech.', verbose_name='Profil vytvořen automaticky'), + preserve_default=False, + ), + migrations.AddField( + model_name='districtoctopuspersonpage', + name='originating_group', + field=models.CharField(default='', help_text='Skupina, ze které byla tato osba importována', max_length=128, verbose_name='Skupina'), + preserve_default=False, + ), + ] diff --git a/district/models.py b/district/models.py index fda8b985e06a0ba697fb9bbfdba8a80823e4cc7d..2ab805900cfc3eb9ffc6b227f9112e6543d24055 100644 --- a/district/models.py +++ b/district/models.py @@ -321,10 +321,27 @@ class DistrictOctopusPersonPage(ExtendedMetadataPageMixin, SubpageMixin, Metadat verbose_name="Osoba" ) + is_automatically_created = models.BooleanField( + verbose_name="Profil vytvořen automaticky", + help_text=( + "Pokud vytváříš stránku pro osobu z Chobotnice manuálně, " + "toto pole by nemělo být zaškrtlé. V ostatních případech " + "ho zaškrtlé nech." + ) + ) + + # Shouldn't be visible in the admin interface + originating_group = models.CharField( + verbose_name="Skupina", + help_text="Skupina, ze které byla tato osba importována", + max_length=128 + ) + ### PANELS content_panels = Page.content_panels + [ FieldPanel("person"), + FieldPanel("is_automatically_created") ] ### RELATIONS diff --git a/district/tasks.py b/district/tasks.py index 4f24dd2c89e92adf817a24c5f4514e1754838ff4..1f03829a8fe3fc1c7754b248e453bd63ae4a71c8 100644 --- a/district/tasks.py +++ b/district/tasks.py @@ -36,12 +36,12 @@ def import_people_from_group( group_shortcut, lock_file_name ): - from .models import DistrictPeoplePage, DistrictPersonPage + from .models import DistrictPeoplePage, DistrictOctopusPersonPage return PeopleGroupImporter( people_parent_page_id=people_parent_page_id, people_parent_page_model=DistrictPeoplePage, - person_page_model=DistrictPersonPage, + person_page_model=DistrictOctopusPersonPage, collection_id=collection_id, group_shortcut=group_shortcut, lock_file_name=lock_file_name, diff --git a/shared/people_import.py b/shared/people_import.py index d6bafe37c958a5b33f08f5117e12e504a3271901..26894a590724dc8e07c6f00230af04915abaf6a7 100644 --- a/shared/people_import.py +++ b/shared/people_import.py @@ -1,6 +1,7 @@ from gql import gql, Client from gql.transport.aiohttp import AIOHTTPTransport from django.conf import settings +from django.db import models from shared.models import OctopusPerson import os import logging @@ -36,6 +37,7 @@ class PeopleGroupImporter: self.new_user_count = 0 self.existing_user_count = 0 + self.people_parent_page = self.people_parent_page_model.objects.get(id=self.people_parent_page_id) self.collection = Collection.objects.get(id=self.collection_id) self.transport = AIOHTTPTransport(url=settings.OCTOPUS_API_URL) @@ -285,7 +287,28 @@ class PeopleGroupImporter: people_profiles = self.get_processed_people_profiles(people_ids) people_instances = self.create_and_update_people_models(people_profiles) - + for person_instance in people_instances: + person_page = self.person_page_model.objects.filter(person=person_instance).descendant_of(self.people_parent_page).first() + + if person_page is None: + person_page = self.person_page_model( + person=person_instance, + is_automatically_created=True, + originating_group=self.group_shortcut, + title=person_instance.display_name, + ) + + self.people_parent_page.add_child(instance=person_page) + + person_page.save_revision().publish() + + # Delete old pages that correspond to profiles which aren't + # part of the group we are importing anymore. + self.person_page_model.objects.filter( + ~models.Q(person__in=people_instances), + originating_group=self.group_shortcut, + is_automatically_created=True + ).descendant_of(self.people_parent_page).delete() finally: # No matter what happens, at least remove the lockfile.