gam7 7.9.7__py3-none-any.whl → 7.10.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of gam7 might be problematic. Click here for more details.

gam/__init__.py CHANGED
@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
25
25
  """
26
26
 
27
27
  __author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
28
- __version__ = '7.09.07'
28
+ __version__ = '7.10.00'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -22786,7 +22786,7 @@ def _processPeopleContactPhotos(users, function):
22786
22786
  if function == 'GetContactPhoto' and not os.path.isdir(targetFolder):
22787
22787
  os.makedirs(targetFolder)
22788
22788
  elif myarg == 'filename':
22789
- filenamePattern = getString(Cmd.OB_PHOTO_FILENAME_PATTERN)
22789
+ filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN)
22790
22790
  else:
22791
22791
  unknownArgumentExit()
22792
22792
  subForContactId = filenamePattern.find('#contactid#') != -1
@@ -25990,6 +25990,8 @@ def _printChatItem(user, citem, parent, entityType, csvPF, FJQC, addCSVData=None
25990
25990
  if entityType == Ent.CHAT_SPACE:
25991
25991
  _cleanChatSpace(citem)
25992
25992
  baserow = {'User': user} if user is not None else {}
25993
+ elif entityType == Ent.CHAT_EMOJI:
25994
+ baserow = {'User': user, 'name': citem['name'], 'emojiName': citem['emojiName']}
25993
25995
  else:
25994
25996
  if user is not None:
25995
25997
  baserow = {'User': user, 'space.name': parent['name'], 'space.displayName': parent['displayName']}
@@ -26009,6 +26011,190 @@ def _printChatItem(user, citem, parent, entityType, csvPF, FJQC, addCSVData=None
26009
26011
  'JSON': json.dumps(cleanJSON(citem, timeObjects=CHAT_TIME_OBJECTS), ensure_ascii=False, sort_keys=True)})
26010
26012
  csvPF.WriteRowNoFilter(row)
26011
26013
 
26014
+ def _getValidateEmojiName():
26015
+ name = getString(Cmd.OB_CHAT_EMOJI_NAME)
26016
+ if re.match(r'^:[0-9a-z_-]+:$', name):
26017
+ return name
26018
+ Cmd.Backup()
26019
+ usageErrorExit(Msg.INVALID_EMOJI_NAME.format(name))
26020
+
26021
+ # gam <UserTypeEntity> create chatemoji <ChatEmojiName>
26022
+ # ([drivedir|(sourcefolder <FilePath>)] [filename <FileNamePattern>])
26023
+ # [formatjson]
26024
+ def createChatEmoji(users):
26025
+ FJQC = FormatJSONQuoteChar()
26026
+ name = _getValidateEmojiName()
26027
+ body = {'emojiName': name, 'payload': {'filename': '', 'fileContent': ''}}
26028
+ sourceFolder = os.getcwd()
26029
+ filenamePattern = '#email#.jpg'
26030
+ while Cmd.ArgumentsRemaining():
26031
+ myarg = getArgument()
26032
+ if myarg == 'drivedir':
26033
+ sourceFolder = GC.Values[GC.DRIVE_DIR]
26034
+ elif myarg == 'sourcefolder':
26035
+ sourceFolder = os.path.expanduser(getString(Cmd.OB_FILE_PATH))
26036
+ if not os.path.isdir(sourceFolder):
26037
+ entityDoesNotExistExit(Ent.DIRECTORY, sourceFolder)
26038
+ elif myarg == 'filename':
26039
+ filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN)
26040
+ else:
26041
+ FJQC.GetFormatJSON(myarg)
26042
+ i, count, users = getEntityArgument(users)
26043
+ for user in users:
26044
+ i += 1
26045
+ user, chat, kvList = buildChatServiceObject(API.CHAT_CUSTOM_EMOJIS, user, i, count, [Ent.CHAT_EMOJI, name])
26046
+ if not chat:
26047
+ continue
26048
+ user, userName, _ = splitEmailAddressOrUID(user)
26049
+ filename = _substituteForUser(filenamePattern, user, userName)
26050
+ if sourceFolder is not None:
26051
+ filename = os.path.join(sourceFolder, filename)
26052
+ filename = os.path.expanduser(filename)
26053
+ try:
26054
+ with open(filename, 'rb') as f:
26055
+ image_data = f.read()
26056
+ except (OSError, IOError) as e:
26057
+ entityActionFailedWarning([Ent.USER, user, Ent.CHAT_EMOJI, filename], str(e), i, count)
26058
+ continue
26059
+ body['payload'] = {'filename': os.path.basename(filename),
26060
+ 'fileContent':base64.urlsafe_b64encode(image_data).decode(UTF8)}
26061
+ try:
26062
+ emoji = callGAPI(chat.customEmojis(), 'create',
26063
+ throwReasons=[GAPI.ALREADY_EXISTS, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED, GAPI.FAILED_PRECONDITION],
26064
+ body=body)
26065
+ _showChatItem(emoji, Ent.CHAT_EMOJI, FJQC, i, count)
26066
+ except (GAPI.alreadyExists, GAPI.invalidArgument, GAPI.permissionDenied) as e:
26067
+ exitIfChatNotConfigured(chat, kvList, str(e), i, count)
26068
+ except GAPI.failedPrecondition:
26069
+ userChatServiceNotEnabledWarning(user, i, count)
26070
+
26071
+ def getEmojiName(myarg):
26072
+ if myarg == 'emojiname':
26073
+ name = _getValidateEmojiName()
26074
+ return 'customEmojis/'+name
26075
+ _, chatEmoji = Cmd.Previous().split('/', 1)
26076
+ return 'customEmojis/'+chatEmoji
26077
+
26078
+ # gam <UserTypeEntity> delete chatemoji <ChatEmoji>
26079
+ def deleteChatEmoji(users):
26080
+ name = None
26081
+ while Cmd.ArgumentsRemaining():
26082
+ myarg = getArgument()
26083
+ if myarg == 'emojiname':
26084
+ name = getEmojiName(myarg)
26085
+ elif myarg.startswith('customemojis/'):
26086
+ name = getEmojiName(myarg)
26087
+ else:
26088
+ unknownArgumentExit()
26089
+ if not name:
26090
+ missingArgumentExit('ChatEmoji')
26091
+ i, count, users = getEntityArgument(users)
26092
+ for user in users:
26093
+ i += 1
26094
+ user, chat, kvList = buildChatServiceObject(API.CHAT_CUSTOM_EMOJIS, user, i, count, [Ent.CHAT_EMOJI, name])
26095
+ if not chat:
26096
+ continue
26097
+ try:
26098
+ callGAPI(chat.customEmojis(), 'delete',
26099
+ throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED, GAPI.FAILED_PRECONDITION],
26100
+ name=name)
26101
+ entityActionPerformed(kvList, i, count)
26102
+ except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
26103
+ exitIfChatNotConfigured(chat, kvList, str(e), i, count)
26104
+ except GAPI.failedPrecondition:
26105
+ userChatServiceNotEnabledWarning(user, i, count)
26106
+
26107
+ # gam <UserTypeEntity> info chatemoji <ChatEmoji>
26108
+ # [formatjson]
26109
+ def infoChatEmoji(users):
26110
+ FJQC = FormatJSONQuoteChar()
26111
+ name = None
26112
+ while Cmd.ArgumentsRemaining():
26113
+ myarg = getArgument()
26114
+ if myarg == 'emojiname':
26115
+ name = getEmojiName(myarg)
26116
+ elif myarg.startswith('customemojis/'):
26117
+ name = getEmojiName(myarg)
26118
+ else:
26119
+ FJQC.GetFormatJSON(myarg)
26120
+ if not name:
26121
+ missingArgumentExit('ChatEmoji')
26122
+ i, count, users = getEntityArgument(users)
26123
+ for user in users:
26124
+ i += 1
26125
+ user, chat, kvList = buildChatServiceObject(API.CHAT_CUSTOM_EMOJIS, user, i, count, [Ent.CHAT_EMOJI, name])
26126
+ if not chat:
26127
+ continue
26128
+ try:
26129
+ emoji = callGAPI(chat.customEmojis(), 'get',
26130
+ throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED, GAPI.FAILED_PRECONDITION],
26131
+ name=name)
26132
+ if not FJQC.formatJSON:
26133
+ entityPerformAction(kvList, i, count)
26134
+ _showChatItem(emoji, Ent.CHAT_EMOJI, FJQC, i, count)
26135
+ except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
26136
+ exitIfChatNotConfigured(chat, kvList, str(e), i, count)
26137
+ except GAPI.failedPrecondition:
26138
+ userChatServiceNotEnabledWarning(user, i, count)
26139
+
26140
+ CHAT_EMOJI_SHOW_CREATED_BY_CHOICE_MAP = {
26141
+ 'any': None,
26142
+ 'me': 'creator("users/me")',
26143
+ 'others': 'NOT creator("users/me")'
26144
+ }
26145
+
26146
+ # gam <UserTypeEntity> show chatemojis
26147
+ # [showcreatedby any|me|others]
26148
+ # [formatjson]
26149
+ # gam <UserTypeEntity> print chatemojis [todrive <ToDriveAttribute>*]
26150
+ # [showcreatedby any|me|others]
26151
+ # [formatjson [quotechar <Character>]]
26152
+ def printShowChatEmojis(users):
26153
+ csvPF = CSVPrintFile(['User', 'name', 'emojiName']) if Act.csvFormat() else None
26154
+ FJQC = FormatJSONQuoteChar(csvPF)
26155
+ pfilter = CHAT_EMOJI_SHOW_CREATED_BY_CHOICE_MAP['me']
26156
+ while Cmd.ArgumentsRemaining():
26157
+ myarg = getArgument()
26158
+ if csvPF and myarg == 'todrive':
26159
+ csvPF.GetTodriveParameters()
26160
+ elif myarg =='showcreatedby':
26161
+ pfilter = getChoice(CHAT_EMOJI_SHOW_CREATED_BY_CHOICE_MAP, mapChoice=True)
26162
+ else:
26163
+ FJQC.GetFormatJSONQuoteChar(myarg, True)
26164
+ i, count, users = getEntityArgument(users)
26165
+ for user in users:
26166
+ i += 1
26167
+ user, chat, kvList = buildChatServiceObject(API.CHAT_CUSTOM_EMOJIS, user, i, count, [Ent.CHAT_EMOJI, None])
26168
+ if not chat:
26169
+ continue
26170
+ try:
26171
+ emojis = callGAPIpages(chat.customEmojis(), 'list', 'customEmojis',
26172
+ pageMessage=_getChatPageMessage(Ent.CHAT_EMOJI, user, i, count, pfilter),
26173
+ throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
26174
+ retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
26175
+ pageSize=CHAT_PAGE_SIZE, filter=pfilter)
26176
+ except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
26177
+ exitIfChatNotConfigured(chat, kvList, str(e), i, count)
26178
+ continue
26179
+ except GAPI.failedPrecondition:
26180
+ userChatServiceNotEnabledWarning(user, i, count)
26181
+ break
26182
+ if not csvPF:
26183
+ jcount = len(emojis)
26184
+ if not FJQC.formatJSON:
26185
+ entityPerformActionNumItems(kvList, jcount, Ent.CHAT_EMOJI, i, count)
26186
+ Ind.Increment()
26187
+ j = 0
26188
+ for emoji in sorted(emojis, key=lambda k: k['emojiName']):
26189
+ j += 1
26190
+ _showChatItem(emoji, Ent.CHAT_EMOJI, FJQC, j, jcount)
26191
+ Ind.Decrement()
26192
+ else:
26193
+ for emoji in sorted(emojis, key=lambda k: k['emojiName']):
26194
+ _printChatItem(user, emoji, '', Ent.CHAT_EMOJI, csvPF, FJQC)
26195
+ if csvPF:
26196
+ csvPF.writeCSVfile('Chat Custom Emojis')
26197
+
26012
26198
  # gam setup chat
26013
26199
  def doSetupChat():
26014
26200
  checkForExtraneousArguments()
@@ -26472,6 +26658,9 @@ def printShowChatSpaces(users):
26472
26658
  substituteQueryTimes(queries, queryTimes)
26473
26659
  pfilter = kwargsCS['query'] = queries[0]
26474
26660
  kwargsCS['useAdminAccess'] = True
26661
+ sortName = 'displayName'
26662
+ else:
26663
+ sortName = 'name'
26475
26664
  for user in users:
26476
26665
  i += 1
26477
26666
  user, chat, kvList = buildChatServiceObject(api, user, i, count, None, useAdminAccess)
@@ -26499,12 +26688,12 @@ def printShowChatSpaces(users):
26499
26688
  entityPerformActionNumItems(kvList, jcount, Ent.CHAT_SPACE, i, count)
26500
26689
  Ind.Increment()
26501
26690
  j = 0
26502
- for space in spaces:
26691
+ for space in sorted(spaces, key=lambda k: k[sortName]):
26503
26692
  j += 1
26504
26693
  _showChatItem(space, Ent.CHAT_SPACE, FJQC, j, jcount)
26505
26694
  Ind.Decrement()
26506
26695
  else:
26507
- for space in spaces:
26696
+ for space in sorted(spaces, key=lambda k: k[sortName]):
26508
26697
  _printChatItem(user, space, None, Ent.CHAT_SPACE, csvPF, FJQC)
26509
26698
  if csvPF:
26510
26699
  csvPF.writeCSVfile('Chat Spaces')
@@ -27139,6 +27328,9 @@ def printShowChatMembers(users):
27139
27328
  i, count, users = getEntityArgument(users)
27140
27329
  if useAdminAccess:
27141
27330
  _chkChatAdminAccess(count)
27331
+ sortName = 'displayName'
27332
+ else:
27333
+ sortName = 'name'
27142
27334
  for user in users:
27143
27335
  i += 1
27144
27336
  user, chat, kvList = buildChatServiceObject(api, user, i, count, [Ent.CHAT_SPACE, None], useAdminAccess)
@@ -27161,7 +27353,7 @@ def printShowChatMembers(users):
27161
27353
  retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
27162
27354
  fields="nextPageToken,spaces(name,displayName,spaceType,membershipCount)", pageSize=CHAT_PAGE_SIZE,
27163
27355
  **kwargsCS)
27164
- for space in spaces:
27356
+ for space in sorted(spaces, key=lambda k: k[sortName]):
27165
27357
  if space['spaceType'] == 'SPACE' and 'membershipCount' in space:
27166
27358
  parentList.append({'name': space['name'], 'displayName': space.get('displayName', 'None')})
27167
27359
  except (GAPI.notFound, GAPI.invalidArgument, GAPI.internalError,
@@ -27178,7 +27370,7 @@ def printShowChatMembers(users):
27178
27370
  retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
27179
27371
  fields="nextPageToken,spaces(name,displayName,spaceType,membershipCount)", pageSize=CHAT_PAGE_SIZE,
27180
27372
  **kwargsCS)
27181
- for space in spaces:
27373
+ for space in sorted(spaces, key=lambda k: k[sortName]):
27182
27374
  # if 'membershipCount' in space:
27183
27375
  # parentList.append({'name': space['name'], 'displayName': space.get('displayName', 'None')})
27184
27376
  parentList.append({'name': space['name'], 'displayName': space.get('displayName', 'None')})
@@ -67871,7 +68063,7 @@ def updatePhoto(users):
67871
68063
  baseFileIdEntity = drive = owner = None
67872
68064
  sourceFolder = os.getcwd()
67873
68065
  if Cmd.NumArgumentsRemaining() == 1:
67874
- filenamePattern = getString(Cmd.OB_PHOTO_FILENAME_PATTERN)
68066
+ filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN)
67875
68067
  else:
67876
68068
  filenamePattern = '#email#.jpg'
67877
68069
  while Cmd.ArgumentsRemaining():
@@ -67883,7 +68075,7 @@ def updatePhoto(users):
67883
68075
  if not os.path.isdir(sourceFolder):
67884
68076
  entityDoesNotExistExit(Ent.DIRECTORY, sourceFolder)
67885
68077
  elif myarg == 'filename':
67886
- filenamePattern = getString(Cmd.OB_PHOTO_FILENAME_PATTERN)
68078
+ filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN)
67887
68079
  elif myarg == 'gphoto':
67888
68080
  owner, drive = buildGAPIServiceObject(API.DRIVE3, getEmailAddress())
67889
68081
  if not drive:
@@ -67984,7 +68176,7 @@ def getPhoto(users, profileMode):
67984
68176
  if not os.path.isdir(targetFolder):
67985
68177
  os.makedirs(targetFolder)
67986
68178
  elif myarg == 'filename':
67987
- filenamePattern = getString(Cmd.OB_PHOTO_FILENAME_PATTERN)
68179
+ filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN)
67988
68180
  elif myarg == 'nofile':
67989
68181
  writeFileData = False
67990
68182
  elif myarg == 'noshow':
@@ -76983,6 +77175,7 @@ USER_ADD_CREATE_FUNCTIONS = {
76983
77175
  Cmd.ARG_CALENDAR: addCreateCalendars,
76984
77176
  Cmd.ARG_GROUP: addUserToGroups,
76985
77177
  Cmd.ARG_CALENDARACL: createCalendarACLs,
77178
+ Cmd.ARG_CHATEMOJI: createChatEmoji,
76986
77179
  Cmd.ARG_CHATMEMBER: createChatMember,
76987
77180
  Cmd.ARG_CHATMESSAGE: createChatMessage,
76988
77181
  Cmd.ARG_CHATSPACE: createChatSpace,
@@ -77099,6 +77292,7 @@ USER_COMMANDS_WITH_OBJECTS = {
77099
77292
  Cmd.ARG_BACKUPCODE: deleteBackupCodes,
77100
77293
  Cmd.ARG_CALENDAR: deleteCalendars,
77101
77294
  Cmd.ARG_CALENDARACL: deleteCalendarACLs,
77295
+ Cmd.ARG_CHATEMOJI: deleteChatEmoji,
77102
77296
  Cmd.ARG_CHATMEMBER: deleteUpdateChatMember,
77103
77297
  Cmd.ARG_CHATMESSAGE: deleteChatMessage,
77104
77298
  Cmd.ARG_CHATSPACE: deleteChatSpace,
@@ -77203,6 +77397,7 @@ USER_COMMANDS_WITH_OBJECTS = {
77203
77397
  (Act.INFO,
77204
77398
  {Cmd.ARG_CALENDAR: infoCalendars,
77205
77399
  Cmd.ARG_CALENDARACL: infoCalendarACLs,
77400
+ Cmd.ARG_CHATEMOJI: infoChatEmoji,
77206
77401
  Cmd.ARG_CHATEVENT: infoChatEvent,
77207
77402
  Cmd.ARG_CHATMEMBER: infoChatMember,
77208
77403
  Cmd.ARG_CHATMESSAGE: infoChatMessage,
@@ -77275,6 +77470,7 @@ USER_COMMANDS_WITH_OBJECTS = {
77275
77470
  Cmd.ARG_CALENDAR: printShowCalendars,
77276
77471
  Cmd.ARG_CALENDARACL: printShowCalendarACLs,
77277
77472
  Cmd.ARG_CALSETTINGS: printShowCalSettings,
77473
+ Cmd.ARG_CHATEMOJI: printShowChatEmojis,
77278
77474
  Cmd.ARG_CHATEVENT: printShowChatEvents,
77279
77475
  Cmd.ARG_CHATMEMBER: printShowChatMembers,
77280
77476
  Cmd.ARG_CHATMESSAGE: printShowChatMessages,
@@ -77382,6 +77578,7 @@ USER_COMMANDS_WITH_OBJECTS = {
77382
77578
  Cmd.ARG_CALENDAR: printShowCalendars,
77383
77579
  Cmd.ARG_CALENDARACL: printShowCalendarACLs,
77384
77580
  Cmd.ARG_CALSETTINGS: printShowCalSettings,
77581
+ Cmd.ARG_CHATEMOJI: printShowChatEmojis,
77385
77582
  Cmd.ARG_CHATEVENT: printShowChatEvents,
77386
77583
  Cmd.ARG_CHATMEMBER: printShowChatMembers,
77387
77584
  Cmd.ARG_CHATMESSAGE: printShowChatMessages,
@@ -77598,6 +77795,7 @@ USER_COMMANDS_OBJ_ALIASES = {
77598
77795
  Cmd.ARG_CLASSIFICATIONLABELPERMISSION: Cmd.ARG_DRIVELABELPERMISSION,
77599
77796
  Cmd.ARG_CLASSIFICATIONLABELPERMISSIONS: Cmd.ARG_DRIVELABELPERMISSION,
77600
77797
  Cmd.ARG_CLASSROOMINVITATIONS: Cmd.ARG_CLASSROOMINVITATION,
77798
+ Cmd.ARG_CHATEMOJIS: Cmd.ARG_CHATEMOJI,
77601
77799
  Cmd.ARG_CHATEVENTS: Cmd.ARG_CHATEVENT,
77602
77800
  Cmd.ARG_CHATMEMBERS: Cmd.ARG_CHATMEMBER,
77603
77801
  Cmd.ARG_CHATMESSAGES: Cmd.ARG_CHATMESSAGE,
gam/gamlib/glapi.py CHANGED
@@ -26,6 +26,7 @@ ANALYTICS_ADMIN = 'analyticsadmin'
26
26
  CALENDAR = 'calendar'
27
27
  CBCM = 'cbcm'
28
28
  CHAT = 'chat'
29
+ CHAT_CUSTOM_EMOJIS = 'chatcustomemojis'
29
30
  CHAT_EVENTS = 'chatevents'
30
31
  CHAT_MEMBERSHIPS = 'chatmemberships'
31
32
  CHAT_MEMBERSHIPS_ADMIN = 'chatmembershipsadmin'
@@ -210,6 +211,7 @@ _INFO = {
210
211
  CALENDAR: {'name': 'Calendar API', 'version': 'v3', 'v2discovery': True, 'mappedAPI': 'calendar-json'},
211
212
  CBCM: {'name': 'Chrome Browser Cloud Management API', 'version': 'v1.1beta1', 'v2discovery': True, 'localjson': True},
212
213
  CHAT: {'name': 'Chat API', 'version': 'v1', 'v2discovery': True},
214
+ CHAT_CUSTOM_EMOJIS: {'name': 'Chat API - Custom Emojis', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
213
215
  CHAT_EVENTS: {'name': 'Chat API - Events', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
214
216
  CHAT_MEMBERSHIPS: {'name': 'Chat API - Memberships', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
215
217
  CHAT_MEMBERSHIPS_ADMIN: {'name': 'Chat API - Memberships Admin', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
@@ -544,6 +546,10 @@ _SVCACCT_SCOPES = [
544
546
  'api': CALENDAR,
545
547
  'subscopes': READONLY,
546
548
  'scope': 'https://www.googleapis.com/auth/calendar'},
549
+ {'name': 'Chat API - Custom Emojis',
550
+ 'api': CHAT_CUSTOM_EMOJIS,
551
+ 'subscopes': READONLY,
552
+ 'scope': 'https://www.googleapis.com/auth/chat.customemojis'},
547
553
  {'name': 'Chat API - Memberships',
548
554
  'api': CHAT_MEMBERSHIPS,
549
555
  'subscopes': READONLY,
gam/gamlib/glclargs.py CHANGED
@@ -461,6 +461,8 @@ class GamCLArgs():
461
461
  ARG_CHANNELSKU = 'channelsku'
462
462
  ARG_CHANNELSKUS = 'channelskus'
463
463
  ARG_CHAT = 'chat'
464
+ ARG_CHATEMOJI = 'chatemoji'
465
+ ARG_CHATEMOJIS = 'chatemojis'
464
466
  ARG_CHATEVENT = 'chatevent'
465
467
  ARG_CHATEVENTS = 'chatevents'
466
468
  ARG_CHATMEMBER = 'chatmember'
@@ -843,6 +845,8 @@ class GamCLArgs():
843
845
  OB_CHARACTER = 'Character'
844
846
  OB_CHAR_SET = 'CharacterSet'
845
847
  OG_CHAT_ATTACHMENT = 'ChatAttachment'
848
+ OB_CHAT_EMOJI = 'ChatEmoji'
849
+ OB_CHAT_EMOJI_NAME = 'ChatEmojiName'
846
850
  OB_CHAT_EVENT = 'ChatEvent'
847
851
  OB_CHAT_MEMBER = 'ChatMember'
848
852
  OB_CHAT_MESSAGE = 'ChatMessage'
@@ -930,6 +934,7 @@ class GamCLArgs():
930
934
  OB_FILE_NAME = 'FileName'
931
935
  OB_FILE_NAME_FIELD_NAME = OB_FILE_NAME+'(:'+OB_FIELD_NAME+')+'
932
936
  OB_FILE_NAME_OR_URL = 'FileName|URL'
937
+ OB_FILE_NAME_PATTERN = 'FileNamePattern'
933
938
  OB_FILE_PATH = 'FilePath'
934
939
  OB_FILTER_ID_ENTITY = 'FilterIDEntity'
935
940
  OB_FORMAT_LIST = 'FormatList'
@@ -975,7 +980,6 @@ class GamCLArgs():
975
980
  OB_PERMISSION_ID_LIST = 'PermissionIDList'
976
981
  OB_PERMISSION_ROLE_LIST = 'PermissionRoleList'
977
982
  OB_PERMISSION_TYPE_LIST = 'PermissionTypeList'
978
- OB_PHOTO_FILENAME_PATTERN = 'FilenameNamePattern'
979
983
  OB_PRINTER_ID = 'PrinterID'
980
984
  OB_PRIVILEGE_LIST = 'PrivilegeList'
981
985
  OB_PRODUCT_ID = 'ProductID'
gam/gamlib/glentity.py CHANGED
@@ -86,6 +86,7 @@ class GamEntity():
86
86
  CHANNEL_SKU = 'chsk'
87
87
  CHAT_BOT = 'chbo'
88
88
  CHAT_ADMIN = 'chad'
89
+ CHAT_EMOJI = 'chem'
89
90
  CHAT_EVENT = 'chev'
90
91
  CHAT_MANAGER_USER = 'chgu'
91
92
  CHAT_MEMBER = 'chme'
@@ -436,6 +437,7 @@ class GamEntity():
436
437
  CHANNEL_SKU: ['Channel SKUs', 'Channel SKU'],
437
438
  CHAT_BOT: ['Chat BOTs', 'Chat BOT'],
438
439
  CHAT_ADMIN: ['Chat Admins', 'Chat Admin'],
440
+ CHAT_EMOJI: ['Chat Emojis', 'Chat Emoji'],
439
441
  CHAT_EVENT: ['Chat Events', 'Chat Event'],
440
442
  CHAT_MANAGER_USER: ['Chat User Managers', 'Chat User Manager'],
441
443
  CHAT_MESSAGE: ['Chat Messages', 'Chat Message'],
gam/gamlib/glmsgs.py CHANGED
@@ -309,6 +309,7 @@ INVALID_ALIAS = 'Invalid Alias'
309
309
  INVALID_ATTENDEE_CHANGE = 'Invalid attendee change "{0}"'
310
310
  INVALID_CHARSET = 'Invalid charset "{0}"'
311
311
  INVALID_DATE_TIME_RANGE = '{0} {1} must be greater than/equal to {2} {3}'
312
+ INVALID_EMOJI_NAME = '{0} does not match pattern :[0-9a-z_-]:'
312
313
  INVALID_ENTITY = 'Invalid {0}, {1}'
313
314
  INVALID_EVENT_TIMERANGE = '{0} {1} must be less than {2}'
314
315
  INVALID_FILE_SELECTION_WITH_ADMIN_ACCESS = 'Invalid file selection with adminaccess|asadmin'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.9.7
3
+ Version: 7.10.0
4
4
  Summary: CLI tool to manage Google Workspace
5
5
  Project-URL: Homepage, https://github.com/GAM-team/GAM
6
6
  Project-URL: Issues, https://github.com/GAM-team/GAM/issues
@@ -1,4 +1,4 @@
1
- gam/__init__.py,sha256=Ec4etcYlgkwMJv3djhU5qJw9FWHf6rE5QKXwgUCwabY,3522132
1
+ gam/__init__.py,sha256=xABU_mlCIWoZhcS_Us3pYFdimJAoGjM80Ac7LWbRWHk,3530030
2
2
  gam/__main__.py,sha256=amz0-959ph6zkZKqjaar4n60yho-T37w6qWI36qx0CA,1049
3
3
  gam/cacerts.pem,sha256=82Ak7btW_2XvocLUvAwPmpx8Chi0oqtZUG1gseLK_t4,50235
4
4
  gam/cbcm-v1.1beta1.json,sha256=xO5XloCQQULmPbFBx5bckdqmbLFQ7sJ2TImhE1ysDIY,19439
@@ -23,15 +23,15 @@ gam/atom/token_store.py,sha256=7E6Ecvxa86WCvl1pJAhv78jg9OxQv8pMtIUcPhZCq04,3803
23
23
  gam/atom/url.py,sha256=pxO1TlORxyKQTQ1bkBE1unFzjnv9c8LjJkm-UEORShY,4276
24
24
  gam/gamlib/__init__.py,sha256=z5mF-y0j8pm-YNFBaiuxB4M_GAUPG-cXWwrhYwrVReM,679
25
25
  gam/gamlib/glaction.py,sha256=1Il_HrChVnPkzZwiZs5au4mFQVtq4K1Z42uIuR6qdnI,9419
26
- gam/gamlib/glapi.py,sha256=7epQ2Hk9SK4Q6SImdJfvGvT5txftyfb5_jrF5K9cMpk,34253
26
+ gam/gamlib/glapi.py,sha256=ZBoidjXurTtQAi9aSKpQ6UsJgPF7XVv9xJja-s1djfs,34571
27
27
  gam/gamlib/glcfg.py,sha256=bNTckxzIM_HruxO2DfYsDbEgqOIz1RX6CbU6XOQQQyg,28296
28
- gam/gamlib/glclargs.py,sha256=zB6GMmDR_y5IRj7LuoM6-Bk_ETfNQ6sTqCNB6RdPfyg,42350
29
- gam/gamlib/glentity.py,sha256=6zL9uIMTXB4MwRRYKnCuAj7nZGfc16b-PIeeq4PGBlA,33691
28
+ gam/gamlib/glclargs.py,sha256=Ohe746FOQqMlXlutH-XJ6E1unYNzf_EJhdubnPp3new,42472
29
+ gam/gamlib/glentity.py,sha256=c9-7MAp0HruXEUVq8Nwkllxc4KypFeZRUFkvVzPwrwk,33760
30
30
  gam/gamlib/glgapi.py,sha256=cGtvFvvBU3XQJLgtLCjs_V5VBUem_k0b5uUrK21VmeA,39491
31
31
  gam/gamlib/glgdata.py,sha256=weRppttWm6uRyqtBoGPKoHiNZ2h28nhfUV4J_mbCszY,2707
32
32
  gam/gamlib/glglobals.py,sha256=J0xcHggVrUBzHJ5GruenKV-qV1zPKcK2qWgAgN3i5Jw,9608
33
33
  gam/gamlib/glindent.py,sha256=RfBa2LDfLIqPLL5vMfC689TCVmqn8xf-qulSzkiatrc,1228
34
- gam/gamlib/glmsgs.py,sha256=Ql1ejqGqZ7SFzNtejn4hd1O5YtBhELwgjfDVXE0qsJM,33735
34
+ gam/gamlib/glmsgs.py,sha256=uSshtTyemMcJGCnYMy3hIilYHIh-IHFbCLlY2aAyTGM,33798
35
35
  gam/gamlib/glskus.py,sha256=Q4UfVnZZxKXpyBc-iQy_uBgbNyIL519jMXHBotrMPio,15241
36
36
  gam/gamlib/gluprop.py,sha256=IyPLCyvn7-NHTUenM71YPQPXRZXx6CB5q-GtJ-FYd1c,11461
37
37
  gam/gamlib/glverlibs.py,sha256=xoQXiwcE_-HVYKv-VYA8O0mazRsc9mN-_ysj1dAlMyc,992
@@ -65,8 +65,8 @@ gam/googleapiclient/discovery_cache/base.py,sha256=yCDPtxnbNN-p5_9fzBacC6P3wcUPl
65
65
  gam/googleapiclient/discovery_cache/file_cache.py,sha256=sim3Mg4HgRYo3vX75jvcKy_aV568EvIrtBfvfbw-044,4774
66
66
  gam/iso8601/__init__.py,sha256=Z2PsYbXgAH5a5xzUvgczCboPzqWpm65kRcIngCnhViU,1218
67
67
  gam/iso8601/iso8601.py,sha256=Li2FHZ4sBTWuthuQhyCvmvj0j6At8JbGzkSv2fc2RHU,4384
68
- gam7-7.9.7.dist-info/METADATA,sha256=q07WWyeqfpMb0LITUcUkRKATrFDMP9kkLUwWlccFO6o,2977
69
- gam7-7.9.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
70
- gam7-7.9.7.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
71
- gam7-7.9.7.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
72
- gam7-7.9.7.dist-info/RECORD,,
68
+ gam7-7.10.0.dist-info/METADATA,sha256=PnmZonJYaIBlkz-1eXpMQxptu1HczzPGp0Axpv2_uGM,2978
69
+ gam7-7.10.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
70
+ gam7-7.10.0.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
71
+ gam7-7.10.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
72
+ gam7-7.10.0.dist-info/RECORD,,
File without changes