gam7 7.27.3__py3-none-any.whl → 7.27.5__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 CHANGED
@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
25
25
  """
26
26
 
27
27
  __author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
28
- __version__ = '7.27.03'
28
+ __version__ = '7.27.05'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -35921,7 +35921,7 @@ def doPrintShowGroupTree():
35921
35921
  # gam create cigroup <EmailAddress>
35922
35922
  # [copyfrom <GroupItem>] <GroupAttribute>
35923
35923
  # [makeowner] [alias|aliases <CIGroupAliasList>]
35924
- # [security|makesecuritygroup]
35924
+ # [security|makesecuritygroup] [locked]
35925
35925
  # [dynamic <QueryDynamicGroup>]
35926
35926
  def doCreateCIGroup():
35927
35927
  doCreateGroup(ciGroupsAPI=True)
@@ -36105,7 +36105,6 @@ def doUpdateCIGroups():
36105
36105
 
36106
36106
  cd = buildGAPIObject(API.DIRECTORY)
36107
36107
  ci = buildGAPIObject(API.CLOUDIDENTITY_GROUPS)
36108
- cib = None
36109
36108
  entityType = Ent.CLOUD_IDENTITY_GROUP
36110
36109
  csvPF = None
36111
36110
  getBeforeUpdate = preview = False
@@ -36214,7 +36213,6 @@ def doUpdateCIGroups():
36214
36213
  _, name, _ = convertGroupEmailToCloudID(ci, group, i, count)
36215
36214
  if not name:
36216
36215
  continue
36217
- cipl = ci
36218
36216
  twoUpdates = False
36219
36217
  if 'labels' in ci_body or lockGroup is not None:
36220
36218
  try:
@@ -36243,20 +36241,16 @@ def doUpdateCIGroups():
36243
36241
  else:
36244
36242
  if CIGROUP_LOCKED_LABEL in ci_body['labels']:
36245
36243
  ci_body['labels'].pop(CIGROUP_LOCKED_LABEL)
36246
- if CIGROUP_LOCKED_LABEL in ci_body['labels']:
36247
- if cib is None:
36248
- cib = buildGAPIObject(API.CLOUDIDENTITY_GROUPS_BETA)
36249
- cipl = cib
36250
36244
  if ci_body:
36251
36245
  try:
36252
36246
  if twoUpdates:
36253
36247
  ci_body['labels'].pop(CIGROUP_LOCKED_LABEL)
36254
- callGAPI(cipl.groups(), 'patch',
36248
+ callGAPI(ci.groups(), 'patch',
36255
36249
  throwReasons=GAPI.CIGROUP_UPDATE_THROW_REASONS,
36256
36250
  retryReasons=GAPI.CIGROUP_RETRY_REASONS,
36257
36251
  name=name, body=ci_body, updateMask=','.join(list(ci_body.keys())))
36258
36252
  ci_body['labels'][CIGROUP_LOCKED_LABEL] = ''
36259
- callGAPI(cipl.groups(), 'patch',
36253
+ callGAPI(ci.groups(), 'patch',
36260
36254
  throwReasons=GAPI.CIGROUP_UPDATE_THROW_REASONS,
36261
36255
  retryReasons=GAPI.CIGROUP_RETRY_REASONS,
36262
36256
  name=name, body=ci_body, updateMask=','.join(list(ci_body.keys())))
@@ -37240,20 +37234,17 @@ def doPrintCIGroups():
37240
37234
  else:
37241
37235
  getFullFieldsList = list(CIGROUP_FULL_FIELDS)
37242
37236
  getFullFields = ','.join(getFullFieldsList)#
37243
- cipl = ci
37244
37237
  if query:
37245
37238
  method = 'search'
37246
37239
  if 'parent' not in query:
37247
37240
  query += f" && parent == '{parent}'"
37248
37241
  kwargs = {'query': query}
37249
- if CIGROUP_LOCKED_LABEL in query:
37250
- cipl = buildGAPIObject(API.CLOUDIDENTITY_GROUPS_BETA)
37251
37242
  else:
37252
37243
  method = 'list'
37253
37244
  kwargs = {'parent': parent}
37254
37245
  printGettingAllAccountEntities(Ent.CLOUD_IDENTITY_GROUP, query)
37255
37246
  try:
37256
- entityList = callGAPIpages(cipl.groups(), method, 'groups',
37247
+ entityList = callGAPIpages(ci.groups(), method, 'groups',
37257
37248
  pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute=['groupKey', 'id'],
37258
37249
  throwReasons=GAPI.CIGROUP_LIST_THROW_REASONS, retryReasons=GAPI.CIGROUP_RETRY_REASONS,
37259
37250
  view='FULL', fields=fieldsnp, pageSize=pageSize, **kwargs)
@@ -44236,6 +44227,28 @@ USER_JSON_SKIP_FIELDS = ['agreedToTerms', 'aliases', 'creationTime', 'customerId
44236
44227
 
44237
44228
  ALLOW_EMPTY_CUSTOM_TYPE = 'allowEmptyCustomType'
44238
44229
 
44230
+ def getNotifyArguments(myarg, notify, userNotification):
44231
+ if myarg == 'notify':
44232
+ if userNotification:
44233
+ notify['recipients'].extend(getNormalizedEmailAddressEntity(shlexSplit=True, noLower=True))
44234
+ else: #delegateNotificatiomn
44235
+ notify['notify'] = getBoolean()
44236
+ elif myarg == 'subject':
44237
+ notify['subject'] = getString(Cmd.OB_STRING)
44238
+ elif myarg in SORF_MSG_FILE_ARGUMENTS:
44239
+ notify['message'], notify['charset'], notify['html'] = getStringOrFile(myarg)
44240
+ elif myarg == 'html':
44241
+ notify['html'] = getBoolean()
44242
+ elif myarg == 'from':
44243
+ notify['from'] = getString(Cmd.OB_EMAIL_ADDRESS)
44244
+ elif myarg == 'mailbox':
44245
+ notify['mailbox'] = getString(Cmd.OB_EMAIL_ADDRESS)
44246
+ elif myarg == 'replyto':
44247
+ notify['replyto'] = getString(Cmd.OB_EMAIL_ADDRESS)
44248
+ else:
44249
+ return False
44250
+ return True
44251
+
44239
44252
  def getUserAttributes(cd, updateCmd, noUid=False):
44240
44253
  def getKeywordAttribute(keywords, attrdict, **opts):
44241
44254
  if Cmd.ArgumentsRemaining():
@@ -44351,22 +44364,10 @@ def getUserAttributes(cd, updateCmd, noUid=False):
44351
44364
  resolveConflictAccount = True
44352
44365
  while Cmd.ArgumentsRemaining():
44353
44366
  myarg = getArgument()
44354
- if myarg == 'notify':
44355
- notify['recipients'].extend(getNormalizedEmailAddressEntity(shlexSplit=True, noLower=True))
44367
+ if getNotifyArguments(myarg, notify, True):
44368
+ pass
44356
44369
  elif myarg == 'notifyrecoveryemail':
44357
44370
  parameters['notifyRecoveryEmail'] = True
44358
- elif myarg == 'subject':
44359
- notify['subject'] = getString(Cmd.OB_STRING)
44360
- elif myarg in SORF_MSG_FILE_ARGUMENTS:
44361
- notify['message'], notify['charset'], notify['html'] = getStringOrFile(myarg)
44362
- elif myarg == 'html':
44363
- notify['html'] = getBoolean()
44364
- elif myarg == 'from':
44365
- notify['from'] = getString(Cmd.OB_EMAIL_ADDRESS)
44366
- elif myarg == 'replyto':
44367
- notify['replyto'] = getString(Cmd.OB_EMAIL_ADDRESS)
44368
- elif myarg == 'mailbox':
44369
- notify['mailbox'] = getString(Cmd.OB_EMAIL_ADDRESS)
44370
44371
  elif PwdOpts.ProcessArgument(myarg, notify, notFoundBody):
44371
44372
  pass
44372
44373
  elif _getTagReplacement(myarg, tagReplacements, True):
@@ -44772,12 +44773,12 @@ def createUserAddAliases(cd, user, aliasList, i, count):
44772
44773
  # [license <SKUID> [product|productid <ProductID>]]
44773
44774
  # [[notify <EmailAddressList>] [notifyrecoveryemail]
44774
44775
  # [subject <String>]
44775
- # [notifypassword <String>]
44776
- # [from <EmailAaddress>]
44776
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
44777
44777
  # [replyto <EmailAaddress>]
44778
- # [<NotifyMessageContent>]
44779
- # (replace <Tag> <UserReplacement>)*
44780
- # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
44778
+ # [notifypassword <String>]
44779
+ # [<NotifyMessageContent>] [html [<Boolean>]]
44780
+ # (replace <Tag> <UserReplacement>)*
44781
+ # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
44781
44782
  # [logpassword <FileName>] [ignorenullpassword]
44782
44783
  # [addnumericsuffixonduplicate <Number>]
44783
44784
  def doCreateUser():
@@ -44876,12 +44877,12 @@ def verifyUserPrimaryEmail(cd, user, createIfNotFound, i, count):
44876
44877
  # [alias|aliases <EmailAddressList>]
44877
44878
  # [[notify <EmailAddressList>] [notifyrecoveryemail]
44878
44879
  # [subject <String>]
44879
- # [notifypassword <String>]
44880
- # [from <EmailAaddress>]
44880
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
44881
44881
  # [replyto <EmailAaddress>]
44882
- # [<NotifyMessageContent>
44882
+ # [<NotifyMessageContent> [html [<Boolean>]]
44883
44883
  # (replace <Tag> <UserReplacement>)*
44884
44884
  # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
44885
+ # [notifypassword <String>]]
44885
44886
  # [notifyonupdate [<Boolean>]]
44886
44887
  # [logpassword <FileName>] [ignorenullpassword]
44887
44888
  def updateUsers(entityList):
@@ -49156,6 +49157,7 @@ def _getCoursesInfo(croom, courseSelectionParameters, courseShowProperties, getO
49156
49157
  # [show none|all|students|teachers] [countsonly]
49157
49158
  # [fields <CourseFieldNameList>] [skipfields <CourseFieldNameList>]
49158
49159
  # [timefilter creationtime|updatetime] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
49160
+ # (addcsvdata <FieldName> <String>)*
49159
49161
  # [showitemcountonly] [formatjson [quotechar <Character>]]
49160
49162
  def doPrintCourses():
49161
49163
  def _saveParticipants(course, participants, role, rtitles):
@@ -49199,6 +49201,7 @@ def doPrintCourses():
49199
49201
  delimiter = GC.Values[GC.CSV_OUTPUT_FIELD_DELIMITER]
49200
49202
  showItemCountOnly = False
49201
49203
  useOwnerAccess = GC.Values[GC.USE_COURSE_OWNER_ACCESS]
49204
+ addCSVData = {}
49202
49205
  while Cmd.ArgumentsRemaining():
49203
49206
  myarg = getArgument()
49204
49207
  if myarg == 'todrive':
@@ -49213,6 +49216,9 @@ def doPrintCourses():
49213
49216
  pass
49214
49217
  elif myarg == 'showitemcountonly':
49215
49218
  showItemCountOnly = True
49219
+ elif myarg == 'addcsvdata':
49220
+ k = getString(Cmd.OB_STRING)
49221
+ addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
49216
49222
  else:
49217
49223
  FJQC.GetFormatJSONQuoteChar(myarg, True)
49218
49224
  applyCourseItemFilter = _setApplyCourseItemFilter(courseItemFilter, None)
@@ -49224,6 +49230,11 @@ def doPrintCourses():
49224
49230
  if showItemCountOnly:
49225
49231
  writeStdout('0\n')
49226
49232
  return
49233
+ if addCSVData:
49234
+ csvPF.AddTitles(sorted(addCSVData.keys()))
49235
+ if FJQC.formatJSON:
49236
+ csvPF.AddJSONTitles(sorted(addCSVData.keys()))
49237
+ csvPF.MoveJSONTitlesToEnd(['JSON'])
49227
49238
  if courseShowProperties['aliases']:
49228
49239
  if FJQC.formatJSON:
49229
49240
  csvPF.AddJSONTitles('JSON-aliases')
@@ -49281,11 +49292,15 @@ def doPrintCourses():
49281
49292
  if courseShowProperties['members'] != 'teachers':
49282
49293
  _saveParticipants(course, students, 'students', stitles)
49283
49294
  row = flattenJSON(course, timeObjects=COURSE_TIME_OBJECTS, noLenObjects=COURSE_NOLEN_OBJECTS)
49295
+ if addCSVData:
49296
+ row.update(addCSVData)
49284
49297
  if not FJQC.formatJSON:
49285
49298
  csvPF.WriteRowTitles(row)
49286
49299
  elif csvPF.CheckRowTitles(row):
49287
49300
  row = {'id': courseId, 'JSON': json.dumps(cleanJSON(course, timeObjects=COURSE_TIME_OBJECTS),
49288
49301
  ensure_ascii=False, sort_keys=True)}
49302
+ if addCSVData:
49303
+ row.update(addCSVData)
49289
49304
  if courseShowProperties['aliases']:
49290
49305
  row['JSON-aliases'] = json.dumps(list(aliases))
49291
49306
  if courseShowProperties['members'] != 'none':
@@ -73923,14 +73938,58 @@ def printShowMessages(users):
73923
73938
  def printShowThreads(users):
73924
73939
  printShowMessagesThreads(users, Ent.THREAD)
73925
73940
 
73941
+ def sendCreateDelegateNotification(user, delegate, basenotify, i=0, count=0, msgFrom=None):
73942
+ # Substitute for #user#, #delegate#
73943
+ def _substituteForPattern(field, pattern, value):
73944
+ if field.find('#') == -1:
73945
+ return field
73946
+ return field.replace(pattern, value)
73947
+
73948
+ def _makeSubstitutions(field):
73949
+ notify[field] = _substituteForPattern(notify[field], '#user#', user)
73950
+ notify[field] = _substituteForPattern(notify[field], '#delegate#', delegate)
73951
+
73952
+ notify = basenotify.copy()
73953
+ if not notify['subject']:
73954
+ notify['subject'] = Msg.CREATE_DELEGATE_NOTIFY_SUBJECT
73955
+ _makeSubstitutions('subject')
73956
+ if not notify['message']:
73957
+ notify['message'] = Msg.CREATE_DELEGATE_NOTIFY_MESSAGE
73958
+ elif notify['html']:
73959
+ notify['message'] = notify['message'].replace('\r', '').replace('\\n', '<br/>')
73960
+ else:
73961
+ notify['message'] = notify['message'].replace('\r', '').replace('\\n', '\n')
73962
+ _makeSubstitutions('message')
73963
+ if 'from' in notify:
73964
+ msgFrom = notify['from']
73965
+ msgReplyTo = notify.get('replyto', None)
73966
+ mailBox = notify.get('mailbox', None)
73967
+ send_email(notify['subject'], notify['message'], delegate, i, count,
73968
+ msgFrom=msgFrom, msgReplyTo=msgReplyTo, html=notify['html'], charset=notify['charset'], mailBox=mailBox)
73969
+
73926
73970
  # gam <UserTypeEntity> create delegate|delegates [convertalias] <UserEntity>
73971
+ # [notify [<Boolean>]
73972
+ # [subject <String>]
73973
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
73974
+ # [replyto <EmailAaddress>]
73975
+ # [<NotifyMessageContent>] [html [<Boolean>]]
73976
+ # ]
73927
73977
  # gam <UserTypeEntity> delete delegate|delegates [convertalias] <UserEntity>
73928
73978
  def processDelegates(users):
73929
73979
  cd = buildGAPIObject(API.DIRECTORY)
73930
- function = 'delete' if Act.Get() == Act.DELETE else 'create'
73980
+ createCmd = Act.Get() != Act.DELETE
73931
73981
  aliasAllowed = not checkArgumentPresent(['convertalias'])
73932
73982
  delegateEntity = getUserObjectEntity(Cmd.OB_USER_ENTITY, Ent.DELEGATE)
73933
- checkForExtraneousArguments()
73983
+ notify = {'notify': False, 'subject': '', 'message': '', 'html': False, 'charset': UTF8}
73984
+ if createCmd:
73985
+ while Cmd.ArgumentsRemaining():
73986
+ myarg = getArgument()
73987
+ if getNotifyArguments(myarg, notify, False):
73988
+ pass
73989
+ else:
73990
+ unknownArgumentExit()
73991
+ else:
73992
+ checkForExtraneousArguments()
73934
73993
  i, count, users = getEntityArgument(users)
73935
73994
  for user in users:
73936
73995
  i += 1
@@ -73942,25 +74001,37 @@ def processDelegates(users):
73942
74001
  for delegate in delegates:
73943
74002
  j += 1
73944
74003
  delegateEmail = convertUIDtoEmailAddress(delegate, cd=cd, emailTypes=['user', 'group'], aliasAllowed=aliasAllowed)
74004
+ kvList = [Ent.USER, user, Ent.DELEGATE, delegateEmail]
73945
74005
  try:
73946
- if function == 'create':
73947
- callGAPI(gmail.users().settings().delegates(), function,
74006
+ if createCmd:
74007
+ callGAPI(gmail.users().settings().delegates(), 'create',
73948
74008
  throwReasons=GAPI.GMAIL_THROW_REASONS+[GAPI.ALREADY_EXISTS, GAPI.FAILED_PRECONDITION, GAPI.INVALID,
73949
74009
  GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
73950
74010
  userId='me', body={'delegateEmail': delegateEmail})
74011
+ entityActionPerformed(kvList, j, jcount)
74012
+ if notify['notify']:
74013
+ Ind.Increment()
74014
+ sendCreateDelegateNotification(user, delegateEmail, notify, j, jcount)
74015
+ Ind.Decrement()
73951
74016
  else:
73952
- callGAPI(gmail.users().settings().delegates(), function,
74017
+ callGAPI(gmail.users().settings().delegates(), 'delete',
73953
74018
  throwReasons=GAPI.GMAIL_THROW_REASONS+[GAPI.NOT_FOUND, GAPI.INVALID_INPUT, GAPI.PERMISSION_DENIED],
73954
74019
  userId='me', delegateEmail=delegateEmail)
73955
- entityActionPerformed([Ent.USER, user, Ent.DELEGATE, delegateEmail], j, jcount)
74020
+ entityActionPerformed(kvList, j, jcount)
73956
74021
  except (GAPI.alreadyExists, GAPI.failedPrecondition, GAPI.invalid,
73957
74022
  GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
73958
- entityActionFailedWarning([Ent.USER, user, Ent.DELEGATE, delegateEmail], str(e), j, jcount)
74023
+ entityActionFailedWarning(kvList, str(e), j, jcount)
73959
74024
  except GAPI.serviceNotAvailable:
73960
74025
  userGmailServiceNotEnabledWarning(user, i, count)
73961
74026
  Ind.Decrement()
73962
74027
 
73963
74028
  # gam <UserTypeEntity> delegate to [convertalias] <UserEntity>
74029
+ # [notify [<Boolean>]
74030
+ # [subject <String>]
74031
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
74032
+ # [replyto <EmailAaddress>]
74033
+ # [<NotifyMessageContent>] [html [<Boolean>]]
74034
+ # ]
73964
74035
  def delegateTo(users):
73965
74036
  checkArgumentPresent('to', required=True)
73966
74037
  processDelegates(users)
gam/gamlib/glapi.py CHANGED
@@ -46,7 +46,6 @@ CLASSROOM = 'classroom'
46
46
  CLOUDCHANNEL = 'cloudchannel'
47
47
  CLOUDIDENTITY_DEVICES = 'cloudidentitydevices'
48
48
  CLOUDIDENTITY_GROUPS = 'cloudidentitygroups'
49
- CLOUDIDENTITY_GROUPS_BETA = 'cloudidentitygroupsbeta'
50
49
  CLOUDIDENTITY_INBOUND_SSO = 'cloudidentityinboundsso'
51
50
  CLOUDIDENTITY_ORGUNITS = 'cloudidentityorgunits'
52
51
  CLOUDIDENTITY_ORGUNITS_BETA = 'cloudidentityorgunitsbeta'
@@ -242,7 +241,6 @@ _INFO = {
242
241
  CLOUDCHANNEL: {'name': 'Cloud Channel API', 'version': 'v1', 'v2discovery': True},
243
242
  CLOUDIDENTITY_DEVICES: {'name': 'Cloud Identity API - Devices', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
244
243
  CLOUDIDENTITY_GROUPS: {'name': 'Cloud Identity API - Groups', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
245
- CLOUDIDENTITY_GROUPS_BETA: {'name': 'Cloud Identity API - Groups Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
246
244
  CLOUDIDENTITY_INBOUND_SSO: {'name': 'Cloud Identity API - Inbound SSO Settings', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
247
245
  CLOUDIDENTITY_ORGUNITS: {'name': 'Cloud Identity API - OrgUnits', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
248
246
  CLOUDIDENTITY_ORGUNITS_BETA: {'name': 'Cloud Identity API - OrgUnits Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
@@ -387,10 +385,6 @@ _CLIENT_SCOPES = [
387
385
  'api': CLOUDIDENTITY_GROUPS,
388
386
  'subscopes': READONLY,
389
387
  'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
390
- {'name': 'Cloud Identity API - Groups Beta (Enables group locking/unlocking)',
391
- 'api': CLOUDIDENTITY_GROUPS_BETA,
392
- 'subscopes': [],
393
- 'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
394
388
  {'name': 'Cloud Identity API - Inbound SSO Settings',
395
389
  'api': CLOUDIDENTITY_INBOUND_SSO,
396
390
  'subscopes': READONLY,
gam/gamlib/glmsgs.py CHANGED
@@ -224,6 +224,8 @@ COUNT_N_EXCEEDS_MAX_TO_PROCESS_M = 'Count {0} exceeds maximum to {1} {2}'
224
224
  CORRUPT_FILE = 'Corrupt file'
225
225
  COULD_NOT_FIND_ANY_YUBIKEY = 'Could not find any YubiKey\n'
226
226
  COULD_NOT_FIND_YUBIKEY_WITH_SERIAL = 'Could not find YubiKey with serial number {0}\n'
227
+ CREATE_DELEGATE_NOTIFY_MESSAGE = '#user# has granted you #delegate# access to read, delete and send mail on their behalf.'
228
+ CREATE_DELEGATE_NOTIFY_SUBJECT = '#user# mail delegation to #delegate#'
227
229
  CREATE_USER_NOTIFY_MESSAGE = 'Hello #givenname# #familyname#,\n\nYou have a new account at #domain#\nAccount details:\nUsername: #user#\nPassword: #password#\nStart using your new account by signing in at\nhttps://www.google.com/accounts/AccountChooser?Email=#user#&continue=https://workspace.google.com/dashboard\n'
228
230
  CREATE_USER_NOTIFY_SUBJECT = 'Welcome to #domain#'
229
231
  CSV_DATA_ALREADY_SAVED = 'CSV data already saved'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.27.3
3
+ Version: 7.27.5
4
4
  Summary: CLI tool to manage Google Workspace
5
5
  Project-URL: Homepage, https://github.com/GAM-team/GAM
6
6
  Project-URL: Issues, https://github.com/GAM-team/GAM/issues
@@ -1,4 +1,4 @@
1
- gam/__init__.py,sha256=6tDyyHCVxCJwXYuFC70EhWj4crFEOwmfG7y62BVRL9M,3627187
1
+ gam/__init__.py,sha256=6PDXteFqxSWOxe1OFvcP0KN88cuEkZPVH6JmPM95r9M,3629732
2
2
  gam/__main__.py,sha256=VwEYS7a9vYQPbT6iLduMOoVUJ6p4R-HZgerZQmM1NpE,1307
3
3
  gam/cacerts.pem,sha256=DUsVo2XlFYwfkhe3gnxa-Km4Z4noz74hSApXwTT-nQE,44344
4
4
  gam/cbcm-v1.1beta1.json,sha256=xO5XloCQQULmPbFBx5bckdqmbLFQ7sJ2TImhE1ysDIY,19439
@@ -22,7 +22,7 @@ gam/atom/token_store.py,sha256=7E6Ecvxa86WCvl1pJAhv78jg9OxQv8pMtIUcPhZCq04,3803
22
22
  gam/atom/url.py,sha256=pxO1TlORxyKQTQ1bkBE1unFzjnv9c8LjJkm-UEORShY,4276
23
23
  gam/gamlib/__init__.py,sha256=z5mF-y0j8pm-YNFBaiuxB4M_GAUPG-cXWwrhYwrVReM,679
24
24
  gam/gamlib/glaction.py,sha256=1Il_HrChVnPkzZwiZs5au4mFQVtq4K1Z42uIuR6qdnI,9419
25
- gam/gamlib/glapi.py,sha256=g49VStWE64nCdrpNIMl60U06m98d3AGO8-vUDxgcBog,37048
25
+ gam/gamlib/glapi.py,sha256=t2ivDXJg4kH0SbdUJNdJH7IZG0uGEUz9gFuU3ri8CpQ,36638
26
26
  gam/gamlib/glcfg.py,sha256=do_FR9m9m7Bmh2SgjLPk2pysU-wPHt7PlqPPjX90tpw,28684
27
27
  gam/gamlib/glclargs.py,sha256=LlTtwJJHqU48l7SQT4bcZCWlw3Y46g42Bn1ACGW8gIk,53307
28
28
  gam/gamlib/glentity.py,sha256=KWFomkoNE6lLE83zVqVIlJ2rkzfLkhEasW1M0TWGieA,35373
@@ -30,7 +30,7 @@ gam/gamlib/glgapi.py,sha256=pdBbwNtnCwFWxJGaP-_3hdTjSNoOCJF2yo76WdQOi1k,40426
30
30
  gam/gamlib/glgdata.py,sha256=weRppttWm6uRyqtBoGPKoHiNZ2h28nhfUV4J_mbCszY,2707
31
31
  gam/gamlib/glglobals.py,sha256=U1eCXHOkWAtwVXG8-0HL4ZzQP0YcbeFlhJxbOa_x1QI,9804
32
32
  gam/gamlib/glindent.py,sha256=RfBa2LDfLIqPLL5vMfC689TCVmqn8xf-qulSzkiatrc,1228
33
- gam/gamlib/glmsgs.py,sha256=Cgb_81itIGaEMtLPVVkYZtfxIMsqECa-eBjh7fA_o7A,34059
33
+ gam/gamlib/glmsgs.py,sha256=TkLg6p8o9elVIbe_4Kq0hac6qSM-qoIMuQvXoEn4Q_c,34254
34
34
  gam/gamlib/glskus.py,sha256=29vlBLBJCL4u9GawCt3eNeZq9HQG3hGFZk9-EainNng,15384
35
35
  gam/gamlib/gluprop.py,sha256=IyPLCyvn7-NHTUenM71YPQPXRZXx6CB5q-GtJ-FYd1c,11461
36
36
  gam/gamlib/glverlibs.py,sha256=mDphdXVN_dJlGUVGuLqOEA3yHBNBeqRV4DRoTX7Wl7A,982
@@ -47,8 +47,8 @@ gam/gdata/apps/audit/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrK
47
47
  gam/gdata/apps/audit/service.py,sha256=Z1eueThcNeVUMWP1DRWc_DGHrJCiJI8W_xj6L-cqu-Q,9658
48
48
  gam/gdata/apps/contacts/__init__.py,sha256=Um6zgIkiahZns7yAEuC3pxHSMD8iciZ_EoynSLoYPfU,30463
49
49
  gam/gdata/apps/contacts/service.py,sha256=5lNb-Ii1Gyek6ePFji3kyoYtCBc8CuJTwagx2BL2o14,15684
50
- gam7-7.27.3.dist-info/METADATA,sha256=W85d4Rkgn2NKOZskyT90_iagAzpPGwCuiCC6OFh8GSo,3093
51
- gam7-7.27.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
- gam7-7.27.3.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
53
- gam7-7.27.3.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
- gam7-7.27.3.dist-info/RECORD,,
50
+ gam7-7.27.5.dist-info/METADATA,sha256=iZoJeKU1yqmMJyPCY7_mGJ1B_5C-usNASAEvyqRS4d0,3093
51
+ gam7-7.27.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
+ gam7-7.27.5.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
53
+ gam7-7.27.5.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
+ gam7-7.27.5.dist-info/RECORD,,
File without changes