Cleaned up print filelist when there are no rows to print

This commit is contained in:
Ross Scroggs
2023-10-10 07:21:38 -07:00
parent 7b6673b43b
commit c18cf75b4f
5 changed files with 151 additions and 68 deletions

View File

@@ -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. 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 <UserTypeEntity> print filelist ... oneitemperrow`
that appeared when some user in `<UserTypeEntity>` had no files to display.
### 6.64.08 ### 6.64.08
Fixed bug in `redirect csv - todrive tdtitle "File Title" tdsheettitle "Sheet Title"` where Fixed bug in `redirect csv - todrive tdtitle "File Title" tdsheettitle "Sheet Title"` where

View File

@@ -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$ rm -f /Users/admin/GAMConfig/oauth2.txt
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam version 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 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 <ross.scroggs@gmail.com> Ross Scroggs <ross.scroggs@gmail.com>
Python 3.10.8 64-bit final Python 3.10.8 64-bit final
MacOS High Sierra 10.13.6 x86_64 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>del C:\GAMConfig\oauth2.txt
C:\GAMADV-XTD3>gam version C:\GAMADV-XTD3>gam version
WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found 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 <ross.scroggs@gmail.com> Ross Scroggs <ross.scroggs@gmail.com>
Python 3.11.5 64-bit final Python 3.11.5 64-bit final
Windows-10-10.0.17134 AMD64 Windows-10-10.0.17134 AMD64

View File

@@ -361,6 +361,11 @@ If `<PeopleUserContactSelection>` specifies `emailmatchpattern <RegularExpressio
are updated. are updated.
## Display User Contacts ## Display User Contacts
### User Contact Group information
In the following commands, specifying `allfields` or including `memberships` in `fields <PeopleFieldNameList>`
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. ### Display as an indented list of keys and values.
``` ```
gam <UserTypeEntity> info contacts gam <UserTypeEntity> info contacts

View File

@@ -4,7 +4,7 @@
Print the current version of Gam with details Print the current version of Gam with details
``` ```
gam version 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 <ross.scroggs@gmail.com> Ross Scroggs <ross.scroggs@gmail.com>
Python 3.11.5 64-bit final Python 3.11.5 64-bit final
MacOS Monterey 12.6.6 x86_64 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 Print the current version of Gam with details and time offset information
``` ```
gam version timeoffset 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 <ross.scroggs@gmail.com> Ross Scroggs <ross.scroggs@gmail.com>
Python 3.11.5 64-bit final Python 3.11.5 64-bit final
MacOS Monterey 12.6.6 x86_64 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 Print the current version of Gam with extended details and SSL information
``` ```
gam version extended 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 <ross.scroggs@gmail.com> Ross Scroggs <ross.scroggs@gmail.com>
Python 3.11.5 64-bit final Python 3.11.5 64-bit final
MacOS Monterey 12.6.6 x86_64 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 Path: /Users/Admin/bin/gamadv-xtd3
Version Check: Version Check:
Current: 5.35.08 Current: 5.35.08
Latest: 6.64.08 Latest: 6.64.09
echo $? echo $?
1 1
``` ```
@@ -73,7 +73,7 @@ echo $?
Print the current version number without details Print the current version number without details
``` ```
gam version simple gam version simple
6.64.08 6.64.09
``` ```
In Linux/MacOS you can do: In Linux/MacOS you can do:
``` ```
@@ -83,7 +83,7 @@ echo $VER
Print the current version of Gam and address of this Wiki Print the current version of Gam and address of this Wiki
``` ```
gam help gam help
GAM 6.64.08 - https://github.com/taers232c/GAMADV-XTD3 GAM 6.64.09 - https://github.com/taers232c/GAMADV-XTD3
Ross Scroggs <ross.scroggs@gmail.com> Ross Scroggs <ross.scroggs@gmail.com>
Python 3.11.5 64-bit final Python 3.11.5 64-bit final
MacOS Monterey 12.6.6 x86_64 MacOS Monterey 12.6.6 x86_64

View File

