mirror of
https://github.com/GAM-team/GAM.git
synced 2025-07-09 06:03:35 +00:00
Optimize License handling (#440)
* Handle batch file errors, clean up commit-batch messages * Optimize License handling
This commit is contained in:
80
src/gam.py
80
src/gam.py
@ -7513,7 +7513,7 @@ def doGetUserInfo(user_email=None):
|
|||||||
getLicenses = False
|
getLicenses = False
|
||||||
i += 1
|
i += 1
|
||||||
elif myarg in [u'sku', u'skus']:
|
elif myarg in [u'sku', u'skus']:
|
||||||
skus = sys.argv[i+1].replace(u',', u' ').split()
|
skus = sys.argv[i+1].split(u',')
|
||||||
i += 2
|
i += 2
|
||||||
elif myarg == u'noschemas':
|
elif myarg == u'noschemas':
|
||||||
getSchemas = False
|
getSchemas = False
|
||||||
@ -8778,14 +8778,12 @@ def doPrintUsers():
|
|||||||
user_count += 1
|
user_count += 1
|
||||||
if getLicenseFeed:
|
if getLicenseFeed:
|
||||||
titles.append(u'Licenses')
|
titles.append(u'Licenses')
|
||||||
licenses = doPrintLicenses(return_list=True)
|
licenses = doPrintLicenses(returnFields=u'userId,skuId')
|
||||||
if len(licenses) > 1:
|
if licenses:
|
||||||
for user in csvRows:
|
for user in csvRows:
|
||||||
user_licenses = []
|
u_licenses = licenses.get(user[u'primaryEmail'].lower())
|
||||||
for u_license in licenses:
|
if u_licenses:
|
||||||
if u_license[u'userId'].lower() == user[u'primaryEmail'].lower():
|
user[u'Licenses'] = u','.join([_skuIdToDisplayName(skuId) for skuId in u_licenses])
|
||||||
user_licenses.append(u_license[u'skuId'])
|
|
||||||
user.update(Licenses=u','.join(user_licenses))
|
|
||||||
writeCSVfile(csvRows, titles, u'Users', todrive)
|
writeCSVfile(csvRows, titles, u'Users', todrive)
|
||||||
|
|
||||||
GROUP_ARGUMENT_TO_PROPERTY_TITLE_MAP = {
|
GROUP_ARGUMENT_TO_PROPERTY_TITLE_MAP = {
|
||||||
@ -9437,61 +9435,75 @@ def doPrintCrosDevices():
|
|||||||
sortCSVTitles([u'deviceId',], titles)
|
sortCSVTitles([u'deviceId',], titles)
|
||||||
writeCSVfile(csvRows, titles, u'CrOS', todrive)
|
writeCSVfile(csvRows, titles, u'CrOS', todrive)
|
||||||
|
|
||||||
def doPrintLicenses(return_list=False, skus=None):
|
def doPrintLicenses(returnFields=None, skus=None):
|
||||||
lic = buildGAPIObject(u'licensing')
|
lic = buildGAPIObject(u'licensing')
|
||||||
products = []
|
products = []
|
||||||
for sku in SKUS.values():
|
|
||||||
if sku[u'product'] not in products:
|
|
||||||
products.append(sku[u'product'])
|
|
||||||
products.sort()
|
|
||||||
licenses = []
|
licenses = []
|
||||||
|
if not returnFields:
|
||||||
titles = [u'userId', u'productId', u'skuId']
|
titles = [u'userId', u'productId', u'skuId']
|
||||||
csvRows = []
|
csvRows = []
|
||||||
todrive = False
|
todrive = False
|
||||||
i = 3
|
i = 3
|
||||||
while i < len(sys.argv) and not return_list:
|
while i < len(sys.argv):
|
||||||
if sys.argv[i].lower() == u'todrive':
|
if sys.argv[i].lower() == u'todrive':
|
||||||
todrive = True
|
todrive = True
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() in [u'products', u'product']:
|
elif sys.argv[i].lower() in [u'products', u'product']:
|
||||||
products = sys.argv[i+1].replace(u',', u' ').split()
|
products = sys.argv[i+1].split(u',')
|
||||||
i += 2
|
i += 2
|
||||||
elif sys.argv[i].lower() in [u'sku', u'skus']:
|
elif sys.argv[i].lower() in [u'sku', u'skus']:
|
||||||
skus = sys.argv[i+1].replace(u',', u' ').split()
|
skus = sys.argv[i+1].split(u',')
|
||||||
i += 2
|
i += 2
|
||||||
else:
|
else:
|
||||||
print u'ERROR: %s is not a valid argument for "gam print licenses"' % sys.argv[i]
|
print u'ERROR: %s is not a valid argument for "gam print licenses"' % sys.argv[i]
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
fields = u'nextPageToken,items(productId,skuId,userId)'
|
||||||
|
else:
|
||||||
|
fields = u'nextPageToken,items({0})'.format(returnFields)
|
||||||
if skus:
|
if skus:
|
||||||
for sku in skus:
|
for sku in skus:
|
||||||
product, sku = getProductAndSKU(sku)
|
product, sku = getProductAndSKU(sku)
|
||||||
page_message = u'Got %%%%total_items%%%% Licenses for %s...\n' % sku
|
page_message = u'Got %%%%total_items%%%% Licenses for %s...\n' % sku
|
||||||
try:
|
try:
|
||||||
licenses += callGAPIpages(lic.licenseAssignments(), u'listForProductAndSku', u'items', throw_reasons=[u'invalid', u'forbidden'], page_message=page_message,
|
licenses += callGAPIpages(lic.licenseAssignments(), u'listForProductAndSku', u'items', throw_reasons=[u'invalid', u'forbidden'], page_message=page_message,
|
||||||
customerId=GC_Values[GC_DOMAIN], productId=product, skuId=sku, fields=u'items(productId,skuId,userId),nextPageToken')
|
customerId=GC_Values[GC_DOMAIN], productId=product, skuId=sku, fields=fields)
|
||||||
except googleapiclient.errors.HttpError:
|
except googleapiclient.errors.HttpError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
|
if not products:
|
||||||
|
for sku in SKUS.values():
|
||||||
|
if sku[u'product'] not in products:
|
||||||
|
products.append(sku[u'product'])
|
||||||
|
products.sort()
|
||||||
for productId in products:
|
for productId in products:
|
||||||
page_message = u'Got %%%%total_items%%%% Licenses for %s...\n' % productId
|
page_message = u'Got %%%%total_items%%%% Licenses for %s...\n' % productId
|
||||||
try:
|
try:
|
||||||
licenses += callGAPIpages(lic.licenseAssignments(), u'listForProduct', u'items', throw_reasons=[u'invalid', u'forbidden'], page_message=page_message,
|
licenses += callGAPIpages(lic.licenseAssignments(), u'listForProduct', u'items', throw_reasons=[u'invalid', u'forbidden'], page_message=page_message,
|
||||||
customerId=GC_Values[GC_DOMAIN], productId=productId, fields=u'items(productId,skuId,userId),nextPageToken')
|
customerId=GC_Values[GC_DOMAIN], productId=productId, fields=fields)
|
||||||
except googleapiclient.errors.HttpError:
|
except googleapiclient.errors.HttpError:
|
||||||
pass
|
pass
|
||||||
|
if returnFields:
|
||||||
|
if returnFields == u'userId':
|
||||||
|
userIds = []
|
||||||
for u_license in licenses:
|
for u_license in licenses:
|
||||||
if u'skuId' in u_license:
|
userId = u_license.get(u'userId', u'').lower()
|
||||||
u_license[u'skuId'] = _skuIdToDisplayName(u_license[u'skuId'])
|
if userId:
|
||||||
a_license = {}
|
userIds.append(userId)
|
||||||
for title in u_license:
|
return userIds
|
||||||
if title in [u'kind', u'etags', u'selfLink']:
|
else:
|
||||||
continue
|
userSkuIds = {}
|
||||||
if title not in titles:
|
for u_license in licenses:
|
||||||
titles.append(title)
|
userId = u_license.get(u'userId', u'').lower()
|
||||||
a_license[title] = u_license[title]
|
skuId = u_license.get(u'skuId')
|
||||||
csvRows.append(a_license)
|
if userId and skuId:
|
||||||
if return_list:
|
userSkuIds.setdefault(userId, [])
|
||||||
return csvRows
|
userSkuIds[userId].append(skuId)
|
||||||
|
return userSkuIds
|
||||||
|
for u_license in licenses:
|
||||||
|
userId = u_license.get(u'userId', u'').lower()
|
||||||
|
skuId = u_license.get(u'skuId', u'')
|
||||||
|
csvRows.append({u'userId': userId, u'productId': u_license.get(u'productId', u''),
|
||||||
|
u'skuId': _skuIdToDisplayName(skuId)})
|
||||||
writeCSVfile(csvRows, titles, u'Licenses', todrive)
|
writeCSVfile(csvRows, titles, u'Licenses', todrive)
|
||||||
|
|
||||||
RESCAL_DFLTFIELDS = [u'id', u'name', u'email',]
|
RESCAL_DFLTFIELDS = [u'id', u'name', u'email',]
|
||||||
@ -9629,13 +9641,7 @@ def getUsersToModify(entity_type=None, entity=None, silent=False, member_type=No
|
|||||||
if not silent:
|
if not silent:
|
||||||
sys.stderr.write(u"done.\r\n")
|
sys.stderr.write(u"done.\r\n")
|
||||||
elif entity_type in [u'license', u'licenses', u'licence', u'licences']:
|
elif entity_type in [u'license', u'licenses', u'licence', u'licences']:
|
||||||
users = []
|
users = doPrintLicenses(returnFields=u'userId', skus=entity.split(u','))
|
||||||
licenses = doPrintLicenses(return_list=True, skus=entity.split(u','))
|
|
||||||
for row in licenses:
|
|
||||||
try:
|
|
||||||
users.append(row[u'userId'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
elif entity_type == u'file':
|
elif entity_type == u'file':
|
||||||
users = []
|
users = []
|
||||||
f = openFile(entity)
|
f = openFile(entity)
|
||||||
|
Reference in New Issue
Block a user