gam7 7.17.3__tar.gz → 7.18.1__tar.gz

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.

Files changed (320) hide show
  1. {gam7-7.17.3 → gam7-7.18.1}/PKG-INFO +1 -1
  2. {gam7-7.17.3 → gam7-7.18.1}/src/GamCommands.txt +16 -2
  3. {gam7-7.17.3 → gam7-7.18.1}/src/GamUpdate.txt +28 -2
  4. {gam7-7.17.3 → gam7-7.18.1}/src/gam/__init__.py +149 -23
  5. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glapi.py +9 -0
  6. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glclargs.py +2 -0
  7. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glentity.py +2 -0
  8. {gam7-7.17.3 → gam7-7.18.1}/wiki/Administrators.md +62 -7
  9. gam7-7.18.1/wiki/Business-Account-Management.md +36 -0
  10. gam7-7.17.3/wiki/Chat-Bot.md → gam7-7.18.1/wiki/Chat-Bot-Setup-Use.md +1 -1
  11. {gam7-7.17.3 → gam7-7.18.1}/wiki/Classroom-Membership.md +1 -0
  12. {gam7-7.17.3 → gam7-7.18.1}/wiki/GamUpdates.md +14 -0
  13. {gam7-7.17.3 → gam7-7.18.1}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  14. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Web-Resources-and-Sites.md +4 -4
  15. {gam7-7.17.3 → gam7-7.18.1}/wiki/Version-and-Help.md +6 -6
  16. {gam7-7.17.3 → gam7-7.18.1}/wiki/_Sidebar.md +2 -1
  17. {gam7-7.17.3 → gam7-7.18.1}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  18. {gam7-7.17.3 → gam7-7.18.1}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  19. {gam7-7.17.3 → gam7-7.18.1}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  20. {gam7-7.17.3 → gam7-7.18.1}/.github/ISSUE_TEMPLATE.txt +0 -0
  21. {gam7-7.17.3 → gam7-7.18.1}/.github/actions/decrypt.sh +0 -0
  22. {gam7-7.17.3 → gam7-7.18.1}/.github/actions/entitlements.plist +0 -0
  23. {gam7-7.17.3 → gam7-7.18.1}/.github/actions/package_exclusions.txt +0 -0
  24. {gam7-7.17.3 → gam7-7.18.1}/.github/stale.yml +0 -0
  25. {gam7-7.17.3 → gam7-7.18.1}/.github/workflows/build.yml +0 -0
  26. {gam7-7.17.3 → gam7-7.18.1}/.github/workflows/codeql-analysis.yml +0 -0
  27. {gam7-7.17.3 → gam7-7.18.1}/.github/workflows/get-cacerts.yml +0 -0
  28. {gam7-7.17.3 → gam7-7.18.1}/.github/workflows/pushwiki.yml +0 -0
  29. {gam7-7.17.3 → gam7-7.18.1}/.github/workflows/pypi.yml +0 -0
  30. {gam7-7.17.3 → gam7-7.18.1}/.pre-commit-config.yaml +0 -0
  31. {gam7-7.17.3 → gam7-7.18.1}/LICENSE +0 -0
  32. {gam7-7.17.3 → gam7-7.18.1}/README.md +0 -0
  33. {gam7-7.17.3 → gam7-7.18.1}/pyproject.toml +0 -0
  34. {gam7-7.17.3 → gam7-7.18.1}/src/.gitignore +0 -0
  35. {gam7-7.17.3 → gam7-7.18.1}/src/LICENSE +0 -0
  36. {gam7-7.17.3 → gam7-7.18.1}/src/README.md +0 -0
  37. {gam7-7.17.3 → gam7-7.18.1}/src/cacerts.pem +0 -0
  38. {gam7-7.17.3 → gam7-7.18.1}/src/callgam.py +0 -0
  39. {gam7-7.17.3 → gam7-7.18.1}/src/gam/__main__.py +0 -0
  40. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/__init__.py +0 -0
  41. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/auth.py +0 -0
  42. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/client.py +0 -0
  43. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/core.py +0 -0
  44. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/data.py +0 -0
  45. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/http.py +0 -0
  46. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/http_core.py +0 -0
  47. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/http_interface.py +0 -0
  48. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/mock_http.py +0 -0
  49. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/mock_http_core.py +0 -0
  50. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/mock_service.py +0 -0
  51. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/service.py +0 -0
  52. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/token_store.py +0 -0
  53. {gam7-7.17.3 → gam7-7.18.1}/src/gam/atom/url.py +0 -0
  54. {gam7-7.17.3 → gam7-7.18.1}/src/gam/cacerts.pem +0 -0
  55. {gam7-7.17.3 → gam7-7.18.1}/src/gam/cbcm-v1.1beta1.json +0 -0
  56. {gam7-7.17.3 → gam7-7.18.1}/src/gam/contactdelegation-v1.json +0 -0
  57. {gam7-7.17.3 → gam7-7.18.1}/src/gam/datastudio-v1.json +0 -0
  58. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/__init__.py +0 -0
  59. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glaction.py +0 -0
  60. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glcfg.py +0 -0
  61. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glgapi.py +0 -0
  62. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glgdata.py +0 -0
  63. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glglobals.py +0 -0
  64. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glindent.py +0 -0
  65. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glmsgs.py +0 -0
  66. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glskus.py +0 -0
  67. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/gluprop.py +0 -0
  68. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/glverlibs.py +0 -0
  69. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gamlib/yubikey.py +0 -0
  70. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/__init__.py +0 -0
  71. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/alt/__init__.py +0 -0
  72. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/alt/app_engine.py +0 -0
  73. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/alt/appengine.py +0 -0
  74. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/apps/__init__.py +0 -0
  75. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/apps/audit/__init__.py +0 -0
  76. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/apps/audit/service.py +0 -0
  77. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  78. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/apps/contacts/service.py +0 -0
  79. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/apps/service.py +0 -0
  80. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/service.py +0 -0
  81. {gam7-7.17.3 → gam7-7.18.1}/src/gam/gdata/urlfetch.py +0 -0
  82. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/__init__.py +0 -0
  83. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/_auth.py +0 -0
  84. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/_helpers.py +0 -0
  85. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/channel.py +0 -0
  86. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/discovery.py +0 -0
  87. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  88. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  89. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  90. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  91. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/errors.py +0 -0
  92. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/http.py +0 -0
  93. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/mimeparse.py +0 -0
  94. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/model.py +0 -0
  95. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/schema.py +0 -0
  96. {gam7-7.17.3 → gam7-7.18.1}/src/gam/googleapiclient/version.py +0 -0
  97. {gam7-7.17.3 → gam7-7.18.1}/src/gam/iso8601/__init__.py +0 -0
  98. {gam7-7.17.3 → gam7-7.18.1}/src/gam/iso8601/iso8601.py +0 -0
  99. {gam7-7.17.3 → gam7-7.18.1}/src/gam/meet-v2beta.json +0 -0
  100. {gam7-7.17.3 → gam7-7.18.1}/src/gam/serviceaccountlookup-v1.json +0 -0
  101. {gam7-7.17.3 → gam7-7.18.1}/src/gam/six.py +0 -0
  102. {gam7-7.17.3 → gam7-7.18.1}/src/gam-install.sh +0 -0
  103. {gam7-7.17.3 → gam7-7.18.1}/src/gam-setup.bat +0 -0
  104. {gam7-7.17.3 → gam7-7.18.1}/src/gam.exe.manifest +0 -0
  105. {gam7-7.17.3 → gam7-7.18.1}/src/gam.py +0 -0
  106. {gam7-7.17.3 → gam7-7.18.1}/src/gam.spec +0 -0
  107. {gam7-7.17.3 → gam7-7.18.1}/src/gam.wxs +0 -0
  108. {gam7-7.17.3 → gam7-7.18.1}/src/license.rtf +0 -0
  109. {gam7-7.17.3 → gam7-7.18.1}/src/requirements-dev.txt +0 -0
  110. {gam7-7.17.3 → gam7-7.18.1}/src/tools/a_atleast_b.py +0 -0
  111. {gam7-7.17.3 → gam7-7.18.1}/src/tools/gen-wix-xml-filelist.py +0 -0
  112. {gam7-7.17.3 → gam7-7.18.1}/src/tools/mkGamRef.py +0 -0
  113. {gam7-7.17.3 → gam7-7.18.1}/src/tools/openssl.props +0 -0
  114. {gam7-7.17.3 → gam7-7.18.1}/src/version_info.txt.in +0 -0
  115. {gam7-7.17.3 → gam7-7.18.1}/wiki/00scratch.md +0 -0
  116. {gam7-7.17.3 → gam7-7.18.1}/wiki/Addresses.md +0 -0
  117. {gam7-7.17.3 → gam7-7.18.1}/wiki/Alert-Center.md +0 -0
  118. {gam7-7.17.3 → gam7-7.18.1}/wiki/Aliases.md +0 -0
  119. {gam7-7.17.3 → gam7-7.18.1}/wiki/Authorization.md +0 -0
  120. {gam7-7.17.3 → gam7-7.18.1}/wiki/BNF-Syntax.md +0 -0
  121. {gam7-7.17.3 → gam7-7.18.1}/wiki/Basic-Items.md +0 -0
  122. {gam7-7.17.3 → gam7-7.18.1}/wiki/Bulk-Processing.md +0 -0
  123. {gam7-7.17.3 → gam7-7.18.1}/wiki/CSV-Input-Filtering.md +0 -0
  124. {gam7-7.17.3 → gam7-7.18.1}/wiki/CSV-Output-Filtering.md +0 -0
  125. {gam7-7.17.3 → gam7-7.18.1}/wiki/CSV-Special-Characters.md +0 -0
  126. {gam7-7.17.3 → gam7-7.18.1}/wiki/Calendars-Access.md +0 -0
  127. {gam7-7.17.3 → gam7-7.18.1}/wiki/Calendars-Events.md +0 -0
  128. {gam7-7.17.3 → gam7-7.18.1}/wiki/Calendars.md +0 -0
  129. {gam7-7.17.3 → gam7-7.18.1}/wiki/Chrome-AUE-Counts.md +0 -0
  130. {gam7-7.17.3 → gam7-7.18.1}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  131. {gam7-7.17.3 → gam7-7.18.1}/wiki/Chrome-Installed-Apps.md +0 -0
  132. {gam7-7.17.3 → gam7-7.18.1}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  133. {gam7-7.17.3 → gam7-7.18.1}/wiki/Chrome-Policies.md +0 -0
  134. {gam7-7.17.3 → gam7-7.18.1}/wiki/Chrome-Printers.md +0 -0
  135. {gam7-7.17.3 → gam7-7.18.1}/wiki/Chrome-Profile-Management.md +0 -0
  136. {gam7-7.17.3 → gam7-7.18.1}/wiki/Chrome-Version-Counts.md +0 -0
  137. {gam7-7.17.3 → gam7-7.18.1}/wiki/Chrome-Version-History.md +0 -0
  138. {gam7-7.17.3 → gam7-7.18.1}/wiki/ChromeOS-Devices.md +0 -0
  139. {gam7-7.17.3 → gam7-7.18.1}/wiki/Classroom-Courses.md +0 -0
  140. {gam7-7.17.3 → gam7-7.18.1}/wiki/Classroom-Guardians.md +0 -0
  141. {gam7-7.17.3 → gam7-7.18.1}/wiki/Classroom-Invitations.md +0 -0
  142. {gam7-7.17.3 → gam7-7.18.1}/wiki/Cloud-Channel.md +0 -0
  143. {gam7-7.17.3 → gam7-7.18.1}/wiki/Cloud-Identity-Devices.md +0 -0
  144. {gam7-7.17.3 → gam7-7.18.1}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  145. {gam7-7.17.3 → gam7-7.18.1}/wiki/Cloud-Identity-Groups.md +0 -0
  146. {gam7-7.17.3 → gam7-7.18.1}/wiki/Cloud-Identity-Policies.md +0 -0
  147. {gam7-7.17.3 → gam7-7.18.1}/wiki/Cloud-Storage.md +0 -0
  148. {gam7-7.17.3 → gam7-7.18.1}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  149. {gam7-7.17.3 → gam7-7.18.1}/wiki/Collections-of-Items.md +0 -0
  150. {gam7-7.17.3 → gam7-7.18.1}/wiki/Collections-of-Users.md +0 -0
  151. {gam7-7.17.3 → gam7-7.18.1}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  152. {gam7-7.17.3 → gam7-7.18.1}/wiki/Command-Line-Parsing.md +0 -0
  153. {gam7-7.17.3 → gam7-7.18.1}/wiki/Command-Logging-Progress.md +0 -0
  154. {gam7-7.17.3 → gam7-7.18.1}/wiki/Context-Aware-Access-Levels.md +0 -0
  155. {gam7-7.17.3 → gam7-7.18.1}/wiki/Customer.md +0 -0
  156. {gam7-7.17.3 → gam7-7.18.1}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  157. {gam7-7.17.3 → gam7-7.18.1}/wiki/Domain-SharedContacts.md +0 -0
  158. {gam7-7.17.3 → gam7-7.18.1}/wiki/Domains-Verification.md +0 -0
  159. {gam7-7.17.3 → gam7-7.18.1}/wiki/Domains.md +0 -0
  160. {gam7-7.17.3 → gam7-7.18.1}/wiki/Downloads-Installs.md +0 -0
  161. {gam7-7.17.3 → gam7-7.18.1}/wiki/Drive-File-Selection.md +0 -0
  162. {gam7-7.17.3 → gam7-7.18.1}/wiki/Drive-Items.md +0 -0
  163. {gam7-7.17.3 → gam7-7.18.1}/wiki/Drive-REST-API-v3.md +0 -0
  164. {gam7-7.17.3 → gam7-7.18.1}/wiki/Email-Audit-Monitor.md +0 -0
  165. {gam7-7.17.3 → gam7-7.18.1}/wiki/Find-File-Owner.md +0 -0
  166. {gam7-7.17.3 → gam7-7.18.1}/wiki/GAM-Public-Chat-Room.md +0 -0
  167. {gam7-7.17.3 → gam7-7.18.1}/wiki/GAM-Return-Codes.md +0 -0
  168. {gam7-7.17.3 → gam7-7.18.1}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  169. {gam7-7.17.3 → gam7-7.18.1}/wiki/GAM7-on-Android-Devices.md +0 -0
  170. {gam7-7.17.3 → gam7-7.18.1}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  171. {gam7-7.17.3 → gam7-7.18.1}/wiki/Global-Address-List.md +0 -0
  172. {gam7-7.17.3 → gam7-7.18.1}/wiki/Google-Data-Transfers.md +0 -0
  173. {gam7-7.17.3 → gam7-7.18.1}/wiki/Google-Network-Addresses.md +0 -0
  174. {gam7-7.17.3 → gam7-7.18.1}/wiki/Groups-Membership.md +0 -0
  175. {gam7-7.17.3 → gam7-7.18.1}/wiki/Groups.md +0 -0
  176. {gam7-7.17.3 → gam7-7.18.1}/wiki/HTTPS-Proxy.md +0 -0
  177. {gam7-7.17.3 → gam7-7.18.1}/wiki/Home.md +0 -0
  178. {gam7-7.17.3 → gam7-7.18.1}/wiki/How-to-Install-GAM7.md +0 -0
  179. {gam7-7.17.3 → gam7-7.18.1}/wiki/How-to-Uninstall-GAM7.md +0 -0
  180. {gam7-7.17.3 → gam7-7.18.1}/wiki/How-to-Update-GAM7.md +0 -0
  181. {gam7-7.17.3 → gam7-7.18.1}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  182. {gam7-7.17.3 → gam7-7.18.1}/wiki/Inbound-SSO.md +0 -0
  183. {gam7-7.17.3 → gam7-7.18.1}/wiki/Install-GAM-as-Python-Library.md +0 -0
  184. {gam7-7.17.3 → gam7-7.18.1}/wiki/Licenses.md +0 -0
  185. {gam7-7.17.3 → gam7-7.18.1}/wiki/List-Items.md +0 -0
  186. {gam7-7.17.3 → gam7-7.18.1}/wiki/List.md +0 -0
  187. {gam7-7.17.3 → gam7-7.18.1}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  188. {gam7-7.17.3 → gam7-7.18.1}/wiki/Mobile-Devices.md +0 -0
  189. {gam7-7.17.3 → gam7-7.18.1}/wiki/Organizational-Units.md +0 -0
  190. {gam7-7.17.3 → gam7-7.18.1}/wiki/Other-Resources.md +0 -0
  191. {gam7-7.17.3 → gam7-7.18.1}/wiki/Permission-Matches.md +0 -0
  192. {gam7-7.17.3 → gam7-7.18.1}/wiki/Python-Regular-Expressions.md +0 -0
  193. {gam7-7.17.3 → gam7-7.18.1}/wiki/README.md +0 -0
  194. {gam7-7.17.3 → gam7-7.18.1}/wiki/Rclone.md +0 -0
  195. {gam7-7.17.3 → gam7-7.18.1}/wiki/Reports.md +0 -0
  196. {gam7-7.17.3 → gam7-7.18.1}/wiki/Reseller.md +0 -0
  197. {gam7-7.17.3 → gam7-7.18.1}/wiki/Resources.md +0 -0
  198. {gam7-7.17.3 → gam7-7.18.1}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  199. {gam7-7.17.3 → gam7-7.18.1}/wiki/SSL-Root-CA-Certificates.md +0 -0
  200. {gam7-7.17.3 → gam7-7.18.1}/wiki/Schemas.md +0 -0
  201. {gam7-7.17.3 → gam7-7.18.1}/wiki/Scripts.md +0 -0
  202. {gam7-7.17.3 → gam7-7.18.1}/wiki/Send-Email.md +0 -0
  203. {gam7-7.17.3 → gam7-7.18.1}/wiki/Shared-Drives.md +0 -0
  204. {gam7-7.17.3 → gam7-7.18.1}/wiki/Sites.md +0 -0
  205. {gam7-7.17.3 → gam7-7.18.1}/wiki/Tag-Replace.md +0 -0
  206. {gam7-7.17.3 → gam7-7.18.1}/wiki/Todrive.md +0 -0
  207. {gam7-7.17.3 → gam7-7.18.1}/wiki/Unmanaged-Accounts.md +0 -0
  208. {gam7-7.17.3 → gam7-7.18.1}/wiki/Upgrade-Benefits.md +0 -0
  209. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Analytics-Admin.md +0 -0
  210. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Application-Specific-Passwords.md +0 -0
  211. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Backup-Verification-Codes.md +0 -0
  212. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Calendars-Access.md +0 -0
  213. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Calendars-Events.md +0 -0
  214. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Calendars.md +0 -0
  215. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Chat.md +0 -0
  216. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Classification-Labels.md +0 -0
  217. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Classroom-Profile.md +0 -0
  218. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Contacts-Delegates.md +0 -0
  219. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Contacts.md +0 -0
  220. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Deprovision.md +0 -0
  221. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Activity-Settings.md +0 -0
  222. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Cleanup.md +0 -0
  223. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Comments.md +0 -0
  224. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Copy-Move.md +0 -0
  225. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Files-Display.md +0 -0
  226. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Files-Manage.md +0 -0
  227. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Orphans.md +0 -0
  228. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Ownership.md +0 -0
  229. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Permissions.md +0 -0
  230. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Query.md +0 -0
  231. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Revisions.md +0 -0
  232. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Shortcuts.md +0 -0
  233. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Drive-Transfer.md +0 -0
  234. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Forms.md +0 -0
  235. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Gmail-CSE.md +0 -0
  236. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Gmail-Delegates.md +0 -0
  237. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Gmail-Filters.md +0 -0
  238. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Gmail-Forwarding.md +0 -0
  239. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Gmail-Labels.md +0 -0
  240. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  241. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Gmail-Profile.md +0 -0
  242. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Gmail-S-MIME.md +0 -0
  243. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  244. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Gmail-Settings.md +0 -0
  245. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Group-Membership.md +0 -0
  246. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Keep-Notes.md +0 -0
  247. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Looker-Studio.md +0 -0
  248. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Meet.md +0 -0
  249. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-People-Contacts-Profiles.md +0 -0
  250. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Photo.md +0 -0
  251. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Profile-Photo.md +0 -0
  252. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Profile-Sharing.md +0 -0
  253. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Shared-Drives.md +0 -0
  254. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  255. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Spreadsheets.md +0 -0
  256. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Tag-Manager.md +0 -0
  257. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Tasks.md +0 -0
  258. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-Tokens.md +0 -0
  259. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users-YouTube.md +0 -0
  260. {gam7-7.17.3 → gam7-7.18.1}/wiki/Users.md +0 -0
  261. {gam7-7.17.3 → gam7-7.18.1}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  262. {gam7-7.17.3 → gam7-7.18.1}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  263. {gam7-7.17.3 → gam7-7.18.1}/wiki/Vault-Takeout.md +0 -0
  264. {gam7-7.17.3 → gam7-7.18.1}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  265. {gam7-7.17.3 → gam7-7.18.1}/wiki/gam.cfg.md +0 -0
  266. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-AdminSettingsExamples.md +0 -0
  267. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Android-Installation.md +0 -0
  268. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-BulkOperations.md +0 -0
  269. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-CalendarExamples.md +0 -0
  270. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Chat-Bot.md +0 -0
  271. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Chrome-Browser-Management.md +0 -0
  272. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Chrome-OS-Installation.md +0 -0
  273. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Chrome-Policy-Settings.md +0 -0
  274. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Cloud-Identity-Groups.md +0 -0
  275. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  276. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Command-Reference-Calendars.md +0 -0
  277. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Command-Reference-Definitions.md +0 -0
  278. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Command-Reference-Drive.md +0 -0
  279. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Command-Reference-Email.md +0 -0
  280. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  281. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Command-Reference-Groups.md +0 -0
  282. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Command-Reference-Users.md +0 -0
  283. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  284. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  285. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-CreatingClientSecretsFile.md +0 -0
  286. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Custom-Schemas.md +0 -0
  287. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Data-Transfers.md +0 -0
  288. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-DomainVerification.md +0 -0
  289. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-ExamplesAccountAuditing.md +0 -0
  290. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-ExamplesCSV.md +0 -0
  291. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-ExamplesEmailSettings.md +0 -0
  292. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-ExamplesOrganizations.md +0 -0
  293. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-GAM-Discussion-Group.md +0 -0
  294. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  295. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-GAM-options-files.md +0 -0
  296. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  297. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-GAM3CSVListings.md +0 -0
  298. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-GAM3DirectoryCommands.md +0 -0
  299. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-GAM3GroupSettings.md +0 -0
  300. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-GAM7-FAQ.md +0 -0
  301. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  302. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-GoogleDriveManagement.md +0 -0
  303. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  304. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Home.md +0 -0
  305. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  306. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Inbound-SSO-Settings.md +0 -0
  307. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-LicenseExamples.md +0 -0
  308. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Managing-Admins.md +0 -0
  309. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  310. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Managing-Devices.md +0 -0
  311. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Managing-Google-Classroom.md +0 -0
  312. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-OAuthKeyManagement.md +0 -0
  313. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Printers.md +0 -0
  314. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-ResellerCommands.md +0 -0
  315. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  316. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-SecurityExamples.md +0 -0
  317. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-UnmanagedUsersExamples.md +0 -0
  318. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Use-a-Yubikey.md +0 -0
  319. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  320. {gam7-7.17.3 → gam7-7.18.1}/wiki/l-_Footer.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.17.3
