diff --git a/docs/GamUpdates.md b/docs/GamUpdates.md index ae62914c..b9af26a0 100644 --- a/docs/GamUpdates.md +++ b/docs/GamUpdates.md @@ -10,6 +10,11 @@ Add the `-s` option to the end of the above commands to suppress creating the `g See [Downloads](https://github.com/taers232c/GAMADV-XTD3/wiki/Downloads) for Windows or other options, including manual installation. +### 6.64.09 + +Eliminated extraneous `permisssions.0.xxxx` headers in `gam print filelist ... oneitemperrow` +that appeared when some user in `` had no files to display. + ### 6.64.08 Fixed bug in `redirect csv - todrive tdtitle "File Title" tdsheettitle "Sheet Title"` where diff --git a/docs/How-to-Upgrade-from-Standard-GAM.md b/docs/How-to-Upgrade-from-Standard-GAM.md index f126137e..05ba9715 100644 --- a/docs/How-to-Upgrade-from-Standard-GAM.md +++ b/docs/How-to-Upgrade-from-Standard-GAM.md @@ -334,7 +334,7 @@ writes the credentials into the file oauth2.txt. admin@server:/Users/admin/bin/gamadv-xtd3$ rm -f /Users/admin/GAMConfig/oauth2.txt admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam version WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found -GAMADV-XTD3 6.64.08 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.64.09 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.10.8 64-bit final MacOS High Sierra 10.13.6 x86_64 @@ -984,7 +984,7 @@ writes the credentials into the file oauth2.txt. C:\GAMADV-XTD3>del C:\GAMConfig\oauth2.txt C:\GAMADV-XTD3>gam version WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found -GAMADV-XTD3 6.64.08 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.64.09 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.11.5 64-bit final Windows-10-10.0.17134 AMD64 diff --git a/docs/Users-People-Contacts-Profiles.md b/docs/Users-People-Contacts-Profiles.md index 683321c1..f7dba498 100644 --- a/docs/Users-People-Contacts-Profiles.md +++ b/docs/Users-People-Contacts-Profiles.md @@ -361,6 +361,11 @@ If `` specifies `emailmatchpattern ` +yields contact group information but only gives the contact group ID. Use the `showgroups` option to have GAM +make additional API calls to get the contact group name associated with the ID. + ### Display as an indented list of keys and values. ``` gam info contacts diff --git a/docs/Version-and-Help.md b/docs/Version-and-Help.md index 670c292f..f30d10e0 100644 --- a/docs/Version-and-Help.md +++ b/docs/Version-and-Help.md @@ -4,7 +4,7 @@ Print the current version of Gam with details ``` gam version -GAMADV-XTD3 6.64.08 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.64.09 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.11.5 64-bit final MacOS Monterey 12.6.6 x86_64 @@ -16,7 +16,7 @@ Time: 2023-06-02T21:10:00-07:00 Print the current version of Gam with details and time offset information ``` gam version timeoffset -GAMADV-XTD3 6.64.08 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.64.09 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.11.5 64-bit final MacOS Monterey 12.6.6 x86_64 @@ -28,7 +28,7 @@ Your system time differs from www.googleapis.com by less than 1 second Print the current version of Gam with extended details and SSL information ``` gam version extended -GAMADV-XTD3 6.64.08 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.64.09 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.11.5 64-bit final MacOS Monterey 12.6.6 x86_64 @@ -65,7 +65,7 @@ MacOS High Sierra 10.13.6 x86_64 Path: /Users/Admin/bin/gamadv-xtd3 Version Check: Current: 5.35.08 - Latest: 6.64.08 + Latest: 6.64.09 echo $? 1 ``` @@ -73,7 +73,7 @@ echo $? Print the current version number without details ``` gam version simple -6.64.08 +6.64.09 ``` In Linux/MacOS you can do: ``` @@ -83,7 +83,7 @@ echo $VER Print the current version of Gam and address of this Wiki ``` gam help -GAM 6.64.08 - https://github.com/taers232c/GAMADV-XTD3 +GAM 6.64.09 - https://github.com/taers232c/GAMADV-XTD3 Ross Scroggs Python 3.11.5 64-bit final MacOS Monterey 12.6.6 x86_64 diff --git a/src/gam/__init__.py b/src/gam/__init__.py index 99dd66cc..f7472d06 100755 --- a/src/gam/__init__.py +++ b/src/gam/__init__.py @@ -7592,6 +7592,8 @@ class CSVPrintFile(): GM.Globals[GM.CSV_OUTPUT_TIMESTAMP_COLUMN] = GC.Values.get(GC.CSV_OUTPUT_TIMESTAMP_COLUMN, '') self.SetTimestampColumn(GM.Globals[GM.CSV_OUTPUT_TIMESTAMP_COLUMN]) self.SetFormatJSON(False) + self.SetMapDrive3Titles(False) + self.SetNodataFields(False, None, None, None, False) self.SetFixPaths(False) self.SetShowPermissionsLast(False) self.sortTitlesSet = set() @@ -7660,7 +7662,12 @@ class CSVPrintFile(): self.sortTitlesList = self.titlesList[:] self.sortTitlesSet = set(self.sortTitlesList) - def UpdateMappedTitles(self): + def SetMapDrive3Titles(self, mapDrive3Titles): + self.mapDrive3Titles = mapDrive3Titles + + def MapDrive3TitlesToDrive2(self): + _mapDrive3TitlesToDrive2(self.titlesList, API.DRIVE3_TO_DRIVE2_FILES_FIELDS_MAP) + _mapDrive3TitlesToDrive2(self.titlesList, API.DRIVE3_TO_DRIVE2_CAPABILITIES_TITLES_MAP) self.titlesSet = set(self.titlesList) def AddJSONTitle(self, title): @@ -8022,6 +8029,67 @@ class CSVPrintFile(): except ValueError: pass + def FixNodataTitles(self): + if self.mapNodataFields: + titles = [] + addPermissionsTitle = not self.oneItemPerRow + for field in self.nodataFields: + if field.find('(') != -1: + field, subFields = field.split('(', 1) + if field in self.driveListFields: + if field != 'permissions': + titles.append(field) + elif addPermissionsTitle: + titles.append(field) + addPermissionsTitle = False + titles.extend([f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}0{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}' for subField in subFields[:-1].split(',') if subField]) + else: + titles.extend([f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}' for subField in subFields[:-1].split(',') if subField]) + elif field.find('.') != -1: + field, subField = field.split('.', 1) + if field in self.driveListFields: + if field != 'permissions': + titles.append(field) + elif addPermissionsTitle: + titles.append(field) + addPermissionsTitle = False + titles.append(f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}0{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}') + else: + titles.append(f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}') + elif field.lower() in self.driveSubfieldsChoiceMap: + if field in self.driveListFields: + if field != 'permissions': + titles.append(field) + elif addPermissionsTitle: + titles.append(field) + addPermissionsTitle = False + for subField in iter(self.driveSubfieldsChoiceMap[field.lower()].values()): + if not isinstance(subField, list): + titles.append(f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}0{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}') + else: + titles.extend([f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}0{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subSubField}' for subSubField in subField]) + else: + for subField in iter(self.driveSubfieldsChoiceMap[field.lower()].values()): + if not isinstance(subField, list): + titles.append(f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}') + else: + titles.extend([f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subSubField}' for subSubField in subField]) + else: + titles.append(field) + if self.oneItemPerRow: + for i, title in enumerate(titles): + if title.startswith('permissions.0'): + titles[i] = title.replace('permissions.0', 'permission') + if not self.formatJSON: + self.SetTitles(titles) + self.SetSortTitles(['Owner', 'id', 'name', 'title']) + self.SortTitles() + else: + self.SetJSONTitles(titles) + else: + self.SetTitles(self.nodataFields) + self.SetJSONTitles(self.nodataFields) + def MovePermsToEnd(self): # Put permissions at end of titles try: @@ -8052,6 +8120,13 @@ class CSVPrintFile(): def SetFormatJSON(self, formatJSON): self.formatJSON = formatJSON + def SetNodataFields(self, mapNodataFields, nodataFields, driveListFields, driveSubfieldsChoiceMap, oneItemPerRow): + self.mapNodataFields = mapNodataFields + self.nodataFields = nodataFields + self.driveListFields = driveListFields + self.driveSubfieldsChoiceMap = driveSubfieldsChoiceMap + self.oneItemPerRow = oneItemPerRow + def SetFixPaths(self, fixPaths): self.fixPaths = fixPaths @@ -8550,7 +8625,14 @@ class CSVPrintFile(): self.formatJSON, self.JSONtitlesList, self.columnDelimiter, self.quoteChar, self.timestampColumn, - self.fixPaths, self.showPermissionsLast, + self.mapDrive3Titles, + self.fixPaths, + self.mapNodataFields, + self.nodataFields, + self.driveListFields, + self.driveSubfieldsChoiceMap, + self.oneItemPerRow, + self.showPermissionsLast, self.zeroBlankMimeTypeCounts))) GM.Globals[GM.CSVFILE][GM.REDIRECT_QUEUE].put((GM.REDIRECT_QUEUE_DATA, self.rows)) return @@ -8574,10 +8656,18 @@ class CSVPrintFile(): self.FixPathsTitles(self.titlesList) if self.showPermissionsLast: self.MovePermsToEnd() + if not self.rows and self.nodataFields is not None: + self.FixNodataTitles() + if self.mapDrive3Titles: + self. MapDrive3TitlesToDrive2() if self.timestampColumn: self.AddTitle(self.timestampColumn) titlesList = self.titlesList else: + if self.fixPaths: + self.FixPathsTitles(self.JSONtitlesList) + if not self.rows and self.nodataFields is not None: + self.FixNodataTitles() if self.timestampColumn: for i, v in enumerate(self.JSONtitlesList): if v.startswith('JSON'): @@ -9156,9 +9246,11 @@ def CSVFileQueueHandler(mpQueue, mpQueueStdout, mpQueueStderr, csvPF, datetimeNo csvPF.SetColumnDelimiter(dataItem[5]) csvPF.SetQuoteChar(dataItem[6]) csvPF.SetTimestampColumn(dataItem[7]) - csvPF.SetFixPaths(dataItem[8]) - csvPF.SetShowPermissionsLast(dataItem[9]) - csvPF.SetZeroBlankMimeTypeCounts(dataItem[10]) + csvPF.SetMapDrive3Titles(dataItem[8]) + csvPF.SetFixPaths(dataItem[9]) + csvPF.SetNoDataFields(dataItem[10], dataItem[11], dataItem[12], dataItem[13], dataItem[14]) + csvPF.SetShowPermissionsLast(dataItem[15]) + csvPF.SetZeroBlankMimeTypeCounts(dataItem[16]) elif dataType == GM.REDIRECT_QUEUE_DATA: csvPF.rows.extend(dataItem) elif dataType == GM.REDIRECT_QUEUE_ARGS: @@ -17681,6 +17773,7 @@ def doPrintAliases(): entityList = callGAPIpages(cd.groups(), 'list', 'groups', pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email', throwReasons=GAPI.GROUP_LIST_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, query=query, orderBy='email', fields=f'nextPageToken,groups({",".join(groupFields)})', **kwargs) for group in entityList: @@ -17750,6 +17843,7 @@ def doPrintAddresses(): entityList = callGAPIpages(cd.groups(), 'list', 'groups', pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email', throwReasons=GAPI.GROUP_LIST_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, orderBy='email', fields=f'nextPageToken,groups({",".join(groupFields)})', **kwargs) except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.forbidden, GAPI.badRequest): accessErrorExit(cd) @@ -30468,6 +30562,7 @@ def infoGroups(entityList): if getGroups: groups = callGAPIpages(cd.groups(), 'list', 'groups', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, userKey=group, orderBy='email', fields='nextPageToken,groups(name,email)') if getUsers: validRoles, listRoles, listFields = _getRoleVerification(memberRoles, 'nextPageToken,members(email,id,role,status,type)') @@ -31146,6 +31241,7 @@ def doPrintGroups(): entityList.extend(callGAPIpages(cd.groups(), 'list', 'groups', pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, orderBy='email', query=query, fields=cdfieldsnp, maxResults=maxResults, **kwargs)) except (GAPI.invalidMember, GAPI.invalidInput) as e: if not invalidMember(query): @@ -31379,6 +31475,7 @@ def getGroupMembersEntityList(cd, entityList, matchPatterns, fieldsList, kwargsD entityList.extend(callGAPIpages(cd.groups(), 'list', 'groups', pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, orderBy='email', query=query, fields=f'nextPageToken,groups({",".join(set(fieldsList))})', **kwargs)) except (GAPI.invalidMember, GAPI.invalidInput) as e: if not invalidMember(query): @@ -31858,6 +31955,7 @@ def doPrintShowGroupTree(): try: entityList = callGAPIpages(cd.groups(), 'list', 'groups', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, orderBy='email', fields='nextPageToken,groups(email,name)', **kwargs) for parentGroup in entityList: groupParents[groupEmail]['parents'].append(parentGroup['email']) @@ -40805,6 +40903,7 @@ def updateUsers(entityList): try: groups = callGAPIpages(cd.groups(), 'list', 'groups', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, userKey=userKey, orderBy='email', fields='nextPageToken,groups(email)') except (GAPI.invalidMember, GAPI.invalidInput): entityUnknownWarning(Ent.USER, userKey, i, count) @@ -41358,6 +41457,7 @@ def infoUsers(entityList): try: entityList = callGAPIpages(cd.groups(), 'list', 'groups', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, userKey=groupEmail, orderBy='email', fields='nextPageToken,groups(email,name)') for parentGroup in entityList: groupParents[groupEmail]['parents'].append(parentGroup['email']) @@ -41490,6 +41590,7 @@ def infoUsers(entityList): try: groups = callGAPIpages(cd.groups(), 'list', 'groups', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, userKey=user['primaryEmail'], orderBy='email', fields='nextPageToken,groups(name,email)', **kwargs) except (GAPI.forbidden, GAPI.domainNotFound): ### Print some message @@ -41881,6 +41982,7 @@ def doPrintUsers(entityList=None): groups = callGAPIpages(cd.groups(), 'list', 'groups', pageMessage=getPageMessageForWhom(), throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, userKey=userEmail, orderBy='email', fields='nextPageToken,groups(email)') numGroups = len(groups) if not printOptions['groupsInColumns']: @@ -52331,9 +52433,6 @@ def printFileList(users): timeObjects = _getDriveTimeObjects() if not GC.Values[GC.DRIVE_V3_NATIVE_NAMES]: fileNameTitle = 'title' - _mapDrive3TitlesToDrive2(csvPF.titlesList, API.DRIVE3_TO_DRIVE2_FILES_FIELDS_MAP) - _mapDrive3TitlesToDrive2(csvPF.titlesList, API.DRIVE3_TO_DRIVE2_CAPABILITIES_TITLES_MAP) - csvPF.UpdateMappedTitles() else: fileNameTitle = 'name' csvPF.RemoveTitles(['capabilities']) @@ -52350,6 +52449,23 @@ def printFileList(users): csvPFco.MoveTitlesToEnd(['Size']) csvPFco.MoveTitlesToEnd(['Total']) csvPFco.SetSortAllTitles() + if not nodataFields: + if DFF.fieldsList: + if not FJQC.formatJSON: + nodataFields = ['Owner']+list(set(DFF.fieldsList)-skipObjects) + else: + nodataFields = ['Owner', 'id', fileNameTitle, 'owners.emailAddress'] + else: + nodataFields = ['Owner', 'id', fileNameTitle, 'owners.emailAddress'] + if not FJQC.formatJSON: + nodataFields.append('permissions') + if filepath: + nodataFields.append('paths') + if FJQC.formatJSON: + nodataFields.append('JSON') + csvPF.SetNodataFields(True, nodataFields, DRIVE_LIST_FIELDS, DRIVE_SUBFIELDS_CHOICE_MAP, oneItemPerRow) + else: + csvPF.SetNodataFields(False, nodataFields, None, None, False) i, count, users = getEntityArgument(users) sizeTotals = {'User': 0, 'Summary': 0} for user in users: @@ -52508,59 +52624,9 @@ def printFileList(users): if not countsOnly: if not csvPF.rows: setSysExitRC(NO_ENTITIES_FOUND_RC) - if not nodataFields: - if DFF.fieldsList: - nodataFields = ['Owner']+list(set(DFF.fieldsList)-skipObjects) - else: - nodataFields = ['Owner', 'id', fileNameTitle, 'owners.emailAddress', 'permissions'] - if filepath: - nodataFields.append('paths') - if FJQC.formatJSON: - nodataFields.append('JSON') - titles = [] - for field in nodataFields: - if field.find('(') != -1: - field, subFields = field.split('(', 1) - if field in DRIVE_LIST_FIELDS: - titles.append(field) - titles.extend([f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}0{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}' for subField in subFields[:-1].split(',') if subField]) - else: - titles.extend([f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}' for subField in subFields[:-1].split(',') if subField]) - elif field.find('.') != -1: - field, subField = field.split('.', 1) - if field in DRIVE_LIST_FIELDS and (field != 'permissions' or pmselect): - titles.append(f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}0{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}') - else: - titles.append(f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}') - elif field.lower() in DRIVE_SUBFIELDS_CHOICE_MAP: - if field in DRIVE_LIST_FIELDS: - titles.append(field) - for subField in iter(DRIVE_SUBFIELDS_CHOICE_MAP[field.lower()].values()): - if not isinstance(subField, list): - titles.append(f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}0{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}') - else: - titles.extend([f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}0{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subSubField}' for subSubField in subField]) - else: - for subField in iter(DRIVE_SUBFIELDS_CHOICE_MAP[field.lower()].values()): - if not isinstance(subField, list): - titles.append(f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subField}') - else: - titles.extend([f'{field}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{subSubField}' for subSubField in subField]) - else: - titles.append(field) - csvPF.SetTitles(titles) - else: - csvPF.SetTitles(nodataFields) - csvPF.SetJSONTitles(nodataFields) - if not GC.Values[GC.DRIVE_V3_NATIVE_NAMES]: - _mapDrive3TitlesToDrive2(csvPF.titlesList, API.DRIVE3_TO_DRIVE2_FILES_FIELDS_MAP) - _mapDrive3TitlesToDrive2(csvPF.titlesList, API.DRIVE3_TO_DRIVE2_CAPABILITIES_TITLES_MAP) - csvPF.UpdateMappedTitles() if not FJQC.formatJSON: csvPF.SetSortTitles(['Owner', 'id', fileNameTitle]) else: - csvPF.JSONtitlesList.sort() - csvPF.FixPathsTitles(csvPF.JSONtitlesList) if 'JSON' in csvPF.JSONtitlesList: csvPF.MoveJSONTitlesToEnd(['JSON']) if GM.Globals[GM.CSVFILE][GM.REDIRECT_QUEUE] is None: @@ -53391,8 +53457,7 @@ def printShowFileTree(users): if not GC.Values[GC.DRIVE_V3_NATIVE_NAMES]: fileNameTitle = 'title' fileSize = 'fileSize' - _mapDrive3TitlesToDrive2(csvPF.titlesList, API.DRIVE3_TO_DRIVE2_FILES_FIELDS_MAP) - csvPF.UpdateMappedTitles() + csvPF.SetMapDrive3Titles(True) else: fileNameTitle = 'name' fileSize = 'size' @@ -60892,6 +60957,7 @@ def printShowSharedDriveACLs(users, useDomainAdminAccess=False): try: groups = callGAPIpages(cd.groups(), 'list', 'groups', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, userKey=emailAddress, orderBy='email', fields='nextPageToken,groups(email)') except (GAPI.invalidMember, GAPI.invalidInput): badRequestWarning(Ent.GROUP, Ent.MEMBER, emailAddress) @@ -61578,6 +61644,7 @@ def deleteUserFromGroups(users): try: result = callGAPIpages(cd.groups(), 'list', 'groups', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, orderBy='email', fields='nextPageToken,groups(email)', **kwargs) except (GAPI.invalidMember, GAPI.invalidInput): badRequestWarning(Ent.GROUP, Ent.MEMBER, user) @@ -61656,6 +61723,7 @@ def updateUserGroups(users): try: result = callGAPIpages(cd.groups(), 'list', 'groups', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, orderBy='email', fields='nextPageToken,groups(email)', **kwargs) except (GAPI.invalidMember, GAPI.invalidInput): badRequestWarning(Ent.GROUP, Ent.MEMBER, user) @@ -61728,6 +61796,7 @@ def syncUserWithGroups(users): try: entityList = callGAPIpages(cd.groups(), 'list', 'groups', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, orderBy='email', fields='nextPageToken,groups(email)', **kwargs) except (GAPI.invalidMember, GAPI.invalidInput): badRequestWarning(Ent.GROUP, Ent.MEMBER, user) @@ -61956,6 +62025,7 @@ def printShowUserGroups(users): entityList = callGAPIpages(cd.groups(), 'list', 'groups', pageMessage=pageMessage, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, orderBy='email', fields='nextPageToken,groups(email)', **kwargs) except (GAPI.invalidMember, GAPI.invalidInput): badRequestWarning(Ent.GROUP, Ent.MEMBER, user) @@ -62037,6 +62107,7 @@ def printShowGroupTree(users): try: entityList = callGAPIpages(cd.groups(), 'list', 'groups', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, orderBy='email', fields='nextPageToken,groups(email,name)', **kwargs) for parentGroup in entityList: groupParents[groupEmail]['parents'].append(parentGroup['email']) @@ -62116,6 +62187,7 @@ def printShowGroupTree(users): try: groups = callGAPIpages(cd.groups(), 'list', 'groups', throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, orderBy='email', fields='nextPageToken,groups(email,name)', **kwargs) except (GAPI.invalidMember, GAPI.invalidInput): entityUnknownWarning(Ent.USER, user, i, count) @@ -62190,6 +62262,7 @@ def printUserGroupsList(users): entityList = callGAPIpages(cd.groups(), 'list', 'groups', pageMessage=getPageMessageForWhom(), throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, + retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS, orderBy='email', fields='nextPageToken,groups(email)', **kwargs) except (GAPI.invalidMember, GAPI.invalidInput): badRequestWarning(Ent.GROUP, Ent.MEMBER, user)