gam7 7.20.2__tar.gz → 7.20.3__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.
Files changed (322) hide show
  1. {gam7-7.20.2 → gam7-7.20.3}/.github/workflows/build.yml +3 -3
  2. {gam7-7.20.2 → gam7-7.20.3}/PKG-INFO +1 -1
  3. {gam7-7.20.2 → gam7-7.20.3}/src/GamCommands.txt +11 -11
  4. {gam7-7.20.2 → gam7-7.20.3}/src/GamUpdate.txt +6 -0
  5. {gam7-7.20.2 → gam7-7.20.3}/src/gam/__init__.py +97 -66
  6. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glmsgs.py +1 -0
  7. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glskus.py +1 -1
  8. {gam7-7.20.2 → gam7-7.20.3}/wiki/Classroom-StudentGroups.md +1 -0
  9. {gam7-7.20.2 → gam7-7.20.3}/wiki/Collections-of-Items.md +2 -0
  10. {gam7-7.20.2 → gam7-7.20.3}/wiki/GamUpdates.md +12 -0
  11. {gam7-7.20.2 → gam7-7.20.3}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  12. {gam7-7.20.2 → gam7-7.20.3}/wiki/Licenses.md +6 -6
  13. {gam7-7.20.2 → gam7-7.20.3}/wiki/Shared-Drives.md +44 -18
  14. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Permissions.md +20 -0
  15. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Shared-Drives.md +43 -18
  16. {gam7-7.20.2 → gam7-7.20.3}/wiki/Version-and-Help.md +6 -6
  17. {gam7-7.20.2 → gam7-7.20.3}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  18. {gam7-7.20.2 → gam7-7.20.3}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  19. {gam7-7.20.2 → gam7-7.20.3}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  20. {gam7-7.20.2 → gam7-7.20.3}/.github/ISSUE_TEMPLATE.txt +0 -0
  21. {gam7-7.20.2 → gam7-7.20.3}/.github/actions/decrypt.sh +0 -0
  22. {gam7-7.20.2 → gam7-7.20.3}/.github/actions/entitlements.plist +0 -0
  23. {gam7-7.20.2 → gam7-7.20.3}/.github/actions/package_exclusions.txt +0 -0
  24. {gam7-7.20.2 → gam7-7.20.3}/.github/stale.yml +0 -0
  25. {gam7-7.20.2 → gam7-7.20.3}/.github/workflows/codeql-analysis.yml +0 -0
  26. {gam7-7.20.2 → gam7-7.20.3}/.github/workflows/get-cacerts.yml +0 -0
  27. {gam7-7.20.2 → gam7-7.20.3}/.github/workflows/pushwiki.yml +0 -0
  28. {gam7-7.20.2 → gam7-7.20.3}/.github/workflows/pypi.yml +0 -0
  29. {gam7-7.20.2 → gam7-7.20.3}/.pre-commit-config.yaml +0 -0
  30. {gam7-7.20.2 → gam7-7.20.3}/LICENSE +0 -0
  31. {gam7-7.20.2 → gam7-7.20.3}/README.md +0 -0
  32. {gam7-7.20.2 → gam7-7.20.3}/pyproject.toml +0 -0
  33. {gam7-7.20.2 → gam7-7.20.3}/src/.gitignore +0 -0
  34. {gam7-7.20.2 → gam7-7.20.3}/src/LICENSE +0 -0
  35. {gam7-7.20.2 → gam7-7.20.3}/src/README.md +0 -0
  36. {gam7-7.20.2 → gam7-7.20.3}/src/cacerts.pem +0 -0
  37. {gam7-7.20.2 → gam7-7.20.3}/src/callgam.py +0 -0
  38. {gam7-7.20.2 → gam7-7.20.3}/src/gam/__main__.py +0 -0
  39. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/__init__.py +0 -0
  40. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/auth.py +0 -0
  41. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/client.py +0 -0
  42. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/core.py +0 -0
  43. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/data.py +0 -0
  44. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/http.py +0 -0
  45. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/http_core.py +0 -0
  46. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/http_interface.py +0 -0
  47. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/mock_http.py +0 -0
  48. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/mock_http_core.py +0 -0
  49. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/mock_service.py +0 -0
  50. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/service.py +0 -0
  51. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/token_store.py +0 -0
  52. {gam7-7.20.2 → gam7-7.20.3}/src/gam/atom/url.py +0 -0
  53. {gam7-7.20.2 → gam7-7.20.3}/src/gam/cacerts.pem +0 -0
  54. {gam7-7.20.2 → gam7-7.20.3}/src/gam/cbcm-v1.1beta1.json +0 -0
  55. {gam7-7.20.2 → gam7-7.20.3}/src/gam/contactdelegation-v1.json +0 -0
  56. {gam7-7.20.2 → gam7-7.20.3}/src/gam/datastudio-v1.json +0 -0
  57. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/__init__.py +0 -0
  58. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glaction.py +0 -0
  59. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glapi.py +0 -0
  60. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glcfg.py +0 -0
  61. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glclargs.py +0 -0
  62. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glentity.py +0 -0
  63. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glgapi.py +0 -0
  64. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glgdata.py +0 -0
  65. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glglobals.py +0 -0
  66. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glindent.py +0 -0
  67. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/gluprop.py +0 -0
  68. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/glverlibs.py +0 -0
  69. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gamlib/yubikey.py +0 -0
  70. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/__init__.py +0 -0
  71. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/alt/__init__.py +0 -0
  72. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/alt/app_engine.py +0 -0
  73. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/alt/appengine.py +0 -0
  74. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/apps/__init__.py +0 -0
  75. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/apps/audit/__init__.py +0 -0
  76. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/apps/audit/service.py +0 -0
  77. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  78. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/apps/contacts/service.py +0 -0
  79. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/apps/service.py +0 -0
  80. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/service.py +0 -0
  81. {gam7-7.20.2 → gam7-7.20.3}/src/gam/gdata/urlfetch.py +0 -0
  82. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/__init__.py +0 -0
  83. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/_auth.py +0 -0
  84. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/_helpers.py +0 -0
  85. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/channel.py +0 -0
  86. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/discovery.py +0 -0
  87. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  88. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  89. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  90. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  91. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/errors.py +0 -0
  92. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/http.py +0 -0
  93. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/mimeparse.py +0 -0
  94. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/model.py +0 -0
  95. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/schema.py +0 -0
  96. {gam7-7.20.2 → gam7-7.20.3}/src/gam/googleapiclient/version.py +0 -0
  97. {gam7-7.20.2 → gam7-7.20.3}/src/gam/iso8601/__init__.py +0 -0
  98. {gam7-7.20.2 → gam7-7.20.3}/src/gam/iso8601/iso8601.py +0 -0
  99. {gam7-7.20.2 → gam7-7.20.3}/src/gam/meet-v2beta.json +0 -0
  100. {gam7-7.20.2 → gam7-7.20.3}/src/gam/serviceaccountlookup-v1.json +0 -0
  101. {gam7-7.20.2 → gam7-7.20.3}/src/gam/six.py +0 -0
  102. {gam7-7.20.2 → gam7-7.20.3}/src/gam-install.sh +0 -0
  103. {gam7-7.20.2 → gam7-7.20.3}/src/gam-setup.bat +0 -0
  104. {gam7-7.20.2 → gam7-7.20.3}/src/gam.exe.manifest +0 -0
  105. {gam7-7.20.2 → gam7-7.20.3}/src/gam.py +0 -0
  106. {gam7-7.20.2 → gam7-7.20.3}/src/gam.spec +0 -0
  107. {gam7-7.20.2 → gam7-7.20.3}/src/gam.wxs +0 -0
  108. {gam7-7.20.2 → gam7-7.20.3}/src/license.rtf +0 -0
  109. {gam7-7.20.2 → gam7-7.20.3}/src/requirements-dev.txt +0 -0
  110. {gam7-7.20.2 → gam7-7.20.3}/src/tools/a_atleast_b.py +0 -0
  111. {gam7-7.20.2 → gam7-7.20.3}/src/tools/gen-wix-xml-filelist.py +0 -0
  112. {gam7-7.20.2 → gam7-7.20.3}/src/tools/mkGamRef.py +0 -0
  113. {gam7-7.20.2 → gam7-7.20.3}/src/tools/openssl.props +0 -0
  114. {gam7-7.20.2 → gam7-7.20.3}/src/tools/ssd.mjs +0 -0
  115. {gam7-7.20.2 → gam7-7.20.3}/src/version_info.txt.in +0 -0
  116. {gam7-7.20.2 → gam7-7.20.3}/wiki/00scratch.md +0 -0
  117. {gam7-7.20.2 → gam7-7.20.3}/wiki/Addresses.md +0 -0
  118. {gam7-7.20.2 → gam7-7.20.3}/wiki/Administrators.md +0 -0
  119. {gam7-7.20.2 → gam7-7.20.3}/wiki/Alert-Center.md +0 -0
  120. {gam7-7.20.2 → gam7-7.20.3}/wiki/Aliases.md +0 -0
  121. {gam7-7.20.2 → gam7-7.20.3}/wiki/Authorization.md +0 -0
  122. {gam7-7.20.2 → gam7-7.20.3}/wiki/BNF-Syntax.md +0 -0
  123. {gam7-7.20.2 → gam7-7.20.3}/wiki/Basic-Items.md +0 -0
  124. {gam7-7.20.2 → gam7-7.20.3}/wiki/Bulk-Processing.md +0 -0
  125. {gam7-7.20.2 → gam7-7.20.3}/wiki/Business-Account-Management.md +0 -0
  126. {gam7-7.20.2 → gam7-7.20.3}/wiki/CSV-Input-Filtering.md +0 -0
  127. {gam7-7.20.2 → gam7-7.20.3}/wiki/CSV-Output-Filtering.md +0 -0
  128. {gam7-7.20.2 → gam7-7.20.3}/wiki/CSV-Special-Characters.md +0 -0
  129. {gam7-7.20.2 → gam7-7.20.3}/wiki/Calendars-Access.md +0 -0
  130. {gam7-7.20.2 → gam7-7.20.3}/wiki/Calendars-Events.md +0 -0
  131. {gam7-7.20.2 → gam7-7.20.3}/wiki/Calendars.md +0 -0
  132. {gam7-7.20.2 → gam7-7.20.3}/wiki/Chat-Bot-Setup-Use.md +0 -0
  133. {gam7-7.20.2 → gam7-7.20.3}/wiki/Chrome-AUE-Counts.md +0 -0
  134. {gam7-7.20.2 → gam7-7.20.3}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  135. {gam7-7.20.2 → gam7-7.20.3}/wiki/Chrome-Installed-Apps.md +0 -0
  136. {gam7-7.20.2 → gam7-7.20.3}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  137. {gam7-7.20.2 → gam7-7.20.3}/wiki/Chrome-Policies.md +0 -0
  138. {gam7-7.20.2 → gam7-7.20.3}/wiki/Chrome-Printers.md +0 -0
  139. {gam7-7.20.2 → gam7-7.20.3}/wiki/Chrome-Profile-Management.md +0 -0
  140. {gam7-7.20.2 → gam7-7.20.3}/wiki/Chrome-Version-Counts.md +0 -0
  141. {gam7-7.20.2 → gam7-7.20.3}/wiki/Chrome-Version-History.md +0 -0
  142. {gam7-7.20.2 → gam7-7.20.3}/wiki/ChromeOS-Devices.md +0 -0
  143. {gam7-7.20.2 → gam7-7.20.3}/wiki/Classroom-Courses.md +0 -0
  144. {gam7-7.20.2 → gam7-7.20.3}/wiki/Classroom-Guardians.md +0 -0
  145. {gam7-7.20.2 → gam7-7.20.3}/wiki/Classroom-Invitations.md +0 -0
  146. {gam7-7.20.2 → gam7-7.20.3}/wiki/Classroom-Membership.md +0 -0
  147. {gam7-7.20.2 → gam7-7.20.3}/wiki/Cloud-Channel.md +0 -0
  148. {gam7-7.20.2 → gam7-7.20.3}/wiki/Cloud-Identity-Devices.md +0 -0
  149. {gam7-7.20.2 → gam7-7.20.3}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  150. {gam7-7.20.2 → gam7-7.20.3}/wiki/Cloud-Identity-Groups.md +0 -0
  151. {gam7-7.20.2 → gam7-7.20.3}/wiki/Cloud-Identity-Policies.md +0 -0
  152. {gam7-7.20.2 → gam7-7.20.3}/wiki/Cloud-Storage.md +0 -0
  153. {gam7-7.20.2 → gam7-7.20.3}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  154. {gam7-7.20.2 → gam7-7.20.3}/wiki/Collections-of-Users.md +0 -0
  155. {gam7-7.20.2 → gam7-7.20.3}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  156. {gam7-7.20.2 → gam7-7.20.3}/wiki/Command-Line-Parsing.md +0 -0
  157. {gam7-7.20.2 → gam7-7.20.3}/wiki/Command-Logging-Progress.md +0 -0
  158. {gam7-7.20.2 → gam7-7.20.3}/wiki/Context-Aware-Access-Levels.md +0 -0
  159. {gam7-7.20.2 → gam7-7.20.3}/wiki/Customer.md +0 -0
  160. {gam7-7.20.2 → gam7-7.20.3}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  161. {gam7-7.20.2 → gam7-7.20.3}/wiki/Domain-SharedContacts.md +0 -0
  162. {gam7-7.20.2 → gam7-7.20.3}/wiki/Domains-Verification.md +0 -0
  163. {gam7-7.20.2 → gam7-7.20.3}/wiki/Domains.md +0 -0
  164. {gam7-7.20.2 → gam7-7.20.3}/wiki/Downloads-Installs.md +0 -0
  165. {gam7-7.20.2 → gam7-7.20.3}/wiki/Drive-File-Selection.md +0 -0
  166. {gam7-7.20.2 → gam7-7.20.3}/wiki/Drive-Items.md +0 -0
  167. {gam7-7.20.2 → gam7-7.20.3}/wiki/Drive-REST-API-v3.md +0 -0
  168. {gam7-7.20.2 → gam7-7.20.3}/wiki/Email-Audit-Monitor.md +0 -0
  169. {gam7-7.20.2 → gam7-7.20.3}/wiki/Find-File-Owner.md +0 -0
  170. {gam7-7.20.2 → gam7-7.20.3}/wiki/GAM-Public-Chat-Room.md +0 -0
  171. {gam7-7.20.2 → gam7-7.20.3}/wiki/GAM-Return-Codes.md +0 -0
  172. {gam7-7.20.2 → gam7-7.20.3}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  173. {gam7-7.20.2 → gam7-7.20.3}/wiki/GAM7-on-Android-Devices.md +0 -0
  174. {gam7-7.20.2 → gam7-7.20.3}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  175. {gam7-7.20.2 → gam7-7.20.3}/wiki/Global-Address-List.md +0 -0
  176. {gam7-7.20.2 → gam7-7.20.3}/wiki/Google-Data-Transfers.md +0 -0
  177. {gam7-7.20.2 → gam7-7.20.3}/wiki/Google-Network-Addresses.md +0 -0
  178. {gam7-7.20.2 → gam7-7.20.3}/wiki/Groups-Membership.md +0 -0
  179. {gam7-7.20.2 → gam7-7.20.3}/wiki/Groups.md +0 -0
  180. {gam7-7.20.2 → gam7-7.20.3}/wiki/HTTPS-Proxy.md +0 -0
  181. {gam7-7.20.2 → gam7-7.20.3}/wiki/Home.md +0 -0
  182. {gam7-7.20.2 → gam7-7.20.3}/wiki/How-to-Install-GAM7.md +0 -0
  183. {gam7-7.20.2 → gam7-7.20.3}/wiki/How-to-Uninstall-GAM7.md +0 -0
  184. {gam7-7.20.2 → gam7-7.20.3}/wiki/How-to-Update-GAM7.md +0 -0
  185. {gam7-7.20.2 → gam7-7.20.3}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  186. {gam7-7.20.2 → gam7-7.20.3}/wiki/Inbound-SSO.md +0 -0
  187. {gam7-7.20.2 → gam7-7.20.3}/wiki/Install-GAM-as-Python-Library.md +0 -0
  188. {gam7-7.20.2 → gam7-7.20.3}/wiki/List-Items.md +0 -0
  189. {gam7-7.20.2 → gam7-7.20.3}/wiki/List.md +0 -0
  190. {gam7-7.20.2 → gam7-7.20.3}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  191. {gam7-7.20.2 → gam7-7.20.3}/wiki/Mobile-Devices.md +0 -0
  192. {gam7-7.20.2 → gam7-7.20.3}/wiki/Organizational-Units.md +0 -0
  193. {gam7-7.20.2 → gam7-7.20.3}/wiki/Other-Resources.md +0 -0
  194. {gam7-7.20.2 → gam7-7.20.3}/wiki/Permission-Matches.md +0 -0
  195. {gam7-7.20.2 → gam7-7.20.3}/wiki/Python-Regular-Expressions.md +0 -0
  196. {gam7-7.20.2 → gam7-7.20.3}/wiki/README.md +0 -0
  197. {gam7-7.20.2 → gam7-7.20.3}/wiki/Rclone.md +0 -0
  198. {gam7-7.20.2 → gam7-7.20.3}/wiki/Reports.md +0 -0
  199. {gam7-7.20.2 → gam7-7.20.3}/wiki/Reseller.md +0 -0
  200. {gam7-7.20.2 → gam7-7.20.3}/wiki/Resources.md +0 -0
  201. {gam7-7.20.2 → gam7-7.20.3}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  202. {gam7-7.20.2 → gam7-7.20.3}/wiki/SSL-Root-CA-Certificates.md +0 -0
  203. {gam7-7.20.2 → gam7-7.20.3}/wiki/Schemas.md +0 -0
  204. {gam7-7.20.2 → gam7-7.20.3}/wiki/Scripts.md +0 -0
  205. {gam7-7.20.2 → gam7-7.20.3}/wiki/Send-Email.md +0 -0
  206. {gam7-7.20.2 → gam7-7.20.3}/wiki/Sites.md +0 -0
  207. {gam7-7.20.2 → gam7-7.20.3}/wiki/Tag-Replace.md +0 -0
  208. {gam7-7.20.2 → gam7-7.20.3}/wiki/Todrive.md +0 -0
  209. {gam7-7.20.2 → gam7-7.20.3}/wiki/Unmanaged-Accounts.md +0 -0
  210. {gam7-7.20.2 → gam7-7.20.3}/wiki/Upgrade-Benefits.md +0 -0
  211. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Analytics-Admin.md +0 -0
  212. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Application-Specific-Passwords.md +0 -0
  213. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Backup-Verification-Codes.md +0 -0
  214. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Calendars-Access.md +0 -0
  215. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Calendars-Events.md +0 -0
  216. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Calendars.md +0 -0
  217. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Chat.md +0 -0
  218. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Classification-Labels.md +0 -0
  219. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Classroom-Profile.md +0 -0
  220. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Contacts-Delegates.md +0 -0
  221. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Contacts.md +0 -0
  222. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Deprovision.md +0 -0
  223. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Activity-Settings.md +0 -0
  224. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Cleanup.md +0 -0
  225. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Comments.md +0 -0
  226. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Copy-Move.md +0 -0
  227. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Files-Display.md +0 -0
  228. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Files-Manage.md +0 -0
  229. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Orphans.md +0 -0
  230. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Ownership.md +0 -0
  231. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Query.md +0 -0
  232. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Revisions.md +0 -0
  233. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Shortcuts.md +0 -0
  234. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Drive-Transfer.md +0 -0
  235. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Forms.md +0 -0
  236. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Gmail-CSE.md +0 -0
  237. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Gmail-Delegates.md +0 -0
  238. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Gmail-Filters.md +0 -0
  239. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Gmail-Forwarding.md +0 -0
  240. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Gmail-Labels.md +0 -0
  241. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  242. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Gmail-Profile.md +0 -0
  243. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Gmail-S-MIME.md +0 -0
  244. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  245. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Gmail-Settings.md +0 -0
  246. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Group-Membership.md +0 -0
  247. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Keep-Notes.md +0 -0
  248. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Looker-Studio.md +0 -0
  249. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Meet.md +0 -0
  250. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-People-Contacts-Profiles.md +0 -0
  251. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Photo.md +0 -0
  252. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Profile-Photo.md +0 -0
  253. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Profile-Sharing.md +0 -0
  254. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  255. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Spreadsheets.md +0 -0
  256. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Tag-Manager.md +0 -0
  257. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Tasks.md +0 -0
  258. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Tokens.md +0 -0
  259. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-Web-Resources-and-Sites.md +0 -0
  260. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users-YouTube.md +0 -0
  261. {gam7-7.20.2 → gam7-7.20.3}/wiki/Users.md +0 -0
  262. {gam7-7.20.2 → gam7-7.20.3}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  263. {gam7-7.20.2 → gam7-7.20.3}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  264. {gam7-7.20.2 → gam7-7.20.3}/wiki/Vault-Takeout.md +0 -0
  265. {gam7-7.20.2 → gam7-7.20.3}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  266. {gam7-7.20.2 → gam7-7.20.3}/wiki/_Sidebar.md +0 -0
  267. {gam7-7.20.2 → gam7-7.20.3}/wiki/gam.cfg.md +0 -0
  268. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-AdminSettingsExamples.md +0 -0
  269. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Android-Installation.md +0 -0
  270. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-BulkOperations.md +0 -0
  271. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-CalendarExamples.md +0 -0
  272. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Chat-Bot.md +0 -0
  273. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Chrome-Browser-Management.md +0 -0
  274. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Chrome-OS-Installation.md +0 -0
  275. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Chrome-Policy-Settings.md +0 -0
  276. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Cloud-Identity-Groups.md +0 -0
  277. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  278. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Command-Reference-Calendars.md +0 -0
  279. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Command-Reference-Definitions.md +0 -0
  280. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Command-Reference-Drive.md +0 -0
  281. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Command-Reference-Email.md +0 -0
  282. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  283. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Command-Reference-Groups.md +0 -0
  284. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Command-Reference-Users.md +0 -0
  285. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  286. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  287. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-CreatingClientSecretsFile.md +0 -0
  288. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Custom-Schemas.md +0 -0
  289. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Data-Transfers.md +0 -0
  290. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-DomainVerification.md +0 -0
  291. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-ExamplesAccountAuditing.md +0 -0
  292. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-ExamplesCSV.md +0 -0
  293. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-ExamplesEmailSettings.md +0 -0
  294. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-ExamplesOrganizations.md +0 -0
  295. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-GAM-Discussion-Group.md +0 -0
  296. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  297. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-GAM-options-files.md +0 -0
  298. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  299. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-GAM3CSVListings.md +0 -0
  300. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-GAM3DirectoryCommands.md +0 -0
  301. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-GAM3GroupSettings.md +0 -0
  302. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-GAM7-FAQ.md +0 -0
  303. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  304. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-GoogleDriveManagement.md +0 -0
  305. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  306. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Home.md +0 -0
  307. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  308. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Inbound-SSO-Settings.md +0 -0
  309. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-LicenseExamples.md +0 -0
  310. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Managing-Admins.md +0 -0
  311. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  312. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Managing-Devices.md +0 -0
  313. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Managing-Google-Classroom.md +0 -0
  314. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-OAuthKeyManagement.md +0 -0
  315. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Printers.md +0 -0
  316. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-ResellerCommands.md +0 -0
  317. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  318. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-SecurityExamples.md +0 -0
  319. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-UnmanagedUsersExamples.md +0 -0
  320. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Use-a-Yubikey.md +0 -0
  321. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  322. {gam7-7.20.2 → gam7-7.20.3}/wiki/l-_Footer.md +0 -0
@@ -30,7 +30,7 @@ env:
30
30
  PYTHON_SOURCE_PATH: ${{ github.workspace }}/src/cpython
31
31
  CRYPTOGRAPHY_BUILD_OPENSSL_NO_LEGACY: 1
32
32
  CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1
33
- WINDOWS_CODESIGN_CERT_HASH: 590dc5bb10dfb31dbff38c0e2f9c35ef0f6d0e9e
33
+ WINDOWS_CODESIGN_CERT_HASH: 3B11D9340A45CF078FF7FD984F1C3E30DA82FD05
34
34
 
35
35
  jobs:
36
36
  build:
@@ -655,7 +655,7 @@ jobs:
655
655
  write-Host "Signing ${env:gam}...."
656
656
  # Always explicitely use x64 version os signtool.exe, arm64 version apparently can't
657
657
  # see Certum certs since SimplySignDesktop is x64-only today.
658
- Start-Process -Wait -NoNewWindow -ErrorAction Continue -FilePath 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe' -ArgumentList "sign", "/sha1", "590dc5bb10dfb31dbff38c0e2f9c35ef0f6d0e9e", "/tr", "http://time.certum.pl", "/td", "SHA256", "/fd", "SHA256", "/v", "$env:gam"
658
+ Start-Process -Wait -NoNewWindow -ErrorAction Continue -FilePath 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe' -ArgumentList "sign", "/sha1", "$env:WINDOWS_CODESIGN_CERT_HASH", "/tr", "http://time.certum.pl", "/td", "SHA256", "/fd", "SHA256", "/v", "$env:gam"
659
659
  write-Host "Verifying signature of ${env:gam}...."
