gam7 7.3.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of gam7 might be problematic. Click here for more details.
- gam/__init__.py +77555 -0
- gam/__main__.py +40 -0
- gam/atom/__init__.py +1460 -0
- gam/atom/auth.py +41 -0
- gam/atom/client.py +214 -0
- gam/atom/core.py +535 -0
- gam/atom/data.py +327 -0
- gam/atom/http.py +354 -0
- gam/atom/http_core.py +599 -0
- gam/atom/http_interface.py +144 -0
- gam/atom/mock_http.py +123 -0
- gam/atom/mock_http_core.py +313 -0
- gam/atom/mock_service.py +235 -0
- gam/atom/service.py +723 -0
- gam/atom/token_store.py +105 -0
- gam/atom/url.py +130 -0
- gam/cacerts.pem +1130 -0
- gam/cbcm-v1.1beta1.json +593 -0
- gam/contactdelegation-v1.json +249 -0
- gam/datastudio-v1.json +486 -0
- gam/gamlib/__init__.py +17 -0
- gam/gamlib/glaction.py +308 -0
- gam/gamlib/glapi.py +837 -0
- gam/gamlib/glcfg.py +616 -0
- gam/gamlib/glclargs.py +1184 -0
- gam/gamlib/glentity.py +831 -0
- gam/gamlib/glgapi.py +817 -0
- gam/gamlib/glgdata.py +98 -0
- gam/gamlib/glglobals.py +307 -0
- gam/gamlib/glindent.py +46 -0
- gam/gamlib/glmsgs.py +547 -0
- gam/gamlib/glskus.py +246 -0
- gam/gamlib/gluprop.py +279 -0
- gam/gamlib/glverlibs.py +33 -0
- gam/gamlib/yubikey.py +202 -0
- gam/gdata/__init__.py +825 -0
- gam/gdata/alt/__init__.py +20 -0
- gam/gdata/alt/app_engine.py +101 -0
- gam/gdata/alt/appengine.py +321 -0
- gam/gdata/apps/__init__.py +526 -0
- gam/gdata/apps/audit/__init__.py +1 -0
- gam/gdata/apps/audit/service.py +278 -0
- gam/gdata/apps/contacts/__init__.py +874 -0
- gam/gdata/apps/contacts/service.py +355 -0
- gam/gdata/apps/service.py +544 -0
- gam/gdata/apps/sites/__init__.py +283 -0
- gam/gdata/apps/sites/service.py +246 -0
- gam/gdata/service.py +1714 -0
- gam/gdata/urlfetch.py +247 -0
- gam/googleapiclient/__init__.py +27 -0
- gam/googleapiclient/_auth.py +167 -0
- gam/googleapiclient/_helpers.py +207 -0
- gam/googleapiclient/channel.py +315 -0
- gam/googleapiclient/discovery.py +1662 -0
- gam/googleapiclient/discovery_cache/__init__.py +78 -0
- gam/googleapiclient/discovery_cache/appengine_memcache.py +55 -0
- gam/googleapiclient/discovery_cache/base.py +46 -0
- gam/googleapiclient/discovery_cache/file_cache.py +145 -0
- gam/googleapiclient/errors.py +197 -0
- gam/googleapiclient/http.py +1962 -0
- gam/googleapiclient/mimeparse.py +183 -0
- gam/googleapiclient/model.py +429 -0
- gam/googleapiclient/schema.py +317 -0
- gam/googleapiclient/version.py +15 -0
- gam/iso8601/__init__.py +28 -0
- gam/iso8601/iso8601.py +160 -0
- gam/serviceaccountlookup-v1.json +141 -0
- gam/six.py +982 -0
- gam7-7.3.4.dist-info/METADATA +69 -0
- gam7-7.3.4.dist-info/RECORD +72 -0
- gam7-7.3.4.dist-info/WHEEL +4 -0
- gam7-7.3.4.dist-info/licenses/LICENSE +201 -0
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
#!/usr/bin/python
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2007 SIOS Technology, Inc.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
__author__ = 'tmatsuo@sios.com (Takashi MATSUO)'
|
|
18
|
+
|
|
19
|
+
import lxml.etree as ElementTree
|
|
20
|
+
import urllib.request, urllib.parse, urllib.error
|
|
21
|
+
import gdata
|
|
22
|
+
import atom.service
|
|
23
|
+
import gdata.service
|
|
24
|
+
import gdata.apps
|
|
25
|
+
import atom
|
|
26
|
+
|
|
27
|
+
API_VER="2.0"
|
|
28
|
+
HTTP_OK=200
|
|
29
|
+
|
|
30
|
+
UNKOWN_ERROR=1000
|
|
31
|
+
USER_DELETED_RECENTLY=1100
|
|
32
|
+
USER_SUSPENDED=1101
|
|
33
|
+
DOMAIN_USER_LIMIT_EXCEEDED=1200
|
|
34
|
+
DOMAIN_ALIAS_LIMIT_EXCEEDED=1201
|
|
35
|
+
DOMAIN_SUSPENDED=1202
|
|
36
|
+
DOMAIN_FEATURE_UNAVAILABLE=1203
|
|
37
|
+
ENTITY_EXISTS=1300
|
|
38
|
+
ENTITY_DOES_NOT_EXIST=1301
|
|
39
|
+
ENTITY_NAME_IS_RESERVED=1302
|
|
40
|
+
ENTITY_NAME_NOT_VALID=1303
|
|
41
|
+
INVALID_GIVEN_NAME=1400
|
|
42
|
+
INVALID_FAMILY_NAME=1401
|
|
43
|
+
INVALID_PASSWORD=1402
|
|
44
|
+
INVALID_USERNAME=1403
|
|
45
|
+
INVALID_HASH_FUNCTION_NAME=1404
|
|
46
|
+
INVALID_HASH_DIGGEST_LENGTH=1405
|
|
47
|
+
INVALID_EMAIL_ADDRESS=1406
|
|
48
|
+
INVALID_QUERY_PARAMETER_VALUE=1407
|
|
49
|
+
TOO_MANY_RECIPIENTS_ON_EMAIL_LIST=1500
|
|
50
|
+
|
|
51
|
+
DEFAULT_QUOTA_LIMIT='2048'
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class Error(Exception):
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class AppsForYourDomainException(Error):
|
|
59
|
+
|
|
60
|
+
def __init__(self, response):
|
|
61
|
+
|
|
62
|
+
Error.__init__(self, response)
|
|
63
|
+
try:
|
|
64
|
+
self.element_tree = ElementTree.fromstring(response['body'])
|
|
65
|
+
self.error_code = int(self.element_tree[0].attrib['errorCode'])
|
|
66
|
+
self.reason = self.element_tree[0].attrib['reason']
|
|
67
|
+
self.invalidInput = self.element_tree[0].attrib['invalidInput']
|
|
68
|
+
except:
|
|
69
|
+
self.error_code = 600
|
|
70
|
+
|
|
71
|
+
class AppsService(gdata.service.GDataService):
|
|
72
|
+
"""Client for the Google Apps Provisioning service."""
|
|
73
|
+
|
|
74
|
+
def __init__(self, email=None, password=None, domain=None, source=None,
|
|
75
|
+
server='apps-apis.google.com', additional_headers=None,
|
|
76
|
+
**kwargs):
|
|
77
|
+
"""Creates a client for the Google Apps Provisioning service.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
email: string (optional) The user's email address, used for
|
|
81
|
+
authentication.
|
|
82
|
+
password: string (optional) The user's password.
|
|
83
|
+
domain: string (optional) The Google Apps domain name.
|
|
84
|
+
source: string (optional) The name of the user's application.
|
|
85
|
+
server: string (optional) The name of the server to which a connection
|
|
86
|
+
will be opened. Default value: 'apps-apis.google.com'.
|
|
87
|
+
**kwargs: The other parameters to pass to gdata.service.GDataService
|
|
88
|
+
constructor.
|
|
89
|
+
"""
|
|
90
|
+
gdata.service.GDataService.__init__(
|
|
91
|
+
self, email=email, password=password, service='apps', source=source,
|
|
92
|
+
server=server, additional_headers=additional_headers, **kwargs)
|
|
93
|
+
self.ssl = True
|
|
94
|
+
self.port = 443
|
|
95
|
+
self.domain = domain
|
|
96
|
+
|
|
97
|
+
def _baseURL(self):
|
|
98
|
+
return "/a/feeds/%s" % self.domain
|
|
99
|
+
|
|
100
|
+
def AddAllElementsFromAllPages(self, link_finder, func):
|
|
101
|
+
"""retrieve all pages and add all elements"""
|
|
102
|
+
next = link_finder.GetNextLink()
|
|
103
|
+
while next is not None:
|
|
104
|
+
next_feed = self.Get(next.href, converter=func)
|
|
105
|
+
for a_entry in next_feed.entry:
|
|
106
|
+
link_finder.entry.append(a_entry)
|
|
107
|
+
next = next_feed.GetNextLink()
|
|
108
|
+
return link_finder
|
|
109
|
+
|
|
110
|
+
def RetrievePageOfEmailLists(self, start_email_list_name=None,
|
|
111
|
+
num_retries=gdata.service.DEFAULT_NUM_RETRIES,
|
|
112
|
+
delay=gdata.service.DEFAULT_DELAY,
|
|
113
|
+
backoff=gdata.service.DEFAULT_BACKOFF):
|
|
114
|
+
"""Retrieve one page of email list"""
|
|
115
|
+
uri = "%s/emailList/%s" % (self._baseURL(), API_VER)
|
|
116
|
+
if start_email_list_name is not None:
|
|
117
|
+
uri += "?startEmailListName=%s" % start_email_list_name
|
|
118
|
+
try:
|
|
119
|
+
return gdata.apps.EmailListFeedFromString(str(self.GetWithRetries(
|
|
120
|
+
uri, num_retries=num_retries, delay=delay, backoff=backoff)))
|
|
121
|
+
except gdata.service.RequestError as e:
|
|
122
|
+
raise AppsForYourDomainException(e.args[0])
|
|
123
|
+
|
|
124
|
+
def GetGeneratorForAllEmailLists(
|
|
125
|
+
self, num_retries=gdata.service.DEFAULT_NUM_RETRIES,
|
|
126
|
+
delay=gdata.service.DEFAULT_DELAY, backoff=gdata.service.DEFAULT_BACKOFF):
|
|
127
|
+
"""Retrieve a generator for all emaillists in this domain."""
|
|
128
|
+
first_page = self.RetrievePageOfEmailLists(num_retries=num_retries,
|
|
129
|
+
delay=delay,
|
|
130
|
+
backoff=backoff)
|
|
131
|
+
return self.GetGeneratorFromLinkFinder(
|
|
132
|
+
first_page, gdata.apps.EmailListRecipientFeedFromString,
|
|
133
|
+
num_retries=num_retries, delay=delay, backoff=backoff)
|
|
134
|
+
|
|
135
|
+
def RetrieveAllEmailLists(self):
|
|
136
|
+
"""Retrieve all email list of a domain."""
|
|
137
|
+
|
|
138
|
+
ret = self.RetrievePageOfEmailLists()
|
|
139
|
+
# pagination
|
|
140
|
+
return self.AddAllElementsFromAllPages(
|
|
141
|
+
ret, gdata.apps.EmailListFeedFromString)
|
|
142
|
+
|
|
143
|
+
def RetrieveEmailList(self, list_name):
|
|
144
|
+
"""Retreive a single email list by the list's name."""
|
|
145
|
+
|
|
146
|
+
uri = "%s/emailList/%s/%s" % (
|
|
147
|
+
self._baseURL(), API_VER, list_name)
|
|
148
|
+
try:
|
|
149
|
+
return self.Get(uri, converter=gdata.apps.EmailListEntryFromString)
|
|
150
|
+
except gdata.service.RequestError as e:
|
|
151
|
+
raise AppsForYourDomainException(e.args[0])
|
|
152
|
+
|
|
153
|
+
def RetrieveEmailLists(self, recipient):
|
|
154
|
+
"""Retrieve All Email List Subscriptions for an Email Address."""
|
|
155
|
+
|
|
156
|
+
uri = "%s/emailList/%s?recipient=%s" % (
|
|
157
|
+
self._baseURL(), API_VER, recipient)
|
|
158
|
+
try:
|
|
159
|
+
ret = gdata.apps.EmailListFeedFromString(str(self.Get(uri)))
|
|
160
|
+
except gdata.service.RequestError as e:
|
|
161
|
+
raise AppsForYourDomainException(e.args[0])
|
|
162
|
+
|
|
163
|
+
# pagination
|
|
164
|
+
return self.AddAllElementsFromAllPages(
|
|
165
|
+
ret, gdata.apps.EmailListFeedFromString)
|
|
166
|
+
|
|
167
|
+
def RemoveRecipientFromEmailList(self, recipient, list_name):
|
|
168
|
+
"""Remove recipient from email list."""
|
|
169
|
+
|
|
170
|
+
uri = "%s/emailList/%s/%s/recipient/%s" % (
|
|
171
|
+
self._baseURL(), API_VER, list_name, recipient)
|
|
172
|
+
try:
|
|
173
|
+
self.Delete(uri)
|
|
174
|
+
except gdata.service.RequestError as e:
|
|
175
|
+
raise AppsForYourDomainException(e.args[0])
|
|
176
|
+
|
|
177
|
+
def RetrievePageOfRecipients(self, list_name, start_recipient=None,
|
|
178
|
+
num_retries=gdata.service.DEFAULT_NUM_RETRIES,
|
|
179
|
+
delay=gdata.service.DEFAULT_DELAY,
|
|
180
|
+
backoff=gdata.service.DEFAULT_BACKOFF):
|
|
181
|
+
"""Retrieve one page of recipient of an email list. """
|
|
182
|
+
|
|
183
|
+
uri = "%s/emailList/%s/%s/recipient" % (
|
|
184
|
+
self._baseURL(), API_VER, list_name)
|
|
185
|
+
|
|
186
|
+
if start_recipient is not None:
|
|
187
|
+
uri += "?startRecipient=%s" % start_recipient
|
|
188
|
+
try:
|
|
189
|
+
return gdata.apps.EmailListRecipientFeedFromString(str(
|
|
190
|
+
self.GetWithRetries(
|
|
191
|
+
uri, num_retries=num_retries, delay=delay, backoff=backoff)))
|
|
192
|
+
except gdata.service.RequestError as e:
|
|
193
|
+
raise AppsForYourDomainException(e.args[0])
|
|
194
|
+
|
|
195
|
+
def GetGeneratorForAllRecipients(
|
|
196
|
+
self, list_name, num_retries=gdata.service.DEFAULT_NUM_RETRIES,
|
|
197
|
+
delay=gdata.service.DEFAULT_DELAY, backoff=gdata.service.DEFAULT_BACKOFF):
|
|
198
|
+
"""Retrieve a generator for all recipients of a particular emaillist."""
|
|
199
|
+
first_page = self.RetrievePageOfRecipients(list_name,
|
|
200
|
+
num_retries=num_retries,
|
|
201
|
+
delay=delay,
|
|
202
|
+
backoff=backoff)
|
|
203
|
+
return self.GetGeneratorFromLinkFinder(
|
|
204
|
+
first_page, gdata.apps.EmailListRecipientFeedFromString,
|
|
205
|
+
num_retries=num_retries, delay=delay, backoff=backoff)
|
|
206
|
+
|
|
207
|
+
def RetrieveAllRecipients(self, list_name):
|
|
208
|
+
"""Retrieve all recipient of an email list."""
|
|
209
|
+
|
|
210
|
+
ret = self.RetrievePageOfRecipients(list_name)
|
|
211
|
+
# pagination
|
|
212
|
+
return self.AddAllElementsFromAllPages(
|
|
213
|
+
ret, gdata.apps.EmailListRecipientFeedFromString)
|
|
214
|
+
|
|
215
|
+
def AddRecipientToEmailList(self, recipient, list_name):
|
|
216
|
+
"""Add a recipient to a email list."""
|
|
217
|
+
|
|
218
|
+
uri = "%s/emailList/%s/%s/recipient" % (
|
|
219
|
+
self._baseURL(), API_VER, list_name)
|
|
220
|
+
recipient_entry = gdata.apps.EmailListRecipientEntry()
|
|
221
|
+
recipient_entry.who = gdata.apps.Who(email=recipient)
|
|
222
|
+
|
|
223
|
+
try:
|
|
224
|
+
return gdata.apps.EmailListRecipientEntryFromString(
|
|
225
|
+
str(self.Post(recipient_entry, uri)))
|
|
226
|
+
except gdata.service.RequestError as e:
|
|
227
|
+
raise AppsForYourDomainException(e.args[0])
|
|
228
|
+
|
|
229
|
+
def DeleteEmailList(self, list_name):
|
|
230
|
+
"""Delete a email list"""
|
|
231
|
+
|
|
232
|
+
uri = "%s/emailList/%s/%s" % (self._baseURL(), API_VER, list_name)
|
|
233
|
+
try:
|
|
234
|
+
self.Delete(uri)
|
|
235
|
+
except gdata.service.RequestError as e:
|
|
236
|
+
raise AppsForYourDomainException(e.args[0])
|
|
237
|
+
|
|
238
|
+
def CreateEmailList(self, list_name):
|
|
239
|
+
"""Create a email list. """
|
|
240
|
+
|
|
241
|
+
uri = "%s/emailList/%s" % (self._baseURL(), API_VER)
|
|
242
|
+
email_list_entry = gdata.apps.EmailListEntry()
|
|
243
|
+
email_list_entry.email_list = gdata.apps.EmailList(name=list_name)
|
|
244
|
+
try:
|
|
245
|
+
return gdata.apps.EmailListEntryFromString(
|
|
246
|
+
str(self.Post(email_list_entry, uri)))
|
|
247
|
+
except gdata.service.RequestError as e:
|
|
248
|
+
raise AppsForYourDomainException(e.args[0])
|
|
249
|
+
|
|
250
|
+
def DeleteNickname(self, nickname):
|
|
251
|
+
"""Delete a nickname"""
|
|
252
|
+
|
|
253
|
+
uri = "%s/nickname/%s/%s" % (self._baseURL(), API_VER, nickname)
|
|
254
|
+
try:
|
|
255
|
+
self.Delete(uri)
|
|
256
|
+
except gdata.service.RequestError as e:
|
|
257
|
+
raise AppsForYourDomainException(e.args[0])
|
|
258
|
+
|
|
259
|
+
def RetrievePageOfNicknames(self, start_nickname=None,
|
|
260
|
+
num_retries=gdata.service.DEFAULT_NUM_RETRIES,
|
|
261
|
+
delay=gdata.service.DEFAULT_DELAY,
|
|
262
|
+
backoff=gdata.service.DEFAULT_BACKOFF):
|
|
263
|
+
"""Retrieve one page of nicknames in the domain"""
|
|
264
|
+
|
|
265
|
+
uri = "%s/nickname/%s" % (self._baseURL(), API_VER)
|
|
266
|
+
if start_nickname is not None:
|
|
267
|
+
uri += "?startNickname=%s" % start_nickname
|
|
268
|
+
try:
|
|
269
|
+
return gdata.apps.NicknameFeedFromString(str(self.GetWithRetries(
|
|
270
|
+
uri, num_retries=num_retries, delay=delay, backoff=backoff)))
|
|
271
|
+
except gdata.service.RequestError as e:
|
|
272
|
+
raise AppsForYourDomainException(e.args[0])
|
|
273
|
+
|
|
274
|
+
def GetGeneratorForAllNicknames(
|
|
275
|
+
self, num_retries=gdata.service.DEFAULT_NUM_RETRIES,
|
|
276
|
+
delay=gdata.service.DEFAULT_DELAY, backoff=gdata.service.DEFAULT_BACKOFF):
|
|
277
|
+
"""Retrieve a generator for all nicknames in this domain."""
|
|
278
|
+
first_page = self.RetrievePageOfNicknames(num_retries=num_retries,
|
|
279
|
+
delay=delay,
|
|
280
|
+
backoff=backoff)
|
|
281
|
+
return self.GetGeneratorFromLinkFinder(
|
|
282
|
+
first_page, gdata.apps.NicknameFeedFromString, num_retries=num_retries,
|
|
283
|
+
delay=delay, backoff=backoff)
|
|
284
|
+
|
|
285
|
+
def RetrieveAllNicknames(self):
|
|
286
|
+
"""Retrieve all nicknames in the domain"""
|
|
287
|
+
|
|
288
|
+
ret = self.RetrievePageOfNicknames()
|
|
289
|
+
# pagination
|
|
290
|
+
return self.AddAllElementsFromAllPages(
|
|
291
|
+
ret, gdata.apps.NicknameFeedFromString)
|
|
292
|
+
|
|
293
|
+
def GetGeneratorForAllNicknamesOfAUser(
|
|
294
|
+
self, user_name, num_retries=gdata.service.DEFAULT_NUM_RETRIES,
|
|
295
|
+
delay=gdata.service.DEFAULT_DELAY, backoff=gdata.service.DEFAULT_BACKOFF):
|
|
296
|
+
"""Retrieve a generator for all nicknames of a particular user."""
|
|
297
|
+
uri = "%s/nickname/%s?username=%s" % (self._baseURL(), API_VER, user_name)
|
|
298
|
+
try:
|
|
299
|
+
first_page = gdata.apps.NicknameFeedFromString(str(self.GetWithRetries(
|
|
300
|
+
uri, num_retries=num_retries, delay=delay, backoff=backoff)))
|
|
301
|
+
except gdata.service.RequestError as e:
|
|
302
|
+
raise AppsForYourDomainException(e.args[0])
|
|
303
|
+
return self.GetGeneratorFromLinkFinder(
|
|
304
|
+
first_page, gdata.apps.NicknameFeedFromString, num_retries=num_retries,
|
|
305
|
+
delay=delay, backoff=backoff)
|
|
306
|
+
|
|
307
|
+
def RetrieveNicknames(self, user_name):
|
|
308
|
+
"""Retrieve nicknames of the user"""
|
|
309
|
+
|
|
310
|
+
uri = "%s/nickname/%s?username=%s" % (self._baseURL(), API_VER, user_name)
|
|
311
|
+
try:
|
|
312
|
+
ret = gdata.apps.NicknameFeedFromString(str(self.Get(uri)))
|
|
313
|
+
except gdata.service.RequestError as e:
|
|
314
|
+
raise AppsForYourDomainException(e.args[0])
|
|
315
|
+
|
|
316
|
+
# pagination
|
|
317
|
+
return self.AddAllElementsFromAllPages(
|
|
318
|
+
ret, gdata.apps.NicknameFeedFromString)
|
|
319
|
+
|
|
320
|
+
def RetrieveNickname(self, nickname):
|
|
321
|
+
"""Retrieve a nickname.
|
|
322
|
+
|
|
323
|
+
Args:
|
|
324
|
+
nickname: string The nickname to retrieve
|
|
325
|
+
|
|
326
|
+
Returns:
|
|
327
|
+
gdata.apps.NicknameEntry
|
|
328
|
+
"""
|
|
329
|
+
|
|
330
|
+
uri = "%s/nickname/%s/%s" % (self._baseURL(), API_VER, nickname)
|
|
331
|
+
try:
|
|
332
|
+
return gdata.apps.NicknameEntryFromString(str(self.Get(uri)))
|
|
333
|
+
except gdata.service.RequestError as e:
|
|
334
|
+
raise AppsForYourDomainException(e.args[0])
|
|
335
|
+
|
|
336
|
+
def CreateNickname(self, user_name, nickname):
|
|
337
|
+
"""Create a nickname"""
|
|
338
|
+
|
|
339
|
+
uri = "%s/nickname/%s" % (self._baseURL(), API_VER)
|
|
340
|
+
nickname_entry = gdata.apps.NicknameEntry()
|
|
341
|
+
nickname_entry.login = gdata.apps.Login(user_name=user_name)
|
|
342
|
+
nickname_entry.nickname = gdata.apps.Nickname(name=nickname)
|
|
343
|
+
|
|
344
|
+
try:
|
|
345
|
+
return gdata.apps.NicknameEntryFromString(
|
|
346
|
+
str(self.Post(nickname_entry, uri)))
|
|
347
|
+
except gdata.service.RequestError as e:
|
|
348
|
+
raise AppsForYourDomainException(e.args[0])
|
|
349
|
+
|
|
350
|
+
def DeleteUser(self, user_name):
|
|
351
|
+
"""Delete a user account"""
|
|
352
|
+
|
|
353
|
+
uri = "%s/user/%s/%s" % (self._baseURL(), API_VER, user_name)
|
|
354
|
+
try:
|
|
355
|
+
return self.Delete(uri)
|
|
356
|
+
except gdata.service.RequestError as e:
|
|
357
|
+
raise AppsForYourDomainException(e.args[0])
|
|
358
|
+
|
|
359
|
+
def UpdateUser(self, user_name, user_entry):
|
|
360
|
+
"""Update a user account."""
|
|
361
|
+
|
|
362
|
+
uri = "%s/user/%s/%s" % (self._baseURL(), API_VER, user_name)
|
|
363
|
+
try:
|
|
364
|
+
return gdata.apps.UserEntryFromString(str(self.Put(user_entry, uri)))
|
|
365
|
+
except gdata.service.RequestError as e:
|
|
366
|
+
raise AppsForYourDomainException(e.args[0])
|
|
367
|
+
|
|
368
|
+
def CreateUser(self, user_name, family_name, given_name, password,
|
|
369
|
+
suspended='false', quota_limit=None,
|
|
370
|
+
password_hash_function=None,
|
|
371
|
+
change_password=None):
|
|
372
|
+
"""Create a user account. """
|
|
373
|
+
|
|
374
|
+
uri = "%s/user/%s" % (self._baseURL(), API_VER)
|
|
375
|
+
user_entry = gdata.apps.UserEntry()
|
|
376
|
+
user_entry.login = gdata.apps.Login(
|
|
377
|
+
user_name=user_name, password=password, suspended=suspended,
|
|
378
|
+
hash_function_name=password_hash_function,
|
|
379
|
+
change_password=change_password)
|
|
380
|
+
user_entry.name = gdata.apps.Name(family_name=family_name,
|
|
381
|
+
given_name=given_name)
|
|
382
|
+
if quota_limit is not None:
|
|
383
|
+
user_entry.quota = gdata.apps.Quota(limit=str(quota_limit))
|
|
384
|
+
|
|
385
|
+
try:
|
|
386
|
+
return gdata.apps.UserEntryFromString(str(self.Post(user_entry, uri)))
|
|
387
|
+
except gdata.service.RequestError as e:
|
|
388
|
+
raise AppsForYourDomainException(e.args[0])
|
|
389
|
+
|
|
390
|
+
def SuspendUser(self, user_name):
|
|
391
|
+
user_entry = self.RetrieveUser(user_name)
|
|
392
|
+
if user_entry.login.suspended != 'true':
|
|
393
|
+
user_entry.login.suspended = 'true'
|
|
394
|
+
user_entry = self.UpdateUser(user_name, user_entry)
|
|
395
|
+
return user_entry
|
|
396
|
+
|
|
397
|
+
def RestoreUser(self, user_name):
|
|
398
|
+
user_entry = self.RetrieveUser(user_name)
|
|
399
|
+
if user_entry.login.suspended != 'false':
|
|
400
|
+
user_entry.login.suspended = 'false'
|
|
401
|
+
user_entry = self.UpdateUser(user_name, user_entry)
|
|
402
|
+
return user_entry
|
|
403
|
+
|
|
404
|
+
def RetrieveUser(self, user_name):
|
|
405
|
+
"""Retrieve an user account.
|
|
406
|
+
|
|
407
|
+
Args:
|
|
408
|
+
user_name: string The user name to retrieve
|
|
409
|
+
|
|
410
|
+
Returns:
|
|
411
|
+
gdata.apps.UserEntry
|
|
412
|
+
"""
|
|
413
|
+
|
|
414
|
+
uri = "%s/user/%s/%s" % (self._baseURL(), API_VER, user_name)
|
|
415
|
+
try:
|
|
416
|
+
return gdata.apps.UserEntryFromString(str(self.Get(uri)))
|
|
417
|
+
except gdata.service.RequestError as e:
|
|
418
|
+
raise AppsForYourDomainException(e.args[0])
|
|
419
|
+
|
|
420
|
+
def RetrievePageOfUsers(self, start_username=None,
|
|
421
|
+
num_retries=gdata.service.DEFAULT_NUM_RETRIES,
|
|
422
|
+
delay=gdata.service.DEFAULT_DELAY,
|
|
423
|
+
backoff=gdata.service.DEFAULT_BACKOFF):
|
|
424
|
+
"""Retrieve one page of users in this domain."""
|
|
425
|
+
|
|
426
|
+
uri = "%s/user/%s" % (self._baseURL(), API_VER)
|
|
427
|
+
if start_username is not None:
|
|
428
|
+
uri += "?startUsername=%s" % start_username
|
|
429
|
+
try:
|
|
430
|
+
return gdata.apps.UserFeedFromString(str(self.GetWithRetries(
|
|
431
|
+
uri, num_retries=num_retries, delay=delay, backoff=backoff)))
|
|
432
|
+
except gdata.service.RequestError as e:
|
|
433
|
+
raise AppsForYourDomainException(e.args[0])
|
|
434
|
+
|
|
435
|
+
def GetGeneratorForAllUsers(self,
|
|
436
|
+
num_retries=gdata.service.DEFAULT_NUM_RETRIES,
|
|
437
|
+
delay=gdata.service.DEFAULT_DELAY,
|
|
438
|
+
backoff=gdata.service.DEFAULT_BACKOFF):
|
|
439
|
+
"""Retrieve a generator for all users in this domain."""
|
|
440
|
+
first_page = self.RetrievePageOfUsers(num_retries=num_retries, delay=delay,
|
|
441
|
+
backoff=backoff)
|
|
442
|
+
return self.GetGeneratorFromLinkFinder(
|
|
443
|
+
first_page, gdata.apps.UserFeedFromString, num_retries=num_retries,
|
|
444
|
+
delay=delay, backoff=backoff)
|
|
445
|
+
|
|
446
|
+
def RetrieveAllUsers(self):
|
|
447
|
+
"""Retrieve all users in this domain. OBSOLETE"""
|
|
448
|
+
|
|
449
|
+
ret = self.RetrievePageOfUsers()
|
|
450
|
+
# pagination
|
|
451
|
+
return self.AddAllElementsFromAllPages(
|
|
452
|
+
ret, gdata.apps.UserFeedFromString)
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
class PropertyService(gdata.service.GDataService):
|
|
456
|
+
"""Client for the Google Apps Property service."""
|
|
457
|
+
|
|
458
|
+
def __init__(self, email=None, password=None, domain=None, source=None,
|
|
459
|
+
server='apps-apis.google.com', additional_headers=None):
|
|
460
|
+
gdata.service.GDataService.__init__(self, email=email, password=password,
|
|
461
|
+
service='apps', source=source,
|
|
462
|
+
server=server,
|
|
463
|
+
additional_headers=additional_headers)
|
|
464
|
+
self.ssl = True
|
|
465
|
+
self.port = 443
|
|
466
|
+
self.domain = domain
|
|
467
|
+
|
|
468
|
+
def AddAllElementsFromAllPages(self, link_finder, func):
|
|
469
|
+
"""retrieve all pages and add all elements"""
|
|
470
|
+
next = link_finder.GetNextLink()
|
|
471
|
+
count = 0
|
|
472
|
+
while next is not None:
|
|
473
|
+
next_feed = self.Get(next.href, converter=func)
|
|
474
|
+
count = count + len(next_feed.entry)
|
|
475
|
+
for a_entry in next_feed.entry:
|
|
476
|
+
link_finder.entry.append(a_entry)
|
|
477
|
+
next = next_feed.GetNextLink()
|
|
478
|
+
return link_finder
|
|
479
|
+
|
|
480
|
+
def _GetPropertyEntry(self, properties):
|
|
481
|
+
property_entry = gdata.apps.PropertyEntry()
|
|
482
|
+
property = []
|
|
483
|
+
for name, value in properties.items():
|
|
484
|
+
if name is not None and value is not None:
|
|
485
|
+
property.append(gdata.apps.Property(name=name, value=value))
|
|
486
|
+
property_entry.property = property
|
|
487
|
+
return property_entry
|
|
488
|
+
|
|
489
|
+
def _PropertyEntry2Dict(self, property_entry):
|
|
490
|
+
properties = {}
|
|
491
|
+
for i, property in enumerate(property_entry.property):
|
|
492
|
+
properties[property.name] = property.value
|
|
493
|
+
return properties
|
|
494
|
+
|
|
495
|
+
def _GetPropertyFeed(self, uri):
|
|
496
|
+
try:
|
|
497
|
+
return gdata.apps.PropertyFeedFromString(str(self.Get(uri)))
|
|
498
|
+
except gdata.service.RequestError as e:
|
|
499
|
+
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
500
|
+
|
|
501
|
+
def _GetPropertiesList(self, uri):
|
|
502
|
+
property_feed = self._GetPropertyFeed(uri)
|
|
503
|
+
# pagination
|
|
504
|
+
property_feed = self.AddAllElementsFromAllPages(
|
|
505
|
+
property_feed, gdata.apps.PropertyFeedFromString)
|
|
506
|
+
properties_list = []
|
|
507
|
+
for property_entry in property_feed.entry:
|
|
508
|
+
properties_list.append(self._PropertyEntry2Dict(property_entry))
|
|
509
|
+
return properties_list
|
|
510
|
+
|
|
511
|
+
def _GetProperties(self, uri):
|
|
512
|
+
try:
|
|
513
|
+
return self._PropertyEntry2Dict(gdata.apps.PropertyEntryFromString(
|
|
514
|
+
str(self.Get(uri))))
|
|
515
|
+
except gdata.service.RequestError as e:
|
|
516
|
+
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
517
|
+
|
|
518
|
+
def _PostProperties(self, uri, properties):
|
|
519
|
+
property_entry = self._GetPropertyEntry(properties)
|
|
520
|
+
try:
|
|
521
|
+
return self._PropertyEntry2Dict(gdata.apps.PropertyEntryFromString(
|
|
522
|
+
str(self.Post(property_entry, uri))))
|
|
523
|
+
except gdata.service.RequestError as e:
|
|
524
|
+
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
525
|
+
|
|
526
|
+
def _PutProperties(self, uri, properties):
|
|
527
|
+
property_entry = self._GetPropertyEntry(properties)
|
|
528
|
+
try:
|
|
529
|
+
return self._PropertyEntry2Dict(gdata.apps.PropertyEntryFromString(
|
|
530
|
+
str(self.Put(property_entry, uri))))
|
|
531
|
+
except gdata.service.RequestError as e:
|
|
532
|
+
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
533
|
+
|
|
534
|
+
def _DeleteProperties(self, uri):
|
|
535
|
+
try:
|
|
536
|
+
self.Delete(uri)
|
|
537
|
+
except gdata.service.RequestError as e:
|
|
538
|
+
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
def _bool2str(b):
|
|
542
|
+
if b is None:
|
|
543
|
+
return None
|
|
544
|
+
return str(b is True).lower()
|