gam7 7.3.8__py3-none-any.whl → 7.4.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.03.08'
28
+ __version__ = '7.04.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
@@ -142,14 +142,11 @@ from gamlib import glskus as SKU
142
142
  from gamlib import gluprop as UProp
143
143
  from gamlib import glverlibs
144
144
 
145
- import atom
146
145
  import gdata.apps.service
147
146
  import gdata.apps.audit
148
147
  import gdata.apps.audit.service
149
148
  import gdata.apps.contacts
150
149
  import gdata.apps.contacts.service
151
- import gdata.apps.sites
152
- import gdata.apps.sites.service
153
150
  # Import local library, does not include discovery documents
154
151
  import googleapiclient
155
152
  import googleapiclient.discovery
@@ -825,6 +822,9 @@ def deprecatedArgument(argument):
825
822
  def deprecatedArgumentExit(argument):
826
823
  usageErrorExit(f'{Cmd.ARGUMENT_ERROR_NAMES[Cmd.ARGUMENT_DEPRECATED][1]}: <{argument}>')
827
824
 
825
+ def deprecatedCommandExit():
826
+ systemErrorExit(USAGE_ERROR_RC, Msg.SITES_COMMAND_DEPRECATED.format(Cmd.CommandDeprecated()))
827
+
828
828
  # Choices is the valid set of choices that was expected
829
829
  def formatChoiceList(choices):
830
830
  choiceList = [c if c else "''" for c in choices]
@@ -1749,33 +1749,6 @@ def protectedSheetId(spreadsheet, sheetId):
1749
1749
  return True
1750
1750
  return False
1751
1751
 
1752
- SITENAME_PATTERN = re.compile(r'^[a-z0-9\-_]+$')
1753
- SITENAME_FORMAT_REQUIRED = '[a-z,0-9,-_]+'
1754
-
1755
- def validateSplitSiteName(fullSite):
1756
- siteParts = fullSite.lower().split('/', 1)
1757
- if (len(siteParts) == 1) or not siteParts[1]:
1758
- domain = GC.Values[GC.DOMAIN]
1759
- site = siteParts[0]
1760
- elif not siteParts[0]:
1761
- domain = GC.Values[GC.DOMAIN]
1762
- site = siteParts[1]
1763
- else:
1764
- domain = siteParts[0]
1765
- site = siteParts[1]
1766
- if SITENAME_PATTERN.match(site):
1767
- return (domain, site, f'{domain}/{site}')
1768
- return (domain, site, None)
1769
-
1770
- def getSiteName():
1771
- if Cmd.ArgumentsRemaining():
1772
- domain, site, domainSite = validateSplitSiteName(Cmd.Current())
1773
- if domainSite:
1774
- Cmd.Advance()
1775
- return (domain, site, domainSite)
1776
- invalidArgumentExit(SITENAME_FORMAT_REQUIRED)
1777
- missingArgumentExit(SITENAME_FORMAT_REQUIRED)
1778
-
1779
1752
  def getString(item, checkBlank=False, optional=False, minLen=1, maxLen=None):
1780
1753
  if Cmd.ArgumentsRemaining():
1781
1754
  argstr = Cmd.Current()
@@ -5674,21 +5647,6 @@ def getContactsQuery(**kwargs):
5674
5647
  def getEmailAuditObject():
5675
5648
  return initGDataObject(gdata.apps.audit.service.AuditService(), API.EMAIL_AUDIT)
5676
5649
 
5677
- def getSitesObject(entityType=Ent.DOMAIN, entityName=None, i=0, count=0):
5678
- if entityType == Ent.DOMAIN:
5679
- sitesObject = initGDataObject(gdata.apps.sites.service.SitesService(), API.SITES)
5680
- return (entityName or GC.Values[GC.DOMAIN], sitesObject)
5681
- userEmail, credentials = getGDataUserCredentials(API.SITES, entityName, i, count)
5682
- if not credentials:
5683
- return (userEmail, None)
5684
- if GC.Values[GC.NO_VERIFY_SSL]:
5685
- ssl._create_default_https_context = ssl._create_unverified_context
5686
- sitesObject = gdata.apps.sites.service.SitesService(source=GAM_USER_AGENT,
5687
- additional_headers={'Authorization': f'Bearer {credentials.token}'})
5688
- if GC.Values[GC.DEBUG_LEVEL] > 0:
5689
- sitesObject.debug = True
5690
- return (userEmail, sitesObject)
5691
-
5692
5650
  def getUserEmailFromID(uid, cd):
5693
5651
  try:
5694
5652
  result = callGAPI(cd.users(), 'get',
@@ -8495,14 +8453,18 @@ class CSVPrintFile():
8495
8453
  self.AddTitle(title)
8496
8454
  return RowFilterMatch(row, self.titlesList, self.rowFilter, self.rowFilterMode, self.rowDropFilter, self.rowDropFilterMode)
8497
8455
 
8498
- def UpdateMimeTypeCounts(self, row, mimeTypeInfo):
8456
+ def UpdateMimeTypeCounts(self, row, mimeTypeInfo, sizeField):
8457
+ saveList = self.titlesList[:]
8458
+ saveSet = set(self.titlesSet)
8499
8459
  for title in row:
8500
8460
  if title not in self.titlesSet:
8501
8461
  self.AddTitle(title)
8502
8462
  if RowFilterMatch(row, self.titlesList, self.rowFilter, self.rowFilterMode, self.rowDropFilter, self.rowDropFilterMode):
8503
8463
  mimeTypeInfo.setdefault(row['mimeType'], {'count': 0, 'size': 0})
8504
8464
  mimeTypeInfo[row['mimeType']]['count'] += 1
8505
- mimeTypeInfo[row['mimeType']]['size'] += int(row.get('size', '0'))
8465
+ mimeTypeInfo[row['mimeType']]['size'] += int(row.get(sizeField, '0'))
8466
+ self.titlesList = saveList[:]
8467
+ self.titlesSet = set(saveSet)
8506
8468
 
8507
8469
  def SetZeroBlankMimeTypeCounts(self, zeroBlankMimeTypeCounts):
8508
8470
  self.zeroBlankMimeTypeCounts = zeroBlankMimeTypeCounts
@@ -41661,23 +41623,22 @@ def printShowUserVaultHolds(entityList):
41661
41623
  else:
41662
41624
  printKeyValueList(['Total Holds', totalHolds])
41663
41625
 
41664
- def _cleanVaultQuery(query, cd, drive):
41626
+ def _cleanVaultQuery(query, cd):
41665
41627
  if 'query' in query:
41666
41628
  if cd is not None:
41667
41629
  if 'orgUnitInfo' in query['query']:
41668
41630
  query['query']['orgUnitInfo']['orgUnitPath'] = convertOrgUnitIDtoPath(cd, query['query']['orgUnitInfo']['orgUnitId'])
41669
- if drive is not None:
41670
41631
  if 'sharedDriveInfo' in query['query']:
41671
41632
  query['query']['sharedDriveInfo']['sharedDriveNames'] = []
41672
41633
  for sharedDriveId in query['query']['sharedDriveInfo']['sharedDriveIds']:
41673
- query['query']['sharedDriveInfo']['sharedDriveNames'].append(_getSharedDriveNameFromId(drive, sharedDriveId, useDomainAdminAccess=True))
41634
+ query['query']['sharedDriveInfo']['sharedDriveNames'].append(_getSharedDriveNameFromId(sharedDriveId))
41674
41635
  query['query'].pop('searchMethod', None)
41675
41636
  query['query'].pop('teamDriveInfo', None)
41676
41637
 
41677
41638
  VAULT_QUERY_TIME_OBJECTS = {'createTime', 'endTime', 'startTime', 'versionDate'}
41678
41639
 
41679
- def _showVaultQuery(matterNameId, query, cd, drive, FJQC, k=0, kcount=0):
41680
- _cleanVaultQuery(query, cd, drive)
41640
+ def _showVaultQuery(matterNameId, query, cd, FJQC, k=0, kcount=0):
41641
+ _cleanVaultQuery(query, cd)
41681
41642
  if FJQC is not None and FJQC.formatJSON:
41682
41643
  printLine(json.dumps(cleanJSON(query, timeObjects=VAULT_QUERY_TIME_OBJECTS), ensure_ascii=False, sort_keys=False))
41683
41644
  return
@@ -41709,7 +41670,7 @@ def doInfoVaultQuery():
41709
41670
  queryId, queryName, queryNameId = convertQueryNameToID(v, getString(Cmd.OB_QUERY_ITEM), matterId, matterNameId)
41710
41671
  else:
41711
41672
  queryName = getString(Cmd.OB_QUERY_ITEM)
41712
- cd = drive = None
41673
+ cd = None
41713
41674
  fieldsList = []
41714
41675
  FJQC = FormatJSONQuoteChar()
41715
41676
  while Cmd.ArgumentsRemaining():
@@ -41719,8 +41680,8 @@ def doInfoVaultQuery():
41719
41680
  queryId, queryName, queryNameId = convertQueryNameToID(v, queryName, matterId, matterNameId)
41720
41681
  elif myarg == 'shownames':
41721
41682
  cd = buildGAPIObject(API.DIRECTORY)
41722
- _, drive = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
41723
- if drive is None:
41683
+ _, GM.Globals[GM.ADMIN_DRIVE] = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
41684
+ if GM.Globals[GM.ADMIN_DRIVE] is None:
41724
41685
  return
41725
41686
  elif getFieldsList(myarg, VAULT_QUERY_FIELDS_CHOICE_MAP, fieldsList, initialField=['savedQueryId', 'displayName']):
41726
41687
  pass
@@ -41731,7 +41692,7 @@ def doInfoVaultQuery():
41731
41692
  query = callGAPI(v.matters().savedQueries(), 'get',
41732
41693
  throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
41733
41694
  matterId=matterId, savedQueryId=queryId, fields=fields)
41734
- _showVaultQuery(matterNameId, query, cd, drive, FJQC)
41695
+ _showVaultQuery(matterNameId, query, cd, FJQC)
41735
41696
  except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden) as e:
41736
41697
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_QUERY, queryNameId], str(e))
41737
41698
 
@@ -41748,7 +41709,7 @@ def doPrintShowVaultQueries():
41748
41709
  csvPF = CSVPrintFile(PRINT_VAULT_QUERIES_TITLES, 'sortall') if Act.csvFormat() else None