660
660
  # verify signature. If we failed to sign we should fail to verify and die.
661
661
  & 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe' verify /pa /v "$env:gam"
@@ -727,7 +727,7 @@ jobs:
727
727
  write-Host "Signing ${env:MSI_FILENAME}...."
728
728
  # Always explicitely use x64 version os signtool.exe, arm64 version apparently can't
729
729
  # see Certum certs since SimplySignDesktop is x64-only today.
730
- Start-Process -Wait -NoNewWindow -ErrorAction Continue -FilePath 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe' -ArgumentList "sign", "/sha1", "590dc5bb10dfb31dbff38c0e2f9c35ef0f6d0e9e", "/tr", "http://time.certum.pl", "/td", "SHA256", "/fd", "SHA256", "/v", "$env:MSI_FILENAME"
730
+ Start-Process -Wait -NoNewWindow -ErrorAction Continue -FilePath 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe' -ArgumentList "sign", "/sha1", "$env:WINDOWS_CODESIGN_CERT_HASH", "/tr", "http://time.certum.pl", "/td", "SHA256", "/fd", "SHA256", "/v", "$env:MSI_FILENAME"
731
731
  write-Host "Verifying signature of ${env:MSI_FILENAME}...."
732
732
  # verify signature. If we failed to sign we should fail to verify and die.
733
733
  & 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe' verify /pa /v "$env:MSI_FILENAME"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.20.2
3
+ Version: 7.20.3
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
@@ -266,7 +266,7 @@ If an item contains spaces, it should be surrounded by ".
266
266
  appsheetstandard | appsheetenterprisestandard | 1010380002 | AppSheet Enterprise Standard |
267
267
  appsheetplus | appsheetenterpriseplus | 1010380003 | AppSheet Enterprise Plus |
268
268
  assuredcontrols | 1010390001 | Assured Controls |
269
- assuredcontrolsplus | 1010390002 | Assured Controls Plus |
269
+ assuredcontrolsplus | 1010390002 | Assured Controls Plus |
270
270
  bce | beyondcorp | beyondcorpenterprise | cep | chromeenterprisepremium | 1010400001 | Chrome Enterprise Premium |
271
271
  cdm | chrome | googlechromedevicemanagement | Google-Chrome-Device-Management |
272
272
  cloudidentity | identity | 1010010001 | Cloud Identity |
@@ -275,8 +275,8 @@ If an item contains spaces, it should be surrounded by ".
275
275
  colabpro | 1010500001 | Colab Pro |
276
276
  colabpro+ | colabproplus | 1010500002 | Colab Pro+ |
277
277
  eeu | 1010490001 | SKU Endpoint Education Upgrade |
278
+ gaiproedu | geminiedu | 1010470004 | Google AI Pro for Education |
278
279
  geminibiz | 1010470003 | Gemini Business |
279
- geminiedu | 1010470004 | Gemini Education |
280
280
  geminiedupremium| 1010470005 | Gemini Education Premium |
281
281
  geminient| duetai | 1010470001 | Gemini Enterprise |
282
282
  geminiultra | 1010470008 | Google AI Ultra for Business |
@@ -316,12 +316,12 @@ If an item contains spaces, it should be surrounded by ".
316
316
  wsbizstarter | workspacebusinessstarter | wsbizstart | 1010020027 | Google Workspace Business Starter |
317
317
  wsbizstarterarchived | workspacebusinessstarterarchived | 1010340005 | Google Workspace Business Starter - Archived User |
318
318
  wsentess | workspaceenterpriseessentials | 1010060003 | Google Workspace Enterprise Essentials |
319
- wsentplus | workspaceenterpriseplus | gae | gse | enterprise | gsuiteenterprise | 1010020020 | Google Workspace Enterprise Plus |
319
+ wsentplus | workspaceenterpriseplus | gae | gse | enterprise | gsuiteenterprise | 1010020020 | Google Workspace Enterprise Plus (formerly G Suite Enterprise) |
320
320
  wsentstan | workspaceenterprisestandard | 1010020026 | Google Workspace Enterprise Standard |
321
321
  wsentstanarchived | workspaceenterprisestandardarchived | 1010340004 | Google Workspace Enterprise Standard - Archived User |
322
322
  wsentstarter | workspaceenterprisestarter | wes | 1010020029 | Workspace Enterprise Starter |
323
- wsess | workspaceesentials | gsuiteessentials | essentials | d4e | driveenterprise | drive4enterprise | 1010060001 | Google Workspace Essentials |
324
- wsessplus | workspaceessentialsplus | 1010060005 | Google Workspace Essentials Plus |
323
+ wsess | workspaceesentials | gsuiteessentials | essentials | d4e | driveenterprise | drive4enterprise | 1010060001 | Google Workspace Essentials (formerly G Suite Essentials) |
324
+ wsessplus | workspaceessentialsplus | 1010060005 | Google Workspace Enterprise Essentials Plus |
325
325
  wsflw | workspacefrontline | workspacefrontlineworker | 1010020030 | Google Workspace Frontline Starter |
326
326
  wsflwstan | workspacefrontlinestan | workspacefrontlineworkerstan | 1010020031 | Google Workspace Frontline Standard |
327
327
  wsflwplus | workspacefrontlineplus | workspacefrontlineworkerplus | 1010020034 | Google Workspace Frontline Plus
@@ -5096,7 +5096,7 @@ gam create|add drivefileacl <SharedDriveEntityAdmin>
5096
5096
  anyone|(user <UserItem>)|(group <GroupItem>)|(domain <DomainName>)
5097
5097
  (role <DriveFileACLRole>) [withlink|(allowfilediscovery|discoverable [<Boolean>])]
5098
5098
  (mappermissionsdomain <DomainName> <DomainName>)*
5099
- [expiration <Time>] [sendemail] [emailmessage <String>]
5099
+ [expiration <Time>] [sendemail|sendnotification] [emailmessage <String>]
5100
5100
  [showtitles] [nodetails|(csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]])]
5101
5101
  gam update drivefileacl <SharedDriveEntityAdmin> <DriveFilePermissionIDorEmail>
5102
5102
  (role <DriveFileACLRole>) [expires|expiration <Time>] [removeexpiration [<Boolean>]]
@@ -5123,7 +5123,7 @@ gam print drivefileacls <SharedDriveEntityAdmin> [todrive <ToDriveAttribute>*]
5123
5123
  (orderby <DriveFileOrderByFieldName> [ascending|descending])*
5124
5124
  [formatjson [quotechar <Character>]]
5125
5125
  gam create|add permissions <SharedDriveEntityAdmin> <DriveFilePermissionEntity>
5126
- [expires|expiration <Time>] [sendemail] [emailmessage <String>]
5126
+ [expires|expiration <Time>] [sendemail|sendnotification] [emailmessage <String>]
5127
5127
  <PermissionMatch>* [<PermissionMatchAction>]
5128
5128
  gam delete permissions <SharedDriveEntityAdmin> <DriveFilePermissionIDEntity>
5129
5129
  <PermissionMatch>* [<PermissionMatchAction>]
@@ -5136,7 +5136,7 @@ gam <UserTypeEntity> create|add drivefileacl <SharedDriveEntityAdmin>
5136
5136
  (role <DriveFileACLRole>) [withlink|(allowfilediscovery|discoverable [<Boolean>])]
5137
5137
  (mappermissionsdomain <DomainName> <DomainName>)*
5138
5138
  [movetonewownersroot [<Boolean>]]
5139
- [expiration <Time>] [sendemail] [emailmessage <String>]
5139
+ [expiration <Time>] [sendemail|sendnotification] [emailmessage <String>]
5140
5140
  [showtitles] [nodetails|(csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]])]
5141
5141
  adminaccess
5142
5142
  gam <UserTypeEntity> update drivefileacl <SharedDriveEntityAdmin> <DriveFilePermissionIDorEmail>
