gam7 7.23.7__py3-none-any.whl → 7.24.1__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.23.07'
28
+ __version__ = '7.24.01'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -3049,9 +3049,10 @@ def getGDocData(gformat):
3049
3049
  mimeType = GDOC_FORMAT_MIME_TYPES[gformat]
3050
3050
  user = getEmailAddress()
3051
3051
  fileIdEntity = getDriveFileEntity(queryShortcutsOK=False)
3052
- user, drive, jcount = _validateUserGetFileIDs(user, 0, 0, fileIdEntity)
3052
+ _, drive = buildGAPIServiceObject(chooseSaAPI(API.DRIVECD, API.DRIVE3), user)
3053
3053
  if not drive:
3054
3054
  sys.exit(GM.Globals[GM.SYSEXITRC])
3055
+ _, _, jcount = _validateUserGetFileIDs(user, 0, 0, fileIdEntity, drive=drive)
3055
3056
  if jcount == 0:
3056
3057
  getGDocSheetDataFailedExit([Ent.USER, user], Msg.NO_ENTITIES_FOUND.format(Ent.Singular(Ent.DRIVE_FILE)))
3057
3058
  if jcount > 1:
@@ -3105,14 +3106,15 @@ def getGSheetData():
3105
3106
  user = getEmailAddress()
3106
3107
  fileIdEntity = getDriveFileEntity(queryShortcutsOK=False)
3107
3108
  sheetEntity = getSheetEntity(False)
3108
- user, drive, jcount = _validateUserGetFileIDs(user, 0, 0, fileIdEntity)
3109
+ user, drive = buildGAPIServiceObject(chooseSaAPI(API.DRIVECD, API.DRIVE3), user)
3109
3110
  if not drive:
3110
3111
  sys.exit(GM.Globals[GM.SYSEXITRC])
3112
+ _, _, jcount = _validateUserGetFileIDs(user, 0, 0, fileIdEntity, drive=drive)
3111
3113
  if jcount == 0:
3112
3114
  getGDocSheetDataFailedExit([Ent.USER, user], Msg.NO_ENTITIES_FOUND.format(Ent.Singular(Ent.DRIVE_FILE)))
3113
3115
  if jcount > 1:
3114
3116
  getGDocSheetDataFailedExit([Ent.USER, user], Msg.MULTIPLE_ENTITIES_FOUND.format(Ent.Plural(Ent.DRIVE_FILE), jcount, ','.join(fileIdEntity['list'])))
3115
- _, sheet = buildGAPIServiceObject(API.SHEETS, user)
3117
+ _, sheet = buildGAPIServiceObject(chooseSaAPI(API.SHEETSCD, API.SHEETS), user)
3116
3118
  if not sheet:
3117
3119
  sys.exit(GM.Globals[GM.SYSEXITRC])
3118
3120
  fileId = fileIdEntity['list'][0]
@@ -4801,8 +4803,6 @@ def defaultSvcAcctScopes():
4801
4803
  saScopes[scope['api']].extend(scope['scope'])
4802
4804
  saScopes[API.DRIVEACTIVITY].append(API.DRIVE_SCOPE)
4803
4805
  saScopes[API.DRIVE2] = saScopes[API.DRIVE3]
4804
- saScopes[API.DRIVETD] = saScopes[API.DRIVE3]
4805
- saScopes[API.SHEETSTD] = saScopes[API.SHEETS]
4806
4806
  return saScopes
4807
4807
 
4808
4808
  def _getSvcAcctData():
@@ -5609,6 +5609,12 @@ def getSaUser(user):
5609
5609
  GM.Globals[GM.CURRENT_CLIENT_API_SCOPES] = currentClientAPIScopes
5610
5610
  return userEmail
5611
5611
 
5612
+ def chooseSaAPI(api1, api2):
5613
+ _getSvcAcctData()
5614
+ if api1 in GM.Globals[GM.SVCACCT_SCOPES]:
5615
+ return api1
5616
+ return api2
5617
+
5612
5618
  def buildGAPIServiceObject(api, user, i=0, count=0, displayError=True):
