Skip to content

Commit 9b1665f

Browse files
committed
Finished group handlers
1 parent b7938ec commit 9b1665f

4 files changed

Lines changed: 208 additions & 23 deletions

File tree

bugout/app.py

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,46 @@ def get_user_tokens(
112112
return self.user.get_user_tokens(token, active, token_type)
113113

114114
# Group handlers
115-
def get_group(self, group_id: uuid.UUID, token: uuid.UUID) -> data.BugoutGroup:
116-
return self.group.get_group(group_id, token)
115+
def get_group(self, token: uuid.UUID, group_id: uuid.UUID) -> data.BugoutGroup:
116+
return self.group.get_group(token, group_id)
117+
118+
def get_user_groups(self, token: uuid.UUID) -> data.BugoutUserGroups:
119+
return self.group.get_user_groups(token)
120+
121+
def create_group(self, token: uuid.UUID, group_name: str) -> data.BugoutGroup:
122+
return self.group.create_group(token, group_name)
123+
124+
def set_user_group(
125+
self,
126+
token: uuid.UUID,
127+
group_id: uuid.UUID,
128+
user_type: data.Role,
129+
username: Optional[str] = None,
130+
email: Optional[str] = None,
131+
) -> data.BugoutGroupUser:
132+
return self.group.set_user_group(token, group_id, user_type, username, email)
133+
134+
def delete_user_group(
135+
self,
136+
token: uuid.UUID,
137+
group_id: uuid.UUID,
138+
username: Optional[str] = None,
139+
email: Optional[str] = None,
140+
) -> data.BugoutGroupUser:
141+
return self.group.delete_user_group(token, group_id, username, email)
142+
143+
def get_group_members(
144+
self, token: uuid.UUID, group_id: uuid.UUID
145+
) -> data.BugoutGroupMembers:
146+
return self.group.get_group_members(token, group_id)
147+
148+
def update_group(
149+
self, token: uuid.UUID, group_id: uuid.UUID, group_name: str
150+
) -> data.BugoutGroup:
151+
return self.group.update_group(token, group_id, group_name)
152+
153+
def delete_group(self, token: uuid.UUID, group_id: uuid.UUID) -> data.BugoutGroup:
154+
return self.group.delete_group(token, group_id)
117155

118156
# Journal handlers
119157
def get_journal(

bugout/data.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ class Method(Enum):
1414
put = "put"
1515

1616

17+
@unique
18+
class Role(Enum):
19+
owner = "owner"
20+
member = "member"
21+
22+
1723
@unique
1824
class TokenType(Enum):
1925
bugout = "bugout"
@@ -32,6 +38,13 @@ class BugoutUser(BaseModel):
3238
updated_at: datetime
3339

3440

41+
class BugoutUserShort(BaseModel):
42+
id: uuid.UUID
43+
username: str
44+
email: str
45+
user_type: Role
46+
47+
3548
class BugoutToken(BaseModel):
3649
id: uuid.UUID
3750
user_id: uuid.UUID
@@ -54,6 +67,24 @@ class BugoutGroup(BaseModel):
5467
autogenerated: bool
5568

5669

70+
class BugoutGroupUser(BaseModel):
71+
group_id: uuid.UUID
72+
user_id: uuid.UUID
73+
user_type: str
74+
autogenerated: Optional[bool] = None
75+
group_name: Optional[str] = None
76+
77+
78+
class BugoutUserGroups(BaseModel):
79+
groups: List[BugoutGroupUser]
80+
81+
82+
class BugoutGroupMembers(BaseModel):
83+
id: uuid.UUID
84+
name: str
85+
users: List[BugoutUserShort]
86+
87+
5788
class BugoutJournal(BaseModel):
5889
id: uuid.UUID
5990
bugout_user_id: uuid.UUID

bugout/group.py

Lines changed: 136 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
import logging
2-
from typing import Any, Dict, List, Optional, Tuple
1+
from typing import Any, Dict, List, Optional
32
import uuid
43

54
from .calls import make_request, InvalidUrlSpec
6-
from .data import BugoutGroup, Method
5+
from .data import (
6+
Method,
7+
Role,
8+
BugoutGroup,
9+
BugoutGroupUser,
10+
BugoutGroupMembers,
11+
BugoutUserGroups,
12+
)
713

8-
logger = logging.getLogger(__name__)
914

10-
11-
class GroupNotFound(Exception):
15+
class GroupInvalidParameters(ValueError):
1216
"""
13-
Raised on actions that involve group which are not present in the database.
17+
Raised when operations are applied to a group but invalid parameters are provided.
1418
"""
1519

1620

@@ -29,14 +33,133 @@ def _call(self, method: Method, path: str, **kwargs):
2933
result = make_request(method=method, url=url, **kwargs)
3034
return result
3135

32-
def get_group(self, group_id: uuid.UUID, token: uuid.UUID) -> BugoutGroup:
33-
get_group_path = f"groups/{group_id}"
36+
def get_group(self, token: uuid.UUID, group_id: uuid.UUID) -> BugoutGroup:
37+
get_group_path = f"group/{group_id}"
3438
headers = {
3539
"Authorization": f"Bearer {token}",
3640
}
3741
result = self._call(method=Method.get, path=get_group_path, headers=headers)
38-
return BugoutGroup(
39-
id=result.get("id"),
40-
name=result.get("name"),
41-
autogenerated=result.get("autogenerated"),
42+
return BugoutGroup(**result)
43+
44+
def get_user_groups(self, token: uuid.UUID) -> BugoutUserGroups:
45+
get_user_groups_path = "groups"
46+
headers = {
47+
"Authorization": f"Bearer {token}",
48+
}
49+
result = self._call(
50+
method=Method.get, path=get_user_groups_path, headers=headers
51+
)
52+
return BugoutUserGroups(**result)
53+
54+
def create_group(self, token: uuid.UUID, group_name: str) -> BugoutGroup:
55+
create_group_path = "group"
56+
data = {
57+
"group_name": group_name,
58+
}
59+
headers = {
60+
"Authorization": f"Bearer {token}",
61+
}
62+
result = self._call(
63+
method=Method.post, path=create_group_path, headers=headers, data=data
64+
)
65+
return BugoutGroup(**result)
66+
67+
def set_user_group(
68+
self,
69+
token: uuid.UUID,
70+
group_id: uuid.UUID,
71+
user_type: Role,
72+
username: Optional[str] = None,
73+
email: Optional[str] = None,
74+
) -> BugoutGroupUser:
75+
set_user_group_path = f"group/{group_id}/role"
76+
77+
if username is None and email is None:
78+
raise GroupInvalidParameters(
79+
"In order to update group role, at least one of username, or email must be specified"
80+
)
81+
82+
data: Dict[str, Any] = {
83+
"user_type": user_type,
84+
}
85+
if username is not None:
86+
data.update({"username": username})
87+
if email is not None:
88+
data.update({"email": email})
89+
headers = {
90+
"Authorization": f"Bearer {token}",
91+
}
92+
result = self._call(
93+
method=Method.post, path=set_user_group_path, headers=headers, data=data
94+
)
95+
return BugoutGroupUser(**result)
96+
97+
def delete_user_group(
98+
self,
99+
token: uuid.UUID,
100+
group_id: uuid.UUID,
101+
username: Optional[str] = None,
102+
email: Optional[str] = None,
103+
) -> BugoutGroupUser:
104+
"""
105+
TODO(kompotkot): Merge with set_user_group()
106+
"""
107+
delete_user_group_path = f"group/{group_id}/role"
108+
109+
if username is None and email is None:
110+
raise GroupInvalidParameters(
111+
"In order to update group role, at least one of username, or email must be specified"
112+
)
113+
114+
data = {}
115+
if username is not None:
116+
data.update({"username": username})
117+
if email is not None:
118+
data.update({"email": email})
119+
headers = {
120+
"Authorization": f"Bearer {token}",
121+
}
122+
result = self._call(
123+
method=Method.delete,
124+
path=delete_user_group_path,
125+
headers=headers,
126+
data=data,
127+
)
128+
return BugoutGroupUser(**result)
129+
130+
def get_group_members(
131+
self, token: uuid.UUID, group_id: uuid.UUID
132+
) -> BugoutGroupMembers:
133+
get_group_members_path = f"group/{group_id}/users"
134+
headers = {
135+
"Authorization": f"Bearer {token}",
136+
}
137+
result = self._call(
138+
method=Method.get, path=get_group_members_path, headers=headers
139+
)
140+
return BugoutGroupMembers(**result)
141+
142+
def update_group(
143+
self, token: uuid.UUID, group_id: uuid.UUID, group_name: str
144+
) -> BugoutGroup:
145+
update_group_path = f"group/{group_id}/name"
146+
data = {
147+
"group_name": group_name,
148+
}
149+
headers = {
150+
"Authorization": f"Bearer {token}",
151+
}
152+
result = self._call(
153+
method=Method.put, path=update_group_path, headers=headers, data=data
154+
)
155+
return BugoutGroup(**result)
156+
157+
def delete_group(self, token: uuid.UUID, group_id: uuid.UUID) -> BugoutGroup:
158+
delete_group_path = f"group/{group_id}"
159+
headers = {
160+
"Authorization": f"Bearer {token}",
161+
}
162+
result = self._call(
163+
method=Method.delete, path=delete_group_path, headers=headers
42164
)
165+
return BugoutGroup(**result)

bugout/user.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,6 @@
55
from .data import Method, TokenType, BugoutUser, BugoutToken, BugoutUserTokens
66

77

8-
class UserNotFound(Exception):
9-
"""
10-
Raised on actions that involve user which are not present in the database.
11-
"""
12-
13-
148
class TokenInvalidParameters(ValueError):
159
"""
1610
Raised when operations are applied to a token but invalid parameters are provided with which to
@@ -169,7 +163,6 @@ def update_token(
169163
) -> BugoutToken:
170164
update_token_path = "token"
171165

172-
data: Dict[str, Any] = {"access_token": token}
173166
if token_type is None and token_note is None:
174167
raise TokenInvalidParameters(
175168
"In order to update token, at least one of token_type, or token_note must be specified"
@@ -178,7 +171,7 @@ def update_token(
178171
raise TokenInvalidParameters(
179172
"Incorrect token type provided, check types at get_token_types()"
180173
)
181-
174+
data: Dict[str, Any] = {"access_token": token}
182175
if token_type is not None:
183176
data.update({"token_type": token_type})
184177
if token_note is not None:

0 commit comments

Comments
 (0)