Skip to content

Commit 9cd0df8

Browse files
authored
Feature/add workspace permissions for repositories (#1182)
* Bitbucket Cloud: Removing workspace name setter (workspace.name("new-name")) since it isn't listed under the bitbucket v2 rest documents: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-workspaces/#api-group-workspaces * Bitbucket Cloud: Add workspaces permissions. * Bitbucket Cloud: Add workspaces repository permissions. * Bitbucket Cloud: Updating bitbucket read the docs.
1 parent 0497b61 commit 9cd0df8

File tree

3 files changed

+142
-5
lines changed

3 files changed

+142
-5
lines changed

atlassian/bitbucket/cloud/workspaces/__init__.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from requests import HTTPError
44
from ..base import BitbucketCloudBase
55

6+
from .permissions import Permissions
67
from .projects import Projects
78
from ..repositories import WorkspaceRepositories
89

@@ -84,6 +85,7 @@ def exists(self, workspace):
8485
class Workspace(BitbucketCloudBase):
8586
def __init__(self, data, *args, **kwargs):
8687
super(Workspace, self).__init__(None, *args, data=data, expected_type="workspace", **kwargs)
88+
self.__permissions = Permissions(self.url_joiner(self.url, "permissions"), **self._new_session_args)
8789
self.__projects = Projects(self.get_link("projects"), **self._new_session_args)
8890
self.__repositories = WorkspaceRepositories(self.get_link("repositories"), **self._new_session_args)
8991

@@ -92,11 +94,6 @@ def name(self):
9294
"""The workspace name"""
9395
return self.get_data("name")
9496

95-
@name.setter
96-
def name(self, name):
97-
"""Setter for the workspace name"""
98-
return self.update(name=name)
99-
10097
@property
10198
def slug(self):
10299
"""The workspace slug"""
@@ -126,6 +123,11 @@ def get_avatar(self):
126123
"""The project avatar"""
127124
return self.get(self.get_link("avatar"), absolute=True)
128125

126+
@property
127+
def permissions(self):
128+
"""The workspace permissions repositories"""
129+
return self.__permissions
130+
129131
@property
130132
def projects(self):
131133
"""The workspace projects"""
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# coding=utf-8
2+
3+
4+
from ..base import BitbucketCloudBase
5+
6+
7+
class Permissions(BitbucketCloudBase):
8+
def __init__(self, url, *args, **kwargs):
9+
super(Permissions, self).__init__(url, *args, **kwargs)
10+
11+
def __get_object_workspace_membership(self, data):
12+
return WorkspaceMembership(
13+
self.url,
14+
data,
15+
**self._new_session_args,
16+
)
17+
18+
def __get_object_repository_permission(self, data):
19+
return RepositoryPermission(self.url, data, **self._new_session_args)
20+
21+
def each(self, q=None, sort=None, pagelen=10):
22+
"""
23+
Returns the list of pipelines in this repository.
24+
25+
:param q: string: Query string to narrow down the response.
26+
See https://developer.atlassian.com/bitbucket/api/2/reference/meta/filtering for details.
27+
:param sort: string: Name of a response property to sort results.
28+
See https://developer.atlassian.com/bitbucket/api/2/reference/meta/filtering for details.
29+
30+
:return: A generator for the Workspace Permission objects
31+
32+
API docs: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-workspaces/#api-workspaces-workspace-permissions-get
33+
"""
34+
params = {}
35+
if sort is not None:
36+
params["sort"] = sort
37+
if q is not None:
38+
params["q"] = q
39+
params["pagelen"] = pagelen
40+
for workspace_membership in self._get_paged(
41+
None,
42+
trailing=True,
43+
paging_workaround=True,
44+
params=params,
45+
):
46+
yield self.__get_object_workspace_membership(workspace_membership)
47+
48+
return
49+
50+
def repositories(self, repo_slug="", pagelen=10):
51+
for permissions in self._get_paged(
52+
"repositories/{}".format(repo_slug), trailing=True, params={"pagelen": pagelen}
53+
):
54+
yield self.__get_object_repository_permission(permissions)
55+
56+
57+
class WorkspaceMembership(BitbucketCloudBase):
58+
def __init__(self, url, data, *args, **kwargs):
59+
super(WorkspaceMembership, self).__init__(url, *args, data=data, expected_type="workspace_membership", **kwargs)
60+
61+
@property
62+
def uuid(self):
63+
"""The workspace_membership uuid"""
64+
return self.get_data("uuid")
65+
66+
@property
67+
def type(self):
68+
"""The workspace_membership type"""
69+
return self.get_data("type")
70+
71+
@property
72+
def user(self):
73+
"""The workspace_membership user"""
74+
return self.get_data("user")
75+
76+
@property
77+
def workspace(self):
78+
"""The workspace_membership workspace"""
79+
return self.get_data("workspace")
80+
81+
@property
82+
def links(self):
83+
"""The workspace_membership links"""
84+
return self.get_data("links")
85+
86+
@property
87+
def added_on(self):
88+
"""The workspace_membership added on"""
89+
return self.get_time("added_on")
90+
91+
@property
92+
def permission(self):
93+
"""The workspace_membership permission"""
94+
return self.get_data("permission")
95+
96+
@property
97+
def last_accessed(self):
98+
"""The workspace_membership last accessed"""
99+
return self.get_time("last_accessed")
100+
101+
102+
class RepositoryPermission(BitbucketCloudBase):
103+
def __init__(self, url, data, *args, **kwargs):
104+
super(RepositoryPermission, self).__init__(
105+
url, *args, data=data, expected_type="repository_permission", **kwargs
106+
)
107+
108+
@property
109+
def repository(self):
110+
"""The repository_permission uuid"""
111+
return self.get_data("repository")
112+
113+
@property
114+
def type(self):
115+
"""The repository_permission type"""
116+
return self.get_data("type")
117+
118+
@property
119+
def permission(self):
120+
"""The repository_permission permission"""
121+
return self.get_data("permission")
122+
123+
@property
124+
def user(self):
125+
"""The repository_permission workspace"""
126+
return self.get_data("user")

docs/bitbucket.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,15 @@ Bitbucket Cloud
341341
# Get a single workplace by workplace slug
342342
workplace = cloud.workspaces.get(workspace_slug)
343343
344+
# Get a list of permissions in a workspace (this may not work depending on the size of your workspace)
345+
workplace.permissions.each():
346+
347+
# Get a list of repository permissions in a workspace (this may not work depending on the size of your workspace)
348+
workplace.permissions.repositories():
349+
350+
# Get a single repository permissions in a workspace
351+
workplace.permissions.repositories(repo_slug):
352+
344353
# Get a list of projects in a workspace
345354
workplace.projects.each():
346355

0 commit comments

Comments
 (0)