5613
5619
  userEmail = getSaUser(user)
5614
5620
  httpObj = getHttpObj(cache=GM.Globals[GM.CACHE_DIR])
@@ -8030,7 +8036,7 @@ class CSVPrintFile():
8030
8036
 
8031
8037
  def getDriveObject():
8032
8038
  if not GC.Values[GC.TODRIVE_CLIENTACCESS]:
8033
- _, drive = buildGAPIServiceObject(API.DRIVETD, self.todrive['user'])
8039
+ _, drive = buildGAPIServiceObject(chooseSaAPI(API.DRIVETD, API.DRIVE3), self.todrive['user'])
8034
8040
  if not drive:
8035
8041
  invalidTodriveUserExit(Ent.USER, Msg.NOT_FOUND)
8036
8042
  else:
@@ -8183,7 +8189,7 @@ class CSVPrintFile():
8183
8189
  if result['mimeType'] != MIMETYPE_GA_SPREADSHEET:
8184
8190
  invalidTodriveFileIdExit([], f'{Msg.NOT_A} {Ent.Singular(Ent.SPREADSHEET)}', tdfileidLocation)
8185
8191
  if not GC.Values[GC.TODRIVE_CLIENTACCESS]:
8186
- _, sheet = buildGAPIServiceObject(API.SHEETSTD, self.todrive['user'])
8192
+ _, sheet = buildGAPIServiceObject(chooseSaAPI(API.SHEETSTD, API.SHEETS), self.todrive['user'])
8187
8193
  if sheet is None:
8188
8194
  invalidTodriveUserExit(Ent.USER, Msg.NOT_FOUND)
8189
8195
  else:
@@ -8696,7 +8702,7 @@ class CSVPrintFile():
8696
8702
  sheetTitle += tdtime.strftime(self.todrive['sheettimeformat'])
8697
8703
  action = Act.Get()
8698
8704
  if not GC.Values[GC.TODRIVE_CLIENTACCESS]:
8699
- user, drive = buildGAPIServiceObject(API.DRIVETD, self.todrive['user'])
8705
+ user, drive = buildGAPIServiceObject(chooseSaAPI(API.DRIVETD, API.DRIVE3), self.todrive['user'])
8700
8706
  if not drive:
8701
8707
  closeFile(csvFile)
8702
8708
  return
@@ -8729,7 +8735,7 @@ class CSVPrintFile():
8729
8735
  if result['mimeType'] != MIMETYPE_GA_SPREADSHEET:
8730
8736
  todriveCSVErrorExit(entityValueList, f'{Msg.NOT_A} {Ent.Singular(Ent.SPREADSHEET)}')
8731
8737
  if not GC.Values[GC.TODRIVE_CLIENTACCESS]:
8732
- _, sheet = buildGAPIServiceObject(API.SHEETSTD, user)
8738
+ _, sheet = buildGAPIServiceObject(chooseSaAPI(API.SHEETSTD, API.SHEETS), user)
8733
8739
  if sheet is None:
8734
8740
  return
8735
8741
  else:
@@ -8877,7 +8883,7 @@ class CSVPrintFile():
8877
8883
  (self.todrive['sheetEntity'] or self.todrive['locale'] or self.todrive['timeZone'] or
8878
8884
  self.todrive['sheettitle'] or self.todrive['cellwrap'] or self.todrive['cellnumberformat'])):
8879
8885
  if not GC.Values[GC.TODRIVE_CLIENTACCESS]:
8880
- _, sheet = buildGAPIServiceObject(API.SHEETSTD, user)
8886
+ _, sheet = buildGAPIServiceObject(chooseSaAPI(API.SHEETSTD, API.SHEETS), user)
8881
8887
  if sheet is None:
8882
8888
  return
8883
8889
  else:
