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.

Files changed (72) hide show
  1. gam/__init__.py +77555 -0
  2. gam/__main__.py +40 -0
  3. gam/atom/__init__.py +1460 -0
  4. gam/atom/auth.py +41 -0
  5. gam/atom/client.py +214 -0
  6. gam/atom/core.py +535 -0
  7. gam/atom/data.py +327 -0
  8. gam/atom/http.py +354 -0
  9. gam/atom/http_core.py +599 -0
  10. gam/atom/http_interface.py +144 -0
  11. gam/atom/mock_http.py +123 -0
  12. gam/atom/mock_http_core.py +313 -0
  13. gam/atom/mock_service.py +235 -0
  14. gam/atom/service.py +723 -0
  15. gam/atom/token_store.py +105 -0
  16. gam/atom/url.py +130 -0
  17. gam/cacerts.pem +1130 -0
  18. gam/cbcm-v1.1beta1.json +593 -0
  19. gam/contactdelegation-v1.json +249 -0
  20. gam/datastudio-v1.json +486 -0
  21. gam/gamlib/__init__.py +17 -0
  22. gam/gamlib/glaction.py +308 -0
  23. gam/gamlib/glapi.py +837 -0
  24. gam/gamlib/glcfg.py +616 -0
  25. gam/gamlib/glclargs.py +1184 -0
  26. gam/gamlib/glentity.py +831 -0
  27. gam/gamlib/glgapi.py +817 -0
  28. gam/gamlib/glgdata.py +98 -0
  29. gam/gamlib/glglobals.py +307 -0
  30. gam/gamlib/glindent.py +46 -0
  31. gam/gamlib/glmsgs.py +547 -0
  32. gam/gamlib/glskus.py +246 -0
  33. gam/gamlib/gluprop.py +279 -0
  34. gam/gamlib/glverlibs.py +33 -0
  35. gam/gamlib/yubikey.py +202 -0
  36. gam/gdata/__init__.py +825 -0
  37. gam/gdata/alt/__init__.py +20 -0
  38. gam/gdata/alt/app_engine.py +101 -0
  39. gam/gdata/alt/appengine.py +321 -0
  40. gam/gdata/apps/__init__.py +526 -0
  41. gam/gdata/apps/audit/__init__.py +1 -0
  42. gam/gdata/apps/audit/service.py +278 -0
  43. gam/gdata/apps/contacts/__init__.py +874 -0
  44. gam/gdata/apps/contacts/service.py +355 -0
  45. gam/gdata/apps/service.py +544 -0
  46. gam/gdata/apps/sites/__init__.py +283 -0
  47. gam/gdata/apps/sites/service.py +246 -0
  48. gam/gdata/service.py +1714 -0
  49. gam/gdata/urlfetch.py +247 -0
  50. gam/googleapiclient/__init__.py +27 -0
  51. gam/googleapiclient/_auth.py +167 -0
  52. gam/googleapiclient/_helpers.py +207 -0
  53. gam/googleapiclient/channel.py +315 -0
  54. gam/googleapiclient/discovery.py +1662 -0
  55. gam/googleapiclient/discovery_cache/__init__.py +78 -0
  56. gam/googleapiclient/discovery_cache/appengine_memcache.py +55 -0
  57. gam/googleapiclient/discovery_cache/base.py +46 -0
  58. gam/googleapiclient/discovery_cache/file_cache.py +145 -0
  59. gam/googleapiclient/errors.py +197 -0
  60. gam/googleapiclient/http.py +1962 -0
  61. gam/googleapiclient/mimeparse.py +183 -0
  62. gam/googleapiclient/model.py +429 -0
  63. gam/googleapiclient/schema.py +317 -0
  64. gam/googleapiclient/version.py +15 -0
  65. gam/iso8601/__init__.py +28 -0
  66. gam/iso8601/iso8601.py +160 -0
  67. gam/serviceaccountlookup-v1.json +141 -0
  68. gam/six.py +982 -0
  69. gam7-7.3.4.dist-info/METADATA +69 -0
  70. gam7-7.3.4.dist-info/RECORD +72 -0
  71. gam7-7.3.4.dist-info/WHEEL +4 -0
  72. 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()