Skip to content

Commit

Permalink
Create related teams for manually created groups
Browse files Browse the repository at this point in the history
And drop group prefix for the default organization.
  • Loading branch information
cutwater committed Mar 11, 2024
1 parent 6fb91ba commit 8767151
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 29 deletions.
5 changes: 3 additions & 2 deletions galaxy_ng/app/api/resource_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
ServiceAPIConfig,
SharedResource,
)
from ansible_base.resource_registry.shared_types import UserType, TeamType, OrganizationType
from ansible_base.resource_registry.shared_types import OrganizationType, TeamType, UserType

from galaxy_ng.app import models


Expand All @@ -26,5 +27,5 @@ class APIConfig(ServiceAPIConfig):
models.Organization,
shared_resource=SharedResource(serializer=OrganizationType, is_provider=False),
name_field="name",
)
),
)
19 changes: 6 additions & 13 deletions galaxy_ng/app/migrations/0050_organization_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,31 +15,24 @@ def create_default_organization(apps, schema_editor):
modified_on=now,
)

schema_editor.execute("""
schema_editor.execute(
"""
INSERT INTO galaxy_team (name, description, created_on, modified_on, group_id, organization_id)
SELECT grp.name, '', now(), now(), grp.id, %s
FROM auth_group AS grp
""", (org.id,))

schema_editor.execute("""
UPDATE auth_group SET name = %s || '::' || name
""", (settings.DEFAULT_ORGANIZATION_NAME,))
""",
(org.id,),
)


def delete_default_organization(apps, schema_editor):
db_alias = schema_editor.connection.alias
Team = apps.get_model("galaxy", "Team")
Organization = apps.get_model("galaxy", "Organization")

schema_editor.execute("""
UPDATE auth_group SET name = regexp_replace(name, '^.+?::', '')
""")

Team.objects.using(db_alias).delete()

Organization.objects.using(db_alias).filter(
name=settings.DEFAULT_ORGANIZATION_NAME
).delete()
Organization.objects.using(db_alias).filter(name=settings.DEFAULT_ORGANIZATION_NAME).delete()


class Migration(migrations.Migration):
Expand Down
49 changes: 35 additions & 14 deletions galaxy_ng/app/models/organization.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@

from ansible_base.lib.abstract_models import AbstractOrganization, AbstractTeam
from django.conf import settings
from django.contrib.auth.models import Group as BaseGroup
from django.db import models
from django_lifecycle import LifecycleModelMixin, hook, BEFORE_CREATE, AFTER_UPDATE
from django.db.models import signals
from django.dispatch import receiver
from django_lifecycle import AFTER_UPDATE, BEFORE_CREATE, LifecycleModelMixin, hook
from pulpcore.plugin.models import Group as PulpGroup

from galaxy_ng.app.models.auth import Group


class OrganizationManager(models.Manager):

def get_default(self) -> Organization:
"""Return default organization."""
return self.get(name=settings.DEFAULT_ORGANIZATION_NAME)
Expand All @@ -21,7 +24,7 @@ class Organization(LifecycleModelMixin, AbstractOrganization):
users = models.ManyToManyField(
settings.AUTH_USER_MODEL,
related_name="organizations",
help_text="The list of users in this organization."
help_text="The list of users in this organization.",
)

objects = OrganizationManager()
Expand All @@ -39,27 +42,45 @@ class Team(LifecycleModelMixin, AbstractTeam):
"""A team model."""

users = models.ManyToManyField(
settings.AUTH_USER_MODEL,
related_name="teams",
help_text="The list of users in this team."
settings.AUTH_USER_MODEL, related_name="teams", help_text="The list of users in this team."
)
group = models.OneToOneField(
Group,
on_delete=models.CASCADE,
related_name='+',
related_name="+",
help_text="Related group record.",
)

def group_name(self):
if self.organization.name == settings.DEFAULT_ORGANIZATION_NAME:
return self.name
return f"{self.organization.name}::{self.name}"

@hook(BEFORE_CREATE)
def _before_create(self):
if not hasattr(self, "group"):
self.group = Group.objects.create(name=self.group_name())
def _create_related_group(self, **kwargs):
if hasattr(self, "group"):
return
self.group = Group(name=self.group_name())
# NOTE(cutwater): This is a hack. Delete along with the signal handler below.
self.group._x_skip_create_team = True
self.group.save()

@hook(AFTER_UPDATE)
def _after_update(self):
if self.has_changed("name"):
self.group.name = self.group_name()
self.group.save()
def _rename_related_group(self, **kwargs):
if not self.has_changed("name"):
return
self.group.name = self.group_name()
self.group.save()


@receiver(signal=signals.post_save, sender=Group)
@receiver(signal=signals.post_save, sender=PulpGroup)
@receiver(signal=signals.post_save, sender=BaseGroup)
def _create_related_team(sender, instance, created, **kwargs):
if not created or getattr(instance, "_x_skip_create_team", False):
return
Team.objects.create(
name=instance.name,
organization=Organization.objects.get_default(),
group=instance,
)

0 comments on commit 8767151

Please sign in to comment.