Skip to content

Commit 88477bc

Browse files
authored
Merge branch 'atlassian-api:master' into bugfix/cloud-pagination
2 parents 1297177 + 5a3f5f1 commit 88477bc

File tree

10 files changed

+417
-8
lines changed

10 files changed

+417
-8
lines changed

CONTRIBUTING.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ All methods based on docs from: https://developer.atlassian.com/docs/
105105
* Confluence
106106
- `Confluence Server`_
107107
- `Confluence Cloud`_
108+
* Crowd
109+
- `Crowd Server`_
108110
* Advanced Roadmaps (formerly Portfolio for Jira)
109111
- `Portfolio for Jira`_
110112
- `Portfolio for Jira Teams`_
@@ -133,6 +135,7 @@ All methods based on docs from: https://developer.atlassian.com/docs/
133135
.. _`Jira Cloud`: https://developer.atlassian.com/cloud/jira/platform/rest/v3/
134136
.. _`Confluence Server`: https://developer.atlassian.com/server/confluence/confluence-server-rest-api/
135137
.. _`Confluence Cloud`: https://developer.atlassian.com/cloud/confluence/rest/
138+
.. _`Crowd Server`: https://developer.atlassian.com/server/crowd/crowd-rest-apis/
136139
.. _`Jira Service Desk Cloud`: https://developer.atlassian.com/cloud/jira/service-desk/rest/
137140
.. _`Jira Service Desk Server`: https://docs.atlassian.com/jira-servicedesk/REST/server
138141
.. _`Portfolio for Jira Teams`: https://docs.atlassian.com/portfolio-for-jira-server/REST/2.13.0/teams/

atlassian/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.14.0
1+
3.14.1

atlassian/bitbucket/__init__.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,16 +91,23 @@ def check_reindexing_status(self):
9191
url = self.resource_url("status", api_root="rest/indexing", api_version="latest")
9292
return self.get(url)
9393

94-
def get_users(self, user_filter=None):
94+
def get_users(self, user_filter=None, limit=25, start=0):
9595
"""
9696
Get list of bitbucket users.
97-
Use 'user_filter' for get specific users.
98-
:user_filter: str
97+
Use 'user_filter' for get specific users or get all users if necessary.
98+
:param user_filter: str - username, displayname or email
99+
:param limit: int - paginated limit to retrieve
100+
:param start: int - paginated point to start retreiving
101+
:return: The collection as JSON with all relevant information about the licensed user
99102
"""
100103
url = self.resource_url("users", api_version="1.0")
101104
params = {}
102105
if user_filter:
103106
params["filter"] = user_filter
107+
if limit:
108+
params["limit"] = limit
109+
if start:
110+
params["start"] = start
104111
return self.get(url, params=params)
105112

106113
def get_users_info(self, user_filter=None, start=0, limit=25):

atlassian/bitbucket/cloud/repositories/pullRequests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def each(self, q=None, sort=None):
7272
if q is not None:
7373
params["q"] = q
7474
for pr in self._get_paged(None, trailing=True, params=params):
75-
yield self.__get_object(pr)
75+
yield self.__get_object(super(PullRequests, self).get(pr.get("id")))
7676

7777
return
7878

atlassian/crowd.py

Lines changed: 98 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# coding=utf-8
22
import logging
3+
import string
4+
import secrets
35

46
from .rest_client import AtlassianRestAPI
57

