Skip to content

Commit 7938804

Browse files
committed
Simplify creating of Permissions to only create a single permission
1 parent c1ca6b0 commit 7938804

File tree

2 files changed

+61
-55
lines changed

2 files changed

+61
-55
lines changed

src/posit/connect/permissions.py

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from __future__ import annotations
44

5-
from typing import TYPE_CHECKING, List, overload
5+
from typing import TYPE_CHECKING, List, Optional, overload
66

77
from requests.sessions import Session as Session
88

@@ -67,18 +67,23 @@ def count(self) -> int:
6767
return len(self.find())
6868

6969
@overload
70-
def create(self, *, principal_guid: str, principal_type: str, role: str) -> Permission: ...
70+
def create(self, /, *, principal_guid: str, principal_type: str, role: str) -> Permission: ...
7171

7272
@overload
73-
def create(self, *args: User | Group, role: str) -> list[Permission]: ...
74-
75-
def create(self, *args: User | Group, **kwargs) -> Permission | list[Permission]:
73+
def create(self, principal: User | Group, /, *, role: str) -> Permission: ...
74+
75+
def create(
76+
self,
77+
principal: Optional[User | Group] = None,
78+
/,
79+
**kwargs,
80+
) -> Permission:
7681
"""Create a permission.
7782
7883
Parameters
7984
----------
80-
*args : User | Group
81-
The principal users or groups to add.
85+
principal : User | Group
86+
The principal user or group to add.
8287
role : str
8388
The principal role. Currently only `"viewer"` and `"owner"` are supported.
8489
principal_guid : str
@@ -90,9 +95,8 @@ def create(self, *args: User | Group, **kwargs) -> Permission | list[Permission]
9095
9196
Returns
9297
-------
93-
Permission | List[Permission]
94-
Returns a `Permission` when the kwargs: `principal_guid` and `principal_type` are used.
95-
Returns a `list[Permission]` when `*args` are used.
98+
Permission
99+
The created permission.
96100
97101
Examples
98102
--------
@@ -107,18 +111,19 @@ def create(self, *args: User | Group, **kwargs) -> Permission | list[Permission]
107111
108112
# Example groups and users
109113
groups = client.groups.find(prefix="GROUP_NAME_PREFIX_HERE")
114+
group = groups[0]
110115
user = client.users.get("USER_GUID_HERE")
111-
users = [user]
112-
113-
# Add many group and user permissions with the same role
114-
content_item.permissions.create(*groups, *users, role=role)
116+
users_and_groups = [user, *groups]
115117
116118
# Add a group permission
117-
group = groups[0]
118119
content_item.permissions.create(group, role=role)
119120
# Add a user permission
120121
content_item.permissions.create(user, role=role)
121122
123+
# Add many group and user permissions with the same role
124+
for principal in users_and_groups:
125+
content_item.permissions.create(principal, role=role)
126+
122127
# Add a group permission manually
123128
content_item.permissions.create(
124129
principal_guid=group["guid"],
@@ -136,35 +141,26 @@ def create(self, *args: User | Group, **kwargs) -> Permission | list[Permission]
136141
content_item.permissions.find()
137142
```
138143
"""
139-
if len(args) > 0:
144+
if principal is not None:
140145
# Avoid circular imports
141146
from .groups import Group
142147
from .users import User
143148