@@ -5167,7 +5167,7 @@ gam <UserTypeEntity> print drivefileacls <SharedDriveEntityAdmin> [todrive <ToDr
5167
5167
  (orderby <DriveFileOrderByFieldName> [ascending|descending])*
5168
5168
  [formatjson [quotechar <Character>]]
5169
5169
  gam <UserTypeEntity> create|add permissions <SharedDriveEntityAdmin> <DriveFilePermissionEntity>
5170
- [expires|expiration <Time>] [sendemail] [emailmessage <String>] adminaccess
5170
+ [expires|expiration <Time>] [sendemail|sendnotification] [emailmessage <String>] adminaccess
5171
5171
  <PermissionMatch>* [<PermissionMatchAction>]
5172
5172
  gam <UserTypeEntity> delete permissions <SharedDriveEntityAdmin> <DriveFilePermissionIDEntity> adminaccess
5173
5173
  <PermissionMatch>* [<PermissionMatchAction>]
@@ -6896,7 +6896,7 @@ gam <UserTypeEntity> create|add drivefileacl <DriveFileEntity> [adminaccess|asad
6896
6896
  anyone|(user <UserItem>)|(group <GroupItem>)|(domain <DomainName>) (role <DriveFileACLRole>)
6897
6897
  [withlink|(allowfilediscovery|discoverable [<Boolean>])] [expiration <Time>]
6898
6898
  [moveToNewOwnersRoot [<Boolean>]]
6899
- [sendemail] [emailmessage <String>]
6899
+ [sendemail|sendnotification] [emailmessage <String>]
6900
6900
  [updatesheetprotectedranges [<Boolean>]]
6901
6901
  [showtitles] [nodetails|(csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]])]
6902
6902
  gam <UserTypeEntity> update drivefileacl <DriveFileEntity> <DriveFilePermissionIDorEmail>
