mirror of
https://github.com/GAM-team/GAM.git
synced 2026-07-03 12:21:35 +00:00
Added aggregatebyuser [Boolean] option to gam report user to allow data aggregation for users across multiple dates.
This commit is contained in:
@@ -4145,7 +4145,7 @@ gam report users|user [todrive <ToDriveAttribute>*]
|
|||||||
[nodatechange | (fulldatarequired all|<UserServiceNameList>)]
|
[nodatechange | (fulldatarequired all|<UserServiceNameList>)]
|
||||||
[filtertime.* <Time>] [filter|filters <String>]
|
[filtertime.* <Time>] [filter|filters <String>]
|
||||||
[(fields|parameters <String>)|(services <UserServiceNameList>)]
|
[(fields|parameters <String>)|(services <UserServiceNameList>)]
|
||||||
[aggregatebydate [Boolean]]
|
[aggregatebydate|aggregatebyuser [Boolean]]
|
||||||
[maxresults <Number>]
|
[maxresults <Number>]
|
||||||
|
|
||||||
# Reseller
|
# Reseller
|
||||||
|
|||||||
@@ -2,6 +2,13 @@
|
|||||||
|
|
||||||
Merged GAM-Team version
|
Merged GAM-Team version
|
||||||
|
|
||||||
|
6.61.14
|
||||||
|
|
||||||
|
Added `aggregatebyuser [Boolean]` option to `gam report user` to allow data aggregation for users across multiple dates.
|
||||||
|
Options `aggregatebyuser` and `aggregatebydate` are mutually exclusive.
|
||||||
|
|
||||||
|
* https://github.com/taers232c/GAMADV-XTD3/wiki/Reports#user-reports
|
||||||
|
|
||||||
6.61.13
|
6.61.13
|
||||||
|
|
||||||
Added commands to display Analytic UA properties.
|
Added commands to display Analytic UA properties.
|
||||||
|
|||||||
@@ -12782,7 +12782,7 @@ REPORT_ACTIVITIES_TIME_OBJECTS = {'time'}
|
|||||||
# [nodatechange | (fulldatarequired all|<UserServiceNameList>)]
|
# [nodatechange | (fulldatarequired all|<UserServiceNameList>)]
|
||||||
# [filtertime.* <Time>] [filter|filters <String>]
|
# [filtertime.* <Time>] [filter|filters <String>]
|
||||||
# [(fields|parameters <String>)|(services <UserServiceNameList>)]
|
# [(fields|parameters <String>)|(services <UserServiceNameList>)]
|
||||||
# [aggregatebydate [Boolean]]
|
# [aggregatebydate|aggregatebyuser [Boolean]]
|
||||||
# [maxresults <Number>]
|
# [maxresults <Number>]
|
||||||
# gam report customers|customer|domain [todrive <ToDriveAttribute>*]
|
# gam report customers|customer|domain [todrive <ToDriveAttribute>*]
|
||||||
# [(date <Date>)|(range <Date> <Date>)|
|
# [(date <Date>)|(range <Date> <Date>)|
|
||||||
@@ -12835,7 +12835,33 @@ def doReport():
|
|||||||
csvPF.WriteRow(row)
|
csvPF.WriteRow(row)
|
||||||
return (True, lastDate)
|
return (True, lastDate)
|
||||||
|
|
||||||
def processAggregateUserUsage(usage, lastDate):
|
def processAggregateUserUsageByUser(usage, lastDate):
|
||||||
|
if not usage:
|
||||||
|
return (True, lastDate)
|
||||||
|
if lastDate == usage[0]['date']:
|
||||||
|
return (False, lastDate)
|
||||||
|
lastDate = usage[0]['date']
|
||||||
|
for user_report in usage:
|
||||||
|
if 'entity' not in user_report:
|
||||||
|
continue
|
||||||
|
if 'userEmail' not in user_report['entity']:
|
||||||
|
continue
|
||||||
|
email = user_report['entity']['userEmail']
|
||||||
|
for item in user_report.get('parameters', []):
|
||||||
|
if 'name' not in item:
|
||||||
|
continue
|
||||||
|
name = item['name']
|
||||||
|
repsvc, _ = name.split(':', 1)
|
||||||
|
if repsvc not in includeServices:
|
||||||
|
continue
|
||||||
|
if 'intValue' in item:
|
||||||
|
csvPF.AddTitles(name)
|
||||||
|
eventCounts.setdefault(email, {})
|
||||||
|
eventCounts[email].setdefault(name, 0)
|
||||||
|
eventCounts[email][name] += int(item['intValue'])
|
||||||
|
return (True, lastDate)
|
||||||
|
|
||||||
|
def processAggregateUserUsageByDate(usage, lastDate):
|
||||||
if not usage:
|
if not usage:
|
||||||
return (True, lastDate)
|
return (True, lastDate)
|
||||||
if lastDate == usage[0]['date']:
|
if lastDate == usage[0]['date']:
|
||||||
@@ -13007,7 +13033,8 @@ def doReport():
|
|||||||
filterTimes = {}
|
filterTimes = {}
|
||||||
maxActivities = 0
|
maxActivities = 0
|
||||||
maxResults = 1000
|
maxResults = 1000
|
||||||
aggregateUserUsage = countsOnly = eventRowFilter = exitUserLoop = noAuthorizedApps = noDateChange = normalizeUsers = select = summary = userCustomerRange = False
|
aggregateByDate = aggregateByUser = countsOnly = eventRowFilter = exitUserLoop = noAuthorizedApps = noDateChange = \
|
||||||
|
normalizeUsers = select = summary = userCustomerRange = False
|
||||||
allVerifyUser = userKey = 'all'
|
allVerifyUser = userKey = 'all'
|
||||||
cd = orgUnit = orgUnitId = None
|
cd = orgUnit = orgUnitId = None
|
||||||
userOrgUnits = {}
|
userOrgUnits = {}
|
||||||
@@ -13116,11 +13143,15 @@ def doReport():
|
|||||||
orgUnit = orgUnitId = None
|
orgUnit = orgUnitId = None
|
||||||
select = True
|
select = True
|
||||||
elif userReports and myarg == 'aggregatebydate':
|
elif userReports and myarg == 'aggregatebydate':
|
||||||
aggregateUserUsage = getBoolean()
|
aggregateByDate = getBoolean()
|
||||||
|
elif userReports and myarg == 'aggregatebyuser':
|
||||||
|
aggregateByUser = getBoolean()
|
||||||
elif userReports and myarg == 'allverifyuser':
|
elif userReports and myarg == 'allverifyuser':
|
||||||
allVerifyUser = getEmailAddress()
|
allVerifyUser = getEmailAddress()
|
||||||
else:
|
else:
|
||||||
unknownArgumentExit()
|
unknownArgumentExit()
|
||||||
|
if aggregateByDate and aggregateByUser:
|
||||||
|
usageErrorExit(Msg.ARE_MUTUALLY_EXCLUSIVE.format('aggregateByDate', 'aggregateByUser'))
|
||||||
parameters = ','.join(parameters) if parameters else None
|
parameters = ','.join(parameters) if parameters else None
|
||||||
if usageReports and not includeServices:
|
if usageReports and not includeServices:
|
||||||
includeServices = set(fullDataServices)
|
includeServices = set(fullDataServices)
|
||||||
@@ -13148,12 +13179,12 @@ def doReport():
|
|||||||
Ent.SetGetting(Ent.REPORT)
|
Ent.SetGetting(Ent.REPORT)
|
||||||
users = [normalizeEmailAddressOrUID(userKey)]
|
users = [normalizeEmailAddressOrUID(userKey)]
|
||||||
orgUnitId = None
|
orgUnitId = None
|
||||||
if aggregateUserUsage:
|
if aggregateByDate:
|
||||||
titles = ['date']
|
titles = ['date']
|
||||||
elif not showOrgUnit:
|
elif aggregateByUser:
|
||||||
titles = ['email', 'date']
|
titles = ['email'] if not showOrgUnit else ['email', 'orgUnitPath']
|
||||||
else:
|
else:
|
||||||
titles = ['email', 'orgUnitPath', 'date']
|
titles = ['email', 'date'] if not showOrgUnit else ['email', 'orgUnitPath', 'date']
|
||||||
csvPF.SetTitles(titles)
|
csvPF.SetTitles(titles)
|
||||||
csvPF.SetSortAllTitles()
|
csvPF.SetSortAllTitles()
|
||||||
i = 0
|
i = 0
|
||||||
@@ -13199,10 +13230,12 @@ def doReport():
|
|||||||
userKey=user, date=tryDate, customerId=customerId,
|
userKey=user, date=tryDate, customerId=customerId,
|
||||||
orgUnitID=orgUnitId, filters=filters, parameters=parameters,
|
orgUnitID=orgUnitId, filters=filters, parameters=parameters,
|
||||||
maxResults=maxResults)
|
maxResults=maxResults)
|
||||||
if not aggregateUserUsage:
|
if aggregateByDate:
|
||||||
status, lastDate = processUserUsage(usage, lastDate)
|
status, lastDate = processAggregateUserUsageByDate(usage, lastDate)
|
||||||
|
elif aggregateByUser:
|
||||||
|
status, lastDate = processAggregateUserUsageByUser(usage, lastDate)
|
||||||
else:
|
else:
|
||||||
status, lastDate = processAggregateUserUsage(usage, lastDate)
|
status, lastDate = processUserUsage(usage, lastDate)
|
||||||
if not status:
|
if not status:
|
||||||
break
|
break
|
||||||
except GAPI.invalid as e:
|
except GAPI.invalid as e:
|
||||||
@@ -13225,10 +13258,7 @@ def doReport():
|
|||||||
startDateTime += oneDay
|
startDateTime += oneDay
|
||||||
if exitUserLoop:
|
if exitUserLoop:
|
||||||
break
|
break
|
||||||
if not aggregateUserUsage:
|
if aggregateByDate:
|
||||||
csvPF.SortRowsTwoTitles('email', 'date', False)
|
|
||||||
csvPF.writeCSVfile(f'User Reports - {tryDate}')
|
|
||||||
else:
|
|
||||||
for usageDate, events in iter(eventCounts.items()):
|
for usageDate, events in iter(eventCounts.items()):
|
||||||
row = {'date': usageDate}
|
row = {'date': usageDate}
|
||||||
for event, count in iter(events.items()):
|
for event, count in iter(events.items()):
|
||||||
@@ -13236,6 +13266,19 @@ def doReport():
|
|||||||
csvPF.WriteRow(row)
|
csvPF.WriteRow(row)
|
||||||
csvPF.SortRows('date', False)
|
csvPF.SortRows('date', False)
|
||||||
csvPF.writeCSVfile(f'User Reports Aggregate - {tryDate}')
|
csvPF.writeCSVfile(f'User Reports Aggregate - {tryDate}')
|
||||||
|
elif aggregateByUser:
|
||||||
|
for email, events in iter(eventCounts.items()):
|
||||||
|
row = {'email': email}
|
||||||
|
if showOrgUnit:
|
||||||
|
row['orgUnitPath'] = userOrgUnits.get(email, UNKNOWN)
|
||||||
|
for event, count in iter(events.items()):
|
||||||
|
row[event] = count
|
||||||
|
csvPF.WriteRow(row)
|
||||||
|
csvPF.SortRows('email', False)
|
||||||
|
csvPF.writeCSVfile('User Reports Aggregate - User')
|
||||||
|
else:
|
||||||
|
csvPF.SortRowsTwoTitles('email', 'date', False)
|
||||||
|
csvPF.writeCSVfile(f'User Reports - {tryDate}')
|
||||||
elif customerReports:
|
elif customerReports:
|
||||||
if startEndTime.startDateTime is None:
|
if startEndTime.startDateTime is None:
|
||||||
startEndTime.startDateTime = startEndTime.endDateTime = todaysDate()
|
startEndTime.startDateTime = startEndTime.endDateTime = todaysDate()
|
||||||
|
|||||||
Reference in New Issue
Block a user