41749
41710
  FJQC = FormatJSONQuoteChar(csvPF)
41750
41711
  matters = []
41751
- cd = drive = None
41712
+ cd = None
41752
41713
  fieldsList = []
41753
41714
  while Cmd.ArgumentsRemaining():
41754
41715
  myarg = getArgument()
@@ -41758,8 +41719,8 @@ def doPrintShowVaultQueries():
41758
41719
  matters = shlexSplitList(getString(Cmd.OB_MATTER_ITEM_LIST))
41759
41720
  elif myarg == 'shownames':
41760
41721
  cd = buildGAPIObject(API.DIRECTORY)
41761
- _, drive = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
41762
- if drive is None:
41722
+ _, GM.Globals[GM.ADMIN_DRIVE] = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
41723
+ if GM.Globals[GM.ADMIN_DRIVE] is None:
41763
41724
  return
41764
41725
  elif getFieldsList(myarg, VAULT_QUERY_FIELDS_CHOICE_MAP, fieldsList, initialField=['savedQueryId', 'displayName']):
41765
41726
  pass
@@ -41821,11 +41782,11 @@ def doPrintShowVaultQueries():
41821
41782
  k = 0
41822
41783
  for query in queries:
41823
41784
  k += 1
41824
- _showVaultQuery(matterNameId, query, cd, drive, FJQC, k, kcount)
41785
+ _showVaultQuery(matterNameId, query, cd, FJQC, k, kcount)
41825
41786
  Ind.Decrement()
41826
41787
  else:
41827
41788
  for query in queries:
41828
- _cleanVaultQuery(query, cd, drive)
41789
+ _cleanVaultQuery(query, cd)
41829
41790
  row = flattenJSON(query, flattened={'matterId': matterId, 'matterName': matterName}, timeObjects=VAULT_QUERY_TIME_OBJECTS)
41830
41791
  if not FJQC.formatJSON:
41831
41792
  csvPF.WriteRowTitles(row)
@@ -42263,776 +42224,26 @@ def doPrintVaultCounts():
42263
42224
  csvPF.WriteRow({'account': account, 'count': 0})
42264
42225
  csvPF.writeCSVfile('Vault Counts')
42265
42226
 
42266
- def checkSiteExists(sitesObject, domain, site):
42267
- try:
42268
- callGData(sitesObject, 'GetSite',
42269
- throwErrors=[GDATA.NOT_FOUND],
42270
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42271
- domain=domain, site=site)
42272
- return True
42273
- except GDATA.notFound:
42274
- return None
42275
-
42276
- SITE_ACLS = 'ACLs'
42277
- SITE_CATEGORIES = 'Categories'
42278
- SITE_LINK = 'Link'
42279
- SITE_NAME = 'Name'
42280
- SITE_SITE = 'Site'
42281
- SITE_SOURCELINK = 'SourceLink'
42282
- SITE_SUMMARY = 'Summary'
42283
- SITE_THEME = 'Theme'
42284
- SITE_UPDATED = 'Updated'
42285
- SITE_WEB_ADDRESS_MAPPINGS = 'WebAddressMappings'
42286
-
42287
- SITE_DATA_DOMAIN = 'domain'
42288
- SITE_DATA_SITE = 'site'
42289
- SITE_DATA_DOMAIN_SITE = 'domainSite'
42290
- SITE_DATA_FIELDS = 'fields'
42291
-
42292
- class SitesManager():
42293
-
42294
- SITE_ARGUMENT_TO_PROPERTY_MAP = {
42295
- 'categories': SITE_CATEGORIES,
42296
- 'name': SITE_NAME,
42297
- 'sourcelink': SITE_SOURCELINK,
42298
- 'summary': SITE_SUMMARY,
42299
- 'theme': SITE_THEME,
42300
- }
42301
-
42302
- @staticmethod
42303
- def AclEntryToFields(acl_entry):
42304
-
42305
- def GetAclAttr(attrlist):
42306
- objAttr = acl_entry
42307
- for attr in attrlist:
42308
- objAttr = getattr(objAttr, attr)
42309
- if not objAttr:
42310
- return None
42311
- return objAttr
42312
-
42313
- fields = {}
42314
- fields['role'] = GetAclAttr(['role', 'value'])
42315
- if not fields['role']:
42316
- fields['role'] = GetAclAttr(['withKey', 'role', 'value'])+' (with link)'
42317
- fields['scope'] = {'type': GetAclAttr(['scope', 'type']),
42318
- 'value': GetAclAttr(['scope', 'value'])}
42319
- link = acl_entry.FindInviteLink()
42320
- if link:
42321
- fields['inviteLink'] = link
42322
- return fields
42323
-
42324
- @staticmethod
42325
- def FieldsToAclEntry(fields):
42326
- acl_entry = gdata.apps.sites.AclEntry()
42327
- acl_entry.role = gdata.apps.sites.AclRole(value=fields['role'])
42328
- acl_entry.scope = gdata.apps.sites.AclScope(stype=fields['scope']['type'], value=fields['scope'].get('value'))
42329
- return acl_entry
42330
-
42331
- @staticmethod
42332
- def ActivityEntryToFields(activity_entry):
42333
- fields = {}
42334
-
42335
- def GetActivityField(fieldName, attrlist):
42336
- objAttr = activity_entry
42337
- for attr in attrlist:
42338
- objAttr = getattr(objAttr, attr)
42339
- if not objAttr:
42340
- return
42341
- fields[fieldName] = objAttr
42342
-
42343
- def GetActivityFieldData(objAttr, attrlist, default):
42344
- for attr in attrlist:
42345
- objAttr = getattr(objAttr, attr)
42346
- if not objAttr:
42347
- return default
42348
- return objAttr
42349
-
42350
- def AppendItemToFieldsList(fieldName, fieldValue):
42351
- fields.setdefault(fieldName, [])
42352
- fields[fieldName].append(fieldValue)
42353
-
42354
- GetActivityField('Summary', ['title', 'text'])
42355
- GetActivityField('Updated', ['updated', 'text'])
42356
- for author in activity_entry.author:
42357
- AppendItemToFieldsList('Authors', f'{GetActivityFieldData(author, ["name", "text"], "Unknown Name")}/{GetActivityFieldData(author, ["email", "text"], "Unknown Email")}')
42358
- fields['Operation'] = activity_entry.Kind()
42359
- return fields
42360
-
42361
- @staticmethod
42362
- def SiteToFields(site_entry):
42363
- fields = {}
42364
-
42365
- def GetSiteField(fieldName, attrlist):
42366
- objAttr = site_entry
42367
- for attr in attrlist:
42368
- objAttr = getattr(objAttr, attr)
42369
- if not objAttr:
42370
- return
42371
- fields[fieldName] = objAttr
42372
-
42373
- def AppendItemToFieldsList(fieldName, fieldValue):
42374
- fields.setdefault(fieldName, [])
42375
- fields[fieldName].append(fieldValue)
42376
-
42377
- GetSiteField(SITE_SITE, ['siteName', 'text'])
42378
- GetSiteField(SITE_NAME, ['title', 'text'])
42379
- GetSiteField(SITE_SUMMARY, ['summary', 'text'])
42380
- GetSiteField(SITE_THEME, ['theme', 'text'])
42381
- GetSiteField(SITE_UPDATED, ['updated', 'text'])
42382
- if site_entry.category:
42383
- for category in site_entry.category:
42384
- if category.term:
42385
- AppendItemToFieldsList(SITE_CATEGORIES, category.term)
42386
- link = site_entry.FindAlternateLink()
42387
- if link:
42388
- fields[SITE_LINK] = link
42389
- link = site_entry.FindSourceLink()
42390
- if link:
42391
- fields[SITE_SOURCELINK] = link
42392
- for link in site_entry.FindWebAddressMappings():
42393
- AppendItemToFieldsList(SITE_WEB_ADDRESS_MAPPINGS, link)
42394
- return fields
42395
-
42396
- @staticmethod
42397
- def GetSiteFields():
42398
-
42399
- fields = {}
42400
- while Cmd.ArgumentsRemaining():
42401
- myarg = getArgument()
42402
- if myarg in SitesManager.SITE_ARGUMENT_TO_PROPERTY_MAP:
42403
- fieldName = SitesManager.SITE_ARGUMENT_TO_PROPERTY_MAP[myarg]
42404
- if fieldName == SITE_NAME:
42405
- fields[fieldName] = getString(Cmd.OB_STRING)
42406
- elif fieldName == SITE_SOURCELINK:
42407
- fields[fieldName] = getString(Cmd.OB_URI)
42408
- elif fieldName == SITE_SUMMARY:
42409
- fields[fieldName] = getStringWithCRsNLs()
42410
- elif fieldName == SITE_THEME:
42411
- fields[fieldName] = getString(Cmd.OB_STRING)
42412
- elif fieldName == SITE_CATEGORIES:
42413
- fields[fieldName] = getString(Cmd.OB_STRING, minLen=0).split(',')
42414
- else:
42415
- unknownArgumentExit()
42416
- return fields
42417
-
42418
- @staticmethod
42419
- def FieldsToSite(fields):
42420
- def GetField(fieldName):
42421
- return fields.get(fieldName)
42422
-
42423
- def GetSiteField(fieldName, fieldClass):
42424
- value = fields.get(fieldName)
42425
- if value:
42426
- return fieldClass(text=value)
42427
- return None
42428
-
42429
- site_entry = gdata.apps.sites.SiteEntry(sourceSite=GetField(SITE_SOURCELINK))
42430
- site_entry.siteName = GetSiteField(SITE_SITE, gdata.apps.sites.SiteName)
42431
- site_entry.title = GetSiteField(SITE_NAME, atom.Title)
42432
- site_entry.summary = GetSiteField(SITE_SUMMARY, atom.Summary)
42433
- site_entry.theme = GetSiteField(SITE_THEME, gdata.apps.sites.Theme)
42434
- value = GetField(SITE_CATEGORIES)
42435
- if value:
42436
- for category in value:
42437
- site_entry.category.append(atom.Category(term=category, scheme=gdata.apps.sites.TAG_KIND_TERM))
42438
- return site_entry
42439
-
42440
- def getSiteEntity():
42441
- siteEntity = {'list': getEntityList(Cmd.OB_SITE_ENTITY), 'dict': None}
42442
- if isinstance(siteEntity['list'], dict):
42443
- siteEntity['dict'] = siteEntity['list']
42444
- return siteEntity
42445
-
42446
- def _validateUserGetSites(entityType, user, i, count, siteEntity, itemType=None, modifier=None):
42447
- if siteEntity['dict']:
42448
- sites = siteEntity['dict'][user]
42449
- else:
42450
- sites = siteEntity['list']
42451
- user, sitesObject = getSitesObject(entityType, user, i, count)
42452
- if not sitesObject:
42453
- return (user, None, None, 0)
42454
- jcount = len(sites)
42455
- if not itemType:
42456
- entityPerformActionNumItems([entityType, user], jcount, Ent.SITE, i, count)
42457
- else:
42458
- entityPerformActionSubItemModifierNumItems([entityType, user], itemType, modifier, jcount, Ent.SITE, i, count)
42459
- if jcount == 0:
42460
- setSysExitRC(NO_ENTITIES_FOUND_RC)
42461
- return (user, sitesObject, sites, jcount)
42462
-
42463
- def _validateSite(fullSite, i, count):
42464
- domain, site, domainSite = validateSplitSiteName(fullSite)
42465
- if domainSite:
42466
- return (domain, site, domainSite)
42467
- entityActionNotPerformedWarning([Ent.SITE, site], Msg.INVALID_SITE.format(site, SITENAME_FORMAT_REQUIRED), i, count)
42468
- return (domain, site, None)
42469
-
42470
- def _validateSiteGetRuleIds(origUser, fullSite, j, jcount, ACLScopeEntity, showAction=True):
42471
- domain, site, domainSite = _validateSite(fullSite, j, jcount)
42472
- if not domainSite:
42473
- return (domain, site, None, None, 0)
42474
- if ACLScopeEntity:
42475
- if ACLScopeEntity['dict']:
42476
- if not GM.Globals[GM.CSV_SUBKEY_FIELD]:
42477
- ruleIds = ACLScopeEntity['dict'][fullSite]
42478
- else:
42479
- ruleIds = ACLScopeEntity['dict'][origUser][fullSite]
42480
- else:
42481
- ruleIds = ACLScopeEntity['list']
42482
- kcount = len(ruleIds)
42483
- if kcount == 0:
42484
- setSysExitRC(NO_ENTITIES_FOUND_RC)
42485
- else:
42486
- ruleIds = []
42487
- kcount = 0
42488
- if showAction:
42489
- entityPerformActionNumItems([Ent.SITE, domainSite], kcount, Ent.SITE_ACL, j, jcount)
42490
- return (domain, site, domainSite, ruleIds, kcount)
42491
-
42492
- def _createSite(users, entityType):
42493
- sitesManager = SitesManager()
42494
- domain, site, domainSite = getSiteName()
42495
- fields = sitesManager.GetSiteFields()
42496
- if not fields.get(SITE_NAME):
42497
- fields[SITE_NAME] = site
42498
- i, count, users = getEntityArgument(users)
42499
- for user in users:
42500
- i += 1
42501
- user, sitesObject = getSitesObject(entityType, user, i, count)
42502
- if not sitesObject:
42503
- continue
42504
- try:
42505
- siteEntry = sitesManager.FieldsToSite(fields)
42506
- callGData(sitesObject, 'CreateSite',
42507
- throwErrors=[GDATA.NOT_FOUND, GDATA.ENTITY_EXISTS, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42508
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42509
- siteentry=siteEntry, domain=domain, site=None)
42510
- entityActionPerformed([Ent.SITE, domainSite])
42511
- except GDATA.notFound as e:
42512
- entityActionFailedWarning([Ent.DOMAIN, domain], str(e))
42513
- except (GDATA.entityExists, GDATA.badRequest, GDATA.forbidden) as e:
42514
- entityActionFailedWarning([Ent.SITE, domainSite], str(e))
42515
-
42516
42227
  # gam [<UserTypeEntity>] create site <SiteName> <SiteAttribute>*
42517
- def createUserSite(users):
42518
- _createSite(users, Ent.USER)
42519
-
42520
- def doCreateDomainSite():
42521
- _createSite([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42522
-
42523
- def _updateSites(users, entityType):
42524
- sitesManager = SitesManager()
42525
- siteEntity = getSiteEntity()
42526
- updateFields = sitesManager.GetSiteFields()
42527
- i, count, users = getEntityArgument(users)
42528
- for user in users:
42529
- i += 1
42530
- user, sitesObject, sites, jcount = _validateUserGetSites(entityType, user, i, count, siteEntity)
42531
- if jcount == 0:
42532
- continue
42533
- Ind.Increment()
42534
- j = 0
42535
- for site in sites:
42536
- j += 1
42537
- domain, site, domainSite = _validateSite(site, j, jcount)
42538
- if not domainSite:
42539
- continue
42540
- try:
42541
- siteEntry = callGData(sitesObject, 'GetSite',
42542
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42543
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42544
- domain=domain, site=site)
42545
- fields = sitesManager.SiteToFields(siteEntry)
42546
- for field, value in iter(updateFields.items()):
42547
- if field != SITE_SOURCELINK:
42548
- fields[field] = value
42549
- newSiteEntry = sitesManager.FieldsToSite(fields)
42550
- callGData(sitesObject, 'UpdateSite',
42551
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42552
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42553
- siteentry=newSiteEntry, domain=domain, site=site, extra_headers={'If-Match': siteEntry.etag})
42554
- entityActionPerformed([Ent.SITE, domainSite])
42555
- except (GDATA.notFound, GDATA.badRequest, GDATA.forbidden) as e:
42556
- entityActionFailedWarning([Ent.SITE, domainSite], str(e))
42557
-
42558
42228
  # gam [<UserTypeEntity>] update site <SiteEntity> <SiteAttribute>+
42559
- def updateUserSites(users):
42560
- _updateSites(users, Ent.USER)
42561
-
42562
- def doUpdateDomainSites():
42563
- _updateSites([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42564
-
42565
- SITE_FIELD_PRINT_ORDER = [
42566
- SITE_UPDATED,
42567
- SITE_NAME,
42568
- SITE_SUMMARY,
42569
- SITE_THEME,
42570
- SITE_SOURCELINK,
42571
- SITE_CATEGORIES,
42572
- SITE_LINK,
42573
- ]
42574
-
42575
- def _showSite(sitesManager, sitesObject, domain, site, roles, j, jcount):
42576
- fields = sitesManager.SiteToFields(site)
42577
- domainSite = f'{domain}/{fields[SITE_SITE]}'
42578
- printKeyValueListWithCount([SITE_SITE, domainSite], j, jcount)
42579
- Ind.Increment()
42580
- for field in SITE_FIELD_PRINT_ORDER:
42581
- if field in fields:
42582
- if not isinstance(fields[field], list):
42583
- if field != SITE_SUMMARY:
42584
- printKeyValueList([field, fields[field]])
42585
- else:
42586
- printKeyValueWithCRsNLs(field, fields[field])
42587
- else:
42588
- printKeyValueList([field, ','.join(fields[field])])
42589
- if fields.get(SITE_WEB_ADDRESS_MAPPINGS):
42590
- printKeyValueList([SITE_WEB_ADDRESS_MAPPINGS, None])
42591
- Ind.Increment()
42592
- for link in fields[SITE_WEB_ADDRESS_MAPPINGS]:
42593
- printKeyValueList([link, None])
42594
- Ind.Decrement()
42595
- if roles:
42596
- try:
42597
- acls = callGDataPages(sitesObject, 'GetAclFeed',
42598
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42599
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42600
- domain=domain, site=fields[SITE_SITE])
42601
- printKeyValueList([SITE_ACLS, None])
42602
- Ind.Increment()
42603
- for acl in acls:
42604
- fields = sitesManager.AclEntryToFields(acl)
42605
- if fields['role'] in roles:
42606
- printKeyValueList([formatACLRule(fields)])
42607
- Ind.Decrement()
42608
- except GDATA.notFound as e:
42609
- entityActionFailedWarning([Ent.SITE, domainSite], str(e))
42610
- except GDATA.forbidden:
42611
- pass
42612
- Ind.Decrement()
42613
-
42614
- SITE_ACL_ROLES_MAP = {
42615
- 'editor': 'writer',
42616
- 'invite': 'invite',
42617
- 'owner': 'owner',
42618
- 'read': 'reader',
42619
- 'reader': 'reader',
42620
- 'writer': 'writer',
42621
- }
42622
-
42623
- def _infoSites(users, entityType):
42624
- siteEntity = getSiteEntity()
42625
- url_params = {}
42626
- roles = set()
42627
- while Cmd.ArgumentsRemaining():
42628
- myarg = getArgument()
42629
- if myarg == 'withmappings':
42630
- url_params['with-mappings'] = 'true'
42631
- elif myarg in {'role', 'roles'}:
42632
- roles = getACLRoles(SITE_ACL_ROLES_MAP)
42633
- else:
42634
- unknownArgumentExit()
42635
- sitesManager = SitesManager()
42636
- i, count, users = getEntityArgument(users)
42637
- for user in users:
42638
- i += 1
42639
- user, sitesObject, sites, jcount = _validateUserGetSites(entityType, user, i, count, siteEntity)
42640
- if jcount == 0:
42641
- continue
42642
- Ind.Increment()
42643
- j = 0
42644
- for site in sites:
42645
- j += 1
42646
- domain, site, domainSite = _validateSite(site, j, jcount)
42647
- if not domainSite:
42648
- continue
42649
- try:
42650
- result = callGData(sitesObject, 'GetSite',
42651
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42652
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42653
- domain=domain, site=site, url_params=url_params)
42654
- if result:
42655
- _showSite(sitesManager, sitesObject, domain, result, roles, j, jcount)
42656
- except (GDATA.notFound, GDATA.forbidden) as e:
42657
- entityActionFailedWarning([Ent.SITE, domainSite], str(e))
42658
- Ind.Decrement()
42659
-
42660
42229
  # gam [<UserTypeEntity>] info site <SiteEntity> [withmappings] [role|roles all|<SiteACLRoleList>]
42661
- def infoUserSites(users):
42662
- _infoSites(users, Ent.USER)
42663
-
42664
- def doInfoDomainSites():
42665
- _infoSites([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42666
-
42667
- def printShowSites(entityList, entityType):
42668
- def _getSites(domain, i, count):
42669
- try:
42670
- return callGDataPages(sitesObject, 'GetSiteFeed',
42671
- pageMessage=getPageMessageForWhom(),
42672
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42673
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42674
- domain=domain, url_params=url_params)
42675
- except (GDATA.notFound, GDATA.forbidden) as e:
42676
- entityActionFailedWarning([Ent.DOMAIN, domain], str(e), i, count)
42677
- return []
42678
-
42679
- def _printSites(entity, i, count, domain, sites):
42680
- for site in sites:
42681
- fields = sitesManager.SiteToFields(site)
42682
- if fields[SITE_SITE] in sitesSet:
42683
- continue
42684
- sitesSet.add(fields[SITE_SITE])
42685
- domainSite = f'{domain}/{fields[SITE_SITE]}'
42686
- siteRow = {Ent.Singular(entityType): entity, SITE_SITE: domainSite}
42687
- for field, value in iter(fields.items()):
42688
- if field != SITE_SITE:
42689
- if not isinstance(value, list):
42690
- if field != SITE_SUMMARY or not convertCRNL:
42691
- siteRow[field] = value
42692
- else:
42693
- siteRow[field] = escapeCRsNLs(value)
42694
- else:
42695
- siteRow[field] = delimiter.join(value)
42696
- rowShown = False
42697
- if roles:
42698
- try:
42699
- acls = callGDataPages(sitesObject, 'GetAclFeed',
42700
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42701
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42702
- domain=domain, site=fields[SITE_SITE])
42703
- for acl in acls:
42704
- fields = sitesManager.AclEntryToFields(acl)
42705
- if fields['role'] in roles:
42706
- siteACLRow = siteRow.copy()
42707
- siteACLRow.update(ACLRuleDict(fields))
42708
- csvPF.WriteRowTitles(siteACLRow)
42709
- rowShown = True
42710
- except GDATA.notFound as e:
42711
- entityActionFailedWarning([Ent.SITE, domainSite], str(e), i, count)
42712
- except GDATA.forbidden:
42713
- pass
42714
- if not rowShown:
42715
- csvPF.WriteRowTitles(siteRow)
42716
-
42717
- def _showSites(entity, i, count, domain, sites):
42718
- jcount = len(sites)
42719
- if entityType == Ent.USER:
42720
- entityPerformActionNumItems([entityType, entity, Ent.DOMAIN, domain], jcount, Ent.SITE, i, count)
42721
- else:
42722
- entityPerformActionNumItems([entityType, entity], jcount, Ent.SITE, i, count)
42723
- Ind.Increment()
42724
- j = 0
42725
- for site in sites:
42726
- j += 1
42727
- _showSite(sitesManager, sitesObject, domain, site, roles, j, jcount)
42728
- Ind.Decrement()
42729
-
42730
- domains = []
42731
- domainLists = []
42732
- url_params = {}
42733
- includeAllSites = 'true' if entityType == Ent.DOMAIN else 'false'
42734
- roles = set()
42735
- convertCRNL = GC.Values[GC.CSV_OUTPUT_CONVERT_CR_NL]
42736
- delimiter = GC.Values[GC.CSV_OUTPUT_FIELD_DELIMITER]
42737
- csvPF = CSVPrintFile([Ent.Singular(entityType), SITE_SITE, SITE_NAME, SITE_SUMMARY], 'sortall') if Act.csvFormat() else None
42738
- while Cmd.ArgumentsRemaining():
42739
- myarg = getArgument()
42740
- if csvPF and myarg == 'todrive':
42741
- csvPF.GetTodriveParameters()
42742
- elif myarg in {'domain', 'domains'}:
42743
- if entityType == Ent.DOMAIN:
42744
- entityList = getEntityList(Cmd.OB_DOMAIN_NAME_ENTITY)
42745
- else:
42746
- domains = getEntityList(Cmd.OB_DOMAIN_NAME_ENTITY)
42747
- domainLists = domains if isinstance(domains, dict) else None
42748
- elif myarg == 'includeallsites':
42749
- includeAllSites = 'true'
42750
- elif myarg == 'maxresults':
42751
- url_params['max-results'] = getInteger(minVal=1)
42752
- elif myarg == 'startindex':
42753
- url_params['start-index'] = getInteger(minVal=1)
42754
- elif myarg == 'withmappings':
42755
- url_params['with-mappings'] = 'true'
42756
- elif myarg in {'role', 'roles'}:
42757
- roles = getACLRoles(SITE_ACL_ROLES_MAP)
42758
- elif myarg in {'convertcrnl', 'converttextnl', 'convertsummarynl'}:
42759
- convertCRNL = True
42760
- elif myarg == 'delimiter':
42761
- delimiter = getCharacter()
42762
- else:
42763
- unknownArgumentExit()
42764
- sitesManager = SitesManager()
42765
- sitesSet = set()
42766
- i, count, entityList = getEntityArgument(entityList)
42767
- if entityType == Ent.USER:
42768
- for user in entityList:
42769
- i += 1
42770
- if domainLists:
42771
- domainList = domainLists[user]
42772
- elif domains:
42773
- domainList = domains
42774
- else:
42775
- _, domain = splitEmailAddress(user)
42776
- domainList = [domain]
42777
- user, sitesObject = getSitesObject(entityType, user, i, count)
42778
- if not sitesObject:
42779
- continue
42780
- jcount = len(domainList)
42781
- j = 0
42782
- for domain in domainList:
42783
- j += 1
42784
- if domain != 'site':
42785
- url_params['include-all-sites'] = includeAllSites
42786
- else:
42787
- url_params.pop('include-all-sites', None)
42788
- printGettingAllEntityItemsForWhom(Ent.SITE, f'{Ent.Singular(Ent.USER)}: {user}, {Ent.Singular(Ent.DOMAIN)}: {domain}')
42789
- sites = _getSites(domain, i, count)
42790
- if not csvPF:
42791
- _showSites(domain, j, jcount, domain, sites)
42792
- else:
42793
- _printSites(user, j, jcount, domain, sites)
42794
- else:
42795
- for domain in entityList:
42796
- i += 1
42797
- domain, sitesObject = getSitesObject(entityType, domain, i, count)
42798
- if not sitesObject:
42799
- continue
42800
- if domain != 'site':
42801
- url_params['include-all-sites'] = includeAllSites
42802
- else:
42803
- url_params.pop('include-all-sites', None)
42804
- printGettingAllEntityItemsForWhom(Ent.SITE, f'{Ent.Singular(Ent.DOMAIN)}: {domain}')
42805
- sites = _getSites(domain, i, count)
42806
- if not csvPF:
42807
- _showSites(domain, i, count, domain, sites)
42808
- else:
42809
- _printSites(domain, i, count, domain, sites)
42810
- if csvPF:
42811
- csvPF.SortTitles()
42812
- csvPF.SetSortTitles([])
42813
- if roles:
42814
- csvPF.MoveTitlesToEnd(['Scope', 'Role'])
42815
- csvPF.writeCSVfile('Sites')
42816
-
42817
- # gam print sites [todrive <ToDriveAttribute>*] [domain|domains <DomainNameEntity>] [includeallsites]
42818
- # [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl] [delimiter <Character>]
42819
- # gam show sites [domain|domains <DomainNameEntity>] [includeallsites]
42820
- # [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl]
42821
- def doPrintShowDomainSites():
42822
- printShowSites([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42823
-
42824
42230
  # gam [<UserTypeEntity>] print sites [todrive <ToDriveAttribute>*] [domain|domains <DomainNameEntity>] [includeallsites]
42825
42231
  # [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl] [delimiter <Character>]
42826
42232
  # gam [<UserTypeEntity>] show sites [domain|domains <DomainNameEntity>] [includeallsites]
42827
42233
  # [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl]
42828
- def printShowUserSites(users):
42829
- printShowSites(users, Ent.USER)
42830
-
42831
- SITE_ACTION_TO_MODIFIER_MAP = {
42832
- Act.ADD: Act.MODIFIER_TO,
42833
- Act.UPDATE: Act.MODIFIER_IN,
42834
- Act.DELETE: Act.MODIFIER_FROM,
42835
- Act.INFO: Act.MODIFIER_FROM,
42836
- Act.PRINT: Act.MODIFIER_FROM,
42837
- Act.SHOW: Act.MODIFIER_FROM,
42838
- }
42839
-
42840
- def _processSiteACLs(users, entityType):
42841
- action = Act.Get()
42842
- siteEntity = getSiteEntity()
42843
- csvPF = None
42844
- if action in [Act.ADD, Act.UPDATE]:
42845
- role = getChoice(SITE_ACL_ROLES_MAP, mapChoice=True)
42846
- elif action == Act.PRINT:
42847
- csvPF = CSVPrintFile([Ent.Singular(entityType), SITE_SITE, 'Scope', 'Role'])
42848
- else:
42849
- role = None
42850
- actionPrintShow = action in [Act.PRINT, Act.SHOW]
42851
- ACLScopeEntity = getCalendarSiteACLScopeEntity() if not actionPrintShow else {}
42852
- getTodriveOnly(csvPF)
42853
- modifier = SITE_ACTION_TO_MODIFIER_MAP[action]
42854
- sitesManager = SitesManager()
42855
- i, count, users = getEntityArgument(users)
42856
- for user in users:
42857
- i += 1
42858
- origUser = user
42859
- user, sitesObject, sites, jcount = _validateUserGetSites(entityType, user, i, count, siteEntity, Ent.SITE_ACL, modifier)
42860
- if jcount == 0:
42861
- continue
42862
- Ind.Increment()
42863
- j = 0
42864
- for site in sites:
42865
- j += 1
42866
- domain, site, domainSite, ruleIds, kcount = _validateSiteGetRuleIds(origUser, site, j, jcount, ACLScopeEntity, showAction=not actionPrintShow)
42867
- if not domainSite:
42868
- continue
42869
- if not actionPrintShow:
42870
- Ind.Increment()
42871
- k = 0
42872
- for ruleId in ruleIds:
42873
- k += 1
42874
- ruleId = normalizeRuleId(ruleId)
42875
- try:
42876
- if action in [Act.CREATE, Act.ADD]:
42877
- acl = callGData(sitesObject, 'CreateAclEntry',
42878
- throwErrors=[GDATA.NOT_FOUND, GDATA.ENTITY_EXISTS, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42879
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42880
- aclentry=sitesManager.FieldsToAclEntry(makeRoleRuleIdBody(role, ruleId)), domain=domain, site=site)
42881
- fields = sitesManager.AclEntryToFields(acl)
42882
- if not fields.get('inviteLink'):
42883
- entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
42884
- else:
42885
- entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, f'{formatACLRule(fields)} (Link: {fields["inviteLink"]})'], k, kcount)
42886
- elif action == Act.UPDATE:
42887
- acl = callGData(sitesObject, 'GetAclEntry',
42888
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42889
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42890
- domain=domain, site=site, ruleId=ruleId)
42891
- acl.role.value = role
42892
- acl = callGData(sitesObject, 'UpdateAclEntry',
42893
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42894
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42895
- aclentry=acl, domain=domain, site=site, ruleId=ruleId, extra_headers={'If-Match': acl.etag})
42896
- fields = sitesManager.AclEntryToFields(acl)
42897
- entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
42898
- elif action == Act.DELETE:
42899
- acl = callGData(sitesObject, 'GetAclEntry',
42900
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42901
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42902
- domain=domain, site=site, ruleId=ruleId)
42903
- callGData(sitesObject, 'DeleteAclEntry',
42904
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42905
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42906
- domain=domain, site=site, ruleId=ruleId, extra_headers={'If-Match': acl.etag})
42907
- entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLScopeRole(ruleId, None)], k, kcount)
42908
- elif action == Act.INFO:
42909
- acl = callGData(sitesObject, 'GetAclEntry',
42910
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42911
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42912
- domain=domain, site=site, ruleId=ruleId)
42913
- fields = sitesManager.AclEntryToFields(acl)
42914
- printEntity([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
42915
- except GDATA.notFound as e:
42916
- if not checkSiteExists(sitesObject, domain, site):
42917
- entityUnknownWarning(Ent.SITE, domainSite, j, jcount)
42918
- break
42919
- entityActionFailedWarning([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLScopeRole(ruleId, role)], str(e), k, kcount)
42920
- except (GDATA.entityExists, GDATA.badRequest, GDATA.forbidden) as e:
42921
- entityActionFailedWarning([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLScopeRole(ruleId, role)], str(e), k, kcount)
42922
- Ind.Decrement()
42923
- else:
42924
- try:
42925
- acls = callGDataPages(sitesObject, 'GetAclFeed',
42926
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42927
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42928
- domain=domain, site=site)
42929
- if not csvPF:
42930
- kcount = len(acls)
42931
- entityPerformActionNumItems([Ent.SITE, domainSite], kcount, Ent.SITE_ACL, j, jcount)
42932
- if kcount == 0:
42933
- continue
42934
- Ind.Increment()
42935
- k = 0
42936
- for acl in acls:
42937
- k += 1
42938
- fields = sitesManager.AclEntryToFields(acl)
42939
- printEntity([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
42940
- Ind.Decrement()
42941
- else:
42942
- siteRow = {Ent.Singular(entityType): user, SITE_SITE: domainSite}
42943
- for acl in acls:
42944
- fields = sitesManager.AclEntryToFields(acl)
42945
- siteACLRow = siteRow.copy()
42946
- siteACLRow.update(ACLRuleDict(fields))
42947
- csvPF.WriteRowTitles(siteACLRow)
42948
- except GDATA.notFound:
42949
- entityUnknownWarning(Ent.SITE, domainSite, j, jcount)
42950
- except GDATA.forbidden as e:
42951
- entityActionFailedWarning([Ent.SITE, domainSite], str(e), j, jcount)
42952
- Ind.Decrement()
42953
- if csvPF:
42954
- csvPF.writeCSVfile('Site ACLs')
42955
-
42956
42234
  # gam [<UserTypeEntity>] create siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
42957
42235
  # gam [<UserTypeEntity>] update siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
42958
42236
  # gam [<UserTypeEntity>] delete siteacls <SiteEntity> <SiteACLScopeEntity>
42959
42237
  # gam [<UserTypeEntity>] info siteacls <SiteEntity> <SiteACLScopeEntity>
42960
42238
  # gam [<UserTypeEntity>] show siteacls <SiteEntity>
42961
42239
  # gam [<UserTypeEntity>] print siteacls <SiteEntity> [todrive <ToDriveAttribute>*]
42962
- def processUserSiteACLs(users):
42963
- _processSiteACLs(users, Ent.USER)
42964
-
42965
- def doProcessDomainSiteACLs():
42966
- _processSiteACLs([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42967
-
42968
- def _printSiteActivity(users, entityType):
42969
- sitesManager = SitesManager()
42970
- url_params = {}
42971
- csvPF = CSVPrintFile([SITE_SITE, SITE_SUMMARY, SITE_UPDATED], 'sortall')
42972
- sites = getEntityList(Cmd.OB_SITE_ENTITY)
42973
- siteLists = sites if isinstance(sites, dict) else None
42974
- while Cmd.ArgumentsRemaining():
42975
- myarg = getArgument()
42976
- if myarg == 'todrive':
42977
- csvPF.GetTodriveParameters()
42978
- elif myarg == 'maxresults':
42979
- url_params['max-results'] = getInteger(minVal=1)
42980
- elif myarg == 'startindex':
42981
- url_params['start-index'] = getInteger(minVal=1)
42982
- elif myarg == 'updatedmin':
42983
- url_params['updated-min'] = getYYYYMMDD()
42984
- elif myarg == 'updatedmax':
42985
- url_params['updated-max'] = getYYYYMMDD()
42986
- else:
42987
- unknownArgumentExit()
42988
- i, count, users = getEntityArgument(users)
42989
- for user in users:
42990
- i += 1
42991
- if siteLists:
42992
- sites = siteLists[user]
42993
- user, sitesObject = getSitesObject(entityType, user, i, count)
42994
- if not sitesObject:
42995
- continue
42996
- jcount = len(sites)
42997
- if jcount == 0:
42998
- setSysExitRC(NO_ENTITIES_FOUND_RC)
42999
- continue
43000
- Ind.Increment()
43001
- j = 0
43002
- for site in sites:
43003
- j += 1
43004
- domain, site, domainSite = _validateSite(site, j, jcount)
43005
- if not domainSite:
43006
- continue
43007
- printGettingAllEntityItemsForWhom(Ent.ACTIVITY, domainSite)
43008
- try:
43009
- activities = callGDataPages(sitesObject, 'GetActivityFeed',
43010
- pageMessage=getPageMessageForWhom(),
43011
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
43012
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
43013
- domain=domain, site=site, url_params=url_params)
43014
- for activity in activities:
43015
- fields = sitesManager.ActivityEntryToFields(activity)
43016
- activityRow = {SITE_SITE: domainSite}
43017
- for key, value in iter(fields.items()):
43018
- if not isinstance(value, list):
43019
- activityRow[key] = value
43020
- else:
43021
- activityRow[key] = ','.join(value)
43022
- csvPF.WriteRowTitles(activityRow)
43023
- except GDATA.notFound:
43024
- entityUnknownWarning(Ent.SITE, domainSite, j, jcount)
43025
- except GDATA.forbidden as e:
43026
- entityActionFailedWarning([Ent.SITE, domainSite], str(e), j, jcount)
43027
- csvPF.writeCSVfile('Site Activities')
43028
-
43029
42240
  # gam [<UserTypeEntity>] print siteactivity <SiteEntity> [todrive <ToDriveAttribute>*]
43030
42241
  # [startindex <Number>] [maxresults <Number>] [updated_min <Date>] [updated_max <Date>]
43031
- def printUserSiteActivity(users):
43032
- _printSiteActivity(users, Ent.USER)
42242
+ def deprecatedUserSites(users):
42243
+ deprecatedCommandExit()
43033
42244
 
43034
- def doPrintDomainSiteActivity():
43035
- _printSiteActivity([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42245
+ def deprecatedDomainSites():
42246
+ deprecatedCommandExit()
43036
42247
 
43037
42248
  # <CSVFileInput> [keyfield <FieldName>] [datafield <FieldName>]
43038
42249
  def _getGroupOrgUnitMap():
@@ -52817,15 +52028,20 @@ def _convertSharedDriveNameToId(drive, user, i, count, fileIdEntity, useDomainAd
52817
52028
  ','.join([td['id'] for td in tdlist])), i, count)
52818
52029
  return False
52819
52030
 
52820
- def _getSharedDriveNameFromId(drive, sharedDriveId, useDomainAdminAccess=False):
52031
+ def _getSharedDriveNameFromId(sharedDriveId):
52821
52032
  sharedDriveName = GM.Globals[GM.MAP_SHAREDDRIVE_ID_TO_NAME].get(sharedDriveId)
52822
52033
  if not sharedDriveName:
52823
- try:
52824
- sharedDriveName = callGAPI(drive.drives(), 'get',
52825
- throwReasons=GAPI.DRIVE_USER_THROW_REASONS+[GAPI.NOT_FOUND],
52826
- useDomainAdminAccess=useDomainAdminAccess,
52827
- driveId=sharedDriveId, fields='name')['name']
52828
- except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy):
52034
+ if not GM.Globals[GM.ADMIN_DRIVE]:
52035
+ _, GM.Globals[GM.ADMIN_DRIVE] = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
52036
+ if GM.Globals[GM.ADMIN_DRIVE]:
52037
+ try:
52038
+ sharedDriveName = callGAPI(GM.Globals[GM.ADMIN_DRIVE].drives(), 'get',
52039
+ throwReasons=GAPI.DRIVE_USER_THROW_REASONS+[GAPI.NOT_FOUND],
52040
+ useDomainAdminAccess=True,
52041
+ driveId=sharedDriveId, fields='name')['name']
52042
+ except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy):
52043
+ sharedDriveName = TEAM_DRIVE
52044
+ else:
52829
52045
  sharedDriveName = TEAM_DRIVE
52830
52046
  GM.Globals[GM.MAP_SHAREDDRIVE_ID_TO_NAME][sharedDriveId] = sharedDriveName
52831
52047
  return sharedDriveName
@@ -52838,7 +52054,7 @@ def _getDriveFileNameFromId(drive, fileId, combineTitleId=True, useDomainAdminAc
52838
52054
  if result:
52839
52055
  fileName = result['name']
52840
52056
  if (result['mimeType'] == MIMETYPE_GA_FOLDER) and result.get('driveId') and (result['name'] == TEAM_DRIVE):
52841
- fileName = _getSharedDriveNameFromId(drive, result['driveId'])
52057
+ fileName = _getSharedDriveNameFromId(result['driveId'])
52842
52058
  if combineTitleId:
52843
52059
  fileName += '('+fileId+')'
52844
52060
  return (fileName, _getEntityMimeType(result), result['mimeType'])
@@ -53920,7 +53136,7 @@ def getFilePaths(drive, fileTree, initialResult, filePathInfo, addParentsToTree=
53920
53136
  fullpath=False, showDepth=False, folderPathOnly=False):
53921
53137
  def _getParentName(result):
53922
53138
  if (result['mimeType'] == MIMETYPE_GA_FOLDER) and result.get('driveId') and (result['name'] == TEAM_DRIVE):
53923
- parentName = _getSharedDriveNameFromId(drive, result['driveId'])
53139
+ parentName = _getSharedDriveNameFromId(result['driveId'])
53924
53140
  if parentName != TEAM_DRIVE:
53925
53141
  return f'{SHARED_DRIVES}{filePathInfo["delimiter"]}{parentName}'
53926
53142
  return result['name']
@@ -54619,9 +53835,9 @@ def showFileInfo(users):
54619
53835
  driveId = result.get('driveId')
54620
53836
  if driveId:
54621
53837
  if result['mimeType'] == MIMETYPE_GA_FOLDER and result['name'] == TEAM_DRIVE:
54622
- result['name'] = _getSharedDriveNameFromId(drive, driveId)
53838
+ result['name'] = _getSharedDriveNameFromId(driveId)
54623
53839
  if DFF.showSharedDriveNames:
54624
- result['driveName'] = _getSharedDriveNameFromId(drive, driveId)
53840
+ result['driveName'] = _getSharedDriveNameFromId(driveId)
54625
53841
  if showNoParents:
54626
53842
  result.setdefault('parents', [])
54627
53843
  if getPermissionsForSharedDrives and driveId and 'permissions' not in result:
@@ -55309,7 +54525,7 @@ def extendFileTreeParents(drive, fileTree, fields):
55309
54525
  result['parents'] = [ORPHANS] if result.get('ownedByMe', False) and 'sharedWithMeTime' not in result else [SHARED_WITHME]
55310
54526
  else:
55311
54527
  if result['name'] == TEAM_DRIVE:
55312
- result['name'] = _getSharedDriveNameFromId(drive, result['driveId'])
54528
+ result['name'] = _getSharedDriveNameFromId(result['driveId'])
55313
54529
  result['parents'] = [SHARED_DRIVES] if 'sharedWithMeTime' not in result else [SHARED_WITHME]
55314
54530
  fileTree[fileId]['info'] = result
55315
54531
  fileTree[fileId]['info']['noDisplay'] = True
@@ -56048,7 +55264,7 @@ def printFileList(users):
56048
55264
  if not pmselect and 'permissions' in fileInfo:
56049
55265
  fileInfo['permissions'] = DLP.GetFileMatchingPermission(fileInfo)
56050
55266
  if DFF.showSharedDriveNames and driveId:
56051
- fileInfo['driveName'] = _getSharedDriveNameFromId(drive, driveId)
55267
+ fileInfo['driveName'] = _getSharedDriveNameFromId(driveId)
56052
55268
  if filepath:
56053
55269
  if not FJQC.formatJSON or not addPathsToJSON:
56054
55270
  addFilePathsToRow(drive, fileTree, fileInfo, filePathInfo, csvPF, row,
@@ -56103,7 +55319,7 @@ def printFileList(users):
56103
55319
  else:
56104
55320
  if not countsRowFilter:
56105
55321
  csvPFco.UpdateMimeTypeCounts(flattenJSON(fileInfo, flattened=row, skipObjects=skipObjects, timeObjects=timeObjects,
56106
- simpleLists=simpleLists, delimiter=delimiter), mimeTypeInfo)
55322
+ simpleLists=simpleLists, delimiter=delimiter), mimeTypeInfo, sizeField)
56107
55323
  else:
56108
55324
  mimeTypeInfo.setdefault(fileInfo['mimeType'], {'count': 0, 'size': 0})
56109
55325
  mimeTypeInfo[fileInfo['mimeType']]['count'] += 1
@@ -56924,7 +56140,7 @@ def printShowFilePaths(users):
56924
56140
  driveId = result.get('driveId')
56925
56141
  if driveId:
56926
56142
  if result['mimeType'] == MIMETYPE_GA_FOLDER and result['name'] == TEAM_DRIVE:
56927
- result['name'] = _getSharedDriveNameFromId(drive, driveId)
56143
+ result['name'] = _getSharedDriveNameFromId(driveId)
56928
56144
  if returnPathOnly:
56929
56145
  if fullpath:
56930
56146
  writeStdout(f'{SHARED_DRIVES}/{result["name"]}\n')
@@ -57014,7 +56230,7 @@ def printFileParentTree(users):
57014
56230
  driveId = result.get('driveId')
57015
56231
  if driveId:
57016
56232
  if result['mimeType'] == MIMETYPE_GA_FOLDER and result['name'] == TEAM_DRIVE:
57017
- result['name'] = _getSharedDriveNameFromId(drive, driveId)
56233
+ result['name'] = _getSharedDriveNameFromId(driveId)
57018
56234
  result['isRoot'] = True
57019
56235
  result['parents'] = ['']
57020
56236
  fileList.append(result)
@@ -57212,10 +56428,7 @@ def printShowFileCounts(users):
57212
56428
  if not drive:
57213
56429
  continue
57214
56430
  sharedDriveId = fileIdEntity.get('shareddrive', {}).get('driveId', '')
57215
- if sharedDriveId:
57216
- sharedDriveName = _getSharedDriveNameFromId(drive, sharedDriveId)
57217
- else:
57218
- sharedDriveName = ''
56431
+ sharedDriveName = _getSharedDriveNameFromId(sharedDriveId) if sharedDriveId else ''
57219
56432
  mimeTypeInfo = {}
57220
56433
  userLastModification = {
57221
56434
  'lastModifiedFileId': '', 'lastModifiedFileName': '',
@@ -57444,7 +56657,7 @@ def printDiskUsage(users):
57444
56657
  includeOwner = False
57445
56658
  csvPF.RemoveTitles(['Owner', 'ownedByMe'])
57446
56659
  if topFolder['name'] == TEAM_DRIVE and not topFolder.get('parents'):
57447
- topFolder['name'] = _getSharedDriveNameFromId(drive, driveId)
56660
+ topFolder['name'] = _getSharedDriveNameFromId(driveId)
57448
56661
  topFolder['path'] = f'{SHARED_DRIVES}{pathDelimiter}{topFolder["name"]}'
57449
56662
  else:
57450
56663
  topFolder['path'] = topFolder['name']
@@ -59509,7 +58722,7 @@ def _getCopyMoveParentInfo(drive, user, i, count, j, jcount, newParentId, statis
59509
58722
  result['destParentType'] = DEST_PARENT_MYDRIVE_FOLDER
59510
58723
  else:
59511
58724
  if result['name'] == TEAM_DRIVE and not result.get('parents', []):
59512
- result['name'] = _getSharedDriveNameFromId(drive, result['driveId'])
58725
+ result['name'] = _getSharedDriveNameFromId(result['driveId'])
59513
58726
  result['destParentType'] = DEST_PARENT_SHAREDDRIVE_ROOT
59514
58727
  else:
59515
58728
  result['destParentType'] = DEST_PARENT_SHAREDDRIVE_FOLDER
@@ -60055,7 +59268,7 @@ def copyDriveFile(users):
60055
59268
  # Source at root of Shared Drive?
60056
59269
  sourceMimeType = source['mimeType']
60057
59270
  if sourceMimeType == MIMETYPE_GA_FOLDER and source.get('driveId') and source['name'] == TEAM_DRIVE and not source.get('parents', []):
60058
- source['name'] = _getSharedDriveNameFromId(drive, source['driveId'])
59271
+ source['name'] = _getSharedDriveNameFromId(source['driveId'])
60059
59272
  sourceName = source['name']
60060
59273
  sourceNameId = f"{sourceName}({source['id']})"
60061
59274
  copyMoveOptions['sourceDriveId'] = source.get('driveId')
@@ -60823,7 +60036,7 @@ def moveDriveFile(users):
60823
60036
  if sourceMimeType == MIMETYPE_GA_FOLDER and source['name'] in [MY_DRIVE, TEAM_DRIVE] and not source.get('parents', []):
60824
60037
  copyMoveOptions['sourceIsMyDriveSharedDrive'] = True
60825
60038
  if source.get('driveId'):
60826
- source['name'] = _getSharedDriveNameFromId(drive, source['driveId'])
60039
+ source['name'] = _getSharedDriveNameFromId(source['driveId'])
60827
60040
  sourceName = source['name']
60828
60041
  sourceNameId = f"{sourceName}({source['id']})"
60829
60042
  copyMoveOptions['sourceDriveId'] = source.get('driveId')
@@ -63248,7 +62461,7 @@ def printEmptyDriveFolders(users):
63248
62461
  fileIdEntity['shareddrive'] = {'driveId': sharedDriveId, 'corpora': 'drive', 'includeItemsFromAllDrives': True, 'supportsAllDrives': True}
63249
62462
  csvPF.AddTitles(['driveId'])
63250
62463
  csvPF.MoveTitlesToEnd(['name'])
63251
- pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(drive, sharedDriveId)}']
62464
+ pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(sharedDriveId)}']
63252
62465
  else:
63253
62466
  pathList = [fileEntryInfo['name']]
63254
62467
  mimeType = fileEntryInfo['mimeType']
@@ -63338,7 +62551,7 @@ def deleteEmptyDriveFolders(users):
63338
62551
  if 'driveId' in fileEntryInfo:
63339
62552
  sharedDriveId = fileEntryInfo['driveId']
63340
62553
  fileIdEntity['shareddrive'] = {'driveId': sharedDriveId, 'corpora': 'drive', 'includeItemsFromAllDrives': True, 'supportsAllDrives': True}
63341
- pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(drive, sharedDriveId)}']
62554
+ pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(sharedDriveId)}']
63342
62555
  else:
63343
62556
  pathList = [fileEntryInfo['name']]
63344
62557
  mimeType = fileEntryInfo['mimeType']
@@ -65754,7 +64967,7 @@ def doPrintShowSharedDrives():
65754
64967
  def doPrintShowOrgunitSharedDrives():
65755
64968
  def _getOrgUnitSharedDriveInfo(shareddrive):
65756
64969
  shareddrive['driveId'] = shareddrive['name'].rsplit(';')[1]
65757
- shareddrive['driveName'] = _getSharedDriveNameFromId(drive, shareddrive['driveId'], useDomainAdminAccess=True)
64970
+ shareddrive['driveName'] = _getSharedDriveNameFromId(shareddrive['driveId'])
65758
64971
  shareddrive['orgUnitPath'] = orgUnitPath
65759
64972
 
65760
64973
  def _showOrgUnitSharedDrive(shareddrive, j, jcount, FJQC):
@@ -65773,8 +64986,8 @@ def doPrintShowOrgunitSharedDrives():
65773
64986
 
65774
64987
  ci = buildGAPIObject(API.CLOUDIDENTITY_ORGUNITS_BETA)
65775
64988
  cd = buildGAPIObject(API.DIRECTORY)
65776
- _, drive = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
65777
- if not drive:
64989
+ _, GM.Globals[GM.ADMIN_DRIVE] = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
64990
+ if not GM.Globals[GM.ADMIN_DRIVE]:
65778
64991
  return
65779
64992
  csvPF = CSVPrintFile(['name', 'type', 'member', 'memberUri', 'driveId', 'driveName', 'orgUnitPath']) if Act.csvFormat() else None
65780
64993
  FJQC = FormatJSONQuoteChar(csvPF)
@@ -65853,13 +65066,13 @@ def copySyncSharedDriveACLs(users, useDomainAdminAccess=False):
65853
65066
  if not drive:
65854
65067
  continue
65855
65068
  if not srcFileIdEntity.get('shareddrivename'):
65856
- srcFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(drive, srcFileIdEntity['shareddrive']['driveId'])
65069
+ srcFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(srcFileIdEntity['shareddrive']['driveId'])
65857
65070
  if tgtFileIdEntity.get('shareddrivename'):
65858
65071
  if not _convertSharedDriveNameToId(drive, user, i, count, tgtFileIdEntity, useDomainAdminAccess):
65859
65072
  continue
65860
65073
  tgtFileIdEntity['shareddrive']['corpora'] = 'drive'
65861
65074
  else:
65862
- tgtFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(drive, tgtFileIdEntity['shareddrive']['driveId'])
65075
+ tgtFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(tgtFileIdEntity['shareddrive']['driveId'])
65863
65076
  statistics = _initStatistics()
65864
65077
  copyMoveOptions['sourceDriveId'] = srcFileIdEntity['shareddrive']['driveId']
65865
65078
  copyMoveOptions['destDriveId'] = tgtFileIdEntity['shareddrive']['driveId']
@@ -69692,7 +68905,7 @@ def _initMessageThreadParameters(entityType, doIt, maxToProcess):
69692
68905
  'query': '', 'queryTimes': {},
69693
68906
  'entityType': entityType, 'messageEntity': None, 'doIt': doIt, 'quick': True,
69694
68907
  'labelMatchPattern': None, 'senderMatchPattern': None,
69695
- 'maxToProcess': maxToProcess, 'maxItems': 0,
68908
+ 'maxToProcess': maxToProcess, 'maxItems': 0, 'maxMessagesPerThread': 0,
69696
68909
  'maxToKeywords': [MESSAGES_MAX_TO_KEYWORDS[Act.Get()], 'maxtoprocess'],
69697
68910
  'listType': listType, 'fields': f'nextPageToken,{listType}(id)'}
69698
68911
 
@@ -69734,6 +68947,8 @@ def _getMessageSelectParameters(myarg, parameters):
69734
68947
  parameters['doIt'] = True
69735
68948
  elif myarg in parameters['maxToKeywords']:
69736
68949
  parameters['maxToProcess'] = getInteger(minVal=0)
68950
+ elif myarg == 'maxmessagesperthread':
68951
+ parameters['maxMessagesPerThread'] = getInteger(minVal=0)
69737
68952
  else:
69738
68953
  return False
69739
68954
  return True
@@ -70873,8 +70088,6 @@ def printShowMessagesThreads(users, entityType):
70873
70088
  return None
70874
70089
 
70875
70090
  def _qualifyMessage(user, result):
70876
- if parameters['maxToProcess'] and parameters['messagesProcessed'] == parameters['maxToProcess']:
70877
- return (False, None)
70878
70091
  if senderMatchPattern:
70879
70092
  sender = _checkSenderMatchCount(result)
70880
70093
  if not sender:
@@ -70902,7 +70115,9 @@ def printShowMessagesThreads(users, entityType):
70902
70115
  except ValueError:
70903
70116
  return headerValue
70904
70117
 
70905
- def _showMessage(user, result, j, jcount):
70118
+ def _showMessage(user, result, j, jcount, checkMax=True):
70119
+ if checkMax and parameters['maxToProcess'] and parameters['messagesProcessed'] == parameters['maxToProcess']:
70120
+ return
70906
70121
  status, messageLabels = _qualifyMessage(user, result)
70907
70122
  if not status:
70908
70123
  return
@@ -70938,7 +70153,8 @@ def printShowMessagesThreads(users, entityType):
70938
70153
  if show_attachments or save_attachments or upload_attachments:
70939
70154
  _showSaveAttachments(result['id'], result['payload'], attachmentNamePattern, j, jcount)
70940
70155
  Ind.Decrement()
70941
- parameters['messagesProcessed'] += 1
70156
+ if checkMax:
70157
+ parameters['messagesProcessed'] += 1
70942
70158
 
70943
70159
  def _getAttachments(messageId, payload, attachmentNamePattern, attachments):
70944
70160
  for part in payload.get('parts', []):
@@ -70960,7 +70176,9 @@ def printShowMessagesThreads(users, entityType):
70960
70176
  else:
70961
70177
  _getAttachments(messageId, part, attachmentNamePattern, attachments)
70962
70178
 
70963
- def _printMessage(user, result):
70179
+ def _printMessage(user, result, checkMax=True):
70180
+ if checkMax and parameters['maxToProcess'] and parameters['messagesProcessed'] == parameters['maxToProcess']:
70181
+ return
70964
70182
  status, messageLabels = _qualifyMessage(user, result)
70965
70183
  if not status:
70966
70184
  return
@@ -71014,7 +70232,8 @@ def printShowMessagesThreads(users, entityType):
71014
70232
  row[f'Attachments{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{i}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}size'] = attachment[2]
71015
70233
  row[f'Attachments{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{i}{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}charset'] = attachment[3]
71016
70234
  csvPF.WriteRowTitles(row)
71017
- parameters['messagesProcessed'] += 1
70235
+ if checkMax:
70236
+ parameters['messagesProcessed'] += 1
71018
70237
 
71019
70238
  def _countMessageLabels(user, result):
71020
70239
  if senderMatchPattern:
@@ -71044,6 +70263,8 @@ def printShowMessagesThreads(users, entityType):
71044
70263
  messageThreadCounts['size'] += result['sizeEstimate']
71045
70264
 
71046
70265
  def _showThread(user, result, j, jcount):
70266
+ if parameters['maxToProcess'] and parameters['messagesProcessed'] == parameters['maxToProcess']:
70267
+ return
71047
70268
  if senderMatchPattern:
71048
70269
  for message in result['messages']:
71049
70270
  if _checkSenderMatch(message):
@@ -71059,19 +70280,29 @@ def printShowMessagesThreads(users, entityType):
71059
70280
  k = 0
71060
70281
  for message in result['messages']:
71061
70282
  k += 1
71062
- _showMessage(user, message, k, kcount)
70283
+ _showMessage(user, message, k, kcount, False)
70284
+ if k == parameters['maxMessagesPerThread']:
70285
+ break
71063
70286
  Ind.Decrement()
70287
+ parameters['messagesProcessed'] += 1
71064
70288
 
71065
70289
  def _printThread(user, result):
70290
+ if parameters['maxToProcess'] and parameters['messagesProcessed'] == parameters['maxToProcess']:
70291
+ return
71066
70292
  if senderMatchPattern:
71067
70293
  for message in result['messages']:
71068
70294
  if _checkSenderMatch(message):
71069
70295
  break
71070
70296
  else:
71071
70297
  return
70298
+ k = 0
71072
70299
  for message in result['messages']:
71073
- _printMessage(user, message)
70300
+ k += 1
70301
+ _printMessage(user, message, False)
70302
+ if k == parameters['maxMessagesPerThread']:
70303
+ break
71074
70304
  messageThreadCounts['threads'] += 1
70305
+ parameters['messagesProcessed'] += 1
71075
70306
 
71076
70307
  def _countThreadLabels(user, result):
71077
70308
  for message in result['messages']:
@@ -71086,8 +70317,12 @@ def printShowMessagesThreads(users, entityType):
71086
70317
  else:
71087
70318
  return
71088
70319
  else:
70320
+ k = 0
71089
70321
  for message in result['messages']:
70322
+ k += 1
71090
70323
  messageThreadCounts['size'] += message['sizeEstimate']
70324
+ if k == parameters['maxMessagesPerThread']:
70325
+ break
71091
70326
  messageThreadCounts['threads'] += 1
71092
70327
 
71093
70328
  _GMAIL_ERROR_REASON_TO_MESSAGE_MAP = {GAPI.NOT_FOUND: Msg.DOES_NOT_EXIST, GAPI.INVALID_MESSAGE_ID: Msg.INVALID_MESSAGE_ID}
@@ -74669,14 +73904,14 @@ def createNotesACLs(users):
74669
73904
  request['parent'] = name
74670
73905
  try:
74671
73906
  permissions = callGAPI(keep.notes().permissions(), 'batchCreate',
74672
- throwReasons=GAPI.KEEP_THROW_REASONS,
73907
+ throwReasons=GAPI.KEEP_THROW_REASONS+[GAPI.FAILED_PRECONDITION],
74673
73908
  parent=name, body=rbody)
74674
73909
  entityNumItemsActionPerformed(entityKVList, kcount, Ent.NOTE_ACL, j, jcount)
74675
73910
  if showDetails:
74676
73911
  Ind.Increment()
74677
73912
  _showNotePermissions(permissions['permissions'])
74678
73913
  Ind.Decrement()
74679
- except (GAPI.badRequest, GAPI.invalidArgument, GAPI.notFound) as e:
73914
+ except (GAPI.badRequest, GAPI.invalidArgument, GAPI.notFound, GAPI.failedPrecondition) as e:
74680
73915
  entityActionFailedWarning(entityKVList, str(e), i, count)
74681
73916
  except GAPI.authError:
74682
73917
  userKeepServiceNotEnabledWarning(user, i, count)
@@ -75706,8 +74941,8 @@ MAIN_ADD_CREATE_FUNCTIONS = {
75706
74941
  Cmd.ARG_SAKEY: doCreateSvcAcctKeys,
75707
74942
  Cmd.ARG_SCHEMA: doCreateUpdateUserSchemas,
75708
74943
  Cmd.ARG_SHAREDDRIVE: doCreateSharedDrive,
75709
- Cmd.ARG_SITE: doCreateDomainSite,
75710
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
74944
+ Cmd.ARG_SITE: deprecatedDomainSites,
74945
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75711
74946
  Cmd.ARG_SVCACCT: doCreateSvcAcct,
75712
74947
  Cmd.ARG_USER: doCreateUser,
75713
74948
  Cmd.ARG_VAULTEXPORT: doCreateVaultExport,
@@ -75821,7 +75056,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75821
75056
  Cmd.ARG_SAKEY: doDeleteSvcAcctKeys,
75822
75057
  Cmd.ARG_SCHEMA: doDeleteUserSchemas,
75823
75058
  Cmd.ARG_SHAREDDRIVE: doDeleteSharedDrive,
75824
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75059
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75825
75060
  Cmd.ARG_SVCACCT: doDeleteSvcAcct,
75826
75061
  Cmd.ARG_USER: doDeleteUser,
75827
75062
  Cmd.ARG_USERS: doDeleteUsers,
@@ -75910,8 +75145,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75910
75145
  Cmd.ARG_RESOURCES: doInfoResourceCalendars,
75911
75146
  Cmd.ARG_SCHEMA: doInfoUserSchemas,
75912
75147
  Cmd.ARG_SHAREDDRIVE: doInfoSharedDrive,
75913
- Cmd.ARG_SITE: doInfoDomainSites,
75914
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75148
+ Cmd.ARG_SITE: deprecatedDomainSites,
75149
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75915
75150
  Cmd.ARG_USER: doInfoUser,
75916
75151
  Cmd.ARG_USERS: doInfoUsers,
75917
75152
  Cmd.ARG_USERINVITATION: doInfoCIUserInvitations,
@@ -76013,9 +75248,9 @@ MAIN_COMMANDS_WITH_OBJECTS = {
76013
75248
  Cmd.ARG_SCHEMA: doPrintShowUserSchemas,
76014
75249
  Cmd.ARG_SHAREDDRIVE: doPrintShowSharedDrives,
76015
75250
  Cmd.ARG_SHAREDDRIVEACLS: doPrintShowSharedDriveACLs,
76016
- Cmd.ARG_SITE: doPrintShowDomainSites,
76017
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
76018
- Cmd.ARG_SITEACTIVITY: doPrintDomainSiteActivity,
75251
+ Cmd.ARG_SITE: deprecatedDomainSites,
75252
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75253
+ Cmd.ARG_SITEACTIVITY: deprecatedDomainSites,
76019
75254
  Cmd.ARG_SVCACCT: doPrintShowSvcAccts,
76020
75255
  Cmd.ARG_TOKEN: doPrintShowTokens,
76021
75256
  Cmd.ARG_TRANSFERAPPS: doShowTransferApps,
@@ -76131,8 +75366,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
76131
75366
  Cmd.ARG_SHAREDDRIVEACLS: doPrintShowSharedDriveACLs,
76132
75367
  Cmd.ARG_SHAREDDRIVEINFO: doInfoSharedDrive,
76133
75368
  Cmd.ARG_SHAREDDRIVETHEMES: doShowSharedDriveThemes,
76134
- Cmd.ARG_SITE: doPrintShowDomainSites,
76135
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75369
+ Cmd.ARG_SITE: deprecatedDomainSites,
75370
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
76136
75371
  Cmd.ARG_SVCACCT: doPrintShowSvcAccts,
76137
75372
  Cmd.ARG_TOKEN: doPrintShowTokens,
76138
75373
  Cmd.ARG_TRANSFERAPPS: doShowTransferApps,
@@ -76197,8 +75432,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
76197
75432
  Cmd.ARG_SAKEY: doUpdateSvcAcctKeys,
76198
75433
  Cmd.ARG_SCHEMA: doCreateUpdateUserSchemas,
76199
75434
  Cmd.ARG_SHAREDDRIVE: doUpdateSharedDrive,
76200
- Cmd.ARG_SITE: doUpdateDomainSites,
76201
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75435
+ Cmd.ARG_SITE: deprecatedDomainSites,
75436
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
76202
75437
  Cmd.ARG_SVCACCT: doCheckUpdateSvcAcct,
76203
75438
  Cmd.ARG_USER: doUpdateUser,
76204
75439
  Cmd.ARG_USERS: doUpdateUsers,
@@ -76737,8 +75972,8 @@ USER_ADD_CREATE_FUNCTIONS = {
76737
75972
  Cmd.ARG_SENDAS: createUpdateSendAs,
76738
75973
  Cmd.ARG_SHAREDDRIVE: createSharedDrive,
76739
75974
  Cmd.ARG_SHEET: createSheet,
76740
- Cmd.ARG_SITE: createUserSite,
76741
- Cmd.ARG_SITEACL: processUserSiteACLs,
75975
+ Cmd.ARG_SITE: deprecatedUserSites,
75976
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76742
75977
  Cmd.ARG_SMIME: createSmime,
76743
75978
  Cmd.ARG_TASK: processTasks,
76744
75979
  Cmd.ARG_TASKLIST: processTasklists,
@@ -76856,7 +76091,7 @@ USER_COMMANDS_WITH_OBJECTS = {
76856
76091
  Cmd.ARG_SENDAS: deleteInfoSendAs,
76857
76092
  Cmd.ARG_SMIME: deleteSmime,
76858
76093
  Cmd.ARG_SHAREDDRIVE: deleteSharedDrive,
76859
- Cmd.ARG_SITEACL: processUserSiteACLs,
76094
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76860
76095
  Cmd.ARG_TASK: processTasks,
76861
76096
  Cmd.ARG_TASKLIST: processTasklists,
76862
76097
  Cmd.ARG_THREAD: processThreads,
@@ -76945,8 +76180,8 @@ USER_COMMANDS_WITH_OBJECTS = {
76945
76180
  Cmd.ARG_SENDAS: deleteInfoSendAs,
76946
76181
  Cmd.ARG_SHAREDDRIVE: infoSharedDrive,
76947
76182
  Cmd.ARG_SHEET: infoPrintShowSheets,
76948
- Cmd.ARG_SITE: infoUserSites,
76949
- Cmd.ARG_SITEACL: processUserSiteACLs,
76183
+ Cmd.ARG_SITE: deprecatedUserSites,
76184
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76950
76185
  Cmd.ARG_TASK: processTasks,
76951
76186
  Cmd.ARG_TASKLIST: processTasklists,
76952
76187
  Cmd.ARG_USER: infoUsers,
@@ -77058,9 +76293,9 @@ USER_COMMANDS_WITH_OBJECTS = {
77058
76293
  Cmd.ARG_SHEETRANGE: printShowSheetRanges,
77059
76294
  Cmd.ARG_SIGNATURE: printShowSignature,
77060
76295
  Cmd.ARG_SMIME: printShowSmimes,
77061
- Cmd.ARG_SITE: printShowUserSites,
77062
- Cmd.ARG_SITEACL: processUserSiteACLs,
77063
- Cmd.ARG_SITEACTIVITY: printUserSiteActivity,
76296
+ Cmd.ARG_SITE: deprecatedUserSites,
76297
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76298
+ Cmd.ARG_SITEACTIVITY: deprecatedUserSites,
77064
76299
  Cmd.ARG_TASK: printShowTasks,
77065
76300
  Cmd.ARG_TASKLIST: printShowTasklists,
77066
76301
  Cmd.ARG_THREAD: printShowThreads,
@@ -77164,8 +76399,8 @@ USER_COMMANDS_WITH_OBJECTS = {
77164
76399
  Cmd.ARG_SHEET: infoPrintShowSheets,
77165
76400
  Cmd.ARG_SHEETRANGE: printShowSheetRanges,
77166
76401
  Cmd.ARG_SIGNATURE: printShowSignature,
77167
- Cmd.ARG_SITE: printShowUserSites,
77168
- Cmd.ARG_SITEACL: processUserSiteACLs,
76402
+ Cmd.ARG_SITE: deprecatedUserSites,
76403
+ Cmd.ARG_SITEACL: deprecatedUserSites,
77169
76404
  Cmd.ARG_SMIME: printShowSmimes,
77170
76405
  Cmd.ARG_TASK: printShowTasks,
77171
76406
  Cmd.ARG_TASKLIST: printShowTasklists,
@@ -77268,8 +76503,8 @@ USER_COMMANDS_WITH_OBJECTS = {
77268
76503
  Cmd.ARG_SHEET: updateSheets,
77269
76504
  Cmd.ARG_SHEETRANGE: updateSheetRanges,
77270
76505
  Cmd.ARG_SMIME: updateSmime,
77271
- Cmd.ARG_SITE: updateUserSites,
77272
- Cmd.ARG_SITEACL: processUserSiteACLs,
76506
+ Cmd.ARG_SITE: deprecatedUserSites,
76507
+ Cmd.ARG_SITEACL: deprecatedUserSites,
77273
76508
  Cmd.ARG_TASK: processTasks,
77274
76509
  Cmd.ARG_TASKLIST: processTasklists,
77275
76510
  Cmd.ARG_USER: updateUsers,