@@ -6922,7 +6922,7 @@ gam <UserTypeEntity> print drivefileacls <DriveFileEntity> [todrive <ToDriveAttr
6922
6922
  (orderby <DriveFileOrderByFieldName> [ascending|descending])*
6923
6923
  [formatjson [quotechar <Character>]]
6924
6924
  gam <UserTypeEntity> create|add permissions <DriveFileEntity> <DriveFilePermissionEntity>
6925
- [expires|expiration <Time>] [sendemail] [emailmessage <String>]
6925
+ [expires|expiration <Time>] [sendemail|sendnotification] [emailmessage <String>]
6926
6926
  [movetonewownersroot [<Boolean>]]
6927
6927
  <PermissionMatch>* [<PermissionMatchAction>]
6928
6928
  gam <UserTypeEntity> delete permissions <DriveFileEntity> <DriveFilePermissionIDEntity>
@@ -1,3 +1,9 @@
1
+ 7.20.03
2
+
3
+ Rebranded license SKU `1010470004` from `Gemini Education` to `Google AI Pro for Education`.
4
+
5
+ Additional updates to student groups in Google Classroom.
6
+
1
7
  7.20.02
2
8
 
3
9
  Upgraded `gam create course-studentgroups` to allow specification of multiple student group titles;
@@ -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.20.02'
28
+ __version__ = '7.20.03'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -51247,7 +51247,7 @@ def doCreateCourseStudentGroups():
51247
51247
  while Cmd.ArgumentsRemaining():
51248
51248
  myarg = getArgument()
51249
51249
  if myarg == 'title':
51250
- titles.append(getString(Cmd.OB_STRING))
51250
+ titles.append(getString(Cmd.OB_STRING, maxLen=100))
51251
51251
  elif myarg == 'select':
51252
51252
  titles.extend(getEntityList(Cmd.OB_STRING_ENTITY, shlexSplit=True))
51253
51253
  elif _getCourseSelectionParameters(myarg, courseSelectionParameters):
@@ -51450,8 +51450,26 @@ def doClearCourseStudentGroups():
51450
51450
  # (course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>])
51451
51451
  # [showitemcountonly] [formatjson [quotechar <Character>]]
51452
51452
  def doPrintCourseStudentGroups(showMembers=False):
51453
+ def _getCourseStudents():
51454
+ studentIdEmailMap = {}
51455
+ try:
51456
+ students = callGAPIpages(ocroom.courses().students(), 'list', 'students',
51457
+ throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE,
51458
+ GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
51459
+ retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
51460
+ courseId=courseId, fields='nextPageToken,students(profile(id,emailAddress))',
51461
+ pageSize=GC.Values[GC.CLASSROOM_MAX_RESULTS])
51462
+ for student in students:
51463
+ studentIdEmailMap[student['profile']['id']] = student['profile']['emailAddress']
51464
+ except GAPI.notFound:
51465
+ pass
51466
+ except (GAPI.serviceNotAvailable, GAPI.notImplemented) as e:
51467
+ entityActionFailedExit([Ent.COURSE, courseId], str(e))
51468
+ except (GAPI.forbidden, GAPI.permissionDenied) as e:
51469
+ ClientAPIAccessDeniedExit(str(e))
51470
+ return studentIdEmailMap
51471
+
51453
51472
  croom = buildGAPIObject(API.CLASSROOM)
51454
- cd = buildGAPIObject(API.DIRECTORY)
51455
51473
  csvPF = CSVPrintFile(['courseId', 'courseName', 'studentGroupId', 'studentGroupTitle'])
51456
51474
  FJQC = FormatJSONQuoteChar(csvPF)
51457
51475
  courseSelectionParameters = _initCourseSelectionParameters()
@@ -51503,6 +51521,8 @@ def doPrintCourseStudentGroups(showMembers=False):
51503
51521
  if not showMembers and showItemCountOnly:
51504
51522
  itemCount += len(studentGroups)
51505
51523
  continue
51524
+ if showMembers:
51525
+ studentIdEmailMap = _getCourseStudents()
51506
51526
  for studentGroup in studentGroups:
51507
51527
  studentGroupId = studentGroup['id']
51508
51528
  if not showMembers:
@@ -51515,7 +51535,7 @@ def doPrintCourseStudentGroups(showMembers=False):
51515
51535
  row['JSON'] = json.dumps(cleanJSON(studentGroup), ensure_ascii=False, sort_keys=False)
51516
51536
  csvPF.WriteRowTitles(row)
51517
51537
  continue
51518
- printGettingEntityItemForWhom(Ent.USER, formatKeyValueList('', [Ent.Singular(Ent.COURSE_STUDENTGROUP), studentGroupId],
51538
+ printGettingEntityItemForWhom(Ent.STUDENT, formatKeyValueList('', [Ent.Singular(Ent.COURSE_STUDENTGROUP), studentGroupId],
51519
51539
  currentCount(i, count)))
51520
51540
  pageMessage = getPageMessage()
51521
51541
  try:
@@ -51530,7 +51550,7 @@ def doPrintCourseStudentGroups(showMembers=False):
51530
51550
  itemCount += len(students)
51531
51551
  continue
51532
51552
  for member in students:
51533
- member['userEmail'] = convertUIDtoEmailAddress(f"id:{member['userId']}", cd=cd, emailTypes=['user'])
51553
+ member['userEmail'] = studentIdEmailMap.get(member['userId'], member['userId'])
51534
51554
  except GAPI.notFound as e:
51535
51555
  entityActionFailedWarning([Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId], str(e))
51536
51556
  continue
@@ -51562,8 +51582,29 @@ def doPrintCourseStudentGroups(showMembers=False):
51562
51582
  # gam sync course-studentgroup-members <CourseID> <StudentGroupID> <UserTypeEntity>
51563
51583
  # gam clear course-studentgroup-members <CourseID> <StudentGroupID>
51564
51584
  def doProcessCourseStudentGroupMembers():
51565
- def _getCurrentStudents():
51566
- printGettingEntityItemForWhom(Ent.USER, Ent.Singular(Ent.COURSE_STUDENTGROUP), studentGroupId)
51585
+ def _getCourseStudents():
51586
+ studentIdEmailMap = {}
51587
+ studentEmailIdMap = {}
51588
+ try:
51589
+ students = callGAPIpages(ocroom.courses().students(), 'list', 'students',
51590
+ throwReasons=[GAPI.NOT_FOUND, GAPI.SERVICE_NOT_AVAILABLE,
51591
+ GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
51592
+ retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
51593
+ courseId=courseId, fields='nextPageToken,students(profile(id,emailAddress))',
51594
+ pageSize=GC.Values[GC.CLASSROOM_MAX_RESULTS])
51595
+ for student in students:
51596
+ studentIdEmailMap[student['profile']['id']] = student['profile']['emailAddress'].lower()
51597
+ studentEmailIdMap[student['profile']['emailAddress'].lower()] = student['profile']['id']
51598
+ return (studentIdEmailMap, studentEmailIdMap)
51599
+ except GAPI.notFound as e:
51600
+ entityActionFailedExit([Ent.COURSE, courseId], str(e))
51601
+ except (GAPI.serviceNotAvailable, GAPI.notImplemented) as e:
51602
+ entityActionFailedExit([Ent.COURSE, courseId], str(e))
51603
+ except (GAPI.forbidden, GAPI.permissionDenied) as e:
51604
+ ClientAPIAccessDeniedExit(str(e))
51605
+
51606
+ def _getGroupCurrentStudents():
51607
+ printGettingEntityItemForWhom(Ent.STUDENT, formatKeyValueList('', [Ent.Singular(Ent.COURSE_STUDENTGROUP), studentGroupId], ''))
51567
51608
  pageMessage = getPageMessage()
51568
51609
  try:
51569
51610
  return callGAPIpages(ocroom.courses().studentGroups().studentGroupMembers(), 'list', 'studentGroupMembers',
@@ -51581,18 +51622,24 @@ def doProcessCourseStudentGroupMembers():
51581
51622
  except (GAPI.forbidden, GAPI.permissionDenied) as e:
51582
51623
  ClientAPIAccessDeniedExit(str(e))
51583
51624
 
51584
- def _getStudentUserId(kvList, student, i, count):
51585
- normalizedEmailAddressOrUID = normalizeEmailAddressOrUID(student)
51586
- if normalizedEmailAddressOrUID.find('@') == -1:
51587
- return normalizedEmailAddressOrUID
51588
- try:
51589
- return callGAPI(cd.users(), 'get',
51590
- throwReasons=GAPI.USER_GET_THROW_REASONS,
51591
- userKey=normalizedEmailAddressOrUID, fields='id')['id']
51592
- except (GAPI.userNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, GAPI.forbidden,
51593
- GAPI.badRequest, GAPI.backendError, GAPI.systemError) as e:
51594
- entityActionFailedWarning(kvList, str(e), i, count)
51595
- return None
51625
+ def _validateClStudents(clStudents):
51626
+ status = True
51627
+ clStudentIds = []
51628
+ count = len(clStudents)
51629
+ i = 0
51630
+ kvList = [Ent.COURSE, courseId, Ent.STUDENT, '']
51631
+ for student in clStudents:
51632
+ i += 1
51633
+ student = normalizeEmailAddressOrUID(student)
51634
+ if student in studentIdEmailMap:
51635
+ clStudentIds.append(student)
51636
+ elif student in studentEmailIdMap:
51637
+ clStudentIds.append(studentEmailIdMap[student])
51638
+ else:
51639
+ kvList[-1] = student
51640
+ entityActionFailedWarning(kvList, Msg.STUDENT_NOT_IN_COURSE, i, count)
51641
+ status = False
51642
+ return clStudentIds if status else None
51596
51643
 
51597
51644
  def _processStudent(function, kvList, kwargs, i, count):
51598
51645
  try:
@@ -51611,85 +51658,69 @@ def doProcessCourseStudentGroupMembers():
51611
51658
  except (GAPI.forbidden, GAPI.permissionDenied) as e:
51612
51659
  ClientAPIAccessDeniedExit(str(e))
51613
51660
 
51614
- def _addStudents(students, getUserIds):
51661
+ def _addStudents(students):
51615
51662
  count = len(students)
51616
51663
  i = 0
51617
- entityPerformActionNumItems([Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId], count, Ent.USER)
51618
- kvList = [Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId, Ent.USER, '']
51664
+ entityPerformActionNumItems([Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId], count, Ent.STUDENT)
51665
+ kvList = [Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId, Ent.STUDENT, '']
51619
51666
  kwargs = {'courseId': courseId, 'studentGroupId': studentGroupId, 'body': {'userId': ''}}
51667
+ Ind.Increment()
51620
51668
  for student in students:
51621
51669
  i += 1
51622
- if getUserIds:
51623
- userId = _getStudentUserId(kvList, student, i, count)
51624
- if userId is None:
51625
- continue
51626
- kvList[-1] = student
51627
- else:
51628
- userId = student
51629
- kvList[-1] = convertUIDtoEmailAddress(f"id:{userId}", cd=cd, emailTypes=['user'])
51630
- kwargs['body']['userId'] = userId
51670
+ kvList[-1] = studentIdEmailMap[student]
51671
+ kwargs['body']['userId'] = student
51631
51672
  _processStudent('create', kvList, kwargs, i, count)
51673
+ Ind.Decrement()
51632
51674
 
51633
- def _removeStudents(students, getUserIds):
51675
+ def _removeStudents(students):
51634
51676
  count = len(students)
51635
51677
  i = 0
51636
- entityPerformActionNumItems([Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId], count, Ent.USER)
51637
- kvList = [Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId, Ent.USER, '']
51678
+ entityPerformActionNumItems([Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId], count, Ent.STUDENT)
51679
+ kvList = [Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId, Ent.STUDENT, '']
51638
51680
  kwargs = {'courseId': courseId, 'studentGroupId': studentGroupId, 'userId': ''}
51681
+ Ind.Increment()
51639
51682
  for student in students:
51640
51683
  i += 1
51641
- if getUserIds:
51642
- userId = _getStudentUserId(kvList, student, i, count)
51643
- if userId is None:
51644
- continue
51645
- kvList[-1] = student
51646
- else:
51647
- userId = student
51648
- kvList[-1] = convertUIDtoEmailAddress(f"id:{userId}", cd=cd, emailTypes=['user'])
51649
- kwargs['userId'] = userId
51684
+ kvList[-1] = studentIdEmailMap[student]
51685
+ kwargs['userId'] = student
51650
51686
  _processStudent('delete', kvList, kwargs, i, count)
51687
+ Ind.Decrement()
51651
51688
 
51652
51689
  croom = buildGAPIObject(API.CLASSROOM)
51653
- cd = buildGAPIObject(API.DIRECTORY)
51654
51690
  action = Act.Get()
51655
51691
  courseId = getString(Cmd.OB_COURSE_ID)
51656
51692
  studentGroupId = getString(Cmd.OB_STUDENTGROUP_ID)
51657
51693
  if action != Act.CLEAR:
51658
51694
  _, clStudents = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS, groupMemberType=Ent.TYPE_USER)
51659
- clStudents = [normalizeEmailAddressOrUID(student) for student in clStudents]
51695
+ clStudentIds = []
51660
51696
  checkForExtraneousArguments()
51661
51697
  _, count, coursesInfo = _getCoursesOwnerInfo(croom, [courseId], GC.Values[GC.USE_COURSE_OWNER_ACCESS])
51662
51698
  if count == 0:
51663
51699
  return
51664
51700
  ocroom = coursesInfo[courseId]['croom']
51665
51701
  courseId = coursesInfo[courseId]['id']
51702
+ studentIdEmailMap, studentEmailIdMap = _getCourseStudents()
51666
51703
  if action in {Act.SYNC, Act.CLEAR}:
51667
- currentStudents = [student['userId'] for student in _getCurrentStudents()]
51704
+ currentStudents = [student['userId'] for student in _getGroupCurrentStudents()]
51705
+ if action != Act.CLEAR:
51706
+ clStudentIds = _validateClStudents(clStudents)
51707
+ if clStudentIds is None:
51708
+ return
51668
51709
  if action == Act.CLEAR:
51669
- _removeStudents(currentStudents, False)
51710
+ _removeStudents(currentStudents)
51670
51711
  elif action == Act.DELETE:
51671
- _removeStudents(clStudents, True)
51712
+ _removeStudents(clStudentIds)
51672
51713
  elif action in {Act.ADD, Act.CREATE}:
51673
- _addStudents(clStudents, True)
51714
+ _addStudents(clStudentIds)
51674
51715
  else: # elif action == Act.SYNC:
51675
51716
  currentMembersSet = set(currentStudents)
51676
- syncMembersSet = set()
51677
- count = len(clStudents)
51678
- i = 0
51679
- kvList = [Ent.COURSE, courseId, Ent.COURSE_STUDENTGROUP, studentGroupId, Ent.USER, '']
51680
- for student in clStudents:
51681
- i += 1
51682
- kvList[-1] = student
51683
- userId = _getStudentUserId(kvList, student, i, count)
51684
- if userId is None:
51685
- continue
51686
- syncMembersSet.add(userId)
51717
+ syncMembersSet = set(clStudentIds)
51687
51718
  removeStudentsSet = currentMembersSet-syncMembersSet
51688
51719
  addStudentsSet = syncMembersSet-currentMembersSet
51689
51720
  Act.Set(Act.DELETE)
51690
- _removeStudents(removeStudentsSet, False)
51721
+ _removeStudents(removeStudentsSet)
51691
51722
  Act.Set(Act.ADD)
51692
- _addStudents(addStudentsSet, False)
51723
+ _addStudents(addStudentsSet)
51693
51724
 
51694
51725
  # gam print course-studentgroup-members [todrive <ToDriveAttribute>*]
51695
51726
  # (course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>])
@@ -65073,7 +65104,7 @@ def _checkFileIdEntityDomainAccess(fileIdEntity, useDomainAdminAccess):
65073
65104
  # (mappermissionsdomain <DomainName> <DomainName>)*
65074
65105
  # [moveToNewOwnersRoot [<Boolean>]]
65075
65106
  # [updatesheetprotectedranges [<Boolean>]]
65076
- # [sendemail] [emailmessage <String>]
65107
+ # [sendemail|sendnotification] [emailmessage <String>]
65077
65108
  # [showtitles] [nodetails|(csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]])]
65078
65109
  def createDriveFileACL(users, useDomainAdminAccess=False):
65079
65110
  moveToNewOwnersRoot = False
@@ -65117,7 +65148,7 @@ def createDriveFileACL(users, useDomainAdminAccess=False):
65117
65148
  elif myarg in {'expiration', 'expires'}:
65118
65149
  expirationLocation = Cmd.Location()
65119
65150
  body['expirationTime'] = getTimeOrDeltaFromNow()
65120
- elif myarg == 'sendemail':
65151
+ elif myarg in {'sendemail', 'sendnotification'}:
65121
65152
  sendNotificationEmail = True
65122
65153
  elif myarg == 'emailmessage':
65123
65154
  sendNotificationEmail = True
@@ -65373,7 +65404,7 @@ def doUpdateDriveFileACLs():
65373
65404
  updateDriveFileACLs([_getAdminEmail()], True)
65374
65405
 
65375
65406
  # gam [<UserTypeEntity>] create permissions <DriveFileEntity> <DriveFilePermissionsEntity> [asadmin]
65376
- # [expiration <Time>] [sendmail] [emailmessage <String>]
65407
+ # [expiration <Time>] [sendemail|sendnotification] [emailmessage <String>]
65377
65408
  # [moveToNewOwnersRoot [<Boolean>]]
65378
65409
  # <PermissionMatch>* [<PermissionMatchAction>]
65379
65410
  def createDriveFilePermissions(users, useDomainAdminAccess=False):
@@ -65491,7 +65522,7 @@ def createDriveFilePermissions(users, useDomainAdminAccess=False):
65491
65522
  moveToNewOwnersRoot = getBoolean()
65492
65523
  elif myarg in {'expiration', 'expires'}:
65493
65524
  expiration = getTimeOrDeltaFromNow()
65494
- elif myarg == 'sendemail':
65525
+ elif myarg in {'sendemail', 'sendnotification'}:
65495
65526
  sendNotificationEmail = True
65496
65527
  elif myarg == 'emailmessage':
65497
65528
  sendNotificationEmail = True
@@ -499,6 +499,7 @@ STATISTICS_MOVE_FILE = 'Total: {0}, Moved: {1}, Shortcut created {2}, Shortcut e
499
499
  STATISTICS_MOVE_FOLDER = 'Total: {0}, Moved: {1}, Shortcut created {2}, Shortcut exists {3}, Duplicate: {4}, Merged: {5}, Move Failed: {6}, Not writable: {7}'
500
500
  STATISTICS_USER_NOT_ORGANIZER = 'User not organizer: {0}'
501
501
  STRING_LENGTH = 'string length'
502
+ STUDENT_NOT_IN_COURSE = 'Student not in course'
502
503
  SUBKEY_FIELD_MISMATCH = 'subkeyfield {0} does not match saved subkeyfield {1}'
503
504
  SUBSCRIPTION_NOT_FOUND = 'Could not find subscription'
504
505
  SUFFIX_NOT_ALLOWED_WITH_CUSTOMLANGUAGE = 'Suffix {0} not allowed with customLanguage {1}'
@@ -100,7 +100,7 @@ _SKUS = {
100
100
  '1010470003': {
101
101
  'product': '101047', 'aliases': ['geminibiz'], 'displayName': 'Gemini Business'},
102
102
  '1010470004': {
103
- 'product': '101047', 'aliases': ['geminiedu'], 'displayName': 'Gemini Education'},
103
+ 'product': '101047', 'aliases': ['gaiproedu', 'geminiedu'], 'displayName': 'Google AI Pro for Education'},
104
104
  '1010470005': {
105
105
  'product': '101047', 'aliases': ['geminiedupremium'], 'displayName': 'Gemini Education Premium'},
106
106
  '1010470006': {
@@ -160,6 +160,7 @@ Middle Students
160
160
  Beginner Students
161
161
 
162
162
  $ gam redirect csv ./StudentGroups.csv add coursestudentgroups course <CourseID> select csvfile titles.csv:title csv
163
+ Course: <CourseID>, Add 3 Course Student Groups
163
164
 
164
165
  $ more StudentGroups.csv
165
166
  courseId,courseName,studentGroupId,studentGroupTitle
@@ -351,6 +351,8 @@ Data fields identified in a `csvkmd` argument.
351
351
  <SiteACLScopeList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
352
352
  <SiteEntity> ::=
353
353
  <SiteList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
354
+ <StringEntity> ::=
355
+ <StringList> | <FileSelector> | <CSVFileSelector>
354
356
  <StudentGroupEntity> ::=
355
357
  <StudentGroupIDList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector>
356
358
  <TagManagerAccountPathEntity> ::=
@@ -10,6 +10,18 @@ Add the `-s` option to the end of the above commands to suppress creating the `g
10
10
 
11
11
  See [Downloads-Installs-GAM7](https://github.com/GAM-team/GAM/wiki/Downloads-Installs) for Windows or other options, including manual installation
12
12
 
13
+ ### 7.20.03
14
+
15
+ Rebranded license SKU `1010470004` from `Gemini Education` to `Google AI Pro for Education`.
16
+
17
+ Additional updates to student groups in Google Classroom.
18
+
19
+ ### 7.20.02
20
+
21
+ Upgraded `gam create course-studentgroups` to allow specification of multiple student group titles;
22
+ multiple student groups can be created in a single command.
23
+ * `((title <String>)|(select <StringEntity))+`
24
+
13
25
  ### 7.20.01
14
26
 
15
27
  Added option `showaccesssettings` to `gam [<UserTypeEntity>] print|show chatspaces`. When listing
@@ -252,7 +252,7 @@ writes the credentials into the file oauth2.txt.
252
252
  admin@server:/Users/admin$ rm -f /Users/admin/GAMConfig/oauth2.txt
253
253
  admin@server:/Users/admin$ gam version
254
254
  WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
255
- GAM 7.20.01 - https://github.com/GAM-team/GAM - pyinstaller
255
+ GAM 7.20.03 - https://github.com/GAM-team/GAM - pyinstaller
256
256
  GAM Team <google-apps-manager@googlegroups.com>
257
257
  Python 3.13.7 64-bit final
258
258
  MacOS Sequoia 15.6.1 x86_64
@@ -990,7 +990,7 @@ writes the credentials into the file oauth2.txt.
990
990
  C:\>del C:\GAMConfig\oauth2.txt
991
991
  C:\>gam version
992
992
  WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
993
- GAM 7.20.01 - https://github.com/GAM-team/GAM - pythonsource
993
+ GAM 7.20.03 - https://github.com/GAM-team/GAM - pythonsource
994
994
  GAM Team <google-apps-manager@googlegroups.com>
995
995
  Python 3.13.7 64-bit final
996
996
  Windows-10-10.0.17134 AMD64
@@ -60,10 +60,10 @@
60
60
  | G Suite Legacy | Google-Apps | standard |
61
61
  | G Suite Lite | Google-Apps-Lite | gsuitelite |
62
62
  | Gemini Business | 1010470003 | geminibiz
63
- | Gemini Education | 1010470004 | geminiedu |
64
63
  | Gemini Education Premium | 1010470005 | geminiedupremium |
65
64
  | Gemini Enterprise | 1010470001 | geminient | duetai |
66
- | Google AI Ultra for Business | 1010470008 | geminiultra |
65
+ | Google AI Pro for Education | 1010470004 | gaiproedu |
66
+ | Google AI Ultra for Business | 1010470008 | geminiultra }
67
67
  | Google Apps Message Security | Google-Apps-For-Postini | postini |
68
68
  | Google Chrome Device Management | Google-Chrome-Device-Management | cdm |
69
69
  | Google Drive Storage 16TB | Google-Drive-storage-16TB | 16tb |
@@ -161,18 +161,17 @@
161
161
  assuredcontrolsplus | 1010390002 | Assured Controls Plus |
162
162
  bce | beyondcorp | beyondcorpenterprise | cep | chromeenterprisepremium | 1010400001 | Chrome Enterprise Premium |
163
163
  cdm | chrome | googlechromedevicemanagement | Google-Chrome-Device-Management |
164
- bce | beyondcorp | beyondcorpenterprise | cep | chromeenterprisepremium | 1010400001 | Chrome Enterprise Premium |
165
- cdm | chrome | googlechromedevicemanagement | Google-Chrome-Device-Management |
166
164
  cloudidentity | identity | 1010010001 | Cloud Identity |
167
165
  cloudidentitypremium | identitypremium | 1010050001 | Cloud Identity Premium |
168
166
  cloudsearch | 1010350001 | Cloud Search |
169
167
  colabpro | 1010500001 | Colab Pro |
170
168
  colabpro+ | colabproplus | 1010500002 | Colab Pro+ |
171
169
  eeu | 1010490001 | SKU Endpoint Education Upgrade |
170
+ gaiproedu | geminiedu | 1010470004 | Google AI Pro for Education |
172
171
  geminibiz | 1010470003 | Gemini Business |
173
- geminiedu | 1010470004 | Gemini Education |
174
172
  geminiedupremium| 1010470005 | Gemini Education Premium |
175
173
  geminient| duetai | 1010470001 | Gemini Enterprise |
174
+ geminiultra | 1010470008 | Google AI Ultra for Business |
176
175
  gsuitebasic | gafb | gafw | basic | Google-Apps-For-Business |
177
176
  gsuitebusiness | gau | gsb | unlimited | Google-Apps-Unlimited |
178
177
  gsuitebusinessarchived | gsbau | businessarchived | 1010340002 | Google Workspace Business - Archived User |
@@ -216,7 +215,8 @@
216
215
  wsess | workspaceesentials | gsuiteessentials | essentials | d4e | driveenterprise | drive4enterprise | 1010060001 | Google Workspace Essentials (formerly G Suite Essentials) |
217
216
  wsessplus | workspaceessentialsplus | 1010060005 | Google Workspace Enterprise Essentials Plus |
218
217
  wsflw | workspacefrontline | workspacefrontlineworker | 1010020030 | Google Workspace Frontline Starter |
219
- wsflwstan | workspacefrontlinestan | workspacefrontlineworkerstan | 1010020031 | Google Workspace Frontline Standard
218
+ wsflwstan | workspacefrontlinestan | workspacefrontlineworkerstan | 1010020031 | Google Workspace Frontline Standard |
219
+ wsflwplus | workspacefrontlineplus | workspacefrontlineworkerplus | 1010020034 | Google Workspace Frontline Plus
220
220
  <SKUIDList> ::= "<SKUID>(,<SKUID>)*"
221
221
  ```
222
222
  ## Notes
@@ -3,7 +3,8 @@
3
3
  - [Query documentation](#query-documentation)
4
4
  - [Definitions](#definitions)
5
5
  - [Introduction](#introduction)
6
- - [GUI API permission name mapping](#gui-api-permission-name-mapping)
6
+ - [API GUI permission name mapping](#api-gui-permission-name-mapping)
7
+ - [API GUI restriction name mapping](#api-gui-restriction-name-mapping)
7
8
  - [Display Shared Drive themes](#display-shared-drive-themes)
8
9
  - [Manage Shared Drives](#manage-shared-drives)
9
10
  - [Create a Shared Drive](#create-a-shared-drive)
@@ -207,15 +208,8 @@
207
208
  downloadrestrictedforwriters|downloadrestrictions.restrictedforwriters|
208
209
  drivemembersonly|teammembersonly|
209
210
  sharingfoldersrequiresorganizerpermission
210
-
211
- Each pair of restrictions below are equivalent:
212
-
213
- allowcontentmanagerstosharefolders true
214
- sharingfoldersrequiresorganizerpermission false
215
-
216
- allowcontentmanagerstosharefolders false
217
- sharingfoldersrequiresorganizerpermission true
218
211
  ```
212
+
219
213
  ## Introduction
220
214
  A domain administrator with the Drive and Docs administrator privilege can search for Shared Drives or update permissions for Shared Drives
221
215
  owned by their organization, regardless of the admin's membership in any given Shared Drive.
@@ -225,15 +219,47 @@ Three forms of the commands are available:
225
219
  * `gam <UserTypeEntity> action ... adminaccess` - The user named in `<UserTypeEntty>` is used, adminaccess indicates that the user is a domain administrator
226
220
  * `gam <UserTypeEntity> action ...` - The user named in `<UserTypeEntty>` is used, access is limited to drives for which they are an organizer
227
221
 
228
- ## GUI API permission name mapping
229
-
230
- | GUI setting | API setting |
231
- |------------|------------|
232
- | Manager | organizer |
233
- | Content manager | fileOrganizer |
234
- | Contributor | writer |
235
- | Commenter | commenter |
236
- | Viewer | reader |
222
+ ## API GUI permission name mapping
223
+
224
+ | API setting | GUI setting |
225
+ |-------------|-------------|
226
+ | organizer | Manager |
227
+ | fileOrganizer | Content manager |
228
+ | writer | Contributor |
229
+ | commenter | Commenter |
230
+ | reader | Viewer |
231
+
232
+ ## API GUI restriction name mapping
233
+ | API Setting | Description |
234
+ |-------------|-------------|
235
+ | adminManagedRestrictions | Whether administrative privileges on this shared drive are required to modify restrictions. |
236
+ | domainUsersOnly | Whether access to this shared drive and items inside this shared drive is restricted to users of the domain to which this shared drive belongs. |
237
+ | driveMembersOnly | Whether access to items inside this shared drive is restricted to its members. |
238
+ | allowContentManagersToShareFolders (GAM defined) | If true, users with either the organizer role or the file organizer role can share folders. If false, only users with the organizer role can share folders. |
239
+ | sharingFoldersRequiresOrganizerPermission | If true, only users with the organizer role can share folders. If false, users with either the organizer role or the file organizer role can share folders. |
240
+ | copyRequiresWriterPermission | Whether the options to copy, print, or download files inside this shared drive, should be disabled for readers and commenters. |
241
+ | downloadRestrictions.restrictedForWriters | Whether download and copy is restricted for writers. If true, download is also restricted for readers. |
242
+ | downloadRestrictions.restrictedForReaders | Whether download and copy is restricted for readers. |
243
+
244
+ | API Setting | False | True | GUI Setting | Checked | Unchecked |
245
+ |-------------|-------|------|-------------|---------|-----------|
246
+ | adminManagedRestrictions | X | | Shared drive settings can be modified | | |
247
+ | adminManagedRestrictions | | X | Shared drive settings can **not** be modified | | |
248
+ | | | | **Access** |
249
+ | domainUsersOnly | X | | Allow people outside of Domain name to access files | X | |
250
+ | domainUsersOnly | | X | Allow people outside of Domain name to access files | | X |
251
+ | driveMembersOnly | X | | Allow people who aren't shared drive members to access files | X | |
252
+ | driveMembersOnly | | X | Allow people who aren't shared drive members to access files | | X |
253
+ | | | | **Role permissions** |
254
+ | allowContentManagersToShareFolders | X | | Allow content managers to share folders | | X |
255
+ | allowContentManagersToShareFolders | | X | Allow content managers to share folders | X | |
256
+ | sharingFoldersRequiresOrganizerPermission | X | | Allow content managers to share folders | X | |
257
+ | sharingFoldersRequiresOrganizerPermission | | X | Allow content managers to share folders | | X |
258
+ | | | | **People who can download, copy, and print** |
259
+ | downloadRestrictions.restrictedForWriters | X | | Contributors and content managers | X | |
260
+ | downloadRestrictions.restrictedForWriters | | X | Contributors and content managers | | X |
261
+ | downloadRestrictions.restrictedForReaders | X | | Commenters and viewers | X | |
262
+ | downloadRestrictions.restrictedForReaders | | X | Commenters and viewers | | X |
237
263
 
238
264
  ## Display Shared Drive themes
239
265
  ```