diff --git a/src/GamCommands.txt b/src/GamCommands.txt index f93798a2..c7b252d0 100644 --- a/src/GamCommands.txt +++ b/src/GamCommands.txt @@ -5803,12 +5803,12 @@ gam download storagefile ::= (address clear)| - (otheremail clear)| (externalid clear)| (im clear)| (keyword clear)| (location clear)| (organization clear)| + (otheremail clear)| (phone clear)| (posix clear)| (relation clear)| @@ -5821,6 +5821,18 @@ gam download storagefile | + ::= + address|addresses| + externalid|externalids| + im|ims| + keyword|keywords| + location|locations| + orgainzation|organizations| + otheremail|otheremails| + phone|phones| + relation|relations| + website|websites + gam create|add user [ignorenullpassword] * [verifynotinvitable|alwaysevict] (groups [] [[delivery] ] )* @@ -5875,6 +5887,8 @@ gam info user [] [nolicenses|nolicences|licenses|licences] [noschemas|allschemas|(schemas|custom|customschemas )] [userview] * [fields ] + (filtermultiattrtype )* + (filtermultiattrcustom )* [(products|product )|(skus|sku )] [formatjson] @@ -5911,6 +5925,8 @@ gam info users [nolicenses|nolicences|licenses|licences] [noschemas|allschemas|(schemas|custom|customschemas )] [userview] * [fields ] + (filtermultiattrtype )* + (filtermultiattrcustom )* [(products|product )|(skus|sku )] [formatjson] @@ -5947,6 +5963,8 @@ gam info users [nolicenses|nolicences|licenses|licences] [noschemas|allschemas|(schemas|custom|customschemas )] [userview] * [fields ] + (filtermultiattrtype )* + (filtermultiattrcustom )* [(products|product )|(skus|sku )] [formatjson] @@ -5966,6 +5984,8 @@ gam print users [todrive *] [schemas|custom|customschemas all|] [emailpart|emailparts|username] [userview] [basic|full|allfields|(*|fields )] + (filtermultiattrtype )* + (filtermultiattrcustom )* [delimiter ] [sortheaders []] [scalarsfirst []] [formatjson [quotechar ]] [quoteplusphonenumbers] [issuspended ] [isarchived ] [aliasmatchpattern ] @@ -5983,6 +6003,8 @@ gam print users [todrive *] select [schemas|custom|customschemas all|] [emailpart|emailparts|username] [userview] [basic|full|allfields|(*|fields )] + (filtermultiattrtype )* + (filtermultiattrcustom )* [delimiter ] [sortheaders []] [scalarsfirst []] [formatjson [quotechar ]] [quoteplusphonenumbers] [issuspended ] [isarchived ] [aliasmatchpattern ] @@ -5998,6 +6020,8 @@ gam print users [todrive *] [schemas|custom|customschemas all|] [emailpart|emailparts|username] [userview] [basic|full|allfields|(*|fields )] + (filtermultiattrtype )* + (filtermultiattrcustom )* [delimiter ] [sortheaders []] [scalarsfirst []] [formatjson [quotechar ]] [quoteplusphonenumbers] [issuspended ] [isarchived ] [aliasmatchpattern ] diff --git a/src/GamUpdate.txt b/src/GamUpdate.txt index 8275d59c..ae93871c 100644 --- a/src/GamUpdate.txt +++ b/src/GamUpdate.txt @@ -1,7 +1,28 @@ -7.35.04 +7.36.00 -Fixed bug in `gam create feature name ` where the result was incorrectly shown as -`Building: , Added` instead of `Feature: , Added`. +Added options `filtermultiattrtype` and filtermultiattrcustom` to `gam info user` and +`gam print users` that support filtering `` display based on `type` or `customType`. + +``` + ::= + address|addresses| + externalid|externalids| + im|ims| + keyword|keywords| + location|locations| + orgainzation|organizations| + otheremail|otheremails| + phone|phones| + relation|relations| + website|websites +``` + +* `filtermultiattrtype ` - Display `` if its `type` is `` +* `filtermultiattrcustom ` - Display `` if its `customType` is `` + +``` +gam info user user@domain.com quick filtermultiattrtype organizations work filtermultiattrcustom phones private +``` 7.35.03 diff --git a/src/gam/__init__.py b/src/gam/__init__.py index cafcf764..15fc3285 100755 --- a/src/gam/__init__.py +++ b/src/gam/__init__.py @@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki """ __author__ = 'GAM Team ' -__version__ = '7.35.04' +__version__ = '7.36.00' __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)' # pylint: disable=wrong-import-position @@ -46726,10 +46726,58 @@ USER_FIELDS_CHOICE_MAP = { 'websites': 'websites', } +USER_MULTI_ATTR_FILTER_CHOICE_MAP = { + 'address': 'addresses', + 'addresses': 'addresses', + 'email': 'emails', + 'emails': 'emails', + 'externalid': 'externalIds', + 'externalids': 'externalIds', + 'im': 'ims', + 'ims': 'ims', + 'keyword': 'keywords', + 'keywords': 'keywords', + 'location': 'locations', + 'locations': 'locations', + 'organization': 'organizations', + 'organizations': 'organizations', + 'organisation': 'organizations', + 'organisations': 'organizations', + 'otheremail': 'emails', + 'otheremails': 'emails', + 'phone': 'phones', + 'phones': 'phones', + 'relation': 'relations', + 'relations': 'relations', + 'website': 'websites', + 'websites': 'websites', + } + INFO_USER_OPTIONS = {'noaliases', 'nobuildingnames', 'nogroups', 'nolicenses', 'nolicences', 'noschemas', 'schemas', 'userview'} USER_SKIP_OBJECTS = {'thumbnailPhotoEtag'} USER_TIME_OBJECTS = {'creationTime', 'deletionTime', 'lastLoginTime'} +def _getUserMultiAttributeFilters(myarg, userMultiAttributeFilters): + up = getChoice(USER_MULTI_ATTR_FILTER_CHOICE_MAP, mapChoice=True) + filterValue = getString(Cmd.OB_STRING) + userMultiAttributeFilters.setdefault(up, []) + if myarg == 'filtermultiattrtype': + userMultiAttributeFilters[up].append({'type': filterValue}) + else: #elif myarg == 'filtermultiattrcustom': + userMultiAttributeFilters[up].append({'customType': filterValue}) + +def _filterUserMultiAttributes(user, userMultiAttributeFilters): + for up, upTypes in userMultiAttributeFilters.items(): + if up in user: + filterAttrList = [] + for userAttr in user.pop(up): + for upType in upTypes: + if ((userAttr.get('type', None) == upType.get('type', '')) or + (userAttr.get('customType', None) == upType.get('customType', ''))): + filterAttrList.append(userAttr) + break + user[up] = filterAttrList + def _formatLanguagesList(propertyValue, delimiter): languages = [] for language in propertyValue: @@ -46824,6 +46872,7 @@ def infoUsers(entityList): fieldsList = [] groups = [] memberships = [] + userMultiAttributeFilters = {} skus = SKU.getAllSKUs() if not GM.Globals[GM.LICENSE_SKUS] else GM.Globals[GM.LICENSE_SKUS] while Cmd.ArgumentsRemaining(): myarg = getArgument() @@ -46858,6 +46907,8 @@ def infoUsers(entityList): getGroups = getLicenses = False elif getFieldsList(myarg, USER_FIELDS_CHOICE_MAP, fieldsList): pass + elif myarg in {'filtermultiattrtype', 'filtermultiattrcustom'}: + _getUserMultiAttributeFilters(myarg, userMultiAttributeFilters) # Ignore info group arguments that may have come from whatis elif myarg in INFO_GROUP_OPTIONS: pass @@ -46885,6 +46936,8 @@ def infoUsers(entityList): throwReasons=GAPI.USER_GET_THROW_REASONS+[GAPI.INVALID_INPUT, GAPI.RESOURCE_NOT_FOUND], userKey=userEmail, projection=schemaParms['projection'], customFieldMask=schemaParms['customFieldMask'], viewType=viewType, fields=fields) + if userMultiAttributeFilters: + _filterUserMultiAttributes(user, userMultiAttributeFilters) groups = [] memberships = [] if getGroups or getGroupsTree: @@ -47322,6 +47375,8 @@ def doPrintUsers(entityList=None): return if showValidColumn: userEntity[showValidColumn] = True + if userMultiAttributeFilters: + _filterUserMultiAttributes(userEntity, userMultiAttributeFilters) userEmail = userEntity['primaryEmail'] if printOptions['emailParts']: if userEmail.find('@') != -1: @@ -47464,6 +47519,7 @@ def doPrintUsers(entityList=None): showItemCountOnly = False addCSVData = {} includeCSVDataInJSON = False + userMultiAttributeFilters = {} while Cmd.ArgumentsRemaining(): myarg = getArgument() if myarg == 'todrive': @@ -47543,6 +47599,8 @@ def doPrintUsers(entityList=None): getAddCSVData(addCSVData) elif myarg == 'includecsvdatainjson': includeCSVDataInJSON = getBoolean() + elif myarg in {'filtermultiattrtype', 'filtermultiattrcustom'}: + _getUserMultiAttributeFilters(myarg, userMultiAttributeFilters) else: FJQC.GetFormatJSONQuoteChar(myarg, False) _, _, entityList = getEntityArgument(entityList)