-
Notifications
You must be signed in to change notification settings - Fork 175
Expand file tree
/
Copy pathsearch_projects.py
More file actions
159 lines (116 loc) · 3.83 KB
/
search_projects.py
File metadata and controls
159 lines (116 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
"""Actions for searching projects."""
from __future__ import annotations
from dataclasses import dataclass
from typing import override
from uuid import UUID
from ai.backend.common.data.permission.types import RBACElementType, ScopeType
from ai.backend.manager.actions.action import BaseActionResult
from ai.backend.manager.actions.types import ActionOperationType
from ai.backend.manager.data.group.types import GroupData
from ai.backend.manager.data.permission.types import RBACElementRef
from ai.backend.manager.repositories.base.querier import BatchQuerier
from ai.backend.manager.repositories.group.types import (
DomainProjectSearchScope,
UserProjectSearchScope,
)
from ai.backend.manager.services.group.actions.base import (
GroupAction,
ProjectScopeAction,
ProjectScopeActionResult,
ProjectSingleEntityAction,
ProjectSingleEntityActionResult,
)
@dataclass
class SearchProjectsAction(GroupAction):
"""Search all projects (admin scope - no scope filter)."""
querier: BatchQuerier
@override
def entity_id(self) -> str | None:
return None
@override
@classmethod
def operation_type(cls) -> ActionOperationType:
return ActionOperationType.SEARCH
@dataclass
class SearchProjectsByDomainAction(ProjectScopeAction):
"""Search projects within a domain."""
scope: DomainProjectSearchScope
querier: BatchQuerier
@override
@classmethod
def operation_type(cls) -> ActionOperationType:
return ActionOperationType.SEARCH
@override
def scope_type(self) -> ScopeType:
return ScopeType.DOMAIN
@override
def scope_id(self) -> str:
return self.scope.domain_name
@override
def target_element(self) -> RBACElementRef:
return RBACElementRef(RBACElementType.DOMAIN, self.scope.domain_name)
@dataclass
class SearchProjectsByUserAction(ProjectScopeAction):
"""Search projects a user is member of."""
scope: UserProjectSearchScope
querier: BatchQuerier
@override
@classmethod
def operation_type(cls) -> ActionOperationType:
return ActionOperationType.SEARCH
@override
def scope_type(self) -> ScopeType:
return ScopeType.USER
@override
def scope_id(self) -> str:
return str(self.scope.user_uuid)
@override
def target_element(self) -> RBACElementRef:
return RBACElementRef(RBACElementType.USER, str(self.scope.user_uuid))
@dataclass
class GetProjectAction(ProjectSingleEntityAction):
"""Get a single project by UUID."""
project_id: UUID
@override
@classmethod
def operation_type(cls) -> ActionOperationType:
return ActionOperationType.GET
@override
def target_entity_id(self) -> str:
return str(self.project_id)
@override
def target_element(self) -> RBACElementRef:
return RBACElementRef(RBACElementType.PROJECT, str(self.project_id))
# Result types
@dataclass
class SearchProjectsActionResult(BaseActionResult):
"""Result from searching projects (admin scope)."""
items: list[GroupData]
total_count: int
has_next_page: bool
has_previous_page: bool
@override
def entity_id(self) -> str | None:
return None
@dataclass
class ScopedSearchProjectsActionResult(ProjectScopeActionResult):
"""Result from searching projects within a scope."""
items: list[GroupData]
total_count: int
has_next_page: bool
has_previous_page: bool
_scope_type: ScopeType
_scope_id: str
@override
def scope_type(self) -> ScopeType:
return self._scope_type
@override
def scope_id(self) -> str:
return self._scope_id
@dataclass
class GetProjectActionResult(ProjectSingleEntityActionResult):
"""Result from getting a single project."""
data: GroupData
@override
def target_entity_id(self) -> str:
return str(self.data.id)