forked from asmbly-makerspace/NeonIntegrations
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdiscourseUtil.py
More file actions
121 lines (95 loc) · 4.48 KB
/
Copy pathdiscourseUtil.py
File metadata and controls
121 lines (95 loc) · 4.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
########### Asmbly NeonCRM & Discourse API Integrations ############
# Neon API docs - https://developer.neoncrm.com/api-v2/ #
# Discourse API docs - https://docs.discourse.org/ #
################################################################
from pprint import pformat
import requests
import logging
from config import D_APIkey, D_APIuser
### Discourse Account Info
from config import D_APIkey, D_APIuser
D_baseURL = 'https://yo.asmbly.org'
D_headers = {'Api-Key':D_APIkey,'Api-Username':D_APIuser}
#testing flag. this should probably be a command-line arguement
dryRun = False
#Discourse Group names
GROUP_MAKERS = "makers"
GROUP_COMMUNITY = "community"
GROUP_COWORKING = "coworking"
GROUP_LEADERSHIP = "leadership"
GROUP_STEWARDS = "stewards"
GROUP_WIKI_ADMINS = "sysops"
#Discourse Group numeric IDs
GROUP_IDS = {GROUP_MAKERS : 42,
GROUP_COMMUNITY : 45,
GROUP_COWORKING : 55,
GROUP_LEADERSHIP : 41,
GROUP_STEWARDS : 44,
GROUP_WIKI_ADMINS : 57
}
####################################################################
# return all members of the given discourse group
####################################################################
def getGroupMembers(groupName: str ):
if GROUP_IDS.get(groupName) is None:
logging.error(f'''"{groupName}" is not a known Discourse group''')
return {}
members = {}
limit = 50
offset = 0
total = 0
while offset + limit <= total+limit:
url = D_baseURL + f'''/groups/{groupName}/members.json''' + "?limit="+str(limit)+"&offset="+str(offset)
print(f'''fetching from {url}''')
response = requests.get(url, headers=D_headers)
offset += limit
logging.debug(pformat(response.json().get("meta")))
total = int(response.json().get("meta")["total"])
for member in response.json().get("members"):
#logging.debug(f'''{members["username"]} is a member of {groupName}''')
members[member["username"]] = member
return members
####################################################################
# Add one or more Discourse users to given Discourse group
####################################################################
def addGroupMembers(membersList: list, groupName: str):
if len(membersList) == 0:
return
if GROUP_IDS.get(groupName) is None:
logging.error(f'''"{groupName}" is not a known Discourse group''')
return
resourcePath = f'''/groups/{GROUP_IDS[groupName]}/members.json'''
url = D_baseURL + resourcePath
logging.info(f'''Adding members to {groupName}: {','.join(membersList)}''')
if not dryRun:
updateResponse = requests.put(url, data={'usernames': ','.join(membersList)}, headers=D_headers)
#pprint(updateResponse)
#TODO: check response for skipped usernames. For now assume callers are checking for valid discourse IDs
####################################################################
# Remove one or more Discourse users from given Discourse group
####################################################################
def removeGroupMembers(membersList: list, groupName: str):
if len(membersList) == 0:
return
if GROUP_IDS.get(groupName) is None:
logging.error(f'''"{groupName}" is not a known Discourse group''')
return
resourcePath = f'''/groups/{GROUP_IDS[groupName]}/members.json'''
url = D_baseURL + resourcePath
logging.info(f'''Removing members from {groupName}: {','.join(membersList)}''')
if not dryRun:
deleteResponse = requests.delete(url, data={'usernames': ','.join(membersList)}, headers=D_headers)
#pprint(deleteResponse)
#don't bother with skipped usernames here - removing a user who wasn't in the group is a safe No-Op
####################################################################
# Set Discourse group membership by adding and/or removing users
####################################################################
def setGroupMembers(newMembersList: list, groupName: str):
if GROUP_IDS.get(groupName) is None:
logging.error(f'''"{groupName}" is not a known Discourse group''')
currentMembersDict = getGroupMembers(groupName)
currentMembersList = currentMembersDict.keys()
addMembersList = newMembersList - currentMembersList
removeMembersList = currentMembersList - newMembersList
removeGroupMembers(removeMembersList, groupName)
addGroupMembers(addMembersList, groupName)