def get_all_for_user( self, user: User, include_owned: bool = True, include_with_role: bool = True, parents_ids: typing.Optional[typing.List[int]] = None, ) -> typing.List[Workspace]: """ Get all workspaces of user :param user: just an user :param include_owned: include workspace where user is owner :param include_with_role: include workspace where user has a role :return: list of workspaces found """ query = self._base_query() workspace_ids = [] rapi = RoleApi(session=self._session, current_user=self._user, config=self._config) if include_with_role: workspace_ids.extend( rapi.get_user_workspaces_ids( user_id=user.user_id, min_role=UserRoleInWorkspace.READER)) if include_owned: owned_workspaces = self._get_workspaces_owned_by_user(user.user_id) workspace_ids.extend( [workspace.workspace_id for workspace in owned_workspaces]) query = self._parent_id_filter(query, parent_ids=parents_ids) query = query.filter(Workspace.workspace_id.in_(workspace_ids)) query = query.order_by(Workspace.label) return query.all()
def _get_user_workspaces_id(self, min_role: int) -> typing.Optional[typing.List[int]]: """ Get user workspace list or None if no user set """ if self._user: rapi = RoleApi(config=self._config, session=self._session, current_user=self._user) return rapi.get_user_workspaces_ids(self._user.user_id, min_role) return None
def get_user_orphan_workspaces(self, user: User): """Get all user workspaces where the users is not member of the parent and parent exists""" query = self._base_query() workspace_ids = [] rapi = RoleApi(session=self._session, current_user=self._user, config=self._config) workspace_ids.extend( rapi.get_user_workspaces_ids(user_id=user.user_id, min_role=UserRoleInWorkspace.READER)) query = query.filter(Workspace.workspace_id.in_(workspace_ids)) query = query.filter(Workspace.parent_id.isnot(None)) query = query.filter(Workspace.parent_id.notin_(workspace_ids)) return self.default_order_workspace(query).all()
def get_one_by_filemanager_filename( self, filemanager_filename: str, parent: typing.Optional[Workspace] = None) -> Workspace: """ get workspace according to filemanager_filename given and parent, if multiple workspace have same filemanager_filename, return first one found. filemanager_filename is filename like version of workspace with specific extension '.space' """ if not filemanager_filename.endswith(Workspace.FILEMANAGER_EXTENSION): raise WorkspaceNotFound( 'Invalid Workspace name. Filemanager_filename should end with "{}"' .format(Workspace.FILEMANAGER_EXTENSION)) label = filemanager_filename[:-len(Workspace.FILEMANAGER_EXTENSION)] query = self._base_query().filter(Workspace.label == label) if parent: query = query.filter(Workspace.parent_id == parent.workspace_id) else: rapi = RoleApi(session=self._session, current_user=self._user, config=self._config) workspace_ids = rapi.get_user_workspaces_ids( user_id=self._user.user_id, min_role=UserRoleInWorkspace.READER) query = query.filter( or_( Workspace.parent_id == None, # noqa: E711 Workspace.parent_id.notin_(workspace_ids), )) result = self.default_order_workspace(query).all() if len(result) == 0: raise WorkspaceNotFound( "workspace {} does not exist or not visible for user".format( id)) return result[0]