@@ -7592,6 +7592,8 @@ class CSVPrintFile():
GM.Globals[GM.CSV_OUTPUT_TIMESTAMP_COLUMN] = GC.Values.get(GC.CSV_OUTPUT_TIMESTAMP_COLUMN, '') 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.SetTimestampColumn(GM.Globals[GM.CSV_OUTPUT_TIMESTAMP_COLUMN])
self.SetFormatJSON(False) self.SetFormatJSON(False)
self.SetMapDrive3Titles(False)
self.SetNodataFields(False, None, None, None, False)
self.SetFixPaths(False) self.SetFixPaths(False)
self.SetShowPermissionsLast(False) self.SetShowPermissionsLast(False)
self.sortTitlesSet = set() self.sortTitlesSet = set()
@@ -7660,7 +7662,12 @@ class CSVPrintFile():
self.sortTitlesList = self.titlesList[:] self.sortTitlesList = self.titlesList[:]
self.sortTitlesSet = set(self.sortTitlesList) 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) self.titlesSet = set(self.titlesList)
def AddJSONTitle(self, title): def AddJSONTitle(self, title):
@@ -8022,6 +8029,67 @@ class CSVPrintFile():
except ValueError: except ValueError:
pass 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): def MovePermsToEnd(self):
# Put permissions at end of titles # Put permissions at end of titles
try: try:
@@ -8052,6 +8120,13 @@ class CSVPrintFile():
def SetFormatJSON(self, formatJSON): def SetFormatJSON(self, formatJSON):
self.formatJSON = 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): def SetFixPaths(self, fixPaths):
self.fixPaths = fixPaths self.fixPaths = fixPaths
@@ -8550,7 +8625,14 @@ class CSVPrintFile():
self.formatJSON, self.JSONtitlesList, self.formatJSON, self.JSONtitlesList,
self.columnDelimiter, self.quoteChar, self.columnDelimiter, self.quoteChar,
self.timestampColumn, self.timestampColumn,
self.fixPaths, self.showPermissionsLast, self.mapDrive3Titles,
self.fixPaths,
self.mapNodataFields,
self.nodataFields,
self.driveListFields,
self.driveSubfieldsChoiceMap,
self.oneItemPerRow,
self.showPermissionsLast,
self.zeroBlankMimeTypeCounts))) self.zeroBlankMimeTypeCounts)))
GM.Globals[GM.CSVFILE][GM.REDIRECT_QUEUE].put((GM.REDIRECT_QUEUE_DATA, self.rows)) GM.Globals[GM.CSVFILE][GM.REDIRECT_QUEUE].put((GM.REDIRECT_QUEUE_DATA, self.rows))
return return
@@ -8574,10 +8656,18 @@ class CSVPrintFile():
self.FixPathsTitles(self.titlesList) self.FixPathsTitles(self.titlesList)
if self.showPermissionsLast: if self.showPermissionsLast:
self.MovePermsToEnd() self.MovePermsToEnd()
if not self.rows and self.nodataFields is not None:
self.FixNodataTitles()
if self.mapDrive3Titles:
self. MapDrive3TitlesToDrive2()
if self.timestampColumn: if self.timestampColumn:
self.AddTitle(self.timestampColumn) self.AddTitle(self.timestampColumn)
titlesList = self.titlesList titlesList = self.titlesList
else: else:
if self.fixPaths:
self.FixPathsTitles(self.JSONtitlesList)
if not self.rows and self.nodataFields is not None:
self.FixNodataTitles()
if self.timestampColumn: if self.timestampColumn:
for i, v in enumerate(self.JSONtitlesList): for i, v in enumerate(self.JSONtitlesList):
if v.startswith('JSON'): if v.startswith('JSON'):
@@ -9156,9 +9246,11 @@ def CSVFileQueueHandler(mpQueue, mpQueueStdout, mpQueueStderr, csvPF, datetimeNo
csvPF.SetColumnDelimiter(dataItem[5]) csvPF.SetColumnDelimiter(dataItem[5])
csvPF.SetQuoteChar(dataItem[6]) csvPF.SetQuoteChar(dataItem[6])
csvPF.SetTimestampColumn(dataItem[7]) csvPF.SetTimestampColumn(dataItem[7])
csvPF.SetFixPaths(dataItem[8]) csvPF.SetMapDrive3Titles(dataItem[8])
csvPF.SetShowPermissionsLast(dataItem[9]) csvPF.SetFixPaths(dataItem[9])
csvPF.SetZeroBlankMimeTypeCounts(dataItem[10]) 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: elif dataType == GM.REDIRECT_QUEUE_DATA:
csvPF.rows.extend(dataItem) csvPF.rows.extend(dataItem)
elif dataType == GM.REDIRECT_QUEUE_ARGS: elif dataType == GM.REDIRECT_QUEUE_ARGS:
@@ -17681,6 +17773,7 @@ def doPrintAliases():
entityList = callGAPIpages(cd.groups(), 'list', 'groups', entityList = callGAPIpages(cd.groups(), 'list', 'groups',
pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email', pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email',
throwReasons=GAPI.GROUP_LIST_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
query=query, orderBy='email', query=query, orderBy='email',
fields=f'nextPageToken,groups({",".join(groupFields)})', **kwargs) fields=f'nextPageToken,groups({",".join(groupFields)})', **kwargs)
for group in entityList: for group in entityList:
@@ -17750,6 +17843,7 @@ def doPrintAddresses():
entityList = callGAPIpages(cd.groups(), 'list', 'groups', entityList = callGAPIpages(cd.groups(), 'list', 'groups',
pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email', pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email',
throwReasons=GAPI.GROUP_LIST_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
orderBy='email', fields=f'nextPageToken,groups({",".join(groupFields)})', **kwargs) orderBy='email', fields=f'nextPageToken,groups({",".join(groupFields)})', **kwargs)
except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.forbidden, GAPI.badRequest): except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.forbidden, GAPI.badRequest):
accessErrorExit(cd) accessErrorExit(cd)
@@ -30468,6 +30562,7 @@ def infoGroups(entityList):
if getGroups: if getGroups:
groups = callGAPIpages(cd.groups(), 'list', 'groups', groups = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
userKey=group, orderBy='email', fields='nextPageToken,groups(name,email)') userKey=group, orderBy='email', fields='nextPageToken,groups(name,email)')
if getUsers: if getUsers:
validRoles, listRoles, listFields = _getRoleVerification(memberRoles, 'nextPageToken,members(email,id,role,status,type)') 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', entityList.extend(callGAPIpages(cd.groups(), 'list', 'groups',
pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email', pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
orderBy='email', query=query, fields=cdfieldsnp, maxResults=maxResults, **kwargs)) orderBy='email', query=query, fields=cdfieldsnp, maxResults=maxResults, **kwargs))
except (GAPI.invalidMember, GAPI.invalidInput) as e: except (GAPI.invalidMember, GAPI.invalidInput) as e:
if not invalidMember(query): if not invalidMember(query):
@@ -31379,6 +31475,7 @@ def getGroupMembersEntityList(cd, entityList, matchPatterns, fieldsList, kwargsD
entityList.extend(callGAPIpages(cd.groups(), 'list', 'groups', entityList.extend(callGAPIpages(cd.groups(), 'list', 'groups',
pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email', pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute='email',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, 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)) orderBy='email', query=query, fields=f'nextPageToken,groups({",".join(set(fieldsList))})', **kwargs))
except (GAPI.invalidMember, GAPI.invalidInput) as e: except (GAPI.invalidMember, GAPI.invalidInput) as e:
if not invalidMember(query): if not invalidMember(query):
@@ -31858,6 +31955,7 @@ def doPrintShowGroupTree():
try: try:
entityList = callGAPIpages(cd.groups(), 'list', 'groups', entityList = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
orderBy='email', fields='nextPageToken,groups(email,name)', **kwargs) orderBy='email', fields='nextPageToken,groups(email,name)', **kwargs)
for parentGroup in entityList: for parentGroup in entityList:
groupParents[groupEmail]['parents'].append(parentGroup['email']) groupParents[groupEmail]['parents'].append(parentGroup['email'])
@@ -40805,6 +40903,7 @@ def updateUsers(entityList):
try: try:
groups = callGAPIpages(cd.groups(), 'list', 'groups', groups = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
userKey=userKey, orderBy='email', fields='nextPageToken,groups(email)') userKey=userKey, orderBy='email', fields='nextPageToken,groups(email)')
except (GAPI.invalidMember, GAPI.invalidInput): except (GAPI.invalidMember, GAPI.invalidInput):
entityUnknownWarning(Ent.USER, userKey, i, count) entityUnknownWarning(Ent.USER, userKey, i, count)
@@ -41358,6 +41457,7 @@ def infoUsers(entityList):
try: try:
entityList = callGAPIpages(cd.groups(), 'list', 'groups', entityList = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
userKey=groupEmail, orderBy='email', fields='nextPageToken,groups(email,name)') userKey=groupEmail, orderBy='email', fields='nextPageToken,groups(email,name)')
for parentGroup in entityList: for parentGroup in entityList:
groupParents[groupEmail]['parents'].append(parentGroup['email']) groupParents[groupEmail]['parents'].append(parentGroup['email'])
@@ -41490,6 +41590,7 @@ def infoUsers(entityList):
try: try:
groups = callGAPIpages(cd.groups(), 'list', 'groups', groups = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, 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) userKey=user['primaryEmail'], orderBy='email', fields='nextPageToken,groups(name,email)', **kwargs)
except (GAPI.forbidden, GAPI.domainNotFound): except (GAPI.forbidden, GAPI.domainNotFound):
### Print some message ### Print some message
@@ -41881,6 +41982,7 @@ def doPrintUsers(entityList=None):
groups = callGAPIpages(cd.groups(), 'list', 'groups', groups = callGAPIpages(cd.groups(), 'list', 'groups',
pageMessage=getPageMessageForWhom(), pageMessage=getPageMessageForWhom(),
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
userKey=userEmail, orderBy='email', fields='nextPageToken,groups(email)') userKey=userEmail, orderBy='email', fields='nextPageToken,groups(email)')
numGroups = len(groups) numGroups = len(groups)
if not printOptions['groupsInColumns']: if not printOptions['groupsInColumns']:
@@ -52331,9 +52433,6 @@ def printFileList(users):
timeObjects = _getDriveTimeObjects() timeObjects = _getDriveTimeObjects()
if not GC.Values[GC.DRIVE_V3_NATIVE_NAMES]: if not GC.Values[GC.DRIVE_V3_NATIVE_NAMES]:
fileNameTitle = 'title' 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: else:
fileNameTitle = 'name' fileNameTitle = 'name'
csvPF.RemoveTitles(['capabilities']) csvPF.RemoveTitles(['capabilities'])
@@ -52350,6 +52449,23 @@ def printFileList(users):
csvPFco.MoveTitlesToEnd(['Size']) csvPFco.MoveTitlesToEnd(['Size'])
csvPFco.MoveTitlesToEnd(['Total']) csvPFco.MoveTitlesToEnd(['Total'])
csvPFco.SetSortAllTitles() 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) i, count, users = getEntityArgument(users)
sizeTotals = {'User': 0, 'Summary': 0} sizeTotals = {'User': 0, 'Summary': 0}
for user in users: for user in users:
@@ -52508,59 +52624,9 @@ def printFileList(users):
if not countsOnly: if not countsOnly:
if not csvPF.rows: if not csvPF.rows:
setSysExitRC(NO_ENTITIES_FOUND_RC) 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: if not FJQC.formatJSON:
csvPF.SetSortTitles(['Owner', 'id', fileNameTitle]) csvPF.SetSortTitles(['Owner', 'id', fileNameTitle])
else: else:
csvPF.JSONtitlesList.sort()
csvPF.FixPathsTitles(csvPF.JSONtitlesList)
if 'JSON' in csvPF.JSONtitlesList: if 'JSON' in csvPF.JSONtitlesList:
csvPF.MoveJSONTitlesToEnd(['JSON']) csvPF.MoveJSONTitlesToEnd(['JSON'])
if GM.Globals[GM.CSVFILE][GM.REDIRECT_QUEUE] is None: 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]: if not GC.Values[GC.DRIVE_V3_NATIVE_NAMES]:
fileNameTitle = 'title' fileNameTitle = 'title'
fileSize = 'fileSize' fileSize = 'fileSize'
_mapDrive3TitlesToDrive2(csvPF.titlesList, API.DRIVE3_TO_DRIVE2_FILES_FIELDS_MAP) csvPF.SetMapDrive3Titles(True)
csvPF.UpdateMappedTitles()
else: else:
fileNameTitle = 'name' fileNameTitle = 'name'
fileSize = 'size' fileSize = 'size'
@@ -60892,6 +60957,7 @@ def printShowSharedDriveACLs(users, useDomainAdminAccess=False):
try: try:
groups = callGAPIpages(cd.groups(), 'list', 'groups', groups = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
userKey=emailAddress, orderBy='email', fields='nextPageToken,groups(email)') userKey=emailAddress, orderBy='email', fields='nextPageToken,groups(email)')
except (GAPI.invalidMember, GAPI.invalidInput): except (GAPI.invalidMember, GAPI.invalidInput):
badRequestWarning(Ent.GROUP, Ent.MEMBER, emailAddress) badRequestWarning(Ent.GROUP, Ent.MEMBER, emailAddress)
@@ -61578,6 +61644,7 @@ def deleteUserFromGroups(users):
try: try:
result = callGAPIpages(cd.groups(), 'list', 'groups', result = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
orderBy='email', fields='nextPageToken,groups(email)', **kwargs) orderBy='email', fields='nextPageToken,groups(email)', **kwargs)
except (GAPI.invalidMember, GAPI.invalidInput): except (GAPI.invalidMember, GAPI.invalidInput):
badRequestWarning(Ent.GROUP, Ent.MEMBER, user) badRequestWarning(Ent.GROUP, Ent.MEMBER, user)
@@ -61656,6 +61723,7 @@ def updateUserGroups(users):
try: try:
result = callGAPIpages(cd.groups(), 'list', 'groups', result = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
orderBy='email', fields='nextPageToken,groups(email)', **kwargs) orderBy='email', fields='nextPageToken,groups(email)', **kwargs)
except (GAPI.invalidMember, GAPI.invalidInput): except (GAPI.invalidMember, GAPI.invalidInput):
badRequestWarning(Ent.GROUP, Ent.MEMBER, user) badRequestWarning(Ent.GROUP, Ent.MEMBER, user)
@@ -61728,6 +61796,7 @@ def syncUserWithGroups(users):
try: try:
entityList = callGAPIpages(cd.groups(), 'list', 'groups', entityList = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
orderBy='email', fields='nextPageToken,groups(email)', **kwargs) orderBy='email', fields='nextPageToken,groups(email)', **kwargs)
except (GAPI.invalidMember, GAPI.invalidInput): except (GAPI.invalidMember, GAPI.invalidInput):
badRequestWarning(Ent.GROUP, Ent.MEMBER, user) badRequestWarning(Ent.GROUP, Ent.MEMBER, user)
@@ -61956,6 +62025,7 @@ def printShowUserGroups(users):
entityList = callGAPIpages(cd.groups(), 'list', 'groups', entityList = callGAPIpages(cd.groups(), 'list', 'groups',
pageMessage=pageMessage, pageMessage=pageMessage,
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
orderBy='email', fields='nextPageToken,groups(email)', **kwargs) orderBy='email', fields='nextPageToken,groups(email)', **kwargs)
except (GAPI.invalidMember, GAPI.invalidInput): except (GAPI.invalidMember, GAPI.invalidInput):
badRequestWarning(Ent.GROUP, Ent.MEMBER, user) badRequestWarning(Ent.GROUP, Ent.MEMBER, user)
@@ -62037,6 +62107,7 @@ def printShowGroupTree(users):
try: try:
entityList = callGAPIpages(cd.groups(), 'list', 'groups', entityList = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
orderBy='email', fields='nextPageToken,groups(email,name)', **kwargs) orderBy='email', fields='nextPageToken,groups(email,name)', **kwargs)
for parentGroup in entityList: for parentGroup in entityList:
groupParents[groupEmail]['parents'].append(parentGroup['email']) groupParents[groupEmail]['parents'].append(parentGroup['email'])
@@ -62116,6 +62187,7 @@ def printShowGroupTree(users):
try: try:
groups = callGAPIpages(cd.groups(), 'list', 'groups', groups = callGAPIpages(cd.groups(), 'list', 'groups',
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
orderBy='email', fields='nextPageToken,groups(email,name)', **kwargs) orderBy='email', fields='nextPageToken,groups(email,name)', **kwargs)
except (GAPI.invalidMember, GAPI.invalidInput): except (GAPI.invalidMember, GAPI.invalidInput):
entityUnknownWarning(Ent.USER, user, i, count) entityUnknownWarning(Ent.USER, user, i, count)
@@ -62190,6 +62262,7 @@ def printUserGroupsList(users):
entityList = callGAPIpages(cd.groups(), 'list', 'groups', entityList = callGAPIpages(cd.groups(), 'list', 'groups',
pageMessage=getPageMessageForWhom(), pageMessage=getPageMessageForWhom(),
throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS, throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
orderBy='email', fields='nextPageToken,groups(email)', **kwargs) orderBy='email', fields='nextPageToken,groups(email)', **kwargs)
except (GAPI.invalidMember, GAPI.invalidInput): except (GAPI.invalidMember, GAPI.invalidInput):
badRequestWarning(Ent.GROUP, Ent.MEMBER, user) badRequestWarning(Ent.GROUP, Ent.MEMBER, user)