Skip to content
Snippets Groups Projects
Commit ffea67a2 authored by Alexa Valentová's avatar Alexa Valentová
Browse files

attempt fixing Octopus import

parent 4786753c
No related branches found
No related tags found
2 merge requests!1195Release,!1194Try fixing Octopus imports
......@@ -150,7 +150,7 @@ class OctopusMixin(blocks.StructBlock):
context["person_list"] = (
DistrictOctopusPersonPage.objects.filter(
originating_group=value["group_shortcut"]
originating_groups__name=value["group_shortcut"]
)
.order_by("person__order", "title")
.all()
......@@ -208,7 +208,7 @@ class OctopusTeamBlock(OctopusMixin):
context = blocks.StructBlock.get_context(self, value, *args, **kwargs)
filter = Q(
originating_team=value["team_shortcut"],
originating_teams__name=value["team_shortcut"],
)
if value["roles"]:
......
import os
import tempfile
from shared.forms import ArticlesPageForm as SharedArticlesPageForm
from shared.forms import JekyllImportForm as SharedJekyllImportForm
from .tasks import (
import_jekyll_articles,
)
from .tasks import import_jekyll_articles
class JekyllImportForm(SharedJekyllImportForm):
......
# Generated by Django 5.0.7 on 2024-11-27 14:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('district', '0303_alter_districtcenterpage_content'),
('shared', '0014_octopuspersonoriginatinggroup_and_more'),
]
operations = [
migrations.RemoveField(
model_name='districtoctopuspersonpage',
name='originating_group',
),
migrations.RemoveField(
model_name='districtoctopuspersonpage',
name='originating_team',
),
migrations.AddField(
model_name='districtoctopuspersonpage',
name='originating_groups',
field=models.ManyToManyField(help_text='Skupiny, ze kterých byla tato osba importována.', to='shared.octopuspersonoriginatinggroup', verbose_name='Skupiny'),
),
migrations.AddField(
model_name='districtoctopuspersonpage',
name='originating_teams',
field=models.ManyToManyField(help_text='Týmy, ze kterých byla tato osba importována.', to='shared.octopuspersonoriginatingteam', verbose_name='Tým'),
),
]
......@@ -558,20 +558,16 @@ class DistrictOctopusPersonPage(
default=False,
)
originating_group = models.CharField(
verbose_name="Skupina",
help_text="Skupina, ze které byla tato osba importována.",
max_length=128,
blank=True,
null=True,
originating_groups = models.ManyToManyField(
"shared.OctopusPersonOriginatingGroup",
verbose_name="Skupiny",
help_text="Skupiny, ze kterých byla tato osba importována.",
)
originating_team = models.CharField(
originating_teams = models.ManyToManyField(
"shared.OctopusPersonOriginatingTeam",
verbose_name="Tým",
help_text="Tým, ze kterého byla tato osba importována.",
max_length=128,
blank=True,
null=True,
help_text="Týmy, ze kterých byla tato osba importována.",
)
originating_role = models.CharField(
......@@ -595,8 +591,8 @@ class DistrictOctopusPersonPage(
content_panels = Page.content_panels + [
FieldPanel("person"),
FieldPanel("is_automatically_created", read_only=True),
FieldPanel("originating_group", read_only=True),
FieldPanel("originating_team", read_only=True),
FieldPanel("originating_groups", read_only=True),
FieldPanel("originating_teams", read_only=True),
]
### RELATIONS
......
......@@ -9,15 +9,15 @@ def get_block_octopus_person_list(block):
from district.models import DistrictOctopusPersonPage
filter = (
models.Q(originating_group=block.value["group_shortcut"])
models.Q(originating_groups__name=block.value["group_shortcut"])
if "group_shortcut" in block.value
else (
models.Q(
originating_team=block.value["team_shortcut"],
originating_teams__name=block.value["team_shortcut"],
originating_role__in=block.value["roles"].split(","),
)
if block.value["roles"]
else models.Q(originating_team=block.value["team_shortcut"])
else models.Q(originating_teams__name=block.value["team_shortcut"])
)
)
......
# Generated by Django 5.0.7 on 2024-11-27 14:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shared', '0013_alter_octopusperson_order'),
]
operations = [
migrations.CreateModel(
name='OctopusPersonOriginatingGroup',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128)),
],
),
migrations.CreateModel(
name='OctopusPersonOriginatingTeam',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128)),
],
),
]
......@@ -2330,4 +2330,18 @@ class OctopusPerson(models.Model):
ordering = ["order"]
class OctopusPersonOriginatingTeam(models.Model):
name = models.CharField(max_length=128, blank=False, null=False)
def __str__(self) -> str:
return self.name
class OctopusPersonOriginatingGroup(models.Model):
name = models.CharField(max_length=128, blank=False, null=False)
def __str__(self) -> str:
return self.name
# --- END Django-only models ---
......@@ -6,13 +6,16 @@ from io import BytesIO
import requests
from django.conf import settings
from django.core.files.images import ImageFile
from django.db import models
from gql import Client, gql
from gql.transport.aiohttp import AIOHTTPTransport
from wagtail.images.models import Image
from wagtail.models.media import Collection
from shared.models import OctopusPerson
from shared.models import (
OctopusPerson,
OctopusPersonOriginatingGroup,
OctopusPersonOriginatingTeam,
)
logger = logging.getLogger(__name__)
......@@ -60,6 +63,17 @@ class ImporterMixin:
"display_name": profile["person"]["displayName"],
}
verifiably_inexsistent_person = OctopusPerson.objects.filter(
octopus_id=person_id
).first()
print(verifiably_inexsistent_person)
# For some reason, probably due to integrity issues somewhere, the person
# can end up existing. FIXME
if person is None and verifiably_inexsistent_person is not None:
person = verifiably_inexsistent_person
if person is None:
if hasattr(self, "new_user_count"):
self.new_user_count += 1
......@@ -332,6 +346,10 @@ class PeopleGroupImporter(ImporterMixin):
.first()
)
originating_group = OctopusPersonOriginatingGroup.objects.get_or_create(
name=self.group_shortcut
)[0]
if person_page is None:
if not isinstance(person_instance.display_name, str):
logger.warning(
......@@ -344,7 +362,6 @@ class PeopleGroupImporter(ImporterMixin):
person_page = self.person_page_model(
person=person_instance,
is_automatically_created=True,
originating_group=self.group_shortcut,
originating_display=self.group_display,
title=person_instance.display_name,
)
......@@ -352,17 +369,24 @@ class PeopleGroupImporter(ImporterMixin):
self.people_parent_page.add_child(instance=person_page)
person_page.save_revision().publish()
person_page.originating_groups.add(originating_group)
else:
if not person_page.originating_groups.filter(
id=originating_group.id
).exists():
person_page.originating_groups.add(originating_group)
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.
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()
# self.person_page_model.objects.filter(
# ~models.Q(person__in=people_instances),
# originating_groups__name=self.group_shortcut,
# is_automatically_created=True,
# ).descendant_of(self.people_parent_page).delete()
finally:
# No matter what happens, at least remove the lockfile.
......@@ -520,13 +544,23 @@ class PeopleTeamImporter(ImporterMixin):
people_profiles = self.get_processed_people_profiles(people_ids)
people_instances = self.create_and_update_people_models(people_profiles)
print("People instances:", people_instances, "DONE")
for person_instance in people_instances:
print(f"Person instance:", person_instance, "DONE")
person_page = (
self.person_page_model.objects.filter(person=person_instance)
.descendant_of(self.people_parent_page)
.first()
)
originating_team = OctopusPersonOriginatingTeam.objects.get_or_create(
name=self.team_shortcut
)[0]
print("Person page:", person_page, "DONE")
if person_page is None:
if not isinstance(person_instance.display_name, str):
logger.warning(
......@@ -539,20 +573,53 @@ class PeopleTeamImporter(ImporterMixin):
person_page = self.person_page_model(
person=person_instance,
is_automatically_created=True,
originating_team=self.team_shortcut,
originating_display=self.team_display,
title=person_instance.display_name,
)
if len(self.team_roles) != 0:
person_page.originating_role = person_instance.position
last_child = self.people_parent_page.get_last_child()
if last_child is None:
# Handle empty parent case
new_path = (
self.people_parent_page.path + "0001"
) # Example path increment
else:
new_path = last_child._inc_path()
self.people_parent_page.add_child(instance=person_page)
person_page.path = new_path
self.people_parent_page.add_child(instance=person_page)
person_page.save_revision().publish()
person_page.originating_teams.add(originating_team)
if len(self.team_roles) != 0:
person_page.originating_role = person_instance.position
person_page.save()
else:
person_page.originating_display = self.team_display
currently_valid_teams = [
team["shortcut"]
for team in self.people_parent_page.get_syncable_octopus_teams()
]
originating_teams = list(person_page.originating_teams.all())
for existing_originating_team in originating_teams:
if existing_originating_team.name not in currently_valid_teams:
person_page.originating_teams.remove(
existing_originating_team
)
if not person_page.originating_teams.filter(
id=originating_team.id
).exists():
person_page.originating_teams.add(originating_team)
person_page.save()
if len(self.team_roles) != 0:
person_page.originating_role = person_instance.position
......@@ -561,18 +628,18 @@ class PeopleTeamImporter(ImporterMixin):
# Delete old pages that correspond to profiles which aren't
# part of the group we are importing anymore.
filter = models.Q(
~models.Q(person__in=people_instances),
originating_team=self.team_shortcut,
is_automatically_created=True,
)
if len(self.team_roles) != 0:
filter = filter & models.Q(originating_role__in=self.team_roles)
self.person_page_model.objects.filter(filter).descendant_of(
self.people_parent_page
).delete()
# filter = models.Q(
# ~models.Q(person__in=people_instances),
# originating_team=self.team_shortcut,
# is_automatically_created=True,
# )
#
# if len(self.team_roles) != 0:
# filter = filter & models.Q(originating_role__in=self.team_roles)
#
# self.person_page_model.objects.filter(filter).descendant_of(
# self.people_parent_page
# ).delete()
finally:
# No matter what happens, at least remove the lockfile.
......
# Generated by Django 5.0.7 on 2024-11-22 11:38
from django.db import migrations
def fix_po_people_page(apps, schema_editor):
# DistrictPeoplePage = apps.get_model("district", "DistrictPeoplePage")
# NOTE: Can't have this for the save_revision() method
from uniweb.models import UniwebPeoplePage
page = UniwebPeoplePage.objects.filter(id=30017).first()
if page is None:
return
page.content = page.content.get_prep_value()
page.save()
page.save_revision().publish()
class Migration(migrations.Migration):
dependencies = [
('uniweb', '0113_alter_uniwebhomepage_dark_logo_and_more'),
]
operations = [
migrations.RunPython(fix_po_people_page)
]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment