Skip to content

Commit 34d3eb8

Browse files
authored
Fixes AAP integration (#1727)
Fixes AAP integration with latest DAB version 2025.7.29 issue: https://issues.redhat.com/browse/AAP-50663 Signed-off-by: Djebran Lezzoum <[email protected]>
1 parent 1ed0553 commit 34d3eb8

File tree

8 files changed

+154
-7
lines changed

8 files changed

+154
-7
lines changed

ansible_ai_connect/main/settings/base.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
"ansible_ai_connect.healthcheck",
7878
"oauth2_provider",
7979
"import_export",
80+
"ansible_base.rbac",
8081
"ansible_base.resource_registry",
8182
"ansible_base.jwt_consumer",
8283
]
@@ -292,8 +293,9 @@ def is_ssl_enabled(value: str) -> bool:
292293
# ==========================================
293294
# Django Ansible Base configuration
294295
# ------------------------------------------
295-
ANSIBLE_BASE_TEAM_MODEL = None
296-
ANSIBLE_BASE_ORGANIZATION_MODEL = "ansible_ai_connect.organizations.models.Organization"
296+
ANSIBLE_BASE_TEAM_MODEL = "users.Team"
297+
ANSIBLE_BASE_ORGANIZATION_MODEL = "organizations.Organization"
298+
ANSIBLE_BASE_RBAC_MODEL_REGISTRY = {}
297299
ANSIBLE_BASE_RESOURCE_CONFIG_MODULE = "ansible_ai_connect.ai.resource_api"
298300
ANSIBLE_BASE_REST_FILTERS_RESERVED_NAMES = (
299301
"page",

ansible_ai_connect/users/apps.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
class UsersConfig(AppConfig):
1919
default_auto_field = "django.db.models.BigAutoField"
2020
name = "ansible_ai_connect.users"
21+
label = "users"
2122

2223
def ready(self) -> None:
2324
import ansible_ai_connect.users.signals # noqa: F401
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# Generated by Django 4.2.22 on 2025-08-01 11:21
2+
3+
import django.db.models.deletion
4+
from django.conf import settings
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
("organizations", "0004_organization_enable_anonymization"),
12+
("users", "0016_user_aap_user"),
13+
]
14+
15+
run_before = [("dab_rbac", "__first__")]
16+
17+
operations = [
18+
migrations.AlterModelOptions(
19+
name="user",
20+
options={},
21+
),
22+
migrations.CreateModel(
23+
name="Team",
24+
fields=[
25+
(
26+
"id",
27+
models.BigAutoField(
28+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
29+
),
30+
),
31+
(
32+
"modified",
33+
models.DateTimeField(
34+
auto_now=True, help_text="The date/time this resource was created."
35+
),
36+
),
37+
(
38+
"created",
39+
models.DateTimeField(
40+
auto_now_add=True, help_text="The date/time this resource was created."
41+
),
42+
),
43+
("name", models.CharField(help_text="The name of this resource.", max_length=512)),
44+
(
45+
"description",
46+
models.TextField(blank=True, default="", help_text="The team description."),
47+
),
48+
(
49+
"admins",
50+
models.ManyToManyField(
51+
blank=True,
52+
help_text="The list of admins for this team",
53+
related_name="teams_administered",
54+
to=settings.AUTH_USER_MODEL,
55+
),
56+
),
57+
(
58+
"created_by",
59+
models.ForeignKey(
60+
default=None,
61+
editable=False,
62+
help_text="The user who created this resource.",
63+
null=True,
64+
on_delete=django.db.models.deletion.SET_NULL,
65+
related_name="%(app_label)s_%(class)s_created+",
66+
to=settings.AUTH_USER_MODEL,
67+
),
68+
),
69+
(
70+
"modified_by",
71+
models.ForeignKey(
72+
default=None,
73+
editable=False,
74+
help_text="The user who last modified this resource.",
75+
null=True,
76+
on_delete=django.db.models.deletion.SET_NULL,
77+
related_name="%(app_label)s_%(class)s_modified+",
78+
to=settings.AUTH_USER_MODEL,
79+
),
80+
),
81+
(
82+
"organization",
83+
models.ForeignKey(
84+
help_text="The organization of this team.",
85+
on_delete=django.db.models.deletion.CASCADE,
86+
related_name="teams",
87+
to="organizations.organization",
88+
),
89+
),
90+
(
91+
"team_parents",
92+
models.ManyToManyField(
93+
blank=True, related_name="team_children", to="users.team"
94+
),
95+
),
96+
(
97+
"users",
98+
models.ManyToManyField(
99+
blank=True,
100+
help_text="The list of users on this team",
101+
related_name="teams",
102+
to=settings.AUTH_USER_MODEL,
103+
),
104+
),
105+
],
106+
options={
107+
"ordering": ["id"],
108+
"abstract": False,
109+
},
110+
),
111+
]

