Skip to content

Commit 1d72ae8

Browse files
kevingunn-wkgonchik
authored andcommitted
Crowd: add additional functions (#865)
Crowd - add additional functions: * add user * delete user * activate user * deactivate user * add user to group
1 parent 636e721 commit 1d72ae8

File tree

4 files changed

+143
-2
lines changed

4 files changed

+143
-2
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/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/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)