3
+ Version: 7.18.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
@@ -1511,15 +1511,22 @@ gam show privileges
1511
1511
  <RoleItem> ::= id:<String>|uid:<string>|<String>
1512
1512
 
1513
1513
  gam create adminrole <String> [description <String>]
1514
- privileges all|all_ou|<PrivilegesList>|(select <FileSelector>|<CSVFileSelector>)
1514
+ privileges all|all_ou|<PrivilegeList>|(select <FileSelector>|<CSVFileSelector>)|<JSONData>
1515
+ [csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]] (addcsvdata <FieldName> <String>)*]
1515
1516
  gam update adminrole <RoleItem> [name <String>] [description <String>]
1516
- [privileges all|all_ou|<PrivilegesList>|(select <FileSelector>|<CSVFileSelector>)]
1517
+ [privileges all|all_ou|<PrivilegeList>|(select <FileSelector>|<CSVFileSelector>)|<JSONData>]
1518
+ [csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]] (addcsvdata <FieldName> <String>)*]
1517
1519
  gam delete adminrole <RoleItem>
1518
1520
  gam info adminrole <RoleItem> [privileges]
1521
+ [formatjson]
1519
1522
  gam print adminroles|roles [todrive <ToDriveAttribute>*]
1520
1523
  [role <RoleItem>] [privileges] [oneitemperrow]