144-
for arg in args:
145-
if not isinstance(arg, (User, Group)):
146-
raise TypeError(f"Invalid argument type: {type(arg)}")
149+
if isinstance(principal, User):
150+
principal_type = "user"
151+
elif isinstance(principal, Group):
152+
principal_type = "group"
153+
else:
154+
raise TypeError(f"Invalid argument type: {type(principal).__name__}")
155+
147156
if "principal_guid" in kwargs:
148-
raise ValueError("'principal_guid' can not be defined with `*args` present.")
157+
raise ValueError("'principal_guid' can not be defined with `principal` present.")
149158
if "principal_type" in kwargs:
150-
raise ValueError("'principal_guid' can not be defined with `*args` present.")
151-
152-
perms: list[Permission] = []
153-
for arg in args:
154-
if isinstance(arg, User):
155-
principal_type = "user"
156-
elif isinstance(arg, Group):
157-
principal_type = "group"
158-
else:
159-
raise TypeError(f"Invalid argument type: {type(arg)}")
160-
161-
perm = self.create(
162-
principal_guid=arg["guid"],
163-
principal_type=principal_type,
164-
role=kwargs["role"],
165-
)
166-
perms.append(perm)
167-
return perms
159+
raise ValueError("'principal_guid' can not be defined with `principal` present.")
160+
161+
# Set the corresponding kwargs
162+
kwargs["principal_guid"] = principal["guid"]
163+
kwargs["principal_type"] = principal_type
168164

169165
path = f"v1/content/{self.content_guid}/permissions"
170166
url = self.params.url + path

tests/posit/connect/test_permissions.py

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -199,16 +199,14 @@ def test_assertions(self):
199199
# setup
200200
principal_guid = "principal_guid"
201201
content_guid = "content_guid"
202-
params = ResourceParameters(requests.Session(), Url("https://connect.example/__api__"))
203-
permissions = Permissions(params, content_guid=content_guid)
204-
user = User(params, guid=principal_guid)
205-
group = User(params, guid=principal_guid)
202+
client = Client("https://connect.example/__api__", "12345")
203+
permissions = Permissions(client.resource_params, content_guid=content_guid)
204+
user = User(client._ctx, guid=principal_guid)
205+
group = User(client._ctx, guid=principal_guid)
206206

207207
# behavior
208208
with pytest.raises(TypeError, match="str"):
209209
permissions.create( # pyright: ignore[reportCallIssue]
210-
user,
211-
group,
212210
"not a user or group",
213211
)
214212
with pytest.raises(ValueError):
@@ -223,7 +221,7 @@ def test_assertions(self):
223221
)
224222

225223
@responses.activate
226-
def test_multiple(self):
224+
def test_user_group(self):
227225
# data
228226
content_guid = "CONTENT_GUID"
229227
user_guid = "USER_GUID"
@@ -251,25 +249,37 @@ def test_multiple(self):
251249
)
252250

253251
# setup
254-
params = ResourceParameters(requests.Session(), Url("https://connect.example/__api__"))
255-
permissions = Permissions(params, content_guid=content_guid)
256-
user = User(params, guid=user_guid)
257-
group = Group(params, guid=group_guid)
252+
client = Client("https://connect.example/__api__", "12345")
253+
permissions = Permissions(client.resource_params, content_guid=content_guid)
254+
user = User(client._ctx, guid=user_guid)
255+
group = Group(client._ctx, guid=group_guid)
258256

259257
# invoke
260-
permissions = permissions.create(user, group, role="viewer")
258+
user_perm = permissions.create(user, role="viewer")
259+
group_perm = permissions.create(group, role="viewer")
260+
261+
created_permissions = [user_perm, group_perm]
261262

262263
# assert
263264
assert res_user.call_count == 1
264265
assert res_group.call_count == 1
265266

266-
assert isinstance(permissions, list)
267-
for permission in permissions:
267+
for permission in created_permissions:
268268
assert isinstance(permission, Permission)
269269

270-
assert permissions == [
271-
Permission(params, principal_guid=user_guid, principal_type="user", role="viewer"),
272-
Permission(params, principal_guid=group_guid, principal_type="group", role="viewer"),
270+
assert created_permissions == [
271+
Permission(
272+
client.resource_params,
273+
principal_guid=user_guid,
274+
principal_type="user",
275+
role="viewer",
276+
),
277+
Permission(
278+
client.resource_params,
279+
principal_guid=group_guid,
280+
principal_type="group",
281+
role="viewer",
282+
),
273283
]
274284

275285

0 commit comments

Comments
 (0)