diff --git a/src/spaceone/dashboard/manager/identity_manager.py b/src/spaceone/dashboard/manager/identity_manager.py index 0164d96..615ee47 100644 --- a/src/spaceone/dashboard/manager/identity_manager.py +++ b/src/spaceone/dashboard/manager/identity_manager.py @@ -19,6 +19,11 @@ def check_workspace(self, workspace_id: str, domain_id: str) -> None: token=system_token, ) + def check_project_group(self, project_group_id: str) -> None: + self.identity_conn.dispatch( + "ProjectGroup.get", {"project_group_id": project_group_id} + ) + def get_project(self, project_id: str) -> dict: return self.identity_conn.dispatch("Project.get", {"project_id": project_id}) diff --git a/src/spaceone/dashboard/manager/public_folder_manager.py b/src/spaceone/dashboard/manager/public_folder_manager.py index 1c0297f..94b032a 100644 --- a/src/spaceone/dashboard/manager/public_folder_manager.py +++ b/src/spaceone/dashboard/manager/public_folder_manager.py @@ -51,6 +51,7 @@ def get_public_folder( workspace_id: str = None, user_projects=None, resource_group=None, + project_group_id=None, ) -> PublicFolder: conditions = { "folder_id": folder_id, @@ -66,6 +67,9 @@ def get_public_folder( if resource_group: conditions["resource_group"] = resource_group + if project_group_id: + conditions["project_group_id"] = project_group_id + return self.folder_model.get(**conditions) def filter_public_folders(self, **conditions) -> QuerySet: diff --git a/src/spaceone/dashboard/model/private_dashboard/database.py b/src/spaceone/dashboard/model/private_dashboard/database.py index 866fdcb..6f05f6f 100644 --- a/src/spaceone/dashboard/model/private_dashboard/database.py +++ b/src/spaceone/dashboard/model/private_dashboard/database.py @@ -18,6 +18,7 @@ class PrivateDashboard(MongoModel): tags = DictField(default=None) folder_id = StringField(max_length=40, default=None, null=True) user_id = StringField(max_length=40) + project_group_id = StringField(max_length=40) workspace_id = StringField(max_length=40, default=None, null=True) domain_id = StringField(max_length=40) created_at = DateTimeField(auto_now_add=True) @@ -42,6 +43,7 @@ class PrivateDashboard(MongoModel): "name", "version", "user_id", + "project_group_id", "workspace_id", "domain_id", ], @@ -49,6 +51,7 @@ class PrivateDashboard(MongoModel): "indexes": [ "name", "user_id", + "project_group_id", "workspace_id", "domain_id", ], diff --git a/src/spaceone/dashboard/model/private_dashboard/request.py b/src/spaceone/dashboard/model/private_dashboard/request.py index 79f1850..6b834e6 100644 --- a/src/spaceone/dashboard/model/private_dashboard/request.py +++ b/src/spaceone/dashboard/model/private_dashboard/request.py @@ -25,6 +25,7 @@ class PrivateDashboardCreateRequest(BaseModel): tags: Union[dict, None] = None folder_id: Union[str, None] = None user_id: str + project_group_id: Union[str, None] = None workspace_id: Union[str, None] = None domain_id: str @@ -72,6 +73,7 @@ class PrivateDashboardSearchQueryRequest(BaseModel): folder_id: Union[str, None] = None workspace_id: Union[str, None] = None user_id: str + project_group_id: Union[str, None] = None domain_id: str diff --git a/src/spaceone/dashboard/model/private_dashboard/response.py b/src/spaceone/dashboard/model/private_dashboard/response.py index 0d5ff4a..b2a13c5 100644 --- a/src/spaceone/dashboard/model/private_dashboard/response.py +++ b/src/spaceone/dashboard/model/private_dashboard/response.py @@ -21,6 +21,7 @@ class PrivateDashboardResponse(BaseModel): tags: Union[dict, None] = None folder_id: Union[str, None] = None user_id: Union[str, None] = None + project_group_id: Union[str, None] = None workspace_id: Union[str, None] = None domain_id: Union[str, None] = None created_at: Union[datetime, None] = None diff --git a/src/spaceone/dashboard/model/private_folder/database.py b/src/spaceone/dashboard/model/private_folder/database.py index 6d700ee..52bc8ac 100644 --- a/src/spaceone/dashboard/model/private_folder/database.py +++ b/src/spaceone/dashboard/model/private_folder/database.py @@ -11,6 +11,7 @@ class PrivateFolder(MongoModel): max_length=40, choices=("DOMAIN", "WORKSPACE", "PROJECT") ) user_id = StringField(max_length=40) + project_group_id = StringField(max_length=40) workspace_id = StringField(max_length=40, default=None, null=True) domain_id = StringField(max_length=40) created_at = DateTimeField(auto_now_add=True) @@ -25,6 +26,7 @@ class PrivateFolder(MongoModel): "folder_id", "name", "user_id", + "project_group_id", "workspace_id", "domain_id", ], @@ -32,6 +34,7 @@ class PrivateFolder(MongoModel): "indexes": [ "name", "user_id", + "project_group_id", "workspace_id", "domain_id", ], diff --git a/src/spaceone/dashboard/model/private_folder/request.py b/src/spaceone/dashboard/model/private_folder/request.py index 9083360..c42671a 100644 --- a/src/spaceone/dashboard/model/private_folder/request.py +++ b/src/spaceone/dashboard/model/private_folder/request.py @@ -16,6 +16,7 @@ class PrivateFolderCreateRequest(BaseModel): tags: Union[dict, None] = None dashboards: Union[list, None] = None user_id: str + project_group_id: Union[str, None] = None workspace_id: Union[str, None] = None domain_id: str @@ -45,6 +46,7 @@ class PrivateFolderSearchQueryRequest(BaseModel): folder_id: Union[str, None] = None name: Union[str, None] = None user_id: str + project_group_id: Union[str, None] = None workspace_id: Union[str, None] = None domain_id: str diff --git a/src/spaceone/dashboard/model/private_folder/response.py b/src/spaceone/dashboard/model/private_folder/response.py index 8d2e140..fb0e589 100644 --- a/src/spaceone/dashboard/model/private_folder/response.py +++ b/src/spaceone/dashboard/model/private_folder/response.py @@ -11,6 +11,7 @@ class PrivateFolderResponse(BaseModel): name: Union[str, None] = None tags: Union[dict, None] = None user_id: Union[str, None] = None + project_group_id: Union[str, None] = None workspace_id: Union[str, None] = None domain_id: Union[str, None] = None created_at: Union[datetime, None] = None diff --git a/src/spaceone/dashboard/model/public_dashboard/database.py b/src/spaceone/dashboard/model/public_dashboard/database.py index a9fb9a8..379f2af 100644 --- a/src/spaceone/dashboard/model/public_dashboard/database.py +++ b/src/spaceone/dashboard/model/public_dashboard/database.py @@ -23,6 +23,7 @@ class PublicDashboard(MongoModel): ) folder_id = StringField(max_length=40, default=None, null=True) project_id = StringField(max_length=40) + project_group_id = StringField(max_length=40) workspace_id = StringField(max_length=40) domain_id = StringField(max_length=40) created_at = DateTimeField(auto_now_add=True) @@ -44,6 +45,7 @@ class PublicDashboard(MongoModel): "scope", "folder_id", "project_id", + "project_group_id", "workspace_id", ], "minimal_fields": [ @@ -53,6 +55,7 @@ class PublicDashboard(MongoModel): "shared", "resource_group", "project_id", + "project_group_id", "workspace_id", "domain_id", ], @@ -64,6 +67,7 @@ class PublicDashboard(MongoModel): "scope", "resource_group", "project_id", + "project_group_id", "workspace_id", "domain_id", ], diff --git a/src/spaceone/dashboard/model/public_dashboard/request.py b/src/spaceone/dashboard/model/public_dashboard/request.py index 17de385..31791a7 100644 --- a/src/spaceone/dashboard/model/public_dashboard/request.py +++ b/src/spaceone/dashboard/model/public_dashboard/request.py @@ -32,6 +32,7 @@ class PublicDashboardCreateRequest(BaseModel): folder_id: Union[str, None] = None resource_group: ResourceGroup project_id: Union[str, None] = None + project_group_id: Union[str, None] = None workspace_id: Union[str, None] = None domain_id: str user_projects: Union[list, None] = None @@ -101,6 +102,7 @@ class PublicDashboardSearchQueryRequest(BaseModel): scope: Union[Scope, None] = None folder_id: Union[str, None] = None project_id: Union[str, None] = None + project_group_id: Union[str, None] = None workspace_id: Union[str, list, None] = None domain_id: str user_projects: Union[list, None] = None diff --git a/src/spaceone/dashboard/model/public_dashboard/response.py b/src/spaceone/dashboard/model/public_dashboard/response.py index 7f60c06..376ee62 100644 --- a/src/spaceone/dashboard/model/public_dashboard/response.py +++ b/src/spaceone/dashboard/model/public_dashboard/response.py @@ -26,6 +26,7 @@ class PublicDashboardResponse(BaseModel): folder_id: Union[str, None] = None resource_group: Union[ResourceGroup, None] = None project_id: Union[str, None] = None + project_group_id: Union[str, None] = None workspace_id: Union[str, None] = None domain_id: Union[str, None] = None created_at: Union[datetime, None] = None diff --git a/src/spaceone/dashboard/model/public_folder/database.py b/src/spaceone/dashboard/model/public_folder/database.py index f079bf7..a231879 100644 --- a/src/spaceone/dashboard/model/public_folder/database.py +++ b/src/spaceone/dashboard/model/public_folder/database.py @@ -13,6 +13,7 @@ class PublicFolder(MongoModel): max_length=40, choices=("DOMAIN", "WORKSPACE", "PROJECT") ) project_id = StringField(max_length=40) + project_group_id = StringField(max_length=40) workspace_id = StringField(max_length=40) domain_id = StringField(max_length=40) created_at = DateTimeField(auto_now_add=True) @@ -25,6 +26,7 @@ class PublicFolder(MongoModel): "shared", "scope", "project_id", + "project_group_id", "workspace_id", ], "minimal_fields": [ @@ -32,6 +34,7 @@ class PublicFolder(MongoModel): "name", "resource_group", "project_id", + "project_group_id", "workspace_id", "domain_id", ], @@ -43,6 +46,7 @@ class PublicFolder(MongoModel): "scope", "resource_group", "project_id", + "project_group_id", "workspace_id", "domain_id", ], diff --git a/src/spaceone/dashboard/model/public_folder/request.py b/src/spaceone/dashboard/model/public_folder/request.py index a190e5d..07510aa 100644 --- a/src/spaceone/dashboard/model/public_folder/request.py +++ b/src/spaceone/dashboard/model/public_folder/request.py @@ -23,6 +23,7 @@ class PublicFolderCreateRequest(BaseModel): dashboards: Union[list, None] = None resource_group: ResourceGroup project_id: Union[str, None] = None + project_group_id: Union[str, None] = None workspace_id: Union[str, None] = None domain_id: str @@ -72,6 +73,7 @@ class PublicFolderSearchQueryRequest(BaseModel): shared: Union[bool, None] = None scope: Union[Scope, None] = None project_id: Union[str, None] = None + project_group_id: Union[str, None] = None workspace_id: Union[str, list, None] = None domain_id: str user_projects: Union[list, None] = None diff --git a/src/spaceone/dashboard/model/public_folder/response.py b/src/spaceone/dashboard/model/public_folder/response.py index 5e45249..a279215 100644 --- a/src/spaceone/dashboard/model/public_folder/response.py +++ b/src/spaceone/dashboard/model/public_folder/response.py @@ -16,6 +16,7 @@ class PublicFolderResponse(BaseModel): scope: Union[str, None] = None resource_group: Union[ResourceGroup, None] = None project_id: Union[str, None] = None + project_group_id: Union[str, None] = None workspace_id: Union[str, None] = None domain_id: Union[str, None] = None created_at: Union[datetime, None] = None diff --git a/src/spaceone/dashboard/service/private_dashboard_service.py b/src/spaceone/dashboard/service/private_dashboard_service.py index 9b03403..bdfc573 100644 --- a/src/spaceone/dashboard/service/private_dashboard_service.py +++ b/src/spaceone/dashboard/service/private_dashboard_service.py @@ -50,6 +50,7 @@ def create( 'tags': 'dict', 'folder_id': 'str', 'workspace_id': 'str', + 'project_group_id': 'str', 'user_id': 'str', # injected from auth (required) 'domain_id': 'str' # injected from auth (required) } @@ -66,6 +67,7 @@ def create_dashboard(self, params_dict: dict) -> dict: domain_id = params_dict["domain_id"] user_id = params_dict["user_id"] workspace_id = params_dict.get("workspace_id") + project_group_id = params_dict.get("project_group_id") layouts = params_dict.get("layouts") if layouts: @@ -78,6 +80,9 @@ def create_dashboard(self, params_dict: dict) -> dict: if workspace_id: self.identity_mgr.check_workspace(workspace_id, domain_id) + if project_group_id: + self.identity_mgr.check_project_group(project_group_id) + pri_dashboard_vo = self.pri_dashboard_mgr.create_private_dashboard(params_dict) if layouts: @@ -252,7 +257,15 @@ def get( role_types=["USER"], ) @append_query_filter( - ["dashboard_id", "name", "domain_id", "workspace_id", "user_id", "folder_id"] + [ + "dashboard_id", + "name", + "domain_id", + "workspace_id", + "user_id", + "project_group_id", + "folder_id", + ] ) @append_keyword_filter(["dashboard_id", "name"]) @convert_model @@ -268,6 +281,7 @@ def list( 'name': 'str', 'folder_id': 'str', 'user_id': 'str', # injected from auth (required) + 'project_group_id': 'str', 'workspace_id': 'str', 'domain_id': 'str', # injected from auth (required) } diff --git a/src/spaceone/dashboard/service/private_folder_service.py b/src/spaceone/dashboard/service/private_folder_service.py index b91be1f..a8ee1d7 100644 --- a/src/spaceone/dashboard/service/private_folder_service.py +++ b/src/spaceone/dashboard/service/private_folder_service.py @@ -40,6 +40,7 @@ def create( 'tags': 'dict', 'dashboards': 'list', 'workspace_id': 'str', + 'project_group_id': 'str', 'user_id': 'str', # injected from auth (required) 'domain_id': 'str' # injected from auth (required) } @@ -148,7 +149,16 @@ def get( permission="dashboard:PrivateFolder.read", role_types=["USER"], ) - @append_query_filter(["folder_id", "name", "domain_id", "workspace_id", "user_id"]) + @append_query_filter( + [ + "folder_id", + "name", + "domain_id", + "workspace_id", + "project_group_id", + "user_id", + ] + ) @append_keyword_filter(["folder_id", "name"]) @convert_model def list( @@ -162,6 +172,7 @@ def list( 'folder_id': 'str', 'name': 'str', 'user_id': 'str', # injected from auth (required) + 'project_group_id': 'str', 'workspace_id': 'str', 'domain_id': 'str', # injected from auth (required) } diff --git a/src/spaceone/dashboard/service/public_dashboard_service.py b/src/spaceone/dashboard/service/public_dashboard_service.py index d925064..55d1e42 100644 --- a/src/spaceone/dashboard/service/public_dashboard_service.py +++ b/src/spaceone/dashboard/service/public_dashboard_service.py @@ -53,6 +53,7 @@ def create( 'folder_id': 'str', 'resource_group': 'str', # required 'project_id': 'str', + 'project_group_id': 'str', 'workspace_id': 'str', # injected from auth 'domain_id': 'str' # injected from auth (required) } @@ -70,6 +71,7 @@ def create_dashboard(self, params_dict: dict) -> dict: domain_id = params_dict["domain_id"] workspace_id = params_dict.get("workspace_id") user_projects = params_dict.get("user_projects") + project_group_id = params_dict.get("project_group_id") layouts = params_dict.get("layouts") if layouts: @@ -88,6 +90,10 @@ def create_dashboard(self, params_dict: dict) -> dict: params_dict["project_id"] = "*" else: raise ERROR_REQUIRED_PARAMETER(key="workspace_id") + + if project_group_id: + self.identity_mgr.check_project_group(project_group_id) + params_dict["project_group_id"] = project_group_id else: params_dict["workspace_id"] = "-" params_dict["project_id"] = "-" @@ -100,6 +106,7 @@ def create_dashboard(self, params_dict: dict) -> dict: workspace_id, user_projects, resource_group, + project_group_id, ) pub_dashboard_vo = self.pub_dashboard_mgr.create_public_dashboard(params_dict) @@ -533,6 +540,7 @@ def get( "domain_id", "workspace_id", "project_id", + "project_group_id", "folder_id", "user_projects", ] @@ -551,6 +559,7 @@ def list( 'name': 'str', 'folder_id': 'str', 'project_id': 'str', + 'project_group_id': 'str', 'workspace_id': 'str', # injected from auth 'domain_id': 'str', # injected from auth (required) 'user_projects': 'list', # injected from auth diff --git a/src/spaceone/dashboard/service/public_folder_service.py b/src/spaceone/dashboard/service/public_folder_service.py index 484b8e2..f5c430c 100644 --- a/src/spaceone/dashboard/service/public_folder_service.py +++ b/src/spaceone/dashboard/service/public_folder_service.py @@ -43,6 +43,7 @@ def create( 'dashboards': 'list', 'resource_group': 'str', # required 'project_id': 'str', + 'project_group_id': 'str', 'workspace_id': 'str', # injected from auth 'domain_id': 'str' # injected from auth (required) } @@ -324,6 +325,7 @@ def get(self, params: PublicFolderGetRequest) -> Union[PublicFolderResponse, dic "domain_id", "workspace_id", "project_id", + "project_group_id", "user_projects", ] ) @@ -340,6 +342,7 @@ def list( 'folder_id': 'str', 'name': 'str', 'project_id': 'str', + 'project_group_id': 'str', 'workspace_id': 'str', # injected from auth 'domain_id': 'str', # injected from auth (required) 'user_projects': 'list', # injected from auth