ansible_ai_connect/users/models.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import logging
1616
import uuid
1717

18+
from ansible_base.lib.abstract_models import AbstractTeam
19+
from ansible_base.resource_registry.fields import AnsibleResourceField
1820
from django.apps import apps
1921
from django.conf import settings
2022
from django.contrib.auth.models import AbstractUser
@@ -70,6 +72,9 @@ class User(ExportModelOperationsMixin("user"), AbstractUser):
7072
email_verified = models.BooleanField(default=False, null=True)
7173
aap_user = models.BooleanField(default=False)
7274

75+
class Meta:
76+
app_label = "users"
77+
7378
@property
7479
def org_id(self) -> int | None:
7580
if self.organization and self.organization.id:
@@ -147,7 +152,7 @@ def rh_aap_superuser(self) -> bool:
147152

148153
plans = models.ManyToManyField(
149154
Plan,
150-
through="UserPlan",
155+
through="users.UserPlan",
151156
through_fields=("user", "plan"),
152157
)
153158

@@ -171,3 +176,31 @@ def is_active(self):
171176
if not self.expired_at:
172177
return True
173178
return self.expired_at > timezone.now()
179+
180+
181+
class Team(AbstractTeam):
182+
"""A Team compatible with Django Ansible Base Teams"""
183+
184+
resource = AnsibleResourceField(primary_key_field="id")
185+
team_parents = models.ManyToManyField("Team", related_name="team_children", blank=True)
186+
187+
ignore_relations = []
188+
189+
class Meta:
190+
app_label = "users"
191+
ordering = ["id"]
192+
abstract = False
193+
194+
users = models.ManyToManyField(
195+
User,
196+
related_name="teams",
197+
blank=True,
198+
help_text="The list of users on this team",
199+
)
200+
201+
admins = models.ManyToManyField(
202+
User,
203+
related_name="teams_administered",
204+
blank=True,
205+
help_text="The list of admins for this team",
206+
)

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ dependencies = [
4848
'uwsgi-readiness-check~=0.2.0',
4949
'django-allow-cidr',
5050
'django-csp~=3.7',
51-
'django-ansible-base[jwt-consumer,resource-registry]>=2025.3.7',
51+
'django-ansible-base[jwt-consumer,resource-registry]>=2025.7.29',
5252
]
5353
readme = "README.rst"
5454
license = {text = "Apache-2.0"}

requirements-aarch64.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ django==4.2.22
123123
# social-auth-app-django
124124
django-allow-cidr==0.6.0
125125
# via -r requirements.in
126-
django-ansible-base[jwt-consumer,resource-registry]==2025.3.7
126+
django-ansible-base[jwt-consumer,resource-registry]==2025.7.29
127127
# via -r requirements.in
128128
django-crum==0.7.9
129129
# via django-ansible-base

requirements-x86_64.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ django==4.2.22
123123
# social-auth-app-django
124124
django-allow-cidr==0.6.0
125125
# via -r requirements.in
126-
django-ansible-base[jwt-consumer,resource-registry]==2025.3.7
126+
django-ansible-base[jwt-consumer,resource-registry]==2025.7.29
127127
# via -r requirements.in
128128
django-crum==0.7.9
129129
# via django-ansible-base

requirements.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,4 @@ uwsgi==2.0.22
7171
uwsgi-readiness-check==0.2.0
7272
django-allow-cidr==0.6.0
7373
django-csp==3.7
74-
django-ansible-base[jwt-consumer,resource-registry]==2025.3.7
74+
django-ansible-base[jwt-consumer,resource-registry]==2025.7.29

0 commit comments

Comments
 (0)