@@ -15,18 +17,112 @@ def __init__(self, url, username, password, timeout=60, api_root="rest", api_ver
1517
super(Crowd, self).__init__(url, username, password, timeout, api_root, api_version)
1618

1719
def _crowd_api_url(self, api, resource):
18-
return "{server}/{api_root}/{api}/{version}/{resource}".format(
19-
server=self.url,
20+
return "/{api_root}/{api}/{version}/{resource}".format(
2021
api_root=self.api_root,
2122
api=api,
2223
version=self.api_version,
2324
resource=resource,
2425
)
2526

27+
def _user_change_status(self, username, active):
28+
"""
29+
Change user status
30+
31+
:params active bool
32+
33+
:return:
34+
"""
35+
36+
user = self.user(username)
37+
38+
user_object = {
39+
"name": username,
40+
"active": active,
41+
"display-name": user.get("display-name"),
42+
"first-name": user.get("first-name"),
43+
"last-name": user.get("last-name"),
44+
"email": user.get("email"),
45+
}
46+
47+
params = {"username": username}
48+
49+
return self.put(self._crowd_api_url("usermanagement", "user"), params=params, data=user_object)
50+
2651
def user(self, username):
2752
params = {"username": username}
2853
return self.get(self._crowd_api_url("usermanagement", "user"), params=params)
2954

55+
def user_activate(self, username):
56+
"""
57+
Activate user
58+
"""
59+
60+
return self._user_change_status(username, True)
61+
62+
def user_create(self, username, active, first_name, last_name, display_name, email, password=None):
63+
"""
64+
Create new user
65+
66+
:param active: bool, OPTIONAL: password can be auto-generated if not included
67+
username (string)
68+
active (bool)
69+
first-name (string)
70+
last-name (string)
71+
display-name (string)
72+
email (string)
73+
password (string, optional)
74+
75+
:return:
76+
"""
77+
78+
if not password:
79+
characters = string.ascii_letters + string.punctuation + string.digits
80+
password = "".join(secrets.choice(characters) for x in range(30))
81+
82+
user_object = {
83+
"name": username,
84+
"password": {"value": password},
85+
"active": active,
86+
"first-name": first_name,
87+
"last-name": last_name,
88+
"display-name": display_name,
89+
"email": email,
90+
}
91+
92+
return self.post(self._crowd_api_url("usermanagement", "user"), data=user_object)
93+
94+
def user_deactivate(self, username):
95+
"""
96+
Deactivate user
97+
98+
:return:
99+
"""
100+
101+
return self._user_change_status(username, False)
102+
103+
def user_delete(self, username):
104+
"""
105+
Delete user
106+
107+
:return:
108+
"""
109+
110+
params = {"username": username}
111+
112+
return self.delete(self._crowd_api_url("usermanagement", "user"), params=params)
113+
114+
def group_add_user(self, username, groupname):
115+
"""
116+
Add user to group
117+
:return:
118+
"""
119+
120+
data = {"name": groupname}
121+
122+
params = {"username": username}
123+
124+
return self.post(self._crowd_api_url("usermanagement", "user/group/direct"), params=params, json=data)
125+
30126
def group_nested_members(self, group):
31127
params = {"groupname": group}
32128
return self.get(self._crowd_api_url("group", "nested"), params=params)

docs/bitbucket.rst

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ Groups and admins
167167
bitbucket.all_project_administrators()
168168
169169
# Get users. Use 'user_filter' parameter to get specific users.
170-
bitbucket.get_users(user_filter="username")
170+
bitbucket.get_users(user_filter="username", limit=25, start=0)
171171
172172
Manage code
173173
-----------

docs/crowd.rst

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
Crowd module
2+
============
3+
4+
Manage users
5+
------------
6+
7+
.. code-block:: python
8+
9+
# Activate user
10+
crowd.user_activate(username)
11+
12+
# Add user
13+
crowd.user_create(username, active, first_name, last_name, display_name, email, password)
14+
15+
# Add user with auto-generated password
16+
crowd.user_create(username, active, first_name, last_name, display_name, email)
17+
18+
# Deactive user
19+
crowd.user_deactivate(username)
20+
21+
# Delete user
22+
crowd.user_delete(username)
23+
24+
# Get user
25+
crowd.user(username)
26+
27+
Manage groups
28+
-------------
29+
30+
.. code-block:: python
31+
32+
# Add user to group
33+
crowd.group_add_user(username, groupname)
34+

docs/index.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Add a connection:
2020
2121
from atlassian import Jira
2222
from atlassian import Confluence
23+
from atlassian import Crowd
2324
from atlassian import Bitbucket
2425
from atlassian import ServiceDesk
2526
from atlassian import Xray
@@ -34,6 +35,12 @@ Add a connection:
3435
username='admin',
3536
password='admin')
3637
38+
crowd = Crowd(
39+
url='http://localhost:4990',
40+
username='app-name',
41+
password='app-password'
42+
)
43+
3744
bitbucket = Bitbucket(
3845
url='http://localhost:7990',
3946
username='admin',
@@ -217,6 +224,7 @@ And to Bitbucket Cloud:
217224

218225
jira
219226
confluence
227+
crowd
220228
bitbucket
221229
bamboo
222230
service_desk

0 commit comments

Comments
 (0)