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

@@ -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)