1524
+ [nosystemroles]
1525
+ [formatjson [quotechar <Character>]]
1521
1526
  gam show adminroles|roles
1522
1527
  [role <RoleItem>] [privileges]
1528
+ [nosystemroles]
1529
+ [formatjson]
1523
1530
 
1524
1531
  gam create|add admin <EmailAddress>|<UniqueID> <RoleItem> customer|(org_unit <OrgUnitItem>)
1525
1532
  [condition securitygroup|nonsecuritygroup]
@@ -3436,6 +3443,13 @@ gam print guardian|guardians [todrive <ToDriveAttribute>*] [accepted|invitations
3436
3443
  [showstudentemails]
3437
3444
  [formatjson [quotechar <Character>]]
3438
3445
 
3446
+ # Business Profile Accounts
3447
+
3448
+ gam show businessprofileaccounts
3449
+ [type locationgroup|organization|personal|usergroup]
3450
+ gam print businessprofileaccounts [todrive <ToDriveAttribute>*]
3451
+ [type locationgroup|organization|personal|usergroup]
3452
+
3439
3453
  # Classroom User Profiles
3440
3454
 
3441
3455
  gam <UserTypeEntity> print classroomprofile [todrive <ToDriveAttribute>*]
@@ -1,7 +1,33 @@
1
+ 7.18.01
2
+
3
+ Added option `nosystemroles` to `gam print|show adminroles` that causes GAM
4
+ to only display non-system roles.
5
+
6
+ Added option `formatjson` to `gam info|print|show adminroles`; this will be most useful
7
+ when the `privileges` option is used.
8
+
9
+ Updated `gam create|update adminrole` to allow specification of privileges with
10
+ JSON data: `privileges <JSONData>`. These two updates make it easier to copy admin roles.
11
+
12
+ Updated `gam create|update adminrole` to allow output of the created/updated
13
+ role data in CSV format; by default, GAM displays `<RoleName>(<RoleID>) created|updated`.
14
+ ```
15
+ csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]] (addcsvdata <FieldName> <String>)*
16
+ ```
17
+
18
+ 7.18.00
19
+
20
+ Added commands to display Business Profile Accounts.
21
+ These are special purpose commands and will not generally be used.
22
+ ```
23
+ gam show businessprofileaccounts
24
+ gam print businessprofileaccounts [todrive <ToDriveAttribute>*]
25
+ ```
26
+
1
27
  7.17.03
2
28
 
3
- Fixed bug in gam <UserItem> print|show chatspaces asadmin fields <ChatSpaceFieldNameList>` that caused a trap
4
- when `isplayname` was not in `<ChatSpaceFieldNameList>`.
29
+ Fixed bug in `gam <UserItem> print|show chatspaces asadmin fields <ChatSpaceFieldNameList>` that caused a trap
30
+ when `displayname` was not in `<ChatSpaceFieldNameList>`.
5
31
 
6
32
  7.17.02
7
33
 
@@ -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.17.03'
28
+ __version__ = '7.18.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
@@ -5579,7 +5579,12 @@ def buildGAPIObject(api, credentials=None):
5579
5579
  try:
5580
5580
  API_Scopes = set(list(service._rootDesc['auth']['oauth2']['scopes']))
5581
5581
  except KeyError:
5582
- API_Scopes = set(API.VAULT_SCOPES) if api == API.VAULT else set()
5582
+ if api == API.VAULT:
5583
+ API_Scopes = set(API.VAULT_SCOPES)
5584
+ elif api == API.BUSINESSACCOUNTMANAGEMENT:
5585
+ API_Scopes = {API.BUSINESSACCOUNTMANAGEMENT_SCOPE}
5586
+ else:
5587
+ API_Scopes = set()
5583
5588
  GM.Globals[GM.CURRENT_CLIENT_API] = api
5584
5589
  GM.Globals[GM.CURRENT_CLIENT_API_SCOPES] = API_Scopes.intersection(GM.Globals[GM.CREDENTIALS_SCOPES])
5585
5590
  if api not in API.SCOPELESS_APIS and not GM.Globals[GM.CURRENT_CLIENT_API_SCOPES]:
@@ -16616,10 +16621,14 @@ def getRoleId():
16616
16621
  invalidChoiceExit(role, GM.Globals[GM.MAP_ROLE_NAME_TO_ID], True)
16617
16622
  return (role, roleId)
16618
16623
 
16624
+ PRINT_ADMIN_ROLES_FIELDS = ['roleId', 'roleName', 'roleDescription', 'isSuperAdminRole', 'isSystemRole']
16625
+
16619
16626
  # gam create adminrole <String> [description <String>]
16620
- # privileges all|all_ou|<PrivilegesList>|(select <FileSelector>|<CSVFileSelector>)
16627
+ # privileges all|all_ou|<PrivilegeList>|(select <FileSelector>|<CSVFileSelector>)|<JSONData>
16628
+ # [csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]] (addcsvdata <FieldName> <String>)*]
16621
16629
  # gam update adminrole <RoleItem> [name <String>] [description <String>]
16622
- # [privileges all|all_ou|<PrivilegesList>|(select <FileSelector>|<CSVFileSelector>)]
16630
+ # [privileges all|all_ou|<PrivilegeList>|(select <FileSelector>|<CSVFileSelector>)|<JSONData>]
16631
+ # [csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]] (addcsvdata <FieldName> <String>)*]
16623
16632
  def doCreateUpdateAdminRoles():
16624
16633
  def expandChildPrivileges(privilege):
16625
16634
  for childPrivilege in privilege.get('childPrivileges', []):
@@ -16636,6 +16645,9 @@ def doCreateUpdateAdminRoles():
16636
16645
  allPrivileges = {}
16637
16646
  ouPrivileges = {}
16638
16647
  childPrivileges = {}
16648
+ csvPF = None
16649
+ FJQC = FormatJSONQuoteChar(None)
16650
+ addCSVData = {}
16639
16651
  for privilege in _listPrivileges(cd):
16640
16652
  allPrivileges[privilege['privilegeName']] = privilege['serviceId']
16641
16653
  if privilege['isOuScopable']:
@@ -16649,6 +16661,8 @@ def doCreateUpdateAdminRoles():
16649
16661
  body['rolePrivileges'] = [{'privilegeName': p, 'serviceId': v} for p, v in allPrivileges.items()]
16650
16662
  elif privs == 'ALL_OU':
16651
16663
  body['rolePrivileges'] = [{'privilegeName': p, 'serviceId': v} for p, v in ouPrivileges.items()]
16664
+ elif privs == 'JSON':
16665
+ body['rolePrivileges'] = getJSON(['roleId', 'roleName', 'isAdminRole', 'isSystemRole']).get('rolePrivileges', [])
16652
16666
  else:
16653
16667
  if privs == 'SELECT':
16654
16668
  privsList = [p.upper() for p in getEntityList(Cmd.OB_PRIVILEGE_LIST)]
@@ -16670,25 +16684,59 @@ def doCreateUpdateAdminRoles():
16670
16684
  else:
16671
16685
  invalidChoiceExit(p, list(allPrivileges.keys())+list(ouPrivileges.keys())+list(childPrivileges.keys()), True)
16672
16686
  elif myarg == 'description':
16673
- body['roleDescription'] = getString(Cmd.OB_STRING)
16687
+ body['roleDescription'] = getString(Cmd.OB_STRING, minLen=0)
16674
16688
  elif myarg == 'name':
16675
16689
  body['roleName'] = getString(Cmd.OB_STRING)
16690
+ elif myarg == 'csv':
16691
+ csvPF = CSVPrintFile(PRINT_ADMIN_ROLES_FIELDS)
16692
+ FJQC.SetCsvPF(csvPF)
16693
+ elif csvPF and myarg == 'todrive':
16694
+ csvPF.GetTodriveParameters()
16695
+ elif csvPF and myarg == 'addcsvdata':
16696
+ k = getString(Cmd.OB_STRING)
16697
+ addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
16676
16698
  else:
16677
- unknownArgumentExit()
16699
+ FJQC.GetFormatJSONQuoteChar(myarg, True)
16678
16700
  if not updateCmd and not body.get('rolePrivileges'):
16679
16701
  missingArgumentExit('privileges')
16702
+ if csvPF:
16703
+ if addCSVData:
16704
+ csvPF.AddTitles(sorted(addCSVData.keys()))
16705
+ if not FJQC.formatJSON:
16706
+ csvPF.AddTitles('rolePrivileges')
16707
+ else:
16708
+ csvPF.AddJSONTitles(sorted(addCSVData.keys()))
16709
+ csvPF.MoveJSONTitlesToEnd(['JSON'])
16710
+ fieldsList = ','.join(PRINT_ADMIN_ROLES_FIELDS+['rolePrivileges'])
16711
+ else:
16712
+ fieldsList = 'roleId,roleName'
16680
16713
  try:
16681
16714
  if not updateCmd:
16682
16715
  result = callGAPI(cd.roles(), 'insert',
16683
16716
  throwReasons=[GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND,
16684
16717
  GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED]+[GAPI.DUPLICATE],
16685
- customer=GC.Values[GC.CUSTOMER_ID], body=body, fields='roleId,roleName')
16718
+ customer=GC.Values[GC.CUSTOMER_ID], body=body, fields=fieldsList)
16686
16719
  else:
16687
16720
  result = callGAPI(cd.roles(), 'patch',
16688
16721
  throwReasons=[GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND,
16689
16722
  GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED]+[GAPI.NOT_FOUND, GAPI.FAILED_PRECONDITION, GAPI.CONFLICT],
16690
- customer=GC.Values[GC.CUSTOMER_ID], roleId=roleId, body=body, fields='roleId,roleName')
16691
- entityActionPerformed([Ent.ADMIN_ROLE, f"{result['roleName']}({result['roleId']})"])
16723
+ customer=GC.Values[GC.CUSTOMER_ID], roleId=roleId, body=body, fields=fieldsList)
16724
+ if not csvPF:
16725
+ entityActionPerformed([Ent.ADMIN_ROLE, f"{result['roleName']}({result['roleId']})"])
16726
+ else:
16727
+ if not FJQC.formatJSON:
16728
+ if addCSVData:
16729
+ result.update(addCSVData)
16730
+ csvPF.WriteRowNoFilter(result)
16731
+ else:
16732
+ row = {}
16733
+ for field in PRINT_ADMIN_ROLES_FIELDS:
16734
+ if field in result:
16735
+ row[field] = result[field]
16736
+ if addCSVData:
16737
+ row.update(addCSVData)
16738
+ row['JSON'] = json.dumps(cleanJSON(result), ensure_ascii=False, sort_keys=True)
16739
+ csvPF.WriteRowNoFilter(row)
16692
16740
  except GAPI.duplicate as e:
16693
16741
  entityActionFailedWarning([Ent.ADMIN_ROLE, f"{body['roleName']}"], str(e))
16694
16742
  except (GAPI.notFound, GAPI.failedPrecondition, GAPI.conflict) as e:
@@ -16697,6 +16745,8 @@ def doCreateUpdateAdminRoles():
16697
16745
  accessErrorExit(cd)
16698
16746
  except (GAPI.forbidden, GAPI.permissionDenied) as e:
16699
16747
  ClientAPIAccessDeniedExit(str(e))
16748
+ if csvPF:
16749
+ csvPF.writeCSVfile('Admin Roles')
16700
16750
 
16701
16751
  # gam delete adminrole <RoleItem>
16702
16752
  def doDeleteAdminRole():
@@ -16716,9 +16766,10 @@ def doDeleteAdminRole():
16716
16766
  except (GAPI.forbidden, GAPI.permissionDenied) as e:
16717
16767
  ClientAPIAccessDeniedExit(str(e))
16718
16768
 
16719
- PRINT_ADMIN_ROLES_FIELDS = ['roleId', 'roleName', 'roleDescription', 'isSuperAdminRole', 'isSystemRole']
16720
-
16721
- def _showAdminRole(role, i=0, count=0):
16769
+ def _showAdminRole(role, FJQC, i=0, count=0):
16770
+ if FJQC.formatJSON:
16771
+ printLine(json.dumps(cleanJSON(role), ensure_ascii=False, sort_keys=True))
16772
+ return
16722
16773
  printEntity([Ent.ADMIN_ROLE, role['roleName']], i, count)
16723
16774
  Ind.Increment()
16724
16775
  for field in PRINT_ADMIN_ROLES_FIELDS:
@@ -16739,15 +16790,21 @@ def _showAdminRole(role, i=0, count=0):
16739
16790
  Ind.Decrement()
16740
16791
 
16741
16792
  # gam info adminrole <RoleItem> [privileges]
16793
+ # [formatjson]
16742
16794
  # gam print adminroles|roles [todrive <ToDriveAttribute>*]
16743
16795
  # [role <RoleItem>] [privileges] [oneitemperrow]
16796
+ # [nosystemroles]
16797
+ # [formatjson [quotechar <Character>]]
16744
16798
  # gam show adminroles|roles
16745
16799
  # [role <RoleItem>] [privileges]
16800
+ # [nosystemroles]
16801
+ # [formatjson]
16746
16802
  def doInfoPrintShowAdminRoles():
16747
16803
  cd = buildGAPIObject(API.DIRECTORY)
16748
16804
  fieldsList = PRINT_ADMIN_ROLES_FIELDS[:]
16749
16805
  csvPF = CSVPrintFile(fieldsList, PRINT_ADMIN_ROLES_FIELDS) if Act.csvFormat() else None
16750
- oneItemPerRow = False
16806
+ FJQC = FormatJSONQuoteChar(csvPF)
16807
+ noSystemRoles = oneItemPerRow = False
16751
16808
  if Act.Get() != Act.INFO:
16752
16809
  roleId = None
16753
16810
  else:
@@ -16762,13 +16819,17 @@ def doInfoPrintShowAdminRoles():
16762
16819
  fieldsList.append('rolePrivileges')
16763
16820
  elif myarg == 'oneitemperrow':
16764
16821
  oneItemPerRow = True
16822
+ elif myarg == 'nosystemroles':
16823
+ noSystemRoles = True
16765
16824
  else:
16766
- unknownArgumentExit()
16767
- if csvPF and 'rolePrivileges' in fieldsList:
16768
- if not oneItemPerRow:
16769
- csvPF.AddTitles(['rolePrivileges'])
16770
- else:
16771
- csvPF.AddTitles(['privilegeName', 'serviceId'])
16825
+ FJQC.GetFormatJSONQuoteChar(myarg, True)
16826
+ if csvPF:
16827
+ if 'rolePrivileges' in fieldsList:
16828
+ if not oneItemPerRow:
16829
+ if not FJQC.formatJSON:
16830
+ csvPF.AddTitles(['rolePrivileges'])
16831
+ else:
16832
+ csvPF.AddTitles(['privilegeName', 'serviceId'])
16772
16833
  try:
16773
16834
  if roleId is None:
16774
16835
  fields = getItemFieldsFromFieldsList('items', fieldsList)
@@ -16778,6 +16839,8 @@ def doInfoPrintShowAdminRoles():
16778
16839
  throwReasons=[GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND,
16779
16840
  GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
16780
16841
  customer=GC.Values[GC.CUSTOMER_ID], fields=fields)
16842
+ if noSystemRoles:
16843
+ roles = [role for role in roles if not role.get('isSystemRole', False)]
16781
16844
  else:
16782
16845
  fields = getFieldsFromFieldsList(fieldsList)
16783
16846
  roles = [callGAPI(cd.roles(), 'get',
@@ -16796,23 +16859,38 @@ def doInfoPrintShowAdminRoles():
16796
16859
  role.setdefault('isSystemRole', False)
16797
16860
  if not csvPF:
16798
16861
  count = len(roles)
16799
- performActionNumItems(count, Ent.ADMIN_ROLE)
16862
+ if not FJQC.formatJSON:
16863
+ performActionNumItems(count, Ent.ADMIN_ROLE)
16800
16864
  Ind.Increment()
16801
16865
  i = 0
16802
16866
  for role in roles:
16803
16867
  i += 1
16804
- _showAdminRole(role, i, count)
16868
+ _showAdminRole(role, FJQC, i, count)
16805
16869
  Ind.Decrement()
16806
16870
  else:
16807
16871
  for role in roles:
16808
16872
  if not oneItemPerRow or 'rolePrivileges' not in role:
16809
- csvPF.WriteRowTitles(flattenJSON(role))
16873
+ row = flattenJSON(role)
16874
+ if not FJQC.formatJSON:
16875
+ csvPF.WriteRowTitles(row)
16876
+ elif csvPF.CheckRowTitles(row):
16877
+ row = {}
16878
+ for field in PRINT_ADMIN_ROLES_FIELDS:
16879
+ if field in role:
16880
+ row[field] = role[field]
16881
+ row['JSON'] = json.dumps(cleanJSON(role), ensure_ascii=False, sort_keys=True)
16882
+ csvPF.WriteRowNoFilter(row)
16810
16883
  else:
16811
16884
  privileges = role.pop('rolePrivileges')
16812
16885
  baserow = flattenJSON(role)
16813
16886
  for privilege in privileges:
16814
16887
  row = flattenJSON(privilege, flattened=baserow.copy())
16815
- csvPF.WriteRowTitles(row)
16888
+ if not FJQC.formatJSON:
16889
+ csvPF.WriteRowTitles(row)
16890
+ elif csvPF.CheckRowTitles(row):
16891
+ row = baserow.copy()
16892
+ row['JSON'] = json.dumps(cleanJSON(privilege), ensure_ascii=False, sort_keys=True)
16893
+ csvPF.WriteRowNoFilter(row)
16816
16894
  if csvPF:
16817
16895
  csvPF.writeCSVfile('Admin Roles')
16818
16896
 
@@ -47069,6 +47147,51 @@ def doUpdateSiteVerification():
47069
47147
  _showSiteVerificationInfo(verify_result)
47070
47148
  printKeyValueList([Msg.YOU_CAN_ADD_DOMAIN_TO_ACCOUNT.format(a_domain, GC.Values[GC.DOMAIN])])
47071
47149
 
47150
+ PROFILE_ACCOUNT_TYPE_MAP = {
47151
+ 'locationgroup': 'LOCATION_GROUP',
47152
+ 'organization': 'ORGANIZATION',
47153
+ 'personal': 'PERSONAL',
47154
+ 'usergroup': 'USER_GROUP',
47155
+ }
47156
+
47157
+ # gam show businessprofileaccounts
47158
+ # [type locationgroup|organization|personal|usergroup]
47159
+ # gam print businessprofileaccounts [todrive <ToDriveAttribute>*]
47160
+ # [type locationgroup|organization|personal|usergroup]
47161
+ def doPrintShowBusinessProfileAccounts():
47162
+ bp = buildGAPIObject(API.BUSINESSACCOUNTMANAGEMENT)
47163
+ csvPF = CSVPrintFile(['name', 'accountName']) if Act.csvFormat() else None
47164
+ kwargs = {}
47165
+ while Cmd.ArgumentsRemaining():
47166
+ myarg = getArgument()
47167
+ if csvPF and myarg == 'todrive':
47168
+ csvPF.GetTodriveParameters()
47169
+ elif myarg == 'type':
47170
+ kwargs['filter'] = f'type={getChoice(PROFILE_ACCOUNT_TYPE_MAP, mapChoice=True)}'
47171
+ else:
47172
+ unknownArgumentExit()
47173
+ try:
47174
+ accounts = callGAPIpages(bp.accounts(), 'list', 'accounts',
47175
+ throwReasons=[GAPI.PERMISSION_DENIED],
47176
+ **kwargs)
47177
+ except GAPI.permissionDenied as e:
47178
+ accessErrorExitNonDirectory(API.BUSINESSACCOUNTMANAGEMENT, str(e))
47179
+ if not csvPF:
47180
+ count = len(accounts)
47181
+ i = 0
47182
+ for account in sorted(accounts, key=lambda k: k['name']):
47183
+ i += 1
47184
+ printKeyValueListWithCount(['Account', account['name']], i, count)
47185
+ Ind.Increment()
47186
+ showJSON(None, account)
47187
+ Ind.Decrement()
47188
+ else:
47189
+ for account in accounts:
47190
+ row = flattenJSON(account, flattened={'name': account['name'], 'accountName': account['accountName']})
47191
+ csvPF.WriteRowTitles(row)
47192
+ if csvPF:
47193
+ csvPF.writeCSVfile('Business Profile Accounts')
47194
+
47072
47195
  # gam info verify|verification
47073
47196
  def doInfoSiteVerification():
47074
47197
  verif = buildGAPIObject(API.SITEVERIFICATION)
@@ -77237,6 +77360,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
77237
77360
  Cmd.ARG_BROWSER: doPrintShowBrowsers,
77238
77361
  Cmd.ARG_BROWSERTOKEN: doPrintShowBrowserTokens,
77239
77362
  Cmd.ARG_BUILDING: doPrintShowBuildings,
77363
+ Cmd.ARG_BUSINESSPROFILEACCOUNT: doPrintShowBusinessProfileAccounts,
77240
77364
  Cmd.ARG_CAALEVEL: doPrintShowCAALevels,
77241
77365
  Cmd.ARG_CHANNELCUSTOMER: doPrintShowChannelCustomers,
77242
77366
  Cmd.ARG_CHANNELCUSTOMERENTITLEMENT: doPrintShowChannelCustomerEntitlements,
@@ -77370,6 +77494,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
77370
77494
  Cmd.ARG_BROWSER: doPrintShowBrowsers,
77371
77495
  Cmd.ARG_BROWSERTOKEN: doPrintShowBrowserTokens,
77372
77496
  Cmd.ARG_BUILDING: doPrintShowBuildings,
77497
+ Cmd.ARG_BUSINESSPROFILEACCOUNT: doPrintShowBusinessProfileAccounts,
77373
77498
  Cmd.ARG_CAALEVEL: doPrintShowCAALevels,
77374
77499
  Cmd.ARG_CHANNELCUSTOMER: doPrintShowChannelCustomers,
77375
77500
  Cmd.ARG_CHANNELCUSTOMERENTITLEMENT: doPrintShowChannelCustomerEntitlements,
@@ -77556,6 +77681,7 @@ MAIN_COMMANDS_OBJ_ALIASES = {
77556
77681
  Cmd.ARG_BUCKET: Cmd.ARG_STORAGEBUCKET,
77557
77682
  Cmd.ARG_BUCKETS: Cmd.ARG_STORAGEBUCKET,
77558
77683
  Cmd.ARG_BUILDINGS: Cmd.ARG_BUILDING,
77684
+ Cmd.ARG_BUSINESSPROFILEACCOUNTS: Cmd.ARG_BUSINESSPROFILEACCOUNT,
77559
77685
  Cmd.ARG_CAALEVELS: Cmd.ARG_CAALEVEL,
77560
77686
  Cmd.ARG_CHATMEMBERS: Cmd.ARG_CHATMEMBER,
77561
77687
  Cmd.ARG_CHANNELCUSTOMERS: Cmd.ARG_CHANNELCUSTOMER,
@@ -24,6 +24,7 @@ ACCESSCONTEXTMANAGER = 'accesscontextmanager'
24
24
  ALERTCENTER = 'alertcenter'
25
25
  ANALYTICS_ADMIN = 'analyticsadmin'
26
26
  CALENDAR = 'calendar'
27
+ BUSINESSACCOUNTMANAGEMENT = 'mybusinessaccountmanagement'
27
28
  CBCM = 'cbcm'
28
29
  CHAT = 'chat'
29
30
  CHAT_CUSTOM_EMOJIS = 'chatcustomemojis'
@@ -101,6 +102,7 @@ TASKS = 'tasks'
101
102
  VAULT = 'vault'
102
103
  YOUTUBE = 'youtube'
103
104
  #
105
+ BUSINESSACCOUNTMANAGEMENT_SCOPE = 'https://www.googleapis.com/auth/business.manage'
104
106
  CHROMEVERSIONHISTORY_URL = 'https://versionhistory.googleapis.com/v1/chrome/platforms'
105
107
  DRIVE_SCOPE = 'https://www.googleapis.com/auth/drive'
106
108
  GMAIL_SEND_SCOPE = 'https://www.googleapis.com/auth/gmail.send'
@@ -174,6 +176,7 @@ PROJECT_APIS = [
174
176
  'alertcenter.googleapis.com',
175
177
  'analyticsadmin.googleapis.com',
176
178
  # 'audit.googleapis.com',
179
+ 'mybusinessaccountmanagement.googleapis.com',
177
180
  'calendar-json.googleapis.com',
178
181
  'chat.googleapis.com',
179
182
  'chromemanagement.googleapis.com',
@@ -213,6 +216,7 @@ _INFO = {
213
216
  ACCESSCONTEXTMANAGER: {'name': 'Access Context Manager API', 'version': 'v1', 'v2discovery': True},
214
217
  ALERTCENTER: {'name': 'AlertCenter API', 'version': 'v1beta1', 'v2discovery': True},
215
218
  ANALYTICS_ADMIN: {'name': 'Analytics Admin API', 'version': 'v1beta', 'v2discovery': True},
219
+ BUSINESSACCOUNTMANAGEMENT: {'name': 'Business Account Management API', 'version': 'v1', 'v2discovery': True},
216
220
  CALENDAR: {'name': 'Calendar API', 'version': 'v3', 'v2discovery': True, 'mappedAPI': 'calendar-json'},
217
221
  CBCM: {'name': 'Chrome Browser Cloud Management API', 'version': 'v1.1beta1', 'v2discovery': True, 'localjson': True},
218
222
  CHAT: {'name': 'Chat API', 'version': 'v1', 'v2discovery': True},
@@ -293,6 +297,11 @@ _INFO = {
293
297
  READONLY = ['readonly',]
294
298
 
295
299
  _CLIENT_SCOPES = [
300
+ {'name': 'Business Account Management API',
301
+ 'api': BUSINESSACCOUNTMANAGEMENT,
302
+ 'subscopes': [],
303
+ 'offByDefault': True,
304
+ 'scope': BUSINESSACCOUNTMANAGEMENT_SCOPE},
296
305
  {'name': 'Calendar API',
297
306
  'api': CALENDAR,
298
307
  'subscopes': READONLY,
@@ -441,6 +441,8 @@ class GamCLArgs():
441
441
  ARG_BUCKETS = 'buckets'
442
442
  ARG_BUILDING = 'building'
443
443
  ARG_BUILDINGS = 'buildings'
444
+ ARG_BUSINESSPROFILEACCOUNT = 'businessprofileaccount'
445
+ ARG_BUSINESSPROFILEACCOUNTS = 'businessprofileaccounts'
444
446
  ARG_CAALEVEL = 'caalevel'
445
447
  ARG_CAALEVELS = 'caalevels'
446
448
  ARG_CALATTENDEES = 'calattendees'
@@ -75,6 +75,7 @@ class GamEntity():
75
75
  BACKUP_VERIFICATION_CODES = 'buvc'
76
76
  BUILDING = 'bldg'
77
77
  BUILDING_ID = 'bldi'
78
+ BUSINESS_PROFILE_ACCOUNT = 'bpac'
78
79
  CAA_LEVEL = 'calv'
79
80
  CALENDAR = 'cale'
80
81
  CALENDAR_ACL = 'cacl'
@@ -434,6 +435,7 @@ class GamEntity():
434
435
  BACKUP_VERIFICATION_CODES: ['Backup Verification Codes', 'Backup Verification Codes'],
435
436
  BUILDING: ['Buildings', 'Building'],
436
437
  BUILDING_ID: ['Building IDs', 'Building ID'],
438
+ BUSINESS_PROFILE_ACCOUNT: ['Business Profile Accounts', 'Business Profile Account'],
437
439
  CAA_LEVEL: ['CAA Levels', 'CAA Level'],
438
440
  CALENDAR: ['Calendars', 'Calendar'],
439
441
  CALENDAR_ACL: ['Calendar ACLs', 'Calendar ACL'],
@@ -9,6 +9,7 @@
9
9
  - [Display administrators](#display-administrators)
10
10
  - [Copy privileges from one role to a new role](#copy-privileges-from-one-role-to-a-new-role)
11
11
  - [Copy roles from one administrator to another](#copy-roles-from-one-administrator-to-another)
12
+ - [Copy non-system admin roles from a source workspace to a target workspace](#copy-non-system-admin-roles-from-a-source-workspace-to-a-target-workspace)
12
13
 
13
14
  ## API documentation
14
15
  * [About Administrator roles](https://support.google.com/a/answer/33325?ref_topic=4514341)
@@ -21,13 +22,16 @@
21
22
  <DomainName> ::= <String>(.<String>)+
22
23
  <EmailAddress> ::= <String>@<DomainName>
23
24
  <GroupItem> ::= <EmailAddress>|<UniqueID>|<String>
25
+ <JSONData> ::= (json [charset <Charset>] <String>) | (json file <FileName> [charset <Charset>]) |
24
26
  <OrgUnitID> ::= id:<String>
25
27
  <OrgUnitPath> ::= /|(/<String)+
26
28
  <OrgUnitItem> ::= <OrgUnitID>|<OrgUnitPath>
27
29
  <Privilege> ::= <String>
28
30
  <PrivilegeList> ::= "<Privilege>(,<Privilege)*"
29
31
  <RoleAssignmentID> ::= <String>
30
- <RoleItem> ::= id:<String>|uid:<String>|<String>
32
+ <RoleID> ::= <String>
33
+ <RoleName> ::= <String>
34
+ <RoleItem> ::= id:<RoleID>|<RoleName>
31
35
  <UniqueID> ::= id:<String>
32
36
  <UserItem> ::= <EmailAddress>|<UniqueID>|<String>
33
37
  ```
@@ -1383,9 +1387,11 @@ Show 111 Privileges
1383
1387
  ## Manage administrative roles
1384
1388
  ```
1385
1389
  gam create adminrole <String> [description <String>]
1386
- privileges all|all_ou|<PrivilegeList>|(select <FileSelector>|<CSVFileSelector>>)
1390
+ privileges all|all_ou|<PrivilegeList>|(select <FileSelector>|<CSVFileSelector>>)|<JSONData>
1391
+ [csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]] (addcsvdata <FieldName> <String>)*]
1387
1392
  gam update adminrole <RoleItem> [name <String>] [description <String>]
1388
- [privileges all|all_ou|<PrivilegeList>|(select <FileSelector>|<CSVFileSelector>>)]
1393
+ [privileges all|all_ou|<PrivilegeList>|(select <FileSelector>|<CSVFileSelector>>)|<JSONData>]
1394
+ [csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]] (addcsvdata <FieldName> <String>)*]
1389
1395
  gam delete adminrole <RoleItem>
1390
1396
  ```
1391
1397
  * `privileges all` - All defined privileges
@@ -1393,24 +1399,61 @@ gam delete adminrole <RoleItem>
1393
1399
  * `privileges <PrivilegeList>` - A specific list of privileges
1394
1400
  * `privileges select <FileSelector>|<CSVFileSelector>>` - A collection of privileges from a flat or CSV file
1395
1401
 
1402
+ By default, when an admin role is created|update, GAM displays `<RoleName>(<RoleID>) created|updated`.
1403
+ * `csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]]` - Output the admin roledetails in CSV format.
1404
+
1405
+ When `csv` is uused, Add additional columns of data from the command line to the output.
1406
+ * `addcsvdata <FieldName> <String>`
1407
+
1396
1408
  ## Display administrative roles
1397
1409
  ```
1398
1410
  gam info adminrole <RoleItem> [privileges]
1411
+ [formatjson]
1399
1412
  ```
1400
1413
  * `privileges` - Display privileges associated with role
1414
+
1415
+ By default, Gam displays the information as an indented list of keys and values.
1416
+ * `formatjson` - Display the fields in JSON format.
1417
+
1401
1418
  ```
1402
- gam print adminroles|roles [todrive <ToDriveAttribute>*]
1403
- [role <RoleItem>] [privileges] [oneitemperrow]
1404
1419
  gam show adminroles|roles
1405
1420
  [role <RoleItem>] [privileges]
1421
+ [nosystemroles]
1422
+ [formatjson]
1406
1423
  ```
1407
- By default, all roles are displayed, use `role <RoleItem>` to display a specific role.
1424
+ * `privileges` - Display privileges associated with each role
1425
+
1426
+ By default, all roles are displayed:
1427
+ * `role <RoleItem>` - Display a specific role.
1428
+ * `nosystemroles` - Display onnly non-system roles.
1429
+
1430
+ By default, Gam displays the information as an indented list of keys and values.
1431
+ * `formatjson` - Display the fields in JSON format.
1408
1432
 
1433
+ ```
1434
+ gam print adminroles|roles [todrive <ToDriveAttribute>*]
1435
+ [role <RoleItem>] [privileges] [oneitemperrow]
1436
+ [nosystemroles]
1437
+ [formatjson [quotechar <Character>]]
1438
+ ```
1409
1439
  * `privileges` - Display privileges associated with each role
1410
1440
 
1411
- By default, with `print`, all privileges for a role are shown on one row as a repeating item.
1441
+ By default, all privileges for a role are shown on one row as a repeating item.
1412
1442
  When `oneitemperrow` is specified, each privilege is output on a separate row/line with the other role fields.
1413
1443
 
1444
+ By default, all roles are displayed:
1445
+ * `role <RoleItem>` - Display a specific role.
1446
+ * `nosystemroles` - Display onnly non-system roles.
1447
+
1448
+ By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format:
1449
+ * `formatjson` - Display the fields in JSON format.
1450
+
1451
+ By default, when writing CSV files, Gam uses a quote character of double quote `"`. The quote character is used to enclose columns that contain
1452
+ the quote character itself, the column delimiter (comma by default) and new-line characters. Any quote characters within the column are doubled.
1453
+ When using the `formatjson` option, double quotes are used extensively in the data resulting in hard to read/process output.
1454
+ The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
1455
+ `quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
1456
+
1414
1457
  ## Create an administrator
1415
1458
  Add an administrator role to an administrator.
1416
1459
  ```
@@ -1469,3 +1512,15 @@ gam config csv_input_row_filter "scopeType:regex:CUSTOMER" redirect stdout ./Upd
1469
1512
  gam config csv_input_row_filter "scopeType:regex:ORG_UNIT" redirect stdout ./UpdateNewAdminOrgUnitRoles.txt multiprocess redirect stderr stdout csv CurrentAdminRoles.csv gam create admin newadmin@domain.com "id:~~roleId~~" org_unit "id:~~orgUnitId~~"
1470
1513
  ```
1471
1514
 
1515
+ ## Copy non-system admin roles from a source workspace to a target workspace
1516
+ This requires GAM version 7.18.01 or higher.
1517
+
1518
+ In the source workspace to the following:
1519
+ ```
1520
+ gam redirect csv ./SourceNonSystemRoles.csv print adminroles privileges nosystemroles formatjson quotechar "'"
1521
+ ```
1522
+
1523
+ In the target workspacce do the following:
1524
+ ```
1525
+ gam redirect csv ./TargetNonSystemRoles.csv multiprocess quotechar "'" redirect stderr - multiprocess csv SourceNonSystemRoles.csv quotechar "'" gam create adminrole "~roleName" description "~roleDescription" privileges json "~JSON" csv addcsvdata oldRoleId "~roleId" formatjson
1526
+ ```
@@ -0,0 +1,36 @@
1
+ # Users - Business Account Management
2
+ - [API documentation](#api-documentation)
3
+ - [Introduction](#introduction)
4
+ - [Definitions](#definitions)
5
+ - [Display Business Profile Accounts](#display-business-profile-accounts)
6
+
7
+ ## API documentation
8
+ * [Business Account Management](https://developers.google.com/my-business/reference/accountmanagement/rest)
9
+
10
+
11
+ ## Introduction
12
+ These features were added in version 7.18.00.
13
+
14
+ To use these commands you add the 'Business Account Management API' to your project and update client authorization.
15
+ ```
16
+ gam update project
17
+ gam oauth create
18
+ ...
19
+ [*] 0) Business Account Management API
20
+
21
+ ```
22
+ ## Definitions
23
+ * [`<UserTypeEntity>`](Collections-of-Users)
24
+
25
+ ## Display Business Profile Accounts
26
+ ```
27
+ gam <UserItem> show businessprofileaccounts
28
+ [type locationgroup|organization|personal|usergroup]
29
+ ```
30
+ Gam displays the information as an indented list of keys and values.
31
+
32
+ ```
33
+ gam <UserItem> print businessprofileaccounts [todrive <ToDriveAttribute>*]
34
+ [type locationgroup|organization|personal|usergroup]
35
+ ```
36
+ Gam displays the information as columns of fields.
@@ -1,4 +1,4 @@
1
- # Chat Bot
1
+ # Chat Bot Setup and Use
2
2
  - [Introduction](#introduction)
3
3
  - [Set up a Chat Bot](#set-up-a-chat-bot)
4
4
  - [API documentation](#api-documentation)
@@ -12,6 +12,7 @@
12
12
  * [Google Classroom API](https://developers.google.com/classroom/reference/rest)
13
13
  * [Google Classroom API - Courses Students](https://developers.google.com/classroom/reference/rest/v1/courses.students)
14
14
  * [Google Classroom API - Courses Teachers](https://developers.google.com/classroom/reference/rest/v1/courses.teachers)
15
+ * [Classroom Membership Limits](https://support.google.com/edu/classroom/answer/7300976)
15
16
 
16
17
  ## Definitions
17
18
  ```