@@ -16263,7 +16269,7 @@ def _showCustomerLicenseInfo(customerInfo, FJQC):
16263
16269
  while True:
16264
16270
  try:
16265
16271
  result = callGAPI(rep.customerUsageReports(), 'get',
16266
- throwReasons=[GAPI.INVALID, GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
16272
+ throwReasons=[GAPI.INVALID, GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
16267
16273
  date=tryDate, customerId=customerInfo['id'],
16268
16274
  fields='warnings,usageReports', parameters=parameters)
16269
16275
  usageReports = numUsersAvailable(result)
@@ -16276,7 +16282,7 @@ def _showCustomerLicenseInfo(customerInfo, FJQC):
16276
16282
  if fullData == 0:
16277
16283
  continue
16278
16284
  break
16279
- except GAPI.invalid as e:
16285
+ except (GAPI.invalid, GAPI.failedPrecondition) as e:
16280
16286
  tryDate = _adjustTryDate(str(e), 0, -1, tryDate)
16281
16287
  if not tryDate:
16282
16288
  return
@@ -17052,10 +17058,7 @@ def doPrintShowAdmins():
17052
17058
  if assignedTo not in assignedToIdEmailMap:
17053
17059
  emailTypes = ALL_ASSIGNEE_TYPES if admin.get('assigneeType', '') != 'group' else ['group']
17054
17060
  assigneeEmail, assigneeType = convertUIDtoEmailAddressWithType(f'uid:{assignedTo}', cd, sal, emailTypes=emailTypes)
17055
- if assigneeType in ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP:
17056
- assignedToField = ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP[assigneeType]
17057
- else:
17058
- assignedToField = 'assignedToUnknown'
17061
+ assignedToField = ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP.get(assigneeType, 'assignedToUnknown')
17059
17062
  if assignedToField == 'assignedToUnknown':
17060
17063
  assigneeEmail = True
17061
17064
  assignedToIdEmailMap[assignedTo] = {'assignedToField': assignedToField, 'assigneeEmail': assigneeEmail}
@@ -17084,6 +17087,7 @@ def doPrintShowAdmins():
17084
17087
  typesSet = set()
17085
17088
  kwargs = {}
17086
17089
  rolePrivileges = {}
17090
+ allGroupRoles = ','.join(sorted(ALL_GROUP_ROLES))
17087
17091
  fieldsList = PRINT_ADMIN_FIELDS+['assigneeType']
17088
17092
  assignedToIdEmailMap = {}
17089
17093
  while Cmd.ArgumentsRemaining():
@@ -17098,7 +17102,6 @@ def doPrintShowAdmins():
17098
17102
  pass
17099
17103
  elif myarg == 'recursive':
17100
17104
  recursive = True
17101
- allGroupRoles = ','.join(sorted(ALL_GROUP_ROLES))
17102
17105
  memberOptions = initMemberOptions()
17103
17106
  memberOptions[MEMBEROPTION_INCLUDEDERIVEDMEMBERSHIP] = True
17104
17107
  memberOptions[MEMBEROPTION_DISPLAYMATCH] = False
@@ -17136,7 +17139,7 @@ def doPrintShowAdmins():
17136
17139
  return
17137
17140
  except GAPI.notFound as e:
17138
17141
  entityActionFailedExit([Ent.ADMIN_ROLE, kwargs['roleId']], str(e))
17139
- except (GAPI.forbidden, GAPI.serviceNotAvailable) as e:
17142
+ except GAPI.serviceNotAvailable as e:
17140
17143
  entityActionFailedExit([Ent.ADMINISTRATOR, userKey], str(e))
17141
17144
  except (GAPI.badRequest, GAPI.customerNotFound):
17142
17145
  accessErrorExit(cd)
@@ -17164,7 +17167,6 @@ def doPrintShowAdmins():
17164
17167
  groupMembers[assignedTo] = membersList[:]
17165
17168
  if not _setNamesFromIds(admin, _getPrivileges(admin)):
17166
17169
  continue
17167
- expandedAdmins.append(admin)
17168
17170
  if not groupMembers[assignedTo]:
17169
17171
  expandedAdmins.append(admin)
17170
17172
  continue
@@ -17203,7 +17205,7 @@ def doPrintShowAdmins():
17203
17205
  else:
17204
17206
  for admin in expandedAdmins:
17205
17207
  admin.pop('assigneeType', None)
17206
- admin.pop('assignedToField')
17208
+ admin.pop('assignedToField', None)
17207
17209
  if not oneItemPerRow or 'rolePrivileges' not in admin:
17208
17210
  csvPF.WriteRowTitles(flattenJSON(admin))
17209
17211
  else:
gam/gamlib/glapi.py CHANGED
@@ -60,6 +60,7 @@ DIRECTORY = 'directory'
60
60
  DOCS = 'docs'
61
61
  DRIVE2 = 'drive2'
62
62
  DRIVE3 = 'drive3'
63
+ DRIVECD = 'drivecd'
63
64
  DRIVETD = 'drivetd'
64
65
  DRIVEACTIVITY = 'driveactivity'
65
66
  DRIVELABELS = 'drivelabels'
@@ -91,6 +92,7 @@ SERVICEACCOUNTLOOKUP = 'serviceaccountlookup'
91
92
  SERVICEMANAGEMENT = 'servicemanagement'
92
93
  SERVICEUSAGE = 'serviceusage'
93
94
  SHEETS = 'sheets'
95
+ SHEETSCD = 'sheetscd'
94
96
  SHEETSTD = 'sheetstd'
95
97
  SITEVERIFICATION = 'siteVerification'
96
98
  STORAGE = 'storage'
@@ -156,6 +158,7 @@ OAUTH2_TOKEN_ERRORS = [
156
158
  'access_denied: Account restricted',
157
159
  'internal_failure: Backend Error',
158
160
  'internal_failure: None',
161
+ 'invalid_account: Forbidden',
159
162
  'invalid_grant',
160
163
  'invalid_grant: Bad Request',
161
164
  'invalid_grant: Invalid email or User ID',
@@ -253,7 +256,8 @@ _INFO = {
253
256
  DOCS: {'name': 'Docs API', 'version': 'v1', 'v2discovery': True},
254
257
  DRIVE2: {'name': 'Drive API v2', 'version': 'v2', 'v2discovery': False, 'mappedAPI': 'drive'},
255
258
  DRIVE3: {'name': 'Drive API v3', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
256
- DRIVETD: {'name': 'Drive API v3 - todrive', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
259
+ DRIVECD: {'name': 'Drive API v3 - read command data', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
260
+ DRIVETD: {'name': 'Drive API v3 - write todrive data', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
257
261
  DRIVEACTIVITY: {'name': 'Drive Activity API v2', 'version': 'v2', 'v2discovery': True},
258
262
  DRIVELABELS_ADMIN: {'name': 'Drive Labels API - Admin', 'version': 'v2', 'v2discovery': True, 'mappedAPI': DRIVELABELS},
259
263
  DRIVELABELS_USER: {'name': 'Drive Labels API - User', 'version': 'v2', 'v2discovery': True, 'mappedAPI': DRIVELABELS},
@@ -283,7 +287,8 @@ _INFO = {
283
287
  SERVICEMANAGEMENT: {'name': 'Service Management API', 'version': 'v1', 'v2discovery': True},
284
288
  SERVICEUSAGE: {'name': 'Service Usage API', 'version': 'v1', 'v2discovery': True},
285
289
  SHEETS: {'name': 'Sheets API', 'version': 'v4', 'v2discovery': True},
286
- SHEETSTD: {'name': 'Sheets API - todrive', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
290
+ SHEETSCD: {'name': 'Sheets API - read command data', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
291
+ SHEETSTD: {'name': 'Sheets API - write todrive data', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
287
292
  SITEVERIFICATION: {'name': 'Site Verification API', 'version': 'v1', 'v2discovery': True},
288
293
  STORAGE: {'name': 'Cloud Storage API', 'version': 'v1', 'v2discovery': True},
289
294
  STORAGEREAD: {'name': 'Cloud Storage API - Read', 'version': 'v1', 'v2discovery': True, 'mappedAPI': STORAGE},
@@ -750,9 +755,15 @@ _SVCACCT_SCOPES = [
750
755
  ]
751
756
 
752
757
  _SVCACCT_SPECIAL_SCOPES = [
753
- {'name': 'Drive API - todrive',
758
+ {'name': 'Drive API - read command data',
759
+ 'api': DRIVECD,
760
+ 'subscopes': [],
761
+ 'offByDefault': True,
762
+ 'scope': DRIVE_SCOPE+'.readonly'},
763
+ {'name': 'Drive API - write todrive data',
754
764
  'api': DRIVETD,
755
765
  'subscopes': [],
766
+ 'offByDefault': True,
756
767
  'scope': DRIVE_SCOPE},
757
768
  {'name': 'Gmail API - Full Access - read only',
758
769
  'api': GMAIL,
@@ -764,8 +775,14 @@ _SVCACCT_SPECIAL_SCOPES = [
764
775
  'subscopes': [],
765
776
  'offByDefault': True,
766
777
  'scope': GMAIL_SEND_SCOPE},
767
- {'name': 'Sheets API - todrive',
778
+ {'name': 'Sheets API - read command data',
779
+ 'api': SHEETSCD,
780
+ 'offByDefault': True,
781
+ 'subscopes': [],
782
+ 'scope': 'https://www.googleapis.com/auth/spreadsheets.readonly'},
783
+ {'name': 'Sheets API - write todrive data',
768
784
  'api': SHEETSTD,
785
+ 'offByDefault': True,
769
786
  'subscopes': [],
770
787
  'scope': 'https://www.googleapis.com/auth/spreadsheets'},
771
788
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.23.7
3
+ Version: 7.24.1
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=4YrLoMJgKhbcDviaShnbuPe-BAk8K_GZF8H-TtlObxM,3623580
1
+ gam/__init__.py,sha256=i7YaQlrH7H5C7Zt11T0UazlQbcMgwLtfBN8v5tTXjFs,3623835
2
2
  gam/__main__.py,sha256=amz0-959ph6zkZKqjaar4n60yho-T37w6qWI36qx0CA,1049
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=u97M7Y2BeP3tYEEGYEz-9kY4fdV0fYkeqC3YN-sRwNc,36028
25
+ gam/gamlib/glapi.py,sha256=1iz0ml8GcWRhs2BesJ_LxrAcoRwZDn5WG6Dryoy6sg0,36755
26
26
  gam/gamlib/glcfg.py,sha256=jX9IIrqSa8CPZ-UdnMDs2RuGo8vPh3jpgvRhI9VRbII,28325
27
27
  gam/gamlib/glclargs.py,sha256=LlTtwJJHqU48l7SQT4bcZCWlw3Y46g42Bn1ACGW8gIk,53307
28
28
  gam/gamlib/glentity.py,sha256=KWFomkoNE6lLE83zVqVIlJ2rkzfLkhEasW1M0TWGieA,35373
@@ -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.23.7.dist-info/METADATA,sha256=2BHtjvFhi6hIfTYI-IaSHB8pv4Omsqb3l1zJ0C9qBK8,3092
51
- gam7-7.23.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
- gam7-7.23.7.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
53
- gam7-7.23.7.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
- gam7-7.23.7.dist-info/RECORD,,
50
+ gam7-7.24.1.dist-info/METADATA,sha256=wRNSzJdAGm2Wy4lQuHlh_jBpxQSwfKu6iIfv3E6mtCQ,3092
51
+ gam7-7.24.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
+ gam7-7.24.1.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
53
+ gam7-7.24.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
+ gam7-7.24.1.dist-info/RECORD,,
File without changes