mirror of
https://github.com/GAM-team/GAM.git
synced 2025-07-09 14:13:35 +00:00
Add Jay's changes
group member delivery settings, check max sheet bytes on CSV upload
This commit is contained in:
@ -962,13 +962,14 @@ gam print mobile [todrive] [(query <QueryMobile>)|(queries <QueryMobileList>)] [
|
||||
|
||||
gam create group <EmailAddress> <GroupAttributes>*
|
||||
gam update group <GroupItem> [admincreated <Boolean>] [email <EmailAddress>] <GroupAttributes>*
|
||||
gam update group <GroupItem> add [owner|manager|member] [notsuspended|suspended] <UserTypeEntity>
|
||||
gam update group <GroupItem> add [owner|manager|member] [notsuspended|suspended] [delivery allmail|daily|digest|none|noemail] <UserTypeEntity>
|
||||
gam update group <GroupItem> delete|remove [owner|manager|member] <UserTypeEntity>
|
||||
gam update group <GroupItem> sync [owner|manager|member] [notsuspended|suspended] <UserTypeEntity>
|
||||
gam update group <GroupItem> update [owner|manager|member] <UserTypeEntity>
|
||||
gam update group <GroupItem> sync [owner|manager|member] [notsuspended|suspended] [delivery allmail|daily|digest|none|noemail] <UserTypeEntity>
|
||||
gam update group <GroupItem> update [owner|manager|member] [delivery allmail|daily|digest|none|noemail] <UserTypeEntity>
|
||||
gam update group <GroupItem> clear [member] [manager] [owner] [notsuspended|suspended]
|
||||
gam delete group <GroupItem>
|
||||
gam info group <GroupItem> [nousers] [noaliases] [groups]
|
||||
gam info member <GroupItem> <UserItem>
|
||||
|
||||
gam print groups [todrive] ([domain <DomainName>] ([member <UserItem>]|[query <QueryGroup>])
|
||||
[maxresults <Number>] [allfields|([settings] <GroupFieldName>* [fields <GroupFieldNameList>])]
|
||||
|
89
src/gam.py
89
src/gam.py
@ -8412,7 +8412,10 @@ GROUP_ROLES_MAP = {
|
||||
u'manager': ROLE_MANAGER, u'managers': ROLE_MANAGER,
|
||||
u'member': ROLE_MEMBER, u'members': ROLE_MEMBER,
|
||||
}
|
||||
|
||||
MEMBER_DELIVERY_MAP = {
|
||||
u'allmail': u'ALL_MAIL', u'digest': u'DIGEST', u'daily': u'DAILY',
|
||||
u'abridged': u'DAILY', u'nomail': u'NONE', u'none': u'NONE'
|
||||
}
|
||||
def doUpdateGroup():
|
||||
|
||||
# Convert foo@googlemail.com to foo@gmail.com; eliminate periods in name for foo.bar@gmail.com
|
||||
@ -8428,7 +8431,8 @@ def doUpdateGroup():
|
||||
|
||||
def _getRoleAndUsers():
|
||||
checkSuspended = None
|
||||
role = ROLE_MEMBER
|
||||
role = None
|
||||
delivery = None
|
||||
i = 5
|
||||
if sys.argv[i].lower() in GROUP_ROLES_MAP:
|
||||
role = GROUP_ROLES_MAP[sys.argv[i].lower()]
|
||||
@ -8436,11 +8440,14 @@ def doUpdateGroup():
|
||||
if sys.argv[i].lower() in [u'suspended', u'notsuspended']:
|
||||
checkSuspended = sys.argv[i].lower() == u'suspended'
|
||||
i += 1
|
||||
if sys.argv[i].lower().replace(u'_', u'') in MEMBER_DELIVERY_MAP:
|
||||
delivery = MEMBER_DELIVERY_MAP[sys.argv[i].lower()]
|
||||
i += 1
|
||||
if sys.argv[i].lower() in usergroup_types:
|
||||
users_email = getUsersToModify(entity_type=sys.argv[i].lower(), entity=sys.argv[i+1], checkSuspended=checkSuspended, groupUserMembersOnly=False)
|
||||
else:
|
||||
users_email = [normalizeEmailAddressOrUID(sys.argv[i], checkForCustomerId=True)]
|
||||
return (role, users_email)
|
||||
return (role, users_email, delivery)
|
||||
|
||||
cd = buildGAPIObject(u'directory')
|
||||
group = sys.argv[3]
|
||||
@ -8449,27 +8456,37 @@ def doUpdateGroup():
|
||||
if myarg in UPDATE_GROUP_SUBCMDS:
|
||||
group = normalizeEmailAddressOrUID(group)
|
||||
if myarg == u'add':
|
||||
role, users_email = _getRoleAndUsers()
|
||||
role, users_email, delivery = _getRoleAndUsers()
|
||||
if not role:
|
||||
role = ROLE_MEMBER
|
||||
if not checkGroupExists(cd, group):
|
||||
return
|
||||
if len(users_email) > 1:
|
||||
sys.stderr.write(u'Group: {0}, Will add {1} {2}s.\n'.format(group, len(users_email), role))
|
||||
for user_email in users_email:
|
||||
items.append(['gam', 'update', 'group', group, 'add', role, user_email])
|
||||
item = ['gam', 'update', 'group', group, 'add', role]
|
||||
if delivery:
|
||||
item.append(delivery)
|
||||
item.append(user_email)
|
||||
items.append(item)
|
||||
else:
|
||||
body = {u'role': role, u'email': users_email[0]}
|
||||
add_text = [u'as %s' % role]
|
||||
if delivery:
|
||||
body[u'delivery_settings'] = delivery
|
||||
add_text.append(u'delivery %s' % delivery)
|
||||
for i in range(2):
|
||||
try:
|
||||
callGAPI(cd.members(), u'insert',
|
||||
throw_reasons=[GAPI_DUPLICATE, GAPI_MEMBER_NOT_FOUND, GAPI_RESOURCE_NOT_FOUND, GAPI_INVALID_MEMBER, GAPI_CYCLIC_MEMBERSHIPS_NOT_ALLOWED],
|
||||
groupKey=group, body=body)
|
||||
print u' Group: {0}, {1} Added as {2}'.format(group, users_email[0], role)
|
||||
print u' Group: {0}, {1} Added {2}'.format(group, users_email[0], u' '.join(add_text))
|
||||
break
|
||||
except GAPI_duplicate as e:
|
||||
# check if user is a full member, not pending
|
||||
try:
|
||||
result = callGAPI(cd.members(), u'get', throw_reasons=[GAPI_MEMBER_NOT_FOUND], memberKey=users_email[0], groupKey=group, fields=u'role')
|
||||
print u' Group: {0}, {1} Add as {2} Failed: Duplicate, already a {3}'.format(group, users_email[0], role, result[u'role'])
|
||||
print u' Group: {0}, {1} Add {2} Failed: Duplicate, already a {3}'.format(group, users_email[0], u' '.join(add_text), result[u'role'])
|
||||
break # if get succeeds, user is a full member and we throw duplicate error
|
||||
except GAPI_memberNotFound:
|
||||
# insert fails on duplicate and get fails on not found, user is pending
|
||||
@ -8477,12 +8494,12 @@ def doUpdateGroup():
|
||||
callGAPI(cd.members(), u'delete', memberKey=users_email[0], groupKey=group)
|
||||
continue # 2nd insert should succeed now that pending is clear
|
||||
except (GAPI_memberNotFound, GAPI_resourceNotFound, GAPI_invalidMember, GAPI_cyclicMembershipsNotAllowed) as e:
|
||||
print u' Group: {0}, {1} Add as {2} Failed: {3}'.format(group, users_email[0], role, str(e))
|
||||
print u' Group: {0}, {1} Add {2} Failed: {3}'.format(group, users_email[0], u' '.join(add_text), str(e))
|
||||
break
|
||||
elif myarg == u'sync':
|
||||
syncMembersSet = set()
|
||||
syncMembersMap = {}
|
||||
role, users_email = _getRoleAndUsers()
|
||||
role, users_email, delivery = _getRoleAndUsers()
|
||||
for user_email in users_email:
|
||||
if user_email == u'*' or user_email == GC_Values[GC_CUSTOMER_ID]:
|
||||
syncMembersSet.add(GC_Values[GC_CUSTOMER_ID])
|
||||
@ -8502,15 +8519,21 @@ def doUpdateGroup():
|
||||
to_remove = [currentMembersMap.get(emailAddress, emailAddress) for emailAddress in currentMembersSet-syncMembersSet]
|
||||
sys.stderr.write(u'Group: {0}, Will add {1} and remove {2} {3}s.\n'.format(group, len(to_add), len(to_remove), role))
|
||||
for user in to_add:
|
||||
items.append([u'gam', u'update', u'group', group, u'add', role, user])
|
||||
item = [u'gam', u'update', u'group', group, u'add']
|
||||
if role:
|
||||
item.append(role)
|
||||
if delivery:
|
||||
item.append(delivery)
|
||||
item.append(user)
|
||||
items.append(item)
|
||||
for user in to_remove:
|
||||
items.append([u'gam', u'update', u'group', group, u'remove', user])
|
||||
elif myarg in [u'delete', u'remove']:
|
||||
role, users_email = _getRoleAndUsers()
|
||||
_, users_email, _ = _getRoleAndUsers()
|
||||
if not checkGroupExists(cd, group):
|
||||
return
|
||||
if len(users_email) > 1:
|
||||
sys.stderr.write(u'Group: {0}, Will remove {1} {2}s.\n'.format(group, len(users_email), role))
|
||||
sys.stderr.write(u'Group: {0}, Will remove {1} emails.\n'.format(group, len(users_email)))
|
||||
for user_email in users_email:
|
||||
items.append(['gam', 'update', 'group', group, 'remove', user_email])
|
||||
else:
|
||||
@ -8522,20 +8545,33 @@ def doUpdateGroup():
|
||||
except (GAPI_memberNotFound, GAPI_invalidMember) as e:
|
||||
print u' Group: {0}, {1} Remove Failed: {2}'.format(group, users_email[0], str(e))
|
||||
elif myarg == u'update':
|
||||
role, users_email = _getRoleAndUsers()
|
||||
role, users_email, delivery = _getRoleAndUsers()
|
||||
group = checkGroupExists(cd, group)
|
||||
if group:
|
||||
if len(users_email) > 1:
|
||||
sys.stderr.write(u'Group: {0}, Will update {1} {2}s.\n'.format(group, len(users_email), role))
|
||||
for user_email in users_email:
|
||||
items.append(['gam', 'update', 'group', group, 'update', role, user_email])
|
||||
item = ['gam', 'update', 'group', group, 'update']
|
||||
if role:
|
||||
item.append(role)
|
||||
if delivery:
|
||||
item.append(delivery)
|
||||
item.append(user_email)
|
||||
items.append(item)
|
||||
else:
|
||||
body = {u'role': role}
|
||||
body = {}
|
||||
update_text = []
|
||||
if role:
|
||||
body[u'role'] = role
|
||||
update_text.append(u'to %s' % role)
|
||||
if delivery:
|
||||
body[u'delivery_settings'] = delivery
|
||||
update_text.append(u'delivery %s' % delivery)
|
||||
try:
|
||||
callGAPI(cd.members(), u'update',
|
||||
throw_reasons=[GAPI_MEMBER_NOT_FOUND, GAPI_INVALID_MEMBER],
|
||||
groupKey=group, memberKey=users_email[0], body=body)
|
||||
print u' Group: {0}, {1} Updated to {2}'.format(group, users_email[0], role)
|
||||
print u' Group: {0}, {1} Updated {2}'.format(group, users_email[0], u' '.join(update_text))
|
||||
except (GAPI_memberNotFound, GAPI_invalidMember) as e:
|
||||
print u' Group: {0}, {1} Update to {2} Failed: {3}'.format(group, users_email[0], role, str(e))
|
||||
else: # clear
|
||||
@ -8568,6 +8604,9 @@ def doUpdateGroup():
|
||||
page_message=page_message,
|
||||
throw_reasons=GAPI_MEMBERS_THROW_REASONS,
|
||||
groupKey=group, roles=listRoles, fields=listFields, maxResults=GC_Values[GC_MEMBER_MAX_RESULTS])
|
||||
if not result:
|
||||
print u'Group already has 0 members'
|
||||
return
|
||||
if checkSuspended is None:
|
||||
users_email = [member.get(u'email', member[u'id']) for member in result if not validRoles or member.get(u'role', ROLE_MEMBER) in validRoles]
|
||||
elif checkSuspended:
|
||||
@ -9012,6 +9051,13 @@ def _getValueFromOAuth(field, credentials=None):
|
||||
credentials = credentials if credentials is not None else getValidOauth2TxtCredentials()
|
||||
return credentials.id_token.get(field, u'Unknown')
|
||||
|
||||
def doGetMemberInfo():
|
||||
cd = buildGAPIObject(u'directory')
|
||||
memberKey = normalizeEmailAddressOrUID(sys.argv[3])
|
||||
groupKey = normalizeEmailAddressOrUID(sys.argv[4])
|
||||
info = callGAPI(cd.members(), u'get', memberKey=memberKey, groupKey=groupKey)
|
||||
print_json(None, info)
|
||||
|
||||
def doGetUserInfo(user_email=None):
|
||||
|
||||
def user_lic_result(request_id, response, exception):
|
||||
@ -10275,13 +10321,11 @@ def writeCSVfile(csvRows, titles, list_type, todrive):
|
||||
except IOError as e:
|
||||
systemErrorExit(6, e)
|
||||
if todrive:
|
||||
data_size = string_file.len
|
||||
columns = len(titles)
|
||||
rows = len(csvRows)
|
||||
cell_count = rows * columns
|
||||
mimeType = u'application/vnd.google-apps.spreadsheet'
|
||||
if cell_count > 2000000 or columns > 256:
|
||||
print u'{0}{1}'.format(WARNING_PREFIX, MESSAGE_RESULTS_TOO_LARGE_FOR_GOOGLE_SPREADSHEET)
|
||||
mimeType = u'text/csv'
|
||||
admin_email = _getValueFromOAuth(u'email')
|
||||
_, drive = buildDrive3GAPIObject(admin_email)
|
||||
if not drive:
|
||||
@ -10291,6 +10335,11 @@ gam user %s check serviceaccount
|
||||
|
||||
and follow recommend steps to authorize GAM for Drive access.''' % (admin_email)
|
||||
sys.exit(5)
|
||||
result = callGAPI(drive.about(), u'get', fields=u'maxImportSizes')
|
||||
max_sheet_bytes = int(result[u'maxImportSizes'][u'application/vnd.google-apps.spreadsheet'])
|
||||
if cell_count > 2000000 or columns > 256 or data_size > max_sheet_bytes:
|
||||
print u'{0}{1}'.format(WARNING_PREFIX, MESSAGE_RESULTS_TOO_LARGE_FOR_GOOGLE_SPREADSHEET)
|
||||
mimeType = u'text/csv'
|
||||
body = {u'description': u' '.join(sys.argv),
|
||||
u'name': u'%s - %s' % (GC_Values[GC_DOMAIN], list_type),
|
||||
u'mimeType': mimeType}
|
||||
@ -12584,6 +12633,8 @@ def ProcessGAMCommand(args):
|
||||
doGetUserInfo()
|
||||
elif argument == u'group':
|
||||
doGetGroupInfo()
|
||||
elif argument == u'member':
|
||||
doGetMemberInfo()
|
||||
elif argument in [u'nickname', u'alias']:
|
||||
doGetAliasInfo()
|
||||
elif argument == u'instance':
|
||||
|
Reference in New Issue
Block a user