gam7 7.3.9__py3-none-any.whl → 7.4.1__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.09'
28
+ __version__ = '7.04.01'
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
@@ -670,8 +667,10 @@ def accessErrorExitNonDirectory(api, errMsg):
670
667
  Ent.API, api])+[errMsg],
671
668
  ''))
672
669
 
673
- def ClientAPIAccessDeniedExit():
670
+ def ClientAPIAccessDeniedExit(errMsg=None):
674
671
  stderrErrorMsg(Msg.API_ACCESS_DENIED)
672
+ if errMsg:
673
+ stderrErrorMsg(errMsg)
675
674
  missingScopes = API.getClientScopesSet(GM.Globals[GM.CURRENT_CLIENT_API])-GM.Globals[GM.CURRENT_CLIENT_API_SCOPES]
676
675
  if missingScopes:
677
676
  writeStderr(Msg.API_CHECK_CLIENT_AUTHORIZATION.format(GM.Globals[GM.OAUTH2_CLIENT_ID],
@@ -825,6 +824,9 @@ def deprecatedArgument(argument):
825
824
  def deprecatedArgumentExit(argument):
826
825
  usageErrorExit(f'{Cmd.ARGUMENT_ERROR_NAMES[Cmd.ARGUMENT_DEPRECATED][1]}: <{argument}>')
827
826
 
827
+ def deprecatedCommandExit():
828
+ systemErrorExit(USAGE_ERROR_RC, Msg.SITES_COMMAND_DEPRECATED.format(Cmd.CommandDeprecated()))
829
+
828
830
  # Choices is the valid set of choices that was expected
829
831
  def formatChoiceList(choices):
830
832
  choiceList = [c if c else "''" for c in choices]
@@ -1749,33 +1751,6 @@ def protectedSheetId(spreadsheet, sheetId):
1749
1751
  return True
1750
1752
  return False
1751
1753
 
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
1754
  def getString(item, checkBlank=False, optional=False, minLen=1, maxLen=None):
1780
1755
  if Cmd.ArgumentsRemaining():
1781
1756
  argstr = Cmd.Current()
@@ -5674,21 +5649,6 @@ def getContactsQuery(**kwargs):
5674
5649
  def getEmailAuditObject():
5675
5650
  return initGDataObject(gdata.apps.audit.service.AuditService(), API.EMAIL_AUDIT)
5676
5651
 
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
5652
  def getUserEmailFromID(uid, cd):
5693
5653
  try:
5694
5654
  result = callGAPI(cd.users(), 'get',
@@ -21267,6 +21227,8 @@ def _getPeopleOtherContacts(people, entityType, user, i=0, count=0):
21267
21227
  resourceName = contact.pop('resourceName')
21268
21228
  otherContacts[resourceName] = contact
21269
21229
  return otherContacts
21230
+ except GAPI.permissionDenied as e:
21231
+ ClientAPIAccessDeniedExit(str(e))
21270
21232
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21271
21233
  entityUnknownWarning(entityType, user, i, count)
21272
21234
  return None
@@ -21323,6 +21285,8 @@ def queryPeopleContacts(people, contactQuery, fields, sortOrder, entityType, use
21323
21285
  showMessage = pageMessage.replace(TOTAL_ITEMS_MARKER, str(totalItems))
21324
21286
  writeGotMessage(showMessage.replace('{0}', str(Ent.Choose(Ent.PEOPLE_CONTACT, totalItems))))
21325
21287
  return entityList
21288
+ except GAPI.permissionDenied as e:
21289
+ ClientAPIAccessDeniedExit(str(e))
21326
21290
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21327
21291
  entityUnknownWarning(entityType, user, i, count)
21328
21292
  return None
@@ -21349,6 +21313,8 @@ def queryPeopleOtherContacts(people, contactQuery, fields, entityType, user, i=0
21349
21313
  showMessage = pageMessage.replace(TOTAL_ITEMS_MARKER, str(totalItems))
21350
21314
  writeGotMessage(showMessage.replace('{0}', str(Ent.Choose(Ent.OTHER_CONTACT, totalItems))))
21351
21315
  return entityList
21316
+ except GAPI.permissionDenied as e:
21317
+ ClientAPIAccessDeniedExit(str(e))
21352
21318
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21353
21319
  entityUnknownWarning(entityType, user, i, count)
21354
21320
  return None
@@ -21369,6 +21335,8 @@ def getPeopleContactGroupsInfo(people, entityType, entityName, i, count):
21369
21335
  if group['formattedName'] != group['name']:
21370
21336
  contactGroupNames.setdefault(group['name'], [])
21371
21337
  contactGroupNames[group['name']].append(group['resourceName'])
21338
+ except GAPI.permissionDenied as e:
21339
+ ClientAPIAccessDeniedExit(str(e))
21372
21340
  except GAPI.forbidden:
21373
21341
  userPeopleServiceNotEnabledWarning(entityName, i, count)
21374
21342
  return (contactGroupIDs, False)
@@ -21467,6 +21435,8 @@ def createUserPeopleContact(users):
21467
21435
  csvPF.WriteRow(row)
21468
21436
  except GAPI.invalidArgument as e:
21469
21437
  entityActionFailedWarning([entityType, user, peopleEntityType, None], str(e), i, count)
21438
+ except GAPI.permissionDenied as e:
21439
+ ClientAPIAccessDeniedExit(str(e))
21470
21440
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21471
21441
  ClientAPIAccessDeniedExit()
21472
21442
  if csvPF:
@@ -21630,6 +21600,8 @@ def _clearUpdatePeopleContacts(users, updateContacts):
21630
21600
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], str(e), j, jcount)
21631
21601
  except (GAPI.notFound, GAPI.internalError):
21632
21602
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
21603
+ except GAPI.permissionDenied as e:
21604
+ ClientAPIAccessDeniedExit(str(e))
21633
21605
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21634
21606
  ClientAPIAccessDeniedExit()
21635
21607
  Ind.Decrement()
@@ -21778,6 +21750,8 @@ def dedupReplaceDomainUserPeopleContacts(users):
21778
21750
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], str(e), j, jcount)
21779
21751
  except (GAPI.notFound, GAPI.internalError):
21780
21752
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
21753
+ except GAPI.permissionDenied as e:
21754
+ ClientAPIAccessDeniedExit(str(e))
21781
21755
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21782
21756
  ClientAPIAccessDeniedExit()
21783
21757
  Ind.Decrement()
@@ -21831,6 +21805,8 @@ def deleteUserPeopleContacts(users):
21831
21805
  entityActionPerformed([entityType, user, peopleEntityType, resourceName], j, jcount)
21832
21806
  except (GAPI.notFound, GAPI.internalError):
21833
21807
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
21808
+ except GAPI.permissionDenied as e:
21809
+ ClientAPIAccessDeniedExit(str(e))
21834
21810
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21835
21811
  ClientAPIAccessDeniedExit()
21836
21812
  Ind.Decrement()
@@ -22109,6 +22085,8 @@ def _infoPeople(users, entityType, source):
22109
22085
  except GAPI.invalidArgument as e:
22110
22086
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], str(e), j, jcount)
22111
22087
  continue
22088
+ except GAPI.permissionDenied as e:
22089
+ ClientAPIAccessDeniedExit(str(e))
22112
22090
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
22113
22091
  ClientAPIAccessDeniedExit()
22114
22092
  if showContactGroups and contactGroupIDs:
@@ -22287,6 +22265,8 @@ def copyUserPeopleOtherContacts(users):
22287
22265
  except (GAPI.notFound, GAPI.internalError):
22288
22266
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
22289
22267
  continue
22268
+ except GAPI.permissionDenied as e:
22269
+ ClientAPIAccessDeniedExit(str(e))
22290
22270
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
22291
22271
  ClientAPIAccessDeniedExit()
22292
22272
  Ind.Decrement()
@@ -22401,7 +22381,9 @@ def processUserPeopleOtherContacts(users):
22401
22381
  except (GAPI.notFound, GAPI.internalError):
22402
22382
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
22403
22383
  continue
22404
- except (GAPI.serviceNotAvailable, GAPI.forbidden, GAPI.permissionDenied):
22384
+ except GAPI.permissionDenied as e:
22385
+ ClientAPIAccessDeniedExit(str(e))
22386
+ except (GAPI.serviceNotAvailable, GAPI.forbidden):
22405
22387
  ClientAPIAccessDeniedExit()
22406
22388
  Ind.Decrement()
22407
22389
 
@@ -22518,6 +22500,8 @@ def _printShowPeople(source):
22518
22500
  pageSize=GC.Values[GC.PEOPLE_MAX_RESULTS],
22519
22501
  sources=sources, mergeSources=mergeSources,
22520
22502
  readMask=fields, fields='nextPageToken,people', **kwargs)
22503
+ except GAPI.permissionDenied as e:
22504
+ ClientAPIAccessDeniedExit(str(e))
22521
22505
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
22522
22506
  ClientAPIAccessDeniedExit()
22523
22507
  if not countsOnly:
@@ -22638,6 +22622,8 @@ def printShowUserPeopleProfiles(users):
22638
22622
  except GAPI.notFound:
22639
22623
  entityUnknownWarning(Ent.PEOPLE_PROFILE, user, i, count)
22640
22624
  continue
22625
+ except GAPI.permissionDenied as e:
22626
+ ClientAPIAccessDeniedExit(str(e))
22641
22627
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
22642
22628
  ClientAPIAccessDeniedExit()
22643
22629
  if not csvPF:
@@ -22792,6 +22778,8 @@ def _processPeopleContactPhotos(users, function):
22792
22778
  entityDoesNotHaveItemWarning([entityType, user, peopleEntityType, resourceName, Ent.PHOTO, filename], j, jcount)
22793
22779
  except (GAPI.invalidArgument, OSError, IOError) as e:
22794
22780
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName, Ent.PHOTO, filename], str(e), j, jcount)
22781
+ except GAPI.permissionDenied as e:
22782
+ ClientAPIAccessDeniedExit(str(e))
22795
22783
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
22796
22784
  ClientAPIAccessDeniedExit()
22797
22785
  break
@@ -22866,7 +22854,7 @@ def createUserPeopleContactGroup(users):
22866
22854
  if addCSVData:
22867
22855
  row.update(addCSVData)
22868
22856
  csvPF.WriteRow(row)
22869
- except GAPI.forbidden:
22857
+ except (GAPI.forbidden, GAPI.permissionDenied):
22870
22858
  userPeopleServiceNotEnabledWarning(user, i, count)
22871
22859
  except GAPI.serviceNotAvailable:
22872
22860
  entityUnknownWarning(entityType, user, i, count)
@@ -22920,7 +22908,7 @@ def updateUserPeopleContactGroup(users):
22920
22908
  entityActionPerformed([entityType, user, Ent.CONTACT_GROUP, contactGroup], j, jcount)
22921
22909
  except (GAPI.notFound, GAPI.internalError) as e:
22922
22910
  entityActionFailedWarning([entityType, user, Ent.CONTACT_GROUP, contactGroup], str(e), j, jcount)
22923
- except GAPI.forbidden:
22911
+ except (GAPI.forbidden, GAPI.permissionDenied):
22924
22912
  userPeopleServiceNotEnabledWarning(user, i, count)
22925
22913
  break
22926
22914
  except GAPI.serviceNotAvailable:
@@ -22965,7 +22953,7 @@ def deleteUserPeopleContactGroups(users):
22965
22953
  entityActionPerformed([entityType, user, Ent.CONTACT_GROUP, contactGroup], j, jcount)
22966
22954
  except GAPI.notFound as e:
22967
22955
  entityActionFailedWarning([entityType, user, Ent.CONTACT_GROUP, contactGroup], str(e), j, jcount)
22968
- except GAPI.forbidden:
22956
+ except (GAPI.forbidden, GAPI.permissionDenied):
22969
22957
  userPeopleServiceNotEnabledWarning(user, i, count)
22970
22958
  break
22971
22959
  except GAPI.serviceNotAvailable:
@@ -23066,7 +23054,7 @@ def infoUserPeopleContactGroups(users):
23066
23054
  _showContactGroup(entityType, user, Ent.CONTACT_GROUP, group, j, jcount, FJQC)
23067
23055
  except GAPI.notFound as e:
23068
23056
  entityActionFailedWarning([entityType, user, Ent.CONTACT_GROUP, contactGroup], str(e), j, jcount)
23069
- except GAPI.forbidden:
23057
+ except (GAPI.forbidden, GAPI.permissionDenied):
23070
23058
  userPeopleServiceNotEnabledWarning(user, i, count)
23071
23059
  break
23072
23060
  except GAPI.serviceNotAvailable:
@@ -23115,6 +23103,8 @@ def printShowUserPeopleContactGroups(users):
23115
23103
  throwReasons=GAPI.PEOPLE_ACCESS_THROW_REASONS,
23116
23104
  pageSize=GC.Values[GC.PEOPLE_MAX_RESULTS],
23117
23105
  groupFields=fields, fields='nextPageToken,contactGroups')
23106
+ except GAPI.permissionDenied as e:
23107
+ ClientAPIAccessDeniedExit(str(e))
23118
23108
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
23119
23109
  ClientAPIAccessDeniedExit()
23120
23110
  _printPersonEntityList(Ent.PEOPLE_CONTACT_GROUP, entityList, entityType, user, i, count, csvPF, FJQC, parameters, None)
@@ -24185,7 +24175,8 @@ def substituteQueryTimes(queries, queryTimes):
24185
24175
  for i, query in enumerate(queries):
24186
24176
  if query is not None:
24187
24177
  for queryTimeName, queryTimeValue in iter(queryTimes.items()):
24188
- queries[i] = query.replace(f'#{queryTimeName}#', queryTimeValue)
24178
+ query = query.replace(f'#{queryTimeName}#', queryTimeValue)
24179
+ queries[i] = query
24189
24180
 
24190
24181
  # Get CrOS devices from gam.cfg print_cros_ous and print_cros_ous_and_children
24191
24182
  def getCfgCrOSEntities():
@@ -34137,7 +34128,7 @@ def doPrintGroupMembers():
34137
34128
  for name in info['names']:
34138
34129
  if name['metadata']['source']['type'] == sourceType:
34139
34130
  return name['displayName']
34140
- except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.forbidden):
34131
+ except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.forbidden, GAPI.permissionDenied):
34141
34132
  pass
34142
34133
  return unknownName
34143
34134
 
@@ -42266,776 +42257,26 @@ def doPrintVaultCounts():
42266
42257
  csvPF.WriteRow({'account': account, 'count': 0})
42267
42258
  csvPF.writeCSVfile('Vault Counts')
42268
42259
 
42269
- def checkSiteExists(sitesObject, domain, site):
42270
- try:
42271
- callGData(sitesObject, 'GetSite',
42272
- throwErrors=[GDATA.NOT_FOUND],
42273
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42274
- domain=domain, site=site)
42275
- return True
42276
- except GDATA.notFound:
42277
- return None
42278
-
42279
- SITE_ACLS = 'ACLs'
42280
- SITE_CATEGORIES = 'Categories'
42281
- SITE_LINK = 'Link'
42282
- SITE_NAME = 'Name'
42283
- SITE_SITE = 'Site'
42284
- SITE_SOURCELINK = 'SourceLink'
42285
- SITE_SUMMARY = 'Summary'
42286
- SITE_THEME = 'Theme'
42287
- SITE_UPDATED = 'Updated'
42288
- SITE_WEB_ADDRESS_MAPPINGS = 'WebAddressMappings'
42289
-
42290
- SITE_DATA_DOMAIN = 'domain'
42291
- SITE_DATA_SITE = 'site'
42292
- SITE_DATA_DOMAIN_SITE = 'domainSite'
42293
- SITE_DATA_FIELDS = 'fields'
42294
-
42295
- class SitesManager():
42296
-
42297
- SITE_ARGUMENT_TO_PROPERTY_MAP = {
42298
- 'categories': SITE_CATEGORIES,
42299
- 'name': SITE_NAME,
42300
- 'sourcelink': SITE_SOURCELINK,
42301
- 'summary': SITE_SUMMARY,
42302
- 'theme': SITE_THEME,
42303
- }
42304
-
42305
- @staticmethod
42306
- def AclEntryToFields(acl_entry):
42307
-
42308
- def GetAclAttr(attrlist):
42309
- objAttr = acl_entry
42310
- for attr in attrlist:
42311
- objAttr = getattr(objAttr, attr)
42312
- if not objAttr:
42313
- return None
42314
- return objAttr
42315
-
42316
- fields = {}
42317
- fields['role'] = GetAclAttr(['role', 'value'])
42318
- if not fields['role']:
42319
- fields['role'] = GetAclAttr(['withKey', 'role', 'value'])+' (with link)'
42320
- fields['scope'] = {'type': GetAclAttr(['scope', 'type']),
42321
- 'value': GetAclAttr(['scope', 'value'])}
42322
- link = acl_entry.FindInviteLink()
42323
- if link:
42324
- fields['inviteLink'] = link
42325
- return fields
42326
-
42327
- @staticmethod
42328
- def FieldsToAclEntry(fields):
42329
- acl_entry = gdata.apps.sites.AclEntry()
42330
- acl_entry.role = gdata.apps.sites.AclRole(value=fields['role'])
42331
- acl_entry.scope = gdata.apps.sites.AclScope(stype=fields['scope']['type'], value=fields['scope'].get('value'))
42332
- return acl_entry
42333
-
42334
- @staticmethod
42335
- def ActivityEntryToFields(activity_entry):
42336
- fields = {}
42337
-
42338
- def GetActivityField(fieldName, attrlist):
42339
- objAttr = activity_entry
42340
- for attr in attrlist:
42341
- objAttr = getattr(objAttr, attr)
42342
- if not objAttr:
42343
- return
42344
- fields[fieldName] = objAttr
42345
-
42346
- def GetActivityFieldData(objAttr, attrlist, default):
42347
- for attr in attrlist:
42348
- objAttr = getattr(objAttr, attr)
42349
- if not objAttr:
42350
- return default
42351
- return objAttr
42352
-
42353
- def AppendItemToFieldsList(fieldName, fieldValue):
42354
- fields.setdefault(fieldName, [])
42355
- fields[fieldName].append(fieldValue)
42356
-
42357
- GetActivityField('Summary', ['title', 'text'])
42358
- GetActivityField('Updated', ['updated', 'text'])
42359
- for author in activity_entry.author:
42360
- AppendItemToFieldsList('Authors', f'{GetActivityFieldData(author, ["name", "text"], "Unknown Name")}/{GetActivityFieldData(author, ["email", "text"], "Unknown Email")}')
42361
- fields['Operation'] = activity_entry.Kind()
42362
- return fields
42363
-
42364
- @staticmethod
42365
- def SiteToFields(site_entry):
42366
- fields = {}
42367
-
42368
- def GetSiteField(fieldName, attrlist):
42369
- objAttr = site_entry
42370
- for attr in attrlist:
42371
- objAttr = getattr(objAttr, attr)
42372
- if not objAttr:
42373
- return
42374
- fields[fieldName] = objAttr
42375
-
42376
- def AppendItemToFieldsList(fieldName, fieldValue):
42377
- fields.setdefault(fieldName, [])
42378
- fields[fieldName].append(fieldValue)
42379
-
42380
- GetSiteField(SITE_SITE, ['siteName', 'text'])
42381
- GetSiteField(SITE_NAME, ['title', 'text'])
42382
- GetSiteField(SITE_SUMMARY, ['summary', 'text'])
42383
- GetSiteField(SITE_THEME, ['theme', 'text'])
42384
- GetSiteField(SITE_UPDATED, ['updated', 'text'])
42385
- if site_entry.category:
42386
- for category in site_entry.category:
42387
- if category.term:
42388
- AppendItemToFieldsList(SITE_CATEGORIES, category.term)
42389
- link = site_entry.FindAlternateLink()
42390
- if link:
42391
- fields[SITE_LINK] = link
42392
- link = site_entry.FindSourceLink()
42393
- if link:
42394
- fields[SITE_SOURCELINK] = link
42395
- for link in site_entry.FindWebAddressMappings():
42396
- AppendItemToFieldsList(SITE_WEB_ADDRESS_MAPPINGS, link)
42397
- return fields
42398
-
42399
- @staticmethod
42400
- def GetSiteFields():
42401
-
42402
- fields = {}
42403
- while Cmd.ArgumentsRemaining():
42404
- myarg = getArgument()
42405
- if myarg in SitesManager.SITE_ARGUMENT_TO_PROPERTY_MAP:
42406
- fieldName = SitesManager.SITE_ARGUMENT_TO_PROPERTY_MAP[myarg]
42407
- if fieldName == SITE_NAME:
42408
- fields[fieldName] = getString(Cmd.OB_STRING)
42409
- elif fieldName == SITE_SOURCELINK:
42410
- fields[fieldName] = getString(Cmd.OB_URI)
42411
- elif fieldName == SITE_SUMMARY:
42412
- fields[fieldName] = getStringWithCRsNLs()
42413
- elif fieldName == SITE_THEME:
42414
- fields[fieldName] = getString(Cmd.OB_STRING)
42415
- elif fieldName == SITE_CATEGORIES:
42416
- fields[fieldName] = getString(Cmd.OB_STRING, minLen=0).split(',')
42417
- else:
42418
- unknownArgumentExit()
42419
- return fields
42420
-
42421
- @staticmethod
42422
- def FieldsToSite(fields):
42423
- def GetField(fieldName):
42424
- return fields.get(fieldName)
42425
-
42426
- def GetSiteField(fieldName, fieldClass):
42427
- value = fields.get(fieldName)
42428
- if value:
42429
- return fieldClass(text=value)
42430
- return None
42431
-
42432
- site_entry = gdata.apps.sites.SiteEntry(sourceSite=GetField(SITE_SOURCELINK))
42433
- site_entry.siteName = GetSiteField(SITE_SITE, gdata.apps.sites.SiteName)
42434
- site_entry.title = GetSiteField(SITE_NAME, atom.Title)
42435
- site_entry.summary = GetSiteField(SITE_SUMMARY, atom.Summary)
42436
- site_entry.theme = GetSiteField(SITE_THEME, gdata.apps.sites.Theme)
42437
- value = GetField(SITE_CATEGORIES)
42438
- if value:
42439
- for category in value:
42440
- site_entry.category.append(atom.Category(term=category, scheme=gdata.apps.sites.TAG_KIND_TERM))
42441
- return site_entry
42442
-
42443
- def getSiteEntity():
42444
- siteEntity = {'list': getEntityList(Cmd.OB_SITE_ENTITY), 'dict': None}
42445
- if isinstance(siteEntity['list'], dict):
42446
- siteEntity['dict'] = siteEntity['list']
42447
- return siteEntity
42448
-
42449
- def _validateUserGetSites(entityType, user, i, count, siteEntity, itemType=None, modifier=None):
42450
- if siteEntity['dict']:
42451
- sites = siteEntity['dict'][user]
42452
- else:
42453
- sites = siteEntity['list']
42454
- user, sitesObject = getSitesObject(entityType, user, i, count)
42455
- if not sitesObject:
42456
- return (user, None, None, 0)
42457
- jcount = len(sites)
42458
- if not itemType:
42459
- entityPerformActionNumItems([entityType, user], jcount, Ent.SITE, i, count)
42460
- else:
42461
- entityPerformActionSubItemModifierNumItems([entityType, user], itemType, modifier, jcount, Ent.SITE, i, count)
42462
- if jcount == 0:
42463
- setSysExitRC(NO_ENTITIES_FOUND_RC)
42464
- return (user, sitesObject, sites, jcount)
42465
-
42466
- def _validateSite(fullSite, i, count):
42467
- domain, site, domainSite = validateSplitSiteName(fullSite)
42468
- if domainSite:
42469
- return (domain, site, domainSite)
42470
- entityActionNotPerformedWarning([Ent.SITE, site], Msg.INVALID_SITE.format(site, SITENAME_FORMAT_REQUIRED), i, count)
42471
- return (domain, site, None)
42472
-
42473
- def _validateSiteGetRuleIds(origUser, fullSite, j, jcount, ACLScopeEntity, showAction=True):
42474
- domain, site, domainSite = _validateSite(fullSite, j, jcount)
42475
- if not domainSite:
42476
- return (domain, site, None, None, 0)
42477
- if ACLScopeEntity:
42478
- if ACLScopeEntity['dict']:
42479
- if not GM.Globals[GM.CSV_SUBKEY_FIELD]:
42480
- ruleIds = ACLScopeEntity['dict'][fullSite]
42481
- else:
42482
- ruleIds = ACLScopeEntity['dict'][origUser][fullSite]
42483
- else:
42484
- ruleIds = ACLScopeEntity['list']
42485
- kcount = len(ruleIds)
42486
- if kcount == 0:
42487
- setSysExitRC(NO_ENTITIES_FOUND_RC)
42488
- else:
42489
- ruleIds = []
42490
- kcount = 0
42491
- if showAction:
42492
- entityPerformActionNumItems([Ent.SITE, domainSite], kcount, Ent.SITE_ACL, j, jcount)
42493
- return (domain, site, domainSite, ruleIds, kcount)
42494
-
42495
- def _createSite(users, entityType):
42496
- sitesManager = SitesManager()
42497
- domain, site, domainSite = getSiteName()
42498
- fields = sitesManager.GetSiteFields()
42499
- if not fields.get(SITE_NAME):
42500
- fields[SITE_NAME] = site
42501
- i, count, users = getEntityArgument(users)
42502
- for user in users:
42503
- i += 1
42504
- user, sitesObject = getSitesObject(entityType, user, i, count)
42505
- if not sitesObject:
42506
- continue
42507
- try:
42508
- siteEntry = sitesManager.FieldsToSite(fields)
42509
- callGData(sitesObject, 'CreateSite',
42510
- throwErrors=[GDATA.NOT_FOUND, GDATA.ENTITY_EXISTS, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42511
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42512
- siteentry=siteEntry, domain=domain, site=None)
42513
- entityActionPerformed([Ent.SITE, domainSite])
42514
- except GDATA.notFound as e:
42515
- entityActionFailedWarning([Ent.DOMAIN, domain], str(e))
42516
- except (GDATA.entityExists, GDATA.badRequest, GDATA.forbidden) as e:
42517
- entityActionFailedWarning([Ent.SITE, domainSite], str(e))
42518
-
42519
42260
  # gam [<UserTypeEntity>] create site <SiteName> <SiteAttribute>*
42520
- def createUserSite(users):
42521
- _createSite(users, Ent.USER)
42522
-
42523
- def doCreateDomainSite():
42524
- _createSite([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42525
-
42526
- def _updateSites(users, entityType):
42527
- sitesManager = SitesManager()
42528
- siteEntity = getSiteEntity()
42529
- updateFields = sitesManager.GetSiteFields()
42530
- i, count, users = getEntityArgument(users)
42531
- for user in users:
42532
- i += 1
42533
- user, sitesObject, sites, jcount = _validateUserGetSites(entityType, user, i, count, siteEntity)
42534
- if jcount == 0:
42535
- continue
42536
- Ind.Increment()
42537
- j = 0
42538
- for site in sites:
42539
- j += 1
42540
- domain, site, domainSite = _validateSite(site, j, jcount)
42541
- if not domainSite:
42542
- continue
42543
- try:
42544
- siteEntry = callGData(sitesObject, 'GetSite',
42545
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42546
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42547
- domain=domain, site=site)
42548
- fields = sitesManager.SiteToFields(siteEntry)
42549
- for field, value in iter(updateFields.items()):
42550
- if field != SITE_SOURCELINK:
42551
- fields[field] = value
42552
- newSiteEntry = sitesManager.FieldsToSite(fields)
42553
- callGData(sitesObject, 'UpdateSite',
42554
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42555
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42556
- siteentry=newSiteEntry, domain=domain, site=site, extra_headers={'If-Match': siteEntry.etag})
42557
- entityActionPerformed([Ent.SITE, domainSite])
42558
- except (GDATA.notFound, GDATA.badRequest, GDATA.forbidden) as e:
42559
- entityActionFailedWarning([Ent.SITE, domainSite], str(e))
42560
-
42561
42261
  # gam [<UserTypeEntity>] update site <SiteEntity> <SiteAttribute>+
42562
- def updateUserSites(users):
42563
- _updateSites(users, Ent.USER)
42564
-
42565
- def doUpdateDomainSites():
42566
- _updateSites([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42567
-
42568
- SITE_FIELD_PRINT_ORDER = [
42569
- SITE_UPDATED,
42570
- SITE_NAME,
42571
- SITE_SUMMARY,
42572
- SITE_THEME,
42573
- SITE_SOURCELINK,
42574
- SITE_CATEGORIES,
42575
- SITE_LINK,
42576
- ]
42577
-
42578
- def _showSite(sitesManager, sitesObject, domain, site, roles, j, jcount):
42579
- fields = sitesManager.SiteToFields(site)
42580
- domainSite = f'{domain}/{fields[SITE_SITE]}'
42581
- printKeyValueListWithCount([SITE_SITE, domainSite], j, jcount)
42582
- Ind.Increment()
42583
- for field in SITE_FIELD_PRINT_ORDER:
42584
- if field in fields:
42585
- if not isinstance(fields[field], list):
42586
- if field != SITE_SUMMARY:
42587
- printKeyValueList([field, fields[field]])
42588
- else:
42589
- printKeyValueWithCRsNLs(field, fields[field])
42590
- else:
42591
- printKeyValueList([field, ','.join(fields[field])])
42592
- if fields.get(SITE_WEB_ADDRESS_MAPPINGS):
42593
- printKeyValueList([SITE_WEB_ADDRESS_MAPPINGS, None])
42594
- Ind.Increment()
42595
- for link in fields[SITE_WEB_ADDRESS_MAPPINGS]:
42596
- printKeyValueList([link, None])
42597
- Ind.Decrement()
42598
- if roles:
42599
- try:
42600
- acls = callGDataPages(sitesObject, 'GetAclFeed',
42601
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42602
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42603
- domain=domain, site=fields[SITE_SITE])
42604
- printKeyValueList([SITE_ACLS, None])
42605
- Ind.Increment()
42606
- for acl in acls:
42607
- fields = sitesManager.AclEntryToFields(acl)
42608
- if fields['role'] in roles:
42609
- printKeyValueList([formatACLRule(fields)])
42610
- Ind.Decrement()
42611
- except GDATA.notFound as e:
42612
- entityActionFailedWarning([Ent.SITE, domainSite], str(e))
42613
- except GDATA.forbidden:
42614
- pass
42615
- Ind.Decrement()
42616
-
42617
- SITE_ACL_ROLES_MAP = {
42618
- 'editor': 'writer',
42619
- 'invite': 'invite',
42620
- 'owner': 'owner',
42621
- 'read': 'reader',
42622
- 'reader': 'reader',
42623
- 'writer': 'writer',
42624
- }
42625
-
42626
- def _infoSites(users, entityType):
42627
- siteEntity = getSiteEntity()
42628
- url_params = {}
42629
- roles = set()
42630
- while Cmd.ArgumentsRemaining():
42631
- myarg = getArgument()
42632
- if myarg == 'withmappings':
42633
- url_params['with-mappings'] = 'true'
42634
- elif myarg in {'role', 'roles'}:
42635
- roles = getACLRoles(SITE_ACL_ROLES_MAP)
42636
- else:
42637
- unknownArgumentExit()
42638
- sitesManager = SitesManager()
42639
- i, count, users = getEntityArgument(users)
42640
- for user in users:
42641
- i += 1
42642
- user, sitesObject, sites, jcount = _validateUserGetSites(entityType, user, i, count, siteEntity)
42643
- if jcount == 0:
42644
- continue
42645
- Ind.Increment()
42646
- j = 0
42647
- for site in sites:
42648
- j += 1
42649
- domain, site, domainSite = _validateSite(site, j, jcount)
42650
- if not domainSite:
42651
- continue
42652
- try:
42653
- result = callGData(sitesObject, 'GetSite',
42654
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42655
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42656
- domain=domain, site=site, url_params=url_params)
42657
- if result:
42658
- _showSite(sitesManager, sitesObject, domain, result, roles, j, jcount)
42659
- except (GDATA.notFound, GDATA.forbidden) as e:
42660
- entityActionFailedWarning([Ent.SITE, domainSite], str(e))
42661
- Ind.Decrement()
42662
-
42663
42262
  # gam [<UserTypeEntity>] info site <SiteEntity> [withmappings] [role|roles all|<SiteACLRoleList>]
42664
- def infoUserSites(users):
42665
- _infoSites(users, Ent.USER)
42666
-
42667
- def doInfoDomainSites():
42668
- _infoSites([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42669
-
42670
- def printShowSites(entityList, entityType):
42671
- def _getSites(domain, i, count):
42672
- try:
42673
- return callGDataPages(sitesObject, 'GetSiteFeed',
42674
- pageMessage=getPageMessageForWhom(),
42675
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42676
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42677
- domain=domain, url_params=url_params)
42678
- except (GDATA.notFound, GDATA.forbidden) as e:
42679
- entityActionFailedWarning([Ent.DOMAIN, domain], str(e), i, count)
42680
- return []
42681
-
42682
- def _printSites(entity, i, count, domain, sites):
42683
- for site in sites:
42684
- fields = sitesManager.SiteToFields(site)
42685
- if fields[SITE_SITE] in sitesSet:
42686
- continue
42687
- sitesSet.add(fields[SITE_SITE])
42688
- domainSite = f'{domain}/{fields[SITE_SITE]}'
42689
- siteRow = {Ent.Singular(entityType): entity, SITE_SITE: domainSite}
42690
- for field, value in iter(fields.items()):
42691
- if field != SITE_SITE:
42692
- if not isinstance(value, list):
42693
- if field != SITE_SUMMARY or not convertCRNL:
42694
- siteRow[field] = value
42695
- else:
42696
- siteRow[field] = escapeCRsNLs(value)
42697
- else:
42698
- siteRow[field] = delimiter.join(value)
42699
- rowShown = False
42700
- if roles:
42701
- try:
42702
- acls = callGDataPages(sitesObject, 'GetAclFeed',
42703
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42704
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42705
- domain=domain, site=fields[SITE_SITE])
42706
- for acl in acls:
42707
- fields = sitesManager.AclEntryToFields(acl)
42708
- if fields['role'] in roles:
42709
- siteACLRow = siteRow.copy()
42710
- siteACLRow.update(ACLRuleDict(fields))
42711
- csvPF.WriteRowTitles(siteACLRow)
42712
- rowShown = True
42713
- except GDATA.notFound as e:
42714
- entityActionFailedWarning([Ent.SITE, domainSite], str(e), i, count)
42715
- except GDATA.forbidden:
42716
- pass
42717
- if not rowShown:
42718
- csvPF.WriteRowTitles(siteRow)
42719
-
42720
- def _showSites(entity, i, count, domain, sites):
42721
- jcount = len(sites)
42722
- if entityType == Ent.USER:
42723
- entityPerformActionNumItems([entityType, entity, Ent.DOMAIN, domain], jcount, Ent.SITE, i, count)
42724
- else:
42725
- entityPerformActionNumItems([entityType, entity], jcount, Ent.SITE, i, count)
42726
- Ind.Increment()
42727
- j = 0
42728
- for site in sites:
42729
- j += 1
42730
- _showSite(sitesManager, sitesObject, domain, site, roles, j, jcount)
42731
- Ind.Decrement()
42732
-
42733
- domains = []
42734
- domainLists = []
42735
- url_params = {}
42736
- includeAllSites = 'true' if entityType == Ent.DOMAIN else 'false'
42737
- roles = set()
42738
- convertCRNL = GC.Values[GC.CSV_OUTPUT_CONVERT_CR_NL]
42739
- delimiter = GC.Values[GC.CSV_OUTPUT_FIELD_DELIMITER]
42740
- csvPF = CSVPrintFile([Ent.Singular(entityType), SITE_SITE, SITE_NAME, SITE_SUMMARY], 'sortall') if Act.csvFormat() else None
42741
- while Cmd.ArgumentsRemaining():
42742
- myarg = getArgument()
42743
- if csvPF and myarg == 'todrive':
42744
- csvPF.GetTodriveParameters()
42745
- elif myarg in {'domain', 'domains'}:
42746
- if entityType == Ent.DOMAIN:
42747
- entityList = getEntityList(Cmd.OB_DOMAIN_NAME_ENTITY)
42748
- else:
42749
- domains = getEntityList(Cmd.OB_DOMAIN_NAME_ENTITY)
42750
- domainLists = domains if isinstance(domains, dict) else None
42751
- elif myarg == 'includeallsites':
42752
- includeAllSites = 'true'
42753
- elif myarg == 'maxresults':
42754
- url_params['max-results'] = getInteger(minVal=1)
42755
- elif myarg == 'startindex':
42756
- url_params['start-index'] = getInteger(minVal=1)
42757
- elif myarg == 'withmappings':
42758
- url_params['with-mappings'] = 'true'
42759
- elif myarg in {'role', 'roles'}:
42760
- roles = getACLRoles(SITE_ACL_ROLES_MAP)
42761
- elif myarg in {'convertcrnl', 'converttextnl', 'convertsummarynl'}:
42762
- convertCRNL = True
42763
- elif myarg == 'delimiter':
42764
- delimiter = getCharacter()
42765
- else:
42766
- unknownArgumentExit()
42767
- sitesManager = SitesManager()
42768
- sitesSet = set()
42769
- i, count, entityList = getEntityArgument(entityList)
42770
- if entityType == Ent.USER:
42771
- for user in entityList:
42772
- i += 1
42773
- if domainLists:
42774
- domainList = domainLists[user]
42775
- elif domains:
42776
- domainList = domains
42777
- else:
42778
- _, domain = splitEmailAddress(user)
42779
- domainList = [domain]
42780
- user, sitesObject = getSitesObject(entityType, user, i, count)
42781
- if not sitesObject:
42782
- continue
42783
- jcount = len(domainList)
42784
- j = 0
42785
- for domain in domainList:
42786
- j += 1
42787
- if domain != 'site':
42788
- url_params['include-all-sites'] = includeAllSites
42789
- else:
42790
- url_params.pop('include-all-sites', None)
42791
- printGettingAllEntityItemsForWhom(Ent.SITE, f'{Ent.Singular(Ent.USER)}: {user}, {Ent.Singular(Ent.DOMAIN)}: {domain}')
42792
- sites = _getSites(domain, i, count)
42793
- if not csvPF:
42794
- _showSites(domain, j, jcount, domain, sites)
42795
- else:
42796
- _printSites(user, j, jcount, domain, sites)
42797
- else:
42798
- for domain in entityList:
42799
- i += 1
42800
- domain, sitesObject = getSitesObject(entityType, domain, i, count)
42801
- if not sitesObject:
42802
- continue
42803
- if domain != 'site':
42804
- url_params['include-all-sites'] = includeAllSites
42805
- else:
42806
- url_params.pop('include-all-sites', None)
42807
- printGettingAllEntityItemsForWhom(Ent.SITE, f'{Ent.Singular(Ent.DOMAIN)}: {domain}')
42808
- sites = _getSites(domain, i, count)
42809
- if not csvPF:
42810
- _showSites(domain, i, count, domain, sites)
42811
- else:
42812
- _printSites(domain, i, count, domain, sites)
42813
- if csvPF:
42814
- csvPF.SortTitles()
42815
- csvPF.SetSortTitles([])
42816
- if roles:
42817
- csvPF.MoveTitlesToEnd(['Scope', 'Role'])
42818
- csvPF.writeCSVfile('Sites')
42819
-
42820
- # gam print sites [todrive <ToDriveAttribute>*] [domain|domains <DomainNameEntity>] [includeallsites]
42821
- # [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl] [delimiter <Character>]
42822
- # gam show sites [domain|domains <DomainNameEntity>] [includeallsites]
42823
- # [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl]
42824
- def doPrintShowDomainSites():
42825
- printShowSites([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42826
-
42827
42263
  # gam [<UserTypeEntity>] print sites [todrive <ToDriveAttribute>*] [domain|domains <DomainNameEntity>] [includeallsites]
42828
42264
  # [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl] [delimiter <Character>]
42829
42265
  # gam [<UserTypeEntity>] show sites [domain|domains <DomainNameEntity>] [includeallsites]
42830
42266
  # [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl]
42831
- def printShowUserSites(users):
42832
- printShowSites(users, Ent.USER)
42833
-
42834
- SITE_ACTION_TO_MODIFIER_MAP = {
42835
- Act.ADD: Act.MODIFIER_TO,
42836
- Act.UPDATE: Act.MODIFIER_IN,
42837
- Act.DELETE: Act.MODIFIER_FROM,
42838
- Act.INFO: Act.MODIFIER_FROM,
42839
- Act.PRINT: Act.MODIFIER_FROM,
42840
- Act.SHOW: Act.MODIFIER_FROM,
42841
- }
42842
-
42843
- def _processSiteACLs(users, entityType):
42844
- action = Act.Get()
42845
- siteEntity = getSiteEntity()
42846
- csvPF = None
42847
- if action in [Act.ADD, Act.UPDATE]:
42848
- role = getChoice(SITE_ACL_ROLES_MAP, mapChoice=True)
42849
- elif action == Act.PRINT:
42850
- csvPF = CSVPrintFile([Ent.Singular(entityType), SITE_SITE, 'Scope', 'Role'])
42851
- else:
42852
- role = None
42853
- actionPrintShow = action in [Act.PRINT, Act.SHOW]
42854
- ACLScopeEntity = getCalendarSiteACLScopeEntity() if not actionPrintShow else {}
42855
- getTodriveOnly(csvPF)
42856
- modifier = SITE_ACTION_TO_MODIFIER_MAP[action]
42857
- sitesManager = SitesManager()
42858
- i, count, users = getEntityArgument(users)
42859
- for user in users:
42860
- i += 1
42861
- origUser = user
42862
- user, sitesObject, sites, jcount = _validateUserGetSites(entityType, user, i, count, siteEntity, Ent.SITE_ACL, modifier)
42863
- if jcount == 0:
42864
- continue
42865
- Ind.Increment()
42866
- j = 0
42867
- for site in sites:
42868
- j += 1
42869
- domain, site, domainSite, ruleIds, kcount = _validateSiteGetRuleIds(origUser, site, j, jcount, ACLScopeEntity, showAction=not actionPrintShow)
42870
- if not domainSite:
42871
- continue
42872
- if not actionPrintShow:
42873
- Ind.Increment()
42874
- k = 0
42875
- for ruleId in ruleIds:
42876
- k += 1
42877
- ruleId = normalizeRuleId(ruleId)
42878
- try:
42879
- if action in [Act.CREATE, Act.ADD]:
42880
- acl = callGData(sitesObject, 'CreateAclEntry',
42881
- throwErrors=[GDATA.NOT_FOUND, GDATA.ENTITY_EXISTS, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42882
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42883
- aclentry=sitesManager.FieldsToAclEntry(makeRoleRuleIdBody(role, ruleId)), domain=domain, site=site)
42884
- fields = sitesManager.AclEntryToFields(acl)
42885
- if not fields.get('inviteLink'):
42886
- entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
42887
- else:
42888
- entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, f'{formatACLRule(fields)} (Link: {fields["inviteLink"]})'], k, kcount)
42889
- elif action == Act.UPDATE:
42890
- acl = callGData(sitesObject, 'GetAclEntry',
42891
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42892
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42893
- domain=domain, site=site, ruleId=ruleId)
42894
- acl.role.value = role
42895
- acl = callGData(sitesObject, 'UpdateAclEntry',
42896
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42897
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42898
- aclentry=acl, domain=domain, site=site, ruleId=ruleId, extra_headers={'If-Match': acl.etag})
42899
- fields = sitesManager.AclEntryToFields(acl)
42900
- entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
42901
- elif action == Act.DELETE:
42902
- acl = callGData(sitesObject, 'GetAclEntry',
42903
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42904
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42905
- domain=domain, site=site, ruleId=ruleId)
42906
- callGData(sitesObject, 'DeleteAclEntry',
42907
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42908
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42909
- domain=domain, site=site, ruleId=ruleId, extra_headers={'If-Match': acl.etag})
42910
- entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLScopeRole(ruleId, None)], k, kcount)
42911
- elif action == Act.INFO:
42912
- acl = callGData(sitesObject, 'GetAclEntry',
42913
- throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
42914
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42915
- domain=domain, site=site, ruleId=ruleId)
42916
- fields = sitesManager.AclEntryToFields(acl)
42917
- printEntity([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
42918
- except GDATA.notFound as e:
42919
- if not checkSiteExists(sitesObject, domain, site):
42920
- entityUnknownWarning(Ent.SITE, domainSite, j, jcount)
42921
- break
42922
- entityActionFailedWarning([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLScopeRole(ruleId, role)], str(e), k, kcount)
42923
- except (GDATA.entityExists, GDATA.badRequest, GDATA.forbidden) as e:
42924
- entityActionFailedWarning([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLScopeRole(ruleId, role)], str(e), k, kcount)
42925
- Ind.Decrement()
42926
- else:
42927
- try:
42928
- acls = callGDataPages(sitesObject, 'GetAclFeed',
42929
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
42930
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
42931
- domain=domain, site=site)
42932
- if not csvPF:
42933
- kcount = len(acls)
42934
- entityPerformActionNumItems([Ent.SITE, domainSite], kcount, Ent.SITE_ACL, j, jcount)
42935
- if kcount == 0:
42936
- continue
42937
- Ind.Increment()
42938
- k = 0
42939
- for acl in acls:
42940
- k += 1
42941
- fields = sitesManager.AclEntryToFields(acl)
42942
- printEntity([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
42943
- Ind.Decrement()
42944
- else:
42945
- siteRow = {Ent.Singular(entityType): user, SITE_SITE: domainSite}
42946
- for acl in acls:
42947
- fields = sitesManager.AclEntryToFields(acl)
42948
- siteACLRow = siteRow.copy()
42949
- siteACLRow.update(ACLRuleDict(fields))
42950
- csvPF.WriteRowTitles(siteACLRow)
42951
- except GDATA.notFound:
42952
- entityUnknownWarning(Ent.SITE, domainSite, j, jcount)
42953
- except GDATA.forbidden as e:
42954
- entityActionFailedWarning([Ent.SITE, domainSite], str(e), j, jcount)
42955
- Ind.Decrement()
42956
- if csvPF:
42957
- csvPF.writeCSVfile('Site ACLs')
42958
-
42959
42267
  # gam [<UserTypeEntity>] create siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
42960
42268
  # gam [<UserTypeEntity>] update siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
42961
42269
  # gam [<UserTypeEntity>] delete siteacls <SiteEntity> <SiteACLScopeEntity>
42962
42270
  # gam [<UserTypeEntity>] info siteacls <SiteEntity> <SiteACLScopeEntity>
42963
42271
  # gam [<UserTypeEntity>] show siteacls <SiteEntity>
42964
42272
  # gam [<UserTypeEntity>] print siteacls <SiteEntity> [todrive <ToDriveAttribute>*]
42965
- def processUserSiteACLs(users):
42966
- _processSiteACLs(users, Ent.USER)
42967
-
42968
- def doProcessDomainSiteACLs():
42969
- _processSiteACLs([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42970
-
42971
- def _printSiteActivity(users, entityType):
42972
- sitesManager = SitesManager()
42973
- url_params = {}
42974
- csvPF = CSVPrintFile([SITE_SITE, SITE_SUMMARY, SITE_UPDATED], 'sortall')
42975
- sites = getEntityList(Cmd.OB_SITE_ENTITY)
42976
- siteLists = sites if isinstance(sites, dict) else None
42977
- while Cmd.ArgumentsRemaining():
42978
- myarg = getArgument()
42979
- if myarg == 'todrive':
42980
- csvPF.GetTodriveParameters()
42981
- elif myarg == 'maxresults':
42982
- url_params['max-results'] = getInteger(minVal=1)
42983
- elif myarg == 'startindex':
42984
- url_params['start-index'] = getInteger(minVal=1)
42985
- elif myarg == 'updatedmin':
42986
- url_params['updated-min'] = getYYYYMMDD()
42987
- elif myarg == 'updatedmax':
42988
- url_params['updated-max'] = getYYYYMMDD()
42989
- else:
42990
- unknownArgumentExit()
42991
- i, count, users = getEntityArgument(users)
42992
- for user in users:
42993
- i += 1
42994
- if siteLists:
42995
- sites = siteLists[user]
42996
- user, sitesObject = getSitesObject(entityType, user, i, count)
42997
- if not sitesObject:
42998
- continue
42999
- jcount = len(sites)
43000
- if jcount == 0:
43001
- setSysExitRC(NO_ENTITIES_FOUND_RC)
43002
- continue
43003
- Ind.Increment()
43004
- j = 0
43005
- for site in sites:
43006
- j += 1
43007
- domain, site, domainSite = _validateSite(site, j, jcount)
43008
- if not domainSite:
43009
- continue
43010
- printGettingAllEntityItemsForWhom(Ent.ACTIVITY, domainSite)
43011
- try:
43012
- activities = callGDataPages(sitesObject, 'GetActivityFeed',
43013
- pageMessage=getPageMessageForWhom(),
43014
- throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
43015
- retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
43016
- domain=domain, site=site, url_params=url_params)
43017
- for activity in activities:
43018
- fields = sitesManager.ActivityEntryToFields(activity)
43019
- activityRow = {SITE_SITE: domainSite}
43020
- for key, value in iter(fields.items()):
43021
- if not isinstance(value, list):
43022
- activityRow[key] = value
43023
- else:
43024
- activityRow[key] = ','.join(value)
43025
- csvPF.WriteRowTitles(activityRow)
43026
- except GDATA.notFound:
43027
- entityUnknownWarning(Ent.SITE, domainSite, j, jcount)
43028
- except GDATA.forbidden as e:
43029
- entityActionFailedWarning([Ent.SITE, domainSite], str(e), j, jcount)
43030
- csvPF.writeCSVfile('Site Activities')
43031
-
43032
42273
  # gam [<UserTypeEntity>] print siteactivity <SiteEntity> [todrive <ToDriveAttribute>*]
43033
42274
  # [startindex <Number>] [maxresults <Number>] [updated_min <Date>] [updated_max <Date>]
43034
- def printUserSiteActivity(users):
43035
- _printSiteActivity(users, Ent.USER)
42275
+ def deprecatedUserSites(users):
42276
+ deprecatedCommandExit()
43036
42277
 
43037
- def doPrintDomainSiteActivity():
43038
- _printSiteActivity([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42278
+ def deprecatedDomainSites():
42279
+ deprecatedCommandExit()
43039
42280
 
43040
42281
  # <CSVFileInput> [keyfield <FieldName>] [datafield <FieldName>]
43041
42282
  def _getGroupOrgUnitMap():
@@ -75733,8 +74974,8 @@ MAIN_ADD_CREATE_FUNCTIONS = {
75733
74974
  Cmd.ARG_SAKEY: doCreateSvcAcctKeys,
75734
74975
  Cmd.ARG_SCHEMA: doCreateUpdateUserSchemas,
75735
74976
  Cmd.ARG_SHAREDDRIVE: doCreateSharedDrive,
75736
- Cmd.ARG_SITE: doCreateDomainSite,
75737
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
74977
+ Cmd.ARG_SITE: deprecatedDomainSites,
74978
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75738
74979
  Cmd.ARG_SVCACCT: doCreateSvcAcct,
75739
74980
  Cmd.ARG_USER: doCreateUser,
75740
74981
  Cmd.ARG_VAULTEXPORT: doCreateVaultExport,
@@ -75848,7 +75089,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75848
75089
  Cmd.ARG_SAKEY: doDeleteSvcAcctKeys,
75849
75090
  Cmd.ARG_SCHEMA: doDeleteUserSchemas,
75850
75091
  Cmd.ARG_SHAREDDRIVE: doDeleteSharedDrive,
75851
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75092
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75852
75093
  Cmd.ARG_SVCACCT: doDeleteSvcAcct,
75853
75094
  Cmd.ARG_USER: doDeleteUser,
75854
75095
  Cmd.ARG_USERS: doDeleteUsers,
@@ -75937,8 +75178,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75937
75178
  Cmd.ARG_RESOURCES: doInfoResourceCalendars,
75938
75179
  Cmd.ARG_SCHEMA: doInfoUserSchemas,
75939
75180
  Cmd.ARG_SHAREDDRIVE: doInfoSharedDrive,
75940
- Cmd.ARG_SITE: doInfoDomainSites,
75941
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75181
+ Cmd.ARG_SITE: deprecatedDomainSites,
75182
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75942
75183
  Cmd.ARG_USER: doInfoUser,
75943
75184
  Cmd.ARG_USERS: doInfoUsers,
75944
75185
  Cmd.ARG_USERINVITATION: doInfoCIUserInvitations,
@@ -76040,9 +75281,9 @@ MAIN_COMMANDS_WITH_OBJECTS = {
76040
75281
  Cmd.ARG_SCHEMA: doPrintShowUserSchemas,
76041
75282
  Cmd.ARG_SHAREDDRIVE: doPrintShowSharedDrives,
76042
75283
  Cmd.ARG_SHAREDDRIVEACLS: doPrintShowSharedDriveACLs,
76043
- Cmd.ARG_SITE: doPrintShowDomainSites,
76044
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
76045
- Cmd.ARG_SITEACTIVITY: doPrintDomainSiteActivity,
75284
+ Cmd.ARG_SITE: deprecatedDomainSites,
75285
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75286
+ Cmd.ARG_SITEACTIVITY: deprecatedDomainSites,
76046
75287
  Cmd.ARG_SVCACCT: doPrintShowSvcAccts,
76047
75288
  Cmd.ARG_TOKEN: doPrintShowTokens,
76048
75289
  Cmd.ARG_TRANSFERAPPS: doShowTransferApps,
@@ -76158,8 +75399,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
76158
75399
  Cmd.ARG_SHAREDDRIVEACLS: doPrintShowSharedDriveACLs,
76159
75400
  Cmd.ARG_SHAREDDRIVEINFO: doInfoSharedDrive,
76160
75401
  Cmd.ARG_SHAREDDRIVETHEMES: doShowSharedDriveThemes,
76161
- Cmd.ARG_SITE: doPrintShowDomainSites,
76162
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75402
+ Cmd.ARG_SITE: deprecatedDomainSites,
75403
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
76163
75404
  Cmd.ARG_SVCACCT: doPrintShowSvcAccts,
76164
75405
  Cmd.ARG_TOKEN: doPrintShowTokens,
76165
75406
  Cmd.ARG_TRANSFERAPPS: doShowTransferApps,
@@ -76224,8 +75465,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
76224
75465
  Cmd.ARG_SAKEY: doUpdateSvcAcctKeys,
76225
75466
  Cmd.ARG_SCHEMA: doCreateUpdateUserSchemas,
76226
75467
  Cmd.ARG_SHAREDDRIVE: doUpdateSharedDrive,
76227
- Cmd.ARG_SITE: doUpdateDomainSites,
76228
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75468
+ Cmd.ARG_SITE: deprecatedDomainSites,
75469
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
76229
75470
  Cmd.ARG_SVCACCT: doCheckUpdateSvcAcct,
76230
75471
  Cmd.ARG_USER: doUpdateUser,
76231
75472
  Cmd.ARG_USERS: doUpdateUsers,
@@ -76764,8 +76005,8 @@ USER_ADD_CREATE_FUNCTIONS = {
76764
76005
  Cmd.ARG_SENDAS: createUpdateSendAs,
76765
76006
  Cmd.ARG_SHAREDDRIVE: createSharedDrive,
76766
76007
  Cmd.ARG_SHEET: createSheet,
76767
- Cmd.ARG_SITE: createUserSite,
76768
- Cmd.ARG_SITEACL: processUserSiteACLs,
76008
+ Cmd.ARG_SITE: deprecatedUserSites,
76009
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76769
76010
  Cmd.ARG_SMIME: createSmime,
76770
76011
  Cmd.ARG_TASK: processTasks,
76771
76012
  Cmd.ARG_TASKLIST: processTasklists,
@@ -76883,7 +76124,7 @@ USER_COMMANDS_WITH_OBJECTS = {
76883
76124
  Cmd.ARG_SENDAS: deleteInfoSendAs,
76884
76125
  Cmd.ARG_SMIME: deleteSmime,
76885
76126
  Cmd.ARG_SHAREDDRIVE: deleteSharedDrive,
76886
- Cmd.ARG_SITEACL: processUserSiteACLs,
76127
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76887
76128
  Cmd.ARG_TASK: processTasks,
76888
76129
  Cmd.ARG_TASKLIST: processTasklists,
76889
76130
  Cmd.ARG_THREAD: processThreads,
@@ -76972,8 +76213,8 @@ USER_COMMANDS_WITH_OBJECTS = {
76972
76213
  Cmd.ARG_SENDAS: deleteInfoSendAs,
76973
76214
  Cmd.ARG_SHAREDDRIVE: infoSharedDrive,
76974
76215
  Cmd.ARG_SHEET: infoPrintShowSheets,
76975
- Cmd.ARG_SITE: infoUserSites,
76976
- Cmd.ARG_SITEACL: processUserSiteACLs,
76216
+ Cmd.ARG_SITE: deprecatedUserSites,
76217
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76977
76218
  Cmd.ARG_TASK: processTasks,
76978
76219
  Cmd.ARG_TASKLIST: processTasklists,
76979
76220
  Cmd.ARG_USER: infoUsers,
@@ -77085,9 +76326,9 @@ USER_COMMANDS_WITH_OBJECTS = {
77085
76326
  Cmd.ARG_SHEETRANGE: printShowSheetRanges,
77086
76327
  Cmd.ARG_SIGNATURE: printShowSignature,
77087
76328
  Cmd.ARG_SMIME: printShowSmimes,
77088
- Cmd.ARG_SITE: printShowUserSites,
77089
- Cmd.ARG_SITEACL: processUserSiteACLs,
77090
- Cmd.ARG_SITEACTIVITY: printUserSiteActivity,
76329
+ Cmd.ARG_SITE: deprecatedUserSites,
76330
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76331
+ Cmd.ARG_SITEACTIVITY: deprecatedUserSites,
77091
76332
  Cmd.ARG_TASK: printShowTasks,
77092
76333
  Cmd.ARG_TASKLIST: printShowTasklists,
77093
76334
  Cmd.ARG_THREAD: printShowThreads,
@@ -77191,8 +76432,8 @@ USER_COMMANDS_WITH_OBJECTS = {
77191
76432
  Cmd.ARG_SHEET: infoPrintShowSheets,
77192
76433
  Cmd.ARG_SHEETRANGE: printShowSheetRanges,
77193
76434
  Cmd.ARG_SIGNATURE: printShowSignature,
77194
- Cmd.ARG_SITE: printShowUserSites,
77195
- Cmd.ARG_SITEACL: processUserSiteACLs,
76435
+ Cmd.ARG_SITE: deprecatedUserSites,
76436
+ Cmd.ARG_SITEACL: deprecatedUserSites,
77196
76437
  Cmd.ARG_SMIME: printShowSmimes,
77197
76438
  Cmd.ARG_TASK: printShowTasks,
77198
76439
  Cmd.ARG_TASKLIST: printShowTasklists,
@@ -77295,8 +76536,8 @@ USER_COMMANDS_WITH_OBJECTS = {
77295
76536
  Cmd.ARG_SHEET: updateSheets,
77296
76537
  Cmd.ARG_SHEETRANGE: updateSheetRanges,
77297
76538
  Cmd.ARG_SMIME: updateSmime,
77298
- Cmd.ARG_SITE: updateUserSites,
77299
- Cmd.ARG_SITEACL: processUserSiteACLs,
76539
+ Cmd.ARG_SITE: deprecatedUserSites,
76540
+ Cmd.ARG_SITEACL: deprecatedUserSites,
77300
76541
  Cmd.ARG_TASK: processTasks,
77301
76542
  Cmd.ARG_TASKLIST: processTasklists,
77302
76543
  Cmd.ARG_USER: updateUsers,
gam/gamlib/glapi.py CHANGED
@@ -89,7 +89,6 @@ SERVICEMANAGEMENT = 'servicemanagement'
89
89
  SERVICEUSAGE = 'serviceusage'
90
90
  SHEETS = 'sheets'
91
91
  SHEETSTD = 'sheetstd'
92
- SITES = 'sites'
93
92
  SITEVERIFICATION = 'siteVerification'
94
93
  STORAGE = 'storage'
95
94
  STORAGEREAD = 'storageread'
@@ -266,7 +265,6 @@ _INFO = {
266
265
  SERVICEUSAGE: {'name': 'Service Usage API', 'version': 'v1', 'v2discovery': True},
267
266
  SHEETS: {'name': 'Sheets API', 'version': 'v4', 'v2discovery': True},
268
267
  SHEETSTD: {'name': 'Sheets API - todrive', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
269
- SITES: {'name': 'Sites API', 'version': 'v1', 'v2discovery': False},
270
268
  SITEVERIFICATION: {'name': 'Site Verification API', 'version': 'v1', 'v2discovery': True},
271
269
  STORAGE: {'name': 'Cloud Storage API', 'version': 'v1', 'v2discovery': True},
272
270
  STORAGEREAD: {'name': 'Cloud Storage API - Read', 'version': 'v1', 'v2discovery': True, 'mappedAPI': STORAGE},
@@ -500,11 +498,6 @@ _CLIENT_SCOPES = [
500
498
  'subscopes': [],
501
499
  'offByDefault': True,
502
500
  'scope': 'https://www.googleapis.com/auth/siteverification'},
503
- {'name': 'Sites API',
504
- 'api': SITES,
505
- 'subscopes': [],
506
- 'offByDefault': True,
507
- 'scope': 'https://sites.google.com/feeds'},
508
501
  {'name': 'Vault API',
509
502
  'api': VAULT,
510
503
  'subscopes': READONLY,
@@ -694,10 +687,6 @@ _SVCACCT_SCOPES = [
694
687
  'api': SHEETS,
695
688
  'subscopes': READONLY,
696
689
  'scope': 'https://www.googleapis.com/auth/spreadsheets'},
697
- {'name': 'Sites API',
698
- 'api': SITES,
699
- 'subscopes': [],
700
- 'scope': 'https://sites.google.com/feeds'},
701
690
  {'name': 'Tasks API',
702
691
  'api': TASKS,
703
692
  'subscopes': READONLY,
gam/gamlib/glclargs.py CHANGED
@@ -1150,6 +1150,10 @@ class GamCLArgs():
1150
1150
  return f'Command: {self.QuotedArgumentList(self.argv[:self.argvI])} >>>{self.QuotedArgumentList([self.argv[self.argvI]])}<<< {self.QuotedArgumentList(self.argv[self.argvI+1:])}\n'
1151
1151
  return f'Command: {self.QuotedArgumentList(self.argv)} >>><<<\n'
1152
1152
 
1153
+ # Deprecated command
1154
+ def CommandDeprecated(self):
1155
+ return f'{self.QuotedArgumentList(self.argv)}\n'
1156
+
1153
1157
  # Peek to see if next argument is in choices
1154
1158
  def PeekArgumentPresent(self, choices):
1155
1159
  if self.ArgumentsRemaining():
gam/gamlib/glentity.py CHANGED
@@ -342,8 +342,6 @@ class GamEntity():
342
342
  SHEET = 'shet'
343
343
  SHEET_ID = 'shti'
344
344
  SIGNATURE = 'sign'
345
- SITE = 'site'
346
- SITE_ACL = 'sacl'
347
345
  SIZE = 'size'
348
346
  SKU = 'sku '
349
347
  SMIME_ID = 'smid'
@@ -695,8 +693,6 @@ class GamEntity():
695
693
  SHEET: ['Sheets', 'Sheet'],
696
694
  SHEET_ID: ['Sheet IDs', 'Sheet ID'],
697
695
  SIGNATURE: ['Signatures', 'Signature'],
698
- SITE: ['Sites', 'Site'],
699
- SITE_ACL: ['Site ACLs', 'Site ACL'],
700
696
  SIZE: ['Sizes', 'Size'],
701
697
  SKU: ['SKUs', 'SKU'],
702
698
  SMIME_ID: ['S/MIME Certificate IDs', 'S/MIME Certificate ID'],
gam/gamlib/glmsgs.py CHANGED
@@ -481,6 +481,7 @@ SERVICE_NOT_APPLICABLE = 'Service not applicable/Does not exist'
481
481
  SERVICE_NOT_APPLICABLE_THIS_ADDRESS = 'Service not applicable for this address: {0}'
482
482
  SERVICE_NOT_ENABLED = '{0} Service/App not enabled'
483
483
  SHORTCUT_TARGET_CAPABILITY_IS_FALSE = '{0} capability {1} is False'
484
+ SITES_COMMAND_DEPRECATED = 'The Classic Sites API is deprecated, this command will not work:\n{0}'
484
485
  SKU_HAS_NO_MATCHING_ARCHIVED_USER_SKU = 'SKU {0} has no matching Archived User SKU'
485
486
  STARTING_THREAD = 'Starting thread'
486
487
  STATISTICS_COPY_FILE = 'Total: {0}, Copied: {1}, Shortcut created {2}, Shortcut exists {3}, Duplicate: {4}, Copy Failed: {5}, Not copyable: {6}, In skipids: {7}, Permissions Failed: {8}, Protected Ranges Failed: {9}'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.3.9
3
+ Version: 7.4.1
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=XPvY7SEYLr2Eehx9ZaOv0gG_W8Zeq394eAzGA6Qs70M,3500602
1
+ gam/__init__.py,sha256=TVtDzftfoUVfeees4B_zmjxR3QmMDByRTKrN_qzBdN4,3471510
2
2
  gam/__main__.py,sha256=amz0-959ph6zkZKqjaar4n60yho-T37w6qWI36qx0CA,1049
3
3
  gam/cacerts.pem,sha256=nJuWha0xm5dHw_5ptGphwRoO-r36Ccpqiww9pCEDbSc,67484
4
4
  gam/cbcm-v1.1beta1.json,sha256=xO5XloCQQULmPbFBx5bckdqmbLFQ7sJ2TImhE1ysDIY,19439
@@ -22,15 +22,15 @@ gam/atom/token_store.py,sha256=7E6Ecvxa86WCvl1pJAhv78jg9OxQv8pMtIUcPhZCq04,3803
22
22
  gam/atom/url.py,sha256=pxO1TlORxyKQTQ1bkBE1unFzjnv9c8LjJkm-UEORShY,4276
23
23
  gam/gamlib/__init__.py,sha256=z5mF-y0j8pm-YNFBaiuxB4M_GAUPG-cXWwrhYwrVReM,679
24
24
  gam/gamlib/glaction.py,sha256=1Il_HrChVnPkzZwiZs5au4mFQVtq4K1Z42uIuR6qdnI,9419
25
- gam/gamlib/glapi.py,sha256=t8E0oM1negh5PydXDyzKoer-vjuCLGHcw7bh4NBs_dY,34499
25
+ gam/gamlib/glapi.py,sha256=AkZRK0ebSBn7iJApTZl2crRWY3-D0vNmwTI36ZEo34s,34171
26
26
  gam/gamlib/glcfg.py,sha256=3ix3GFXP8riaD4z4ubt4qUCxznhmLU-bZHCw8TxLiz8,27484
27
- gam/gamlib/glclargs.py,sha256=nB366gRthM0fHQpWbWWuWRBCnKvlcfB5cejFZfx0Xdc,42094
28
- gam/gamlib/glentity.py,sha256=4DGlmRxugViY1K3zObva8ByL3yA9sccXxjAVQz-xIjg,33907
27
+ gam/gamlib/glclargs.py,sha256=ptSTGELZHQS6SfvGGJ3NrXRoHAToO108NTYsFQE-C4c,42200
28
+ gam/gamlib/glentity.py,sha256=ZLbyMl9NhN-MBf9Rxmho2dBYeS4SNLMctpeaKFZSbQ4,33801
29
29
  gam/gamlib/glgapi.py,sha256=W1nFH0sY7P8pnb98_4uzMSCs8gre0rvG5pBRI6HJq0c,38274
30
30
  gam/gamlib/glgdata.py,sha256=weRppttWm6uRyqtBoGPKoHiNZ2h28nhfUV4J_mbCszY,2707
31
31
  gam/gamlib/glglobals.py,sha256=B0kCz4K6PO1-n3eZI_lvdRG99Ane1-dH4zS4J4aymlI,9566
32
32
  gam/gamlib/glindent.py,sha256=RfBa2LDfLIqPLL5vMfC689TCVmqn8xf-qulSzkiatrc,1228
33
- gam/gamlib/glmsgs.py,sha256=Evdd4lEXGFPaf7m0IOt_MJbQZ40Gauma5NlOyGO4M1I,33103
33
+ gam/gamlib/glmsgs.py,sha256=HzISx_btqbwOKjMm2rokV4-Y1BMDS04-bwu6fa92XCo,33202
34
34
  gam/gamlib/glskus.py,sha256=S-OasG1SteZSV0cG8JM74L3wFp9sozoZd39fTXajQWc,14159
35
35
  gam/gamlib/gluprop.py,sha256=IyPLCyvn7-NHTUenM71YPQPXRZXx6CB5q-GtJ-FYd1c,11461
36
36
  gam/gamlib/glverlibs.py,sha256=XXYhmjOVti78JTy7NNr4ShIwiOX7LrfrmFSlqSWixrE,1077
@@ -66,8 +66,8 @@ gam/googleapiclient/discovery_cache/base.py,sha256=yCDPtxnbNN-p5_9fzBacC6P3wcUPl
66
66
  gam/googleapiclient/discovery_cache/file_cache.py,sha256=sim3Mg4HgRYo3vX75jvcKy_aV568EvIrtBfvfbw-044,4774
67
67
  gam/iso8601/__init__.py,sha256=Z2PsYbXgAH5a5xzUvgczCboPzqWpm65kRcIngCnhViU,1218
68
68
  gam/iso8601/iso8601.py,sha256=Li2FHZ4sBTWuthuQhyCvmvj0j6At8JbGzkSv2fc2RHU,4384
69
- gam7-7.3.9.dist-info/METADATA,sha256=JWBdFrsHj2n57HCMqC8M5E8pt081CRd_8k-djkiDZZg,2888
70
- gam7-7.3.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
71
- gam7-7.3.9.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
72
- gam7-7.3.9.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
73
- gam7-7.3.9.dist-info/RECORD,,
69
+ gam7-7.4.1.dist-info/METADATA,sha256=CtD82jtdLbj0wYtnKS0VoRQ0xCwE4rO-_PDDKjONh9g,2888
70
+ gam7-7.4.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
71
+ gam7-7.4.1.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
72
+ gam7-7.4.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
73
+ gam7-7.4.1.dist-info/RECORD,,
File without changes