Skip to content

Commit 5bca5af

Browse files
fregataaclaude
andcommitted
fix(BA-3696): Derive scope info from creator.spec instead of requiring _domain_name parameter
- Remove _domain_name as a required field from CreateUserAction and CreateUserActionResult - Derive domain_name from creator.spec.domain_name (UserCreatorSpec) - Use TYPE_CHECKING and cast() to satisfy mypy without runtime imports - Fixes 8 test call sites that were missing _domain_name parameter Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent b5eca07 commit 5bca5af

2 files changed

Lines changed: 23 additions & 8 deletions

File tree

src/ai/backend/manager/services/user/actions/create_user.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from __future__ import annotations
2+
13
from dataclasses import dataclass
2-
from typing import override
4+
from typing import TYPE_CHECKING, cast, override
35

46
from ai.backend.common.data.permission.types import RBACElementType, ScopeType
57
from ai.backend.manager.actions.action import BaseActionResult
@@ -14,11 +16,13 @@
1416
UserScopeActionResult,
1517
)
1618

19+
if TYPE_CHECKING:
20+
from ai.backend.manager.repositories.user.creators import UserCreatorSpec
21+
1722

1823
@dataclass
1924
class CreateUserAction(UserScopeAction):
20-
creator: Creator[UserRow]
21-
_domain_name: str
25+
creator: Creator[UserRow] # spec: UserCreatorSpec
2226
group_ids: list[str] | None = None
2327

2428
@override
@@ -32,17 +36,28 @@ def scope_type(self) -> ScopeType:
3236

3337
@override
3438
def scope_id(self) -> str:
35-
return self._domain_name
39+
if TYPE_CHECKING:
40+
from ai.backend.manager.repositories.user.creators import UserCreatorSpec
41+
42+
spec = cast(UserCreatorSpec, self.creator.spec)
43+
else:
44+
spec = self.creator.spec
45+
return spec.domain_name
3646

3747
@override
3848
def target_element(self) -> RBACElementRef:
39-
return RBACElementRef(RBACElementType.DOMAIN, self._domain_name)
49+
if TYPE_CHECKING:
50+
from ai.backend.manager.repositories.user.creators import UserCreatorSpec
51+
52+
spec = cast(UserCreatorSpec, self.creator.spec)
53+
else:
54+
spec = self.creator.spec
55+
return RBACElementRef(RBACElementType.DOMAIN, spec.domain_name)
4056

4157

4258
@dataclass
4359
class CreateUserActionResult(UserScopeActionResult):
4460
data: UserCreateResultData
45-
_domain_name: str
4661

4762
@override
4863
def entity_id(self) -> str | None:
@@ -54,7 +69,8 @@ def scope_type(self) -> ScopeType:
5469

5570
@override
5671
def scope_id(self) -> str:
57-
return self._domain_name
72+
# UserCreateResultData always has domain_name set (from creator.spec.domain_name)
73+
return self.data.user.domain_name or ""
5874

5975

6076
@dataclass

src/ai/backend/manager/services/user/service.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ async def create_user(self, action: CreateUserAction) -> CreateUserActionResult:
102102
)
103103
return CreateUserActionResult(
104104
data=user_data_result,
105-
_domain_name=action.scope_id(),
106105
)
107106

108107
async def bulk_create_users(self, action: BulkCreateUserAction) -> BulkCreateUserActionResult:

0 commit comments

Comments
 (0)