gam7 7.27.3__tar.gz → 7.27.5__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 (303) hide show
  1. {gam7-7.27.3 → gam7-7.27.5}/.github/workflows/build.yml +22 -15
  2. {gam7-7.27.3 → gam7-7.27.5}/PKG-INFO +1 -1
  3. {gam7-7.27.3 → gam7-7.27.5}/src/GamCommands.txt +21 -12
  4. {gam7-7.27.3 → gam7-7.27.5}/src/GamUpdate.txt +15 -0
  5. {gam7-7.27.3 → gam7-7.27.5}/src/gam/__init__.py +114 -43
  6. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glapi.py +0 -6
  7. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glmsgs.py +2 -0
  8. {gam7-7.27.3 → gam7-7.27.5}/wiki/Classroom-Courses.md +4 -1
  9. {gam7-7.27.3 → gam7-7.27.5}/wiki/Cloud-Identity-Groups.md +1 -10
  10. {gam7-7.27.3 → gam7-7.27.5}/wiki/GamUpdates.md +36 -0
  11. {gam7-7.27.3 → gam7-7.27.5}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  12. {gam7-7.27.3 → gam7-7.27.5}/wiki/Reports.md +4 -0
  13. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Chat.md +24 -25
  14. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Gmail-Delegates.md +69 -0
  15. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users.md +17 -20
  16. {gam7-7.27.3 → gam7-7.27.5}/wiki/Version-and-Help.md +6 -6
  17. {gam7-7.27.3 → gam7-7.27.5}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  18. {gam7-7.27.3 → gam7-7.27.5}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  19. {gam7-7.27.3 → gam7-7.27.5}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  20. {gam7-7.27.3 → gam7-7.27.5}/.github/ISSUE_TEMPLATE.txt +0 -0
  21. {gam7-7.27.3 → gam7-7.27.5}/.github/actions/decrypt.sh +0 -0
  22. {gam7-7.27.3 → gam7-7.27.5}/.github/actions/entitlements.plist +0 -0
  23. {gam7-7.27.3 → gam7-7.27.5}/.github/actions/package_exclusions.txt +0 -0
  24. {gam7-7.27.3 → gam7-7.27.5}/.github/stale.yml +0 -0
  25. {gam7-7.27.3 → gam7-7.27.5}/.github/workflows/codeql-analysis.yml +0 -0
  26. {gam7-7.27.3 → gam7-7.27.5}/.github/workflows/get-cacerts.yml +0 -0
  27. {gam7-7.27.3 → gam7-7.27.5}/.github/workflows/pushwiki.yml +0 -0
  28. {gam7-7.27.3 → gam7-7.27.5}/.github/workflows/pypi.yml +0 -0
  29. {gam7-7.27.3 → gam7-7.27.5}/LICENSE +0 -0
  30. {gam7-7.27.3 → gam7-7.27.5}/README.md +0 -0
  31. {gam7-7.27.3 → gam7-7.27.5}/pyproject.toml +0 -0
  32. {gam7-7.27.3 → gam7-7.27.5}/src/.gitignore +0 -0
  33. {gam7-7.27.3 → gam7-7.27.5}/src/LICENSE +0 -0
  34. {gam7-7.27.3 → gam7-7.27.5}/src/README.md +0 -0
  35. {gam7-7.27.3 → gam7-7.27.5}/src/callgam.py +0 -0
  36. {gam7-7.27.3 → gam7-7.27.5}/src/gam/__main__.py +0 -0
  37. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/__init__.py +0 -0
  38. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/auth.py +0 -0
  39. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/client.py +0 -0
  40. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/core.py +0 -0
  41. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/data.py +0 -0
  42. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/http.py +0 -0
  43. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/http_core.py +0 -0
  44. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/http_interface.py +0 -0
  45. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/mock_http.py +0 -0
  46. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/mock_http_core.py +0 -0
  47. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/mock_service.py +0 -0
  48. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/service.py +0 -0
  49. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/token_store.py +0 -0
  50. {gam7-7.27.3 → gam7-7.27.5}/src/gam/atom/url.py +0 -0
  51. {gam7-7.27.3 → gam7-7.27.5}/src/gam/cacerts.pem +0 -0
  52. {gam7-7.27.3 → gam7-7.27.5}/src/gam/cbcm-v1.1beta1.json +0 -0
  53. {gam7-7.27.3 → gam7-7.27.5}/src/gam/contactdelegation-v1.json +0 -0
  54. {gam7-7.27.3 → gam7-7.27.5}/src/gam/datastudio-v1.json +0 -0
  55. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/__init__.py +0 -0
  56. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glaction.py +0 -0
  57. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glcfg.py +0 -0
  58. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glclargs.py +0 -0
  59. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glentity.py +0 -0
  60. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glgapi.py +0 -0
  61. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glgdata.py +0 -0
  62. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glglobals.py +0 -0
  63. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glindent.py +0 -0
  64. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glskus.py +0 -0
  65. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/gluprop.py +0 -0
  66. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/glverlibs.py +0 -0
  67. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gamlib/yubikey.py +0 -0
  68. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/__init__.py +0 -0
  69. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/alt/__init__.py +0 -0
  70. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/alt/app_engine.py +0 -0
  71. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/alt/appengine.py +0 -0
  72. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/apps/__init__.py +0 -0
  73. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/apps/audit/__init__.py +0 -0
  74. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/apps/audit/service.py +0 -0
  75. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  76. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/apps/contacts/service.py +0 -0
  77. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/apps/service.py +0 -0
  78. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/service.py +0 -0
  79. {gam7-7.27.3 → gam7-7.27.5}/src/gam/gdata/urlfetch.py +0 -0
  80. {gam7-7.27.3 → gam7-7.27.5}/src/gam/meet-v2beta.json +0 -0
  81. {gam7-7.27.3 → gam7-7.27.5}/src/gam/serviceaccountlookup-v1.json +0 -0
  82. {gam7-7.27.3 → gam7-7.27.5}/src/gam-install.sh +0 -0
  83. {gam7-7.27.3 → gam7-7.27.5}/src/gam-setup.bat +0 -0
  84. {gam7-7.27.3 → gam7-7.27.5}/src/gam.exe.manifest +0 -0
  85. {gam7-7.27.3 → gam7-7.27.5}/src/gam.py +0 -0
  86. {gam7-7.27.3 → gam7-7.27.5}/src/gam.spec +0 -0
  87. {gam7-7.27.3 → gam7-7.27.5}/src/gam.wxs +0 -0
  88. {gam7-7.27.3 → gam7-7.27.5}/src/license.rtf +0 -0
  89. {gam7-7.27.3 → gam7-7.27.5}/src/tools/a_atleast_b.py +0 -0
  90. {gam7-7.27.3 → gam7-7.27.5}/src/tools/gen-wix-xml-filelist.py +0 -0
  91. {gam7-7.27.3 → gam7-7.27.5}/src/tools/hooks/hook-googleapiclient.model.py +0 -0
  92. {gam7-7.27.3 → gam7-7.27.5}/src/tools/hooks/hook-httplib2.py +0 -0
  93. {gam7-7.27.3 → gam7-7.27.5}/src/tools/mkGamRef.py +0 -0
  94. {gam7-7.27.3 → gam7-7.27.5}/src/tools/openssl.props +0 -0
  95. {gam7-7.27.3 → gam7-7.27.5}/src/tools/ssd.mjs +0 -0
  96. {gam7-7.27.3 → gam7-7.27.5}/src/version_info.txt.in +0 -0
  97. {gam7-7.27.3 → gam7-7.27.5}/wiki/00scratch.md +0 -0
  98. {gam7-7.27.3 → gam7-7.27.5}/wiki/Addresses.md +0 -0
  99. {gam7-7.27.3 → gam7-7.27.5}/wiki/Administrators.md +0 -0
  100. {gam7-7.27.3 → gam7-7.27.5}/wiki/Alert-Center.md +0 -0
  101. {gam7-7.27.3 → gam7-7.27.5}/wiki/Aliases.md +0 -0
  102. {gam7-7.27.3 → gam7-7.27.5}/wiki/Authorization.md +0 -0
  103. {gam7-7.27.3 → gam7-7.27.5}/wiki/BNF-Syntax.md +0 -0
  104. {gam7-7.27.3 → gam7-7.27.5}/wiki/Basic-Items.md +0 -0
  105. {gam7-7.27.3 → gam7-7.27.5}/wiki/Bulk-Processing.md +0 -0
  106. {gam7-7.27.3 → gam7-7.27.5}/wiki/Business-Account-Management.md +0 -0
  107. {gam7-7.27.3 → gam7-7.27.5}/wiki/CSV-Input-Filtering.md +0 -0
  108. {gam7-7.27.3 → gam7-7.27.5}/wiki/CSV-Output-Filtering.md +0 -0
  109. {gam7-7.27.3 → gam7-7.27.5}/wiki/CSV-Special-Characters.md +0 -0
  110. {gam7-7.27.3 → gam7-7.27.5}/wiki/Calendars-Access.md +0 -0
  111. {gam7-7.27.3 → gam7-7.27.5}/wiki/Calendars-Events.md +0 -0
  112. {gam7-7.27.3 → gam7-7.27.5}/wiki/Calendars.md +0 -0
  113. {gam7-7.27.3 → gam7-7.27.5}/wiki/Chat-Bot-Setup-Use.md +0 -0
  114. {gam7-7.27.3 → gam7-7.27.5}/wiki/Chrome-AUE-Counts.md +0 -0
  115. {gam7-7.27.3 → gam7-7.27.5}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  116. {gam7-7.27.3 → gam7-7.27.5}/wiki/Chrome-Installed-Apps.md +0 -0
  117. {gam7-7.27.3 → gam7-7.27.5}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  118. {gam7-7.27.3 → gam7-7.27.5}/wiki/Chrome-Policies.md +0 -0
  119. {gam7-7.27.3 → gam7-7.27.5}/wiki/Chrome-Printers.md +0 -0
  120. {gam7-7.27.3 → gam7-7.27.5}/wiki/Chrome-Profile-Management.md +0 -0
  121. {gam7-7.27.3 → gam7-7.27.5}/wiki/Chrome-Version-Counts.md +0 -0
  122. {gam7-7.27.3 → gam7-7.27.5}/wiki/Chrome-Version-History.md +0 -0
  123. {gam7-7.27.3 → gam7-7.27.5}/wiki/ChromeOS-Devices.md +0 -0
  124. {gam7-7.27.3 → gam7-7.27.5}/wiki/Classroom-Guardians.md +0 -0
  125. {gam7-7.27.3 → gam7-7.27.5}/wiki/Classroom-Invitations.md +0 -0
  126. {gam7-7.27.3 → gam7-7.27.5}/wiki/Classroom-Membership.md +0 -0
  127. {gam7-7.27.3 → gam7-7.27.5}/wiki/Classroom-StudentGroups.md +0 -0
  128. {gam7-7.27.3 → gam7-7.27.5}/wiki/Cloud-Channel.md +0 -0
  129. {gam7-7.27.3 → gam7-7.27.5}/wiki/Cloud-Identity-Devices.md +0 -0
  130. {gam7-7.27.3 → gam7-7.27.5}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  131. {gam7-7.27.3 → gam7-7.27.5}/wiki/Cloud-Identity-Policies.md +0 -0
  132. {gam7-7.27.3 → gam7-7.27.5}/wiki/Cloud-Storage.md +0 -0
  133. {gam7-7.27.3 → gam7-7.27.5}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  134. {gam7-7.27.3 → gam7-7.27.5}/wiki/Collections-of-Items.md +0 -0
  135. {gam7-7.27.3 → gam7-7.27.5}/wiki/Collections-of-Users.md +0 -0
  136. {gam7-7.27.3 → gam7-7.27.5}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  137. {gam7-7.27.3 → gam7-7.27.5}/wiki/Command-Line-Parsing.md +0 -0
  138. {gam7-7.27.3 → gam7-7.27.5}/wiki/Command-Logging-Progress.md +0 -0
  139. {gam7-7.27.3 → gam7-7.27.5}/wiki/Context-Aware-Access-Levels.md +0 -0
  140. {gam7-7.27.3 → gam7-7.27.5}/wiki/Customer.md +0 -0
  141. {gam7-7.27.3 → gam7-7.27.5}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  142. {gam7-7.27.3 → gam7-7.27.5}/wiki/Domain-SharedContacts.md +0 -0
  143. {gam7-7.27.3 → gam7-7.27.5}/wiki/Domains-Verification.md +0 -0
  144. {gam7-7.27.3 → gam7-7.27.5}/wiki/Domains.md +0 -0
  145. {gam7-7.27.3 → gam7-7.27.5}/wiki/Downloads-Installs.md +0 -0
  146. {gam7-7.27.3 → gam7-7.27.5}/wiki/Drive-File-Selection.md +0 -0
  147. {gam7-7.27.3 → gam7-7.27.5}/wiki/Drive-Items.md +0 -0
  148. {gam7-7.27.3 → gam7-7.27.5}/wiki/Drive-REST-API-v3.md +0 -0
  149. {gam7-7.27.3 → gam7-7.27.5}/wiki/Email-Audit-Monitor.md +0 -0
  150. {gam7-7.27.3 → gam7-7.27.5}/wiki/Find-File-Owner.md +0 -0
  151. {gam7-7.27.3 → gam7-7.27.5}/wiki/GAM-Public-Chat-Room.md +0 -0
  152. {gam7-7.27.3 → gam7-7.27.5}/wiki/GAM-Release-Process.md +0 -0
  153. {gam7-7.27.3 → gam7-7.27.5}/wiki/GAM-Return-Codes.md +0 -0
  154. {gam7-7.27.3 → gam7-7.27.5}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  155. {gam7-7.27.3 → gam7-7.27.5}/wiki/GAM7-FAQ.md +0 -0
  156. {gam7-7.27.3 → gam7-7.27.5}/wiki/GAM7-on-Android-Devices.md +0 -0
  157. {gam7-7.27.3 → gam7-7.27.5}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  158. {gam7-7.27.3 → gam7-7.27.5}/wiki/Global-Address-List.md +0 -0
  159. {gam7-7.27.3 → gam7-7.27.5}/wiki/Google-Data-Transfers.md +0 -0
  160. {gam7-7.27.3 → gam7-7.27.5}/wiki/Google-Network-Addresses.md +0 -0
  161. {gam7-7.27.3 → gam7-7.27.5}/wiki/Groups-Membership.md +0 -0
  162. {gam7-7.27.3 → gam7-7.27.5}/wiki/Groups.md +0 -0
  163. {gam7-7.27.3 → gam7-7.27.5}/wiki/HTTPS-Proxy.md +0 -0
  164. {gam7-7.27.3 → gam7-7.27.5}/wiki/Home.md +0 -0
  165. {gam7-7.27.3 → gam7-7.27.5}/wiki/How-to-Install-GAM7.md +0 -0
  166. {gam7-7.27.3 → gam7-7.27.5}/wiki/How-to-Uninstall-GAM7.md +0 -0
  167. {gam7-7.27.3 → gam7-7.27.5}/wiki/How-to-Update-GAM7.md +0 -0
  168. {gam7-7.27.3 → gam7-7.27.5}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  169. {gam7-7.27.3 → gam7-7.27.5}/wiki/Inbound-SSO.md +0 -0
  170. {gam7-7.27.3 → gam7-7.27.5}/wiki/Install-GAM-as-Python-Library.md +0 -0
  171. {gam7-7.27.3 → gam7-7.27.5}/wiki/Licenses.md +0 -0
  172. {gam7-7.27.3 → gam7-7.27.5}/wiki/List-Items.md +0 -0
  173. {gam7-7.27.3 → gam7-7.27.5}/wiki/List.md +0 -0
  174. {gam7-7.27.3 → gam7-7.27.5}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  175. {gam7-7.27.3 → gam7-7.27.5}/wiki/Mobile-Devices.md +0 -0
  176. {gam7-7.27.3 → gam7-7.27.5}/wiki/Organizational-Units.md +0 -0
  177. {gam7-7.27.3 → gam7-7.27.5}/wiki/Other-Resources.md +0 -0
  178. {gam7-7.27.3 → gam7-7.27.5}/wiki/Permission-Matches.md +0 -0
  179. {gam7-7.27.3 → gam7-7.27.5}/wiki/Python-Regular-Expressions.md +0 -0
  180. {gam7-7.27.3 → gam7-7.27.5}/wiki/README.md +0 -0
  181. {gam7-7.27.3 → gam7-7.27.5}/wiki/Rclone.md +0 -0
  182. {gam7-7.27.3 → gam7-7.27.5}/wiki/Reseller.md +0 -0
  183. {gam7-7.27.3 → gam7-7.27.5}/wiki/Resources.md +0 -0
  184. {gam7-7.27.3 → gam7-7.27.5}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  185. {gam7-7.27.3 → gam7-7.27.5}/wiki/SSL-Root-CA-Certificates.md +0 -0
  186. {gam7-7.27.3 → gam7-7.27.5}/wiki/Schemas.md +0 -0
  187. {gam7-7.27.3 → gam7-7.27.5}/wiki/Scripts.md +0 -0
  188. {gam7-7.27.3 → gam7-7.27.5}/wiki/Send-Email.md +0 -0
  189. {gam7-7.27.3 → gam7-7.27.5}/wiki/Shared-Drives.md +0 -0
  190. {gam7-7.27.3 → gam7-7.27.5}/wiki/Sites.md +0 -0
  191. {gam7-7.27.3 → gam7-7.27.5}/wiki/Tag-Replace.md +0 -0
  192. {gam7-7.27.3 → gam7-7.27.5}/wiki/Todrive.md +0 -0
  193. {gam7-7.27.3 → gam7-7.27.5}/wiki/Unmanaged-Accounts.md +0 -0
  194. {gam7-7.27.3 → gam7-7.27.5}/wiki/Upgrade-Benefits.md +0 -0
  195. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Analytics-Admin.md +0 -0
  196. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Application-Specific-Passwords.md +0 -0
  197. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Backup-Verification-Codes.md +0 -0
  198. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Calendars-Access.md +0 -0
  199. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Calendars-Events.md +0 -0
  200. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Calendars.md +0 -0
  201. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Classification-Labels.md +0 -0
  202. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Classroom-Profile.md +0 -0
  203. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Contacts-Delegates.md +0 -0
  204. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Contacts.md +0 -0
  205. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Deprovision.md +0 -0
  206. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Activity-Settings.md +0 -0
  207. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Cleanup.md +0 -0
  208. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Comments.md +0 -0
  209. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Copy-Move.md +0 -0
  210. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Files-Display.md +0 -0
  211. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Files-Manage.md +0 -0
  212. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Orphans.md +0 -0
  213. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Ownership.md +0 -0
  214. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Permissions.md +0 -0
  215. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Query.md +0 -0
  216. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Revisions.md +0 -0
  217. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Shortcuts.md +0 -0
  218. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Drive-Transfer.md +0 -0
  219. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Forms.md +0 -0
  220. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Gmail-CSE.md +0 -0
  221. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Gmail-Filters.md +0 -0
  222. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Gmail-Forwarding.md +0 -0
  223. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Gmail-Labels.md +0 -0
  224. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  225. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Gmail-Profile.md +0 -0
  226. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Gmail-S-MIME.md +0 -0
  227. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  228. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Gmail-Settings.md +0 -0
  229. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Group-Membership.md +0 -0
  230. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Keep-Notes.md +0 -0
  231. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Looker-Studio.md +0 -0
  232. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Meet.md +0 -0
  233. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-People-Contacts-Profiles.md +0 -0
  234. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Photo.md +0 -0
  235. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Profile-Photo.md +0 -0
  236. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Profile-Sharing.md +0 -0
  237. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Shared-Drives.md +0 -0
  238. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  239. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Spreadsheets.md +0 -0
  240. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Tag-Manager.md +0 -0
  241. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Tasks.md +0 -0
  242. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Tokens.md +0 -0
  243. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-Web-Resources-and-Sites.md +0 -0
  244. {gam7-7.27.3 → gam7-7.27.5}/wiki/Users-YouTube.md +0 -0
  245. {gam7-7.27.3 → gam7-7.27.5}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  246. {gam7-7.27.3 → gam7-7.27.5}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  247. {gam7-7.27.3 → gam7-7.27.5}/wiki/Using-GAM7-with-keyless-authentication-Workload-Identity-Federation.md +0 -0
  248. {gam7-7.27.3 → gam7-7.27.5}/wiki/Vault-Takeout.md +0 -0
  249. {gam7-7.27.3 → gam7-7.27.5}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  250. {gam7-7.27.3 → gam7-7.27.5}/wiki/_Sidebar.md +0 -0
  251. {gam7-7.27.3 → gam7-7.27.5}/wiki/gam.cfg.md +0 -0
  252. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-AdminSettingsExamples.md +0 -0
  253. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Android-Installation.md +0 -0
  254. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-BulkOperations.md +0 -0
  255. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-CalendarExamples.md +0 -0
  256. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Chat-Bot.md +0 -0
  257. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Chrome-Browser-Management.md +0 -0
  258. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Chrome-OS-Installation.md +0 -0
  259. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Chrome-Policy-Settings.md +0 -0
  260. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Cloud-Identity-Groups.md +0 -0
  261. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Command-Reference-Calendar-Resources.md +0 -0
  262. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Command-Reference-Calendars.md +0 -0
  263. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Command-Reference-Definitions.md +0 -0
  264. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Command-Reference-Drive.md +0 -0
  265. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Command-Reference-Email.md +0 -0
  266. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Command-Reference-Group-Attributes.md +0 -0
  267. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Command-Reference-Groups.md +0 -0
  268. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Command-Reference-Users.md +0 -0
  269. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Context-Aware-Access-Levels.md +0 -0
  270. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  271. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-CreatingClientSecretsFile.md +0 -0
  272. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Custom-Schemas.md +0 -0
  273. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Data-Transfers.md +0 -0
  274. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-DomainVerification.md +0 -0
  275. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-ExamplesAccountAuditing.md +0 -0
  276. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-ExamplesCSV.md +0 -0
  277. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-ExamplesEmailSettings.md +0 -0
  278. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-ExamplesOrganizations.md +0 -0
  279. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-GAM-Discussion-Group.md +0 -0
  280. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  281. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-GAM-options-files.md +0 -0
  282. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-GAM-with--minimal-GCP-rights.md +0 -0
  283. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-GAM3CSVListings.md +0 -0
  284. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-GAM3DirectoryCommands.md +0 -0
  285. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-GAM3GroupSettings.md +0 -0
  286. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Google-Vault---Takeout-Commands.md +0 -0
  287. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-GoogleDriveManagement.md +0 -0
  288. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Grouping-18-or-Older-Users.md +0 -0
  289. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Home.md +0 -0
  290. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  291. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Inbound-SSO-Settings.md +0 -0
  292. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-LicenseExamples.md +0 -0
  293. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Managing-Admins.md +0 -0
  294. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Managing-CloudPrint-Printers.md +0 -0
  295. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Managing-Devices.md +0 -0
  296. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Managing-Google-Classroom.md +0 -0
  297. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-OAuthKeyManagement.md +0 -0
  298. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Printers.md +0 -0
  299. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-ResellerCommands.md +0 -0
  300. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-SecurityExamples.md +0 -0
  301. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-UnmanagedUsersExamples.md +0 -0
  302. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  303. {gam7-7.27.3 → gam7-7.27.5}/wiki/legacy/l-_Footer.md +0 -0
@@ -479,24 +479,16 @@ jobs:
479
479
  "${PYTHON}" -V
480
480
  "${PYTHON}" -c "import ssl; print(f'Using {ssl.OPENSSL_VERSION}')"
481
481
 
482
- - name: Upgrade pip, wheel, etc
483
- run: |
484
- curl $curl_retry -O https://bootstrap.pypa.io/get-pip.py
485
- "$PYTHON" get-pip.py
486
- "$PYTHON" -m pip install --upgrade pip
487
- "$PYTHON" -m pip install --upgrade wheel
488
- "$PYTHON" -m pip install --upgrade setuptools
489
- "$PYTHON" -m pip install --upgrade importlib-metadata
490
- "$PYTHON" -m pip install --upgrade setuptools-scm
491
- "$PYTHON" -m pip list
492
-
493
482
  - name: Create and use Python venv
494
483
  run: |
495
484
  cd "$GITHUB_WORKSPACE"
485
+ curl -o get-pip.py https://bootstrap.pypa.io/get-pip.py
486
+ "$PYTHON" get-pip.py
496
487
  "$PYTHON" -m venv venv
497
488
  if [[ "$RUNNER_OS" == "Windows" ]]; then
498
- # hack till pyscard has a wheel for win arm64
499
- "$PYTHON" -m pip install --upgrade --force-reinstall pyscard
489
+ # pyscard seems to build outside venv but not in it.
490
+ # build it so it's cached.
491
+ "$PYTHON" -m pip install --upgrade pyscard
500
492
  export PYTHON="${GITHUB_WORKSPACE}/venv/scripts/python.exe"
501
493
  else
502
494
  export PYTHON="${GITHUB_WORKSPACE}/venv/bin/python3"
@@ -507,6 +499,18 @@ jobs:
507
499
  echo "gam=${gam}" >> $GITHUB_ENV
508
500
  fi
509
501
 
502
+ - name: Upgrade pip, wheel, etc
503
+ run: |
504
+ curl $curl_retry -O https://bootstrap.pypa.io/get-pip.py
505
+ "$PYTHON" get-pip.py
506
+ "$PYTHON" -m pip install --upgrade pip
507
+ "$PYTHON" -m pip install --upgrade wheel
508
+ "$PYTHON" -m pip install --upgrade setuptools
509
+ "$PYTHON" -m pip install --upgrade importlib-metadata
510
+ "$PYTHON" -m pip install --upgrade setuptools-scm
511
+ "$PYTHON" -m pip install --upgrade packaging
512
+ "$PYTHON" -m pip list
513
+
510
514
  - name: Install pip requirements
511
515
  run: |
512
516
  echo "before anything..."
@@ -515,7 +519,10 @@ jobs:
515
519
  "$PYTHON" -m pip cache info
516
520
  echo "--list--"
517
521
  "$PYTHON" -m pip cache list
518
- "$PYTHON" -m pip install --upgrade ..[yubikey]
522
+ echo "--pip debug verbose--"
523
+ "$PYTHON" -m pip debug --verbose
524
+ echo "--------"
525
+ "$PYTHON" -m pip install -vvv --upgrade ..[yubikey]
519
526
  echo "after everything..."
520
527
  "$PYTHON" -m pip list
521
528
 
@@ -987,7 +994,7 @@ jobs:
987
994
  $gam report usageparameters customer
988
995
  $gam report usage customer parameters gmail:num_emails_sent,accounts:num_1day_logins
989
996
  $gam report customer todrive tdnobrowser
990
- #$gam report users fields accounts:is_less_secure_apps_access_allowed,gmail:last_imap_time,gmail:last_pop_time filters "accounts:last_login_time>2019-01-01T00:00:00.000Z" todrive tdnobrowser
997
+ #$gam report users fields accounts:is_less_secure_apps_access_allowed,gmail:last_imap_time,gmail:last_pop_time filters "accounts:last_login_time>2025-01-01T00:00:00.000Z" todrive tdnobrowser
991
998
  $gam report users todrive tdnobrowser
992
999
  $gam report admin start -3d todrive tdnobrowser
993
1000
  $gam print devices nopersonaldevices nodeviceusers filter "serial:$JID$JID$JID$JID-" | $gam csv - gam delete device id ~name
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.27.3
3
+ Version: 7.27.5
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
@@ -3279,6 +3279,7 @@ gam print courses [todrive <ToDriveAttribute>*]
3279
3279
  [show all|students|teachers] [countsonly]
3280
3280
  [timefilter creationtime|updatetime] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
3281
3281
  [fields <CourseFieldNameList>] [skipfields <CourseFieldNameList>]
3282
+ (addcsvdata <FieldName> <String>)*
3282
3283
  [formatjson [quotechar <Character>]]
3283
3284
  [showitemcountonly]
3284
3285
 
@@ -5776,10 +5777,9 @@ gam create|add user <EmailAddress> [ignorenullpassword] <UserAttribute>*
5776
5777
  [[notify <EmailAddressList>] [notifyrecoveryemail]
5777
5778
  [subject <String>]
5778
5779
  [notifypassword <String>]
5779
- [from <EmailAaddress>]
5780
- [mailbox <EmailAaddress>]
5780
+ [from <EmailAaddress>] [mailbox <EmailAaddress>]
5781
5781
  [replyto <EmailAaddress>]
5782
- [<NotifyMessageContent>]
5782
+ [<NotifyMessageContent>] [html [<Boolean>]]
5783
5783
  (replace <Tag> <UserReplacement>)*
5784
5784
  (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
5785
5785
  ]
@@ -5802,10 +5802,9 @@ gam update user <UserItem> [ignorenullpassword] <UserAttribute>*
5802
5802
  [[notify <EmailAddressList>] [notifyrecoveryemail]
5803
5803
  [subject <String>]
5804
5804
  [notifypassword <String>]
5805
- [from <EmailAaddress>]
5806
- [mailbox <EmailAddress>]
5805
+ [from <EmailAaddress>] [mailbox <EmailAddress>]
5807
5806
  [replyto <EmailAddress>]
5808
- [<NotifyMessageContent>]
5807
+ [<NotifyMessageContent>] [html [<Boolean>]]
5809
5808
  (replace <Tag> <UserReplacement>)*
5810
5809
  (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
5811
5810
  ]
@@ -5840,10 +5839,9 @@ gam update users <UserTypeEntity> [ignorenullpassword] <UserAttribute>*
5840
5839
  [[notify <EmailAddressList>] [notifyrecoveryemail]
5841
5840
  [subject <String>]
5842
5841
  [notifypassword <String>]
5843
- [from <EmailAddress>]
5844
- [mailbox <EmailAddress>]
5842
+ [from <EmailAddress>] [mailbox <EmailAddress>]
5845
5843
  [replyto <EmailAaddress>]
5846
- [<NotifyMessageContent>]
5844
+ [<NotifyMessageContent>] [html [<Boolean>]]
5847
5845
  (replace <Tag> <UserReplacement>)*
5848
5846
  (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
5849
5847
  ]
@@ -5877,10 +5875,9 @@ gam <UserTypeEntity> update users [ignorenullpassword] <UserAttribute>*
5877
5875
  [[notify <EmailAddressList>] [notifyrecoveryemail]
5878
5876
  [subject <String>]
5879
5877
  [notifypassword <String>]
5880
- [from <EmailAaddress>]
5881
- [mailbox <EmailAddress>]
5878
+ [from <EmailAaddress>] [mailbox <EmailAddress>]
5882
5879
  [replyto <EmailAddress>]
5883
- [<NotifyMessageContent>]
5880
+ [<NotifyMessageContent>] [html [<Boolean>]]
5884
5881
  (replace <Tag> <UserReplacement>)*
5885
5882
  (replaceregex <RESearchPattern> <RESubstitution> <Tag> <UserReplacement>)*
5886
5883
  ]
@@ -7579,7 +7576,19 @@ gam <UserTypeEntity> deprovision|deprov [popimap] [signout] [turnoff2sv]
7579
7576
  # Users - Gmail - Delegates
7580
7577
 
7581
7578
  gam <UserTypeEntity> delegate to [convertalias] <UserEntity>
7579
+ [notify [<Boolean>]
7580
+ [subject <String>]
7581
+ [from <EmailAaddress>] [mailbox <EmailAddress>]
7582
+ [replyto <EmailAaddress>]
7583
+ [<NotifyMessageContent>] [html [<Boolean>]]
7584
+ ]
7582
7585
  gam <UserTypeEntity> create|add delegate|delegates [convertalias] <UserEntity>
7586
+ [notify [<Boolean>]
7587
+ [subject <String>]
7588
+ [from <EmailAaddress>] [mailbox <EmailAddress>]
7589
+ [replyto <EmailAaddress>]
7590
+ [<NotifyMessageContent>] [html [<Boolean>]]
7591
+ ]
7583
7592
  gam <UserTypeEntity> delete delegate|delegates [convertalias] <UserEntity>
7584
7593
  gam <UserTypeEntity> update delegate|delegates [convertalias] [<UserEntity>]
7585
7594
  gam <UserTypeEntity> show delegates|delegate [shownames] [csv]
@@ -1,3 +1,18 @@
1
+ 7.27.05
2
+
3
+ Added option `addcsvdata <FieldName> <String>` to `gam print courses`
4
+ that adds additional columns of data to the CSV file output.
5
+
6
+ The following scope is no longer necessary: `Cloud Identity API - Groups Beta (Enables group locking/unlocking)`
7
+ as this scope `Cloud Identity API - Groups` now provides group locking/unlocking.
8
+
9
+ 7.27.04
10
+
11
+ Added options to `gam <UserTypeEntity> create delegate` that support
12
+ sending email notifications when a user adds a delegate.
13
+
14
+ * See: https://github.com/GAM-team/GAM/wiki/Users-Gmail-Delegates#delegation-notification
15
+
1
16
  7.27.03
2
17
 
3
18
  Updated `gam <UserTypeEntity> create|update|sync chatmember` role specification to `role member|manager|owner`.
@@ -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.27.03'
28
+ __version__ = '7.27.05'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -35921,7 +35921,7 @@ def doPrintShowGroupTree():
35921
35921
  # gam create cigroup <EmailAddress>
35922
35922
  # [copyfrom <GroupItem>] <GroupAttribute>
35923
35923
  # [makeowner] [alias|aliases <CIGroupAliasList>]
35924
- # [security|makesecuritygroup]
35924
+ # [security|makesecuritygroup] [locked]
35925
35925
  # [dynamic <QueryDynamicGroup>]
35926
35926
  def doCreateCIGroup():
35927
35927
  doCreateGroup(ciGroupsAPI=True)
@@ -36105,7 +36105,6 @@ def doUpdateCIGroups():
36105
36105
 
36106
36106
  cd = buildGAPIObject(API.DIRECTORY)
36107
36107
  ci = buildGAPIObject(API.CLOUDIDENTITY_GROUPS)
36108
- cib = None
36109
36108
  entityType = Ent.CLOUD_IDENTITY_GROUP
36110
36109
  csvPF = None
36111
36110
  getBeforeUpdate = preview = False
@@ -36214,7 +36213,6 @@ def doUpdateCIGroups():
36214
36213
  _, name, _ = convertGroupEmailToCloudID(ci, group, i, count)
36215
36214
  if not name:
36216
36215
  continue
36217
- cipl = ci
36218
36216
  twoUpdates = False
36219
36217
  if 'labels' in ci_body or lockGroup is not None:
36220
36218
  try:
@@ -36243,20 +36241,16 @@ def doUpdateCIGroups():
36243
36241
  else:
36244
36242
  if CIGROUP_LOCKED_LABEL in ci_body['labels']:
36245
36243
  ci_body['labels'].pop(CIGROUP_LOCKED_LABEL)
36246
- if CIGROUP_LOCKED_LABEL in ci_body['labels']:
36247
- if cib is None:
36248
- cib = buildGAPIObject(API.CLOUDIDENTITY_GROUPS_BETA)
36249
- cipl = cib
36250
36244
  if ci_body:
36251
36245
  try:
36252
36246
  if twoUpdates:
36253
36247
  ci_body['labels'].pop(CIGROUP_LOCKED_LABEL)
36254
- callGAPI(cipl.groups(), 'patch',
36248
+ callGAPI(ci.groups(), 'patch',
36255
36249
  throwReasons=GAPI.CIGROUP_UPDATE_THROW_REASONS,
36256
36250
  retryReasons=GAPI.CIGROUP_RETRY_REASONS,
36257
36251
  name=name, body=ci_body, updateMask=','.join(list(ci_body.keys())))
36258
36252
  ci_body['labels'][CIGROUP_LOCKED_LABEL] = ''
36259
- callGAPI(cipl.groups(), 'patch',
36253
+ callGAPI(ci.groups(), 'patch',
36260
36254
  throwReasons=GAPI.CIGROUP_UPDATE_THROW_REASONS,
36261
36255
  retryReasons=GAPI.CIGROUP_RETRY_REASONS,
36262
36256
  name=name, body=ci_body, updateMask=','.join(list(ci_body.keys())))
@@ -37240,20 +37234,17 @@ def doPrintCIGroups():
37240
37234
  else:
37241
37235
  getFullFieldsList = list(CIGROUP_FULL_FIELDS)
37242
37236
  getFullFields = ','.join(getFullFieldsList)#
37243
- cipl = ci
37244
37237
  if query:
37245
37238
  method = 'search'
37246
37239
  if 'parent' not in query:
37247
37240
  query += f" && parent == '{parent}'"
37248
37241
  kwargs = {'query': query}
37249
- if CIGROUP_LOCKED_LABEL in query:
37250
- cipl = buildGAPIObject(API.CLOUDIDENTITY_GROUPS_BETA)
37251
37242
  else:
37252
37243
  method = 'list'
37253
37244
  kwargs = {'parent': parent}
37254
37245
  printGettingAllAccountEntities(Ent.CLOUD_IDENTITY_GROUP, query)
37255
37246
  try:
37256
- entityList = callGAPIpages(cipl.groups(), method, 'groups',
37247
+ entityList = callGAPIpages(ci.groups(), method, 'groups',
37257
37248
  pageMessage=getPageMessage(showFirstLastItems=True), messageAttribute=['groupKey', 'id'],
37258
37249
  throwReasons=GAPI.CIGROUP_LIST_THROW_REASONS, retryReasons=GAPI.CIGROUP_RETRY_REASONS,
37259
37250
  view='FULL', fields=fieldsnp, pageSize=pageSize, **kwargs)
@@ -44236,6 +44227,28 @@ USER_JSON_SKIP_FIELDS = ['agreedToTerms', 'aliases', 'creationTime', 'customerId
44236
44227
 
44237
44228
  ALLOW_EMPTY_CUSTOM_TYPE = 'allowEmptyCustomType'
44238
44229
 
44230
+ def getNotifyArguments(myarg, notify, userNotification):
44231
+ if myarg == 'notify':
44232
+ if userNotification:
44233
+ notify['recipients'].extend(getNormalizedEmailAddressEntity(shlexSplit=True, noLower=True))
44234
+ else: #delegateNotificatiomn
44235
+ notify['notify'] = getBoolean()
44236
+ elif myarg == 'subject':
44237
+ notify['subject'] = getString(Cmd.OB_STRING)
44238
+ elif myarg in SORF_MSG_FILE_ARGUMENTS:
44239
+ notify['message'], notify['charset'], notify['html'] = getStringOrFile(myarg)
44240
+ elif myarg == 'html':
44241
+ notify['html'] = getBoolean()
44242
+ elif myarg == 'from':
44243
+ notify['from'] = getString(Cmd.OB_EMAIL_ADDRESS)
44244
+ elif myarg == 'mailbox':
44245
+ notify['mailbox'] = getString(Cmd.OB_EMAIL_ADDRESS)
44246
+ elif myarg == 'replyto':
44247
+ notify['replyto'] = getString(Cmd.OB_EMAIL_ADDRESS)
44248
+ else:
44249
+ return False
44250
+ return True
44251
+
44239
44252
  def getUserAttributes(cd, updateCmd, noUid=False):
44240
44253
  def getKeywordAttribute(keywords, attrdict, **opts):
44241
44254
  if Cmd.ArgumentsRemaining():
@@ -44351,22 +44364,10 @@ def getUserAttributes(cd, updateCmd, noUid=False):
44351
44364
  resolveConflictAccount = True
44352
44365
  while Cmd.ArgumentsRemaining():
44353
44366
  myarg = getArgument()
44354
- if myarg == 'notify':
44355
- notify['recipients'].extend(getNormalizedEmailAddressEntity(shlexSplit=True, noLower=True))
44367
+ if getNotifyArguments(myarg, notify, True):
44368
+ pass
44356
44369
  elif myarg == 'notifyrecoveryemail':
44357
44370
  parameters['notifyRecoveryEmail'] = True
44358
- elif myarg == 'subject':
44359
- notify['subject'] = getString(Cmd.OB_STRING)
44360
- elif myarg in SORF_MSG_FILE_ARGUMENTS:
44361
- notify['message'], notify['charset'], notify['html'] = getStringOrFile(myarg)
44362
- elif myarg == 'html':
44363
- notify['html'] = getBoolean()
44364
- elif myarg == 'from':
44365
- notify['from'] = getString(Cmd.OB_EMAIL_ADDRESS)
44366
- elif myarg == 'replyto':
44367
- notify['replyto'] = getString(Cmd.OB_EMAIL_ADDRESS)
44368
- elif myarg == 'mailbox':
44369
- notify['mailbox'] = getString(Cmd.OB_EMAIL_ADDRESS)
44370
44371
  elif PwdOpts.ProcessArgument(myarg, notify, notFoundBody):
44371
44372
  pass
44372
44373
  elif _getTagReplacement(myarg, tagReplacements, True):
@@ -44772,12 +44773,12 @@ def createUserAddAliases(cd, user, aliasList, i, count):
44772
44773
  # [license <SKUID> [product|productid <ProductID>]]
44773
44774
  # [[notify <EmailAddressList>] [notifyrecoveryemail]
44774
44775
  # [subject <String>]
44775
- # [notifypassword <String>]
44776
- # [from <EmailAaddress>]
44776
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
44777
44777
  # [replyto <EmailAaddress>]
44778
- # [<NotifyMessageContent>]
44779
- # (replace <Tag> <UserReplacement>)*
44780
- # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
44778
+ # [notifypassword <String>]
44779
+ # [<NotifyMessageContent>] [html [<Boolean>]]
44780
+ # (replace <Tag> <UserReplacement>)*
44781
+ # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
44781
44782
  # [logpassword <FileName>] [ignorenullpassword]
44782
44783
  # [addnumericsuffixonduplicate <Number>]
44783
44784
  def doCreateUser():
@@ -44876,12 +44877,12 @@ def verifyUserPrimaryEmail(cd, user, createIfNotFound, i, count):
44876
44877
  # [alias|aliases <EmailAddressList>]
44877
44878
  # [[notify <EmailAddressList>] [notifyrecoveryemail]
44878
44879
  # [subject <String>]
44879
- # [notifypassword <String>]
44880
- # [from <EmailAaddress>]
44880
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
44881
44881
  # [replyto <EmailAaddress>]
44882
- # [<NotifyMessageContent>
44882
+ # [<NotifyMessageContent> [html [<Boolean>]]
44883
44883
  # (replace <Tag> <UserReplacement>)*
44884
44884
  # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
44885
+ # [notifypassword <String>]]
44885
44886
  # [notifyonupdate [<Boolean>]]
44886
44887
  # [logpassword <FileName>] [ignorenullpassword]
44887
44888
  def updateUsers(entityList):
@@ -49156,6 +49157,7 @@ def _getCoursesInfo(croom, courseSelectionParameters, courseShowProperties, getO
49156
49157
  # [show none|all|students|teachers] [countsonly]
49157
49158
  # [fields <CourseFieldNameList>] [skipfields <CourseFieldNameList>]
49158
49159
  # [timefilter creationtime|updatetime] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
49160
+ # (addcsvdata <FieldName> <String>)*
49159
49161
  # [showitemcountonly] [formatjson [quotechar <Character>]]
49160
49162
  def doPrintCourses():
49161
49163
  def _saveParticipants(course, participants, role, rtitles):
@@ -49199,6 +49201,7 @@ def doPrintCourses():
49199
49201
  delimiter = GC.Values[GC.CSV_OUTPUT_FIELD_DELIMITER]
49200
49202
  showItemCountOnly = False
49201
49203
  useOwnerAccess = GC.Values[GC.USE_COURSE_OWNER_ACCESS]
49204
+ addCSVData = {}
49202
49205
  while Cmd.ArgumentsRemaining():
49203
49206
  myarg = getArgument()
49204
49207
  if myarg == 'todrive':
@@ -49213,6 +49216,9 @@ def doPrintCourses():
49213
49216
  pass
49214
49217
  elif myarg == 'showitemcountonly':
49215
49218
  showItemCountOnly = True
49219
+ elif myarg == 'addcsvdata':
49220
+ k = getString(Cmd.OB_STRING)
49221
+ addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
49216
49222
  else:
49217
49223
  FJQC.GetFormatJSONQuoteChar(myarg, True)
49218
49224
  applyCourseItemFilter = _setApplyCourseItemFilter(courseItemFilter, None)
@@ -49224,6 +49230,11 @@ def doPrintCourses():
49224
49230
  if showItemCountOnly:
49225
49231
  writeStdout('0\n')
49226
49232
  return
49233
+ if addCSVData:
49234
+ csvPF.AddTitles(sorted(addCSVData.keys()))
49235
+ if FJQC.formatJSON:
49236
+ csvPF.AddJSONTitles(sorted(addCSVData.keys()))
49237
+ csvPF.MoveJSONTitlesToEnd(['JSON'])
49227
49238
  if courseShowProperties['aliases']:
49228
49239
  if FJQC.formatJSON:
49229
49240
  csvPF.AddJSONTitles('JSON-aliases')
@@ -49281,11 +49292,15 @@ def doPrintCourses():
49281
49292
  if courseShowProperties['members'] != 'teachers':
49282
49293
  _saveParticipants(course, students, 'students', stitles)
49283
49294
  row = flattenJSON(course, timeObjects=COURSE_TIME_OBJECTS, noLenObjects=COURSE_NOLEN_OBJECTS)
49295
+ if addCSVData:
49296
+ row.update(addCSVData)
49284
49297
  if not FJQC.formatJSON:
49285
49298
  csvPF.WriteRowTitles(row)
49286
49299
  elif csvPF.CheckRowTitles(row):
49287
49300
  row = {'id': courseId, 'JSON': json.dumps(cleanJSON(course, timeObjects=COURSE_TIME_OBJECTS),
49288
49301
  ensure_ascii=False, sort_keys=True)}
49302
+ if addCSVData:
49303
+ row.update(addCSVData)
49289
49304
  if courseShowProperties['aliases']:
49290
49305
  row['JSON-aliases'] = json.dumps(list(aliases))
49291
49306
  if courseShowProperties['members'] != 'none':
@@ -73923,14 +73938,58 @@ def printShowMessages(users):
73923
73938
  def printShowThreads(users):
73924
73939
  printShowMessagesThreads(users, Ent.THREAD)
73925
73940
 
73941
+ def sendCreateDelegateNotification(user, delegate, basenotify, i=0, count=0, msgFrom=None):
73942
+ # Substitute for #user#, #delegate#
73943
+ def _substituteForPattern(field, pattern, value):
73944
+ if field.find('#') == -1:
73945
+ return field
73946
+ return field.replace(pattern, value)
73947
+
73948
+ def _makeSubstitutions(field):
73949
+ notify[field] = _substituteForPattern(notify[field], '#user#', user)
73950
+ notify[field] = _substituteForPattern(notify[field], '#delegate#', delegate)
73951
+
73952
+ notify = basenotify.copy()
73953
+ if not notify['subject']:
73954
+ notify['subject'] = Msg.CREATE_DELEGATE_NOTIFY_SUBJECT
73955
+ _makeSubstitutions('subject')
73956
+ if not notify['message']:
73957
+ notify['message'] = Msg.CREATE_DELEGATE_NOTIFY_MESSAGE
73958
+ elif notify['html']:
73959
+ notify['message'] = notify['message'].replace('\r', '').replace('\\n', '<br/>')
73960
+ else:
73961
+ notify['message'] = notify['message'].replace('\r', '').replace('\\n', '\n')
73962
+ _makeSubstitutions('message')
73963
+ if 'from' in notify:
73964
+ msgFrom = notify['from']
73965
+ msgReplyTo = notify.get('replyto', None)
73966
+ mailBox = notify.get('mailbox', None)
73967
+ send_email(notify['subject'], notify['message'], delegate, i, count,
73968
+ msgFrom=msgFrom, msgReplyTo=msgReplyTo, html=notify['html'], charset=notify['charset'], mailBox=mailBox)
73969
+
73926
73970
  # gam <UserTypeEntity> create delegate|delegates [convertalias] <UserEntity>
73971
+ # [notify [<Boolean>]
73972
+ # [subject <String>]
73973
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
73974
+ # [replyto <EmailAaddress>]
73975
+ # [<NotifyMessageContent>] [html [<Boolean>]]
73976
+ # ]
73927
73977
  # gam <UserTypeEntity> delete delegate|delegates [convertalias] <UserEntity>
73928
73978
  def processDelegates(users):
73929
73979
  cd = buildGAPIObject(API.DIRECTORY)
73930
- function = 'delete' if Act.Get() == Act.DELETE else 'create'
73980
+ createCmd = Act.Get() != Act.DELETE
73931
73981
  aliasAllowed = not checkArgumentPresent(['convertalias'])
73932
73982
  delegateEntity = getUserObjectEntity(Cmd.OB_USER_ENTITY, Ent.DELEGATE)
73933
- checkForExtraneousArguments()
73983
+ notify = {'notify': False, 'subject': '', 'message': '', 'html': False, 'charset': UTF8}
73984
+ if createCmd:
73985
+ while Cmd.ArgumentsRemaining():
73986
+ myarg = getArgument()
73987
+ if getNotifyArguments(myarg, notify, False):
73988
+ pass
73989
+ else:
73990
+ unknownArgumentExit()
73991
+ else:
73992
+ checkForExtraneousArguments()
73934
73993
  i, count, users = getEntityArgument(users)
73935
73994
  for user in users:
73936
73995
  i += 1
@@ -73942,25 +74001,37 @@ def processDelegates(users):
73942
74001
  for delegate in delegates:
73943
74002
  j += 1
73944
74003
  delegateEmail = convertUIDtoEmailAddress(delegate, cd=cd, emailTypes=['user', 'group'], aliasAllowed=aliasAllowed)
74004
+ kvList = [Ent.USER, user, Ent.DELEGATE, delegateEmail]
73945
74005
  try:
73946
- if function == 'create':
73947
- callGAPI(gmail.users().settings().delegates(), function,
74006
+ if createCmd:
74007
+ callGAPI(gmail.users().settings().delegates(), 'create',
73948
74008
  throwReasons=GAPI.GMAIL_THROW_REASONS+[GAPI.ALREADY_EXISTS, GAPI.FAILED_PRECONDITION, GAPI.INVALID,
73949
74009
  GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
73950
74010
  userId='me', body={'delegateEmail': delegateEmail})
74011
+ entityActionPerformed(kvList, j, jcount)
74012
+ if notify['notify']:
74013
+ Ind.Increment()
74014
+ sendCreateDelegateNotification(user, delegateEmail, notify, j, jcount)
74015
+ Ind.Decrement()
73951
74016
  else:
73952
- callGAPI(gmail.users().settings().delegates(), function,
74017
+ callGAPI(gmail.users().settings().delegates(), 'delete',
73953
74018
  throwReasons=GAPI.GMAIL_THROW_REASONS+[GAPI.NOT_FOUND, GAPI.INVALID_INPUT, GAPI.PERMISSION_DENIED],
73954
74019
  userId='me', delegateEmail=delegateEmail)
73955
- entityActionPerformed([Ent.USER, user, Ent.DELEGATE, delegateEmail], j, jcount)
74020
+ entityActionPerformed(kvList, j, jcount)
73956
74021
  except (GAPI.alreadyExists, GAPI.failedPrecondition, GAPI.invalid,
73957
74022
  GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
73958
- entityActionFailedWarning([Ent.USER, user, Ent.DELEGATE, delegateEmail], str(e), j, jcount)
74023
+ entityActionFailedWarning(kvList, str(e), j, jcount)
73959
74024
  except GAPI.serviceNotAvailable:
73960
74025
  userGmailServiceNotEnabledWarning(user, i, count)
73961
74026
  Ind.Decrement()
73962
74027
 
73963
74028
  # gam <UserTypeEntity> delegate to [convertalias] <UserEntity>
74029
+ # [notify [<Boolean>]
74030
+ # [subject <String>]
74031
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
74032
+ # [replyto <EmailAaddress>]
74033
+ # [<NotifyMessageContent>] [html [<Boolean>]]
74034
+ # ]
73964
74035
  def delegateTo(users):
73965
74036
  checkArgumentPresent('to', required=True)
73966
74037
  processDelegates(users)
@@ -46,7 +46,6 @@ CLASSROOM = 'classroom'
46
46
  CLOUDCHANNEL = 'cloudchannel'
47
47
  CLOUDIDENTITY_DEVICES = 'cloudidentitydevices'
48
48
  CLOUDIDENTITY_GROUPS = 'cloudidentitygroups'
49
- CLOUDIDENTITY_GROUPS_BETA = 'cloudidentitygroupsbeta'
50
49
  CLOUDIDENTITY_INBOUND_SSO = 'cloudidentityinboundsso'
51
50
  CLOUDIDENTITY_ORGUNITS = 'cloudidentityorgunits'
52
51
  CLOUDIDENTITY_ORGUNITS_BETA = 'cloudidentityorgunitsbeta'
@@ -242,7 +241,6 @@ _INFO = {
242
241
  CLOUDCHANNEL: {'name': 'Cloud Channel API', 'version': 'v1', 'v2discovery': True},
243
242
  CLOUDIDENTITY_DEVICES: {'name': 'Cloud Identity API - Devices', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
244
243
  CLOUDIDENTITY_GROUPS: {'name': 'Cloud Identity API - Groups', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
245
- CLOUDIDENTITY_GROUPS_BETA: {'name': 'Cloud Identity API - Groups Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
246
244
  CLOUDIDENTITY_INBOUND_SSO: {'name': 'Cloud Identity API - Inbound SSO Settings', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
247
245
  CLOUDIDENTITY_ORGUNITS: {'name': 'Cloud Identity API - OrgUnits', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
248
246
  CLOUDIDENTITY_ORGUNITS_BETA: {'name': 'Cloud Identity API - OrgUnits Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
@@ -387,10 +385,6 @@ _CLIENT_SCOPES = [
387
385
  'api': CLOUDIDENTITY_GROUPS,
388
386
  'subscopes': READONLY,
389
387
  'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
390
- {'name': 'Cloud Identity API - Groups Beta (Enables group locking/unlocking)',
391
- 'api': CLOUDIDENTITY_GROUPS_BETA,
392
- 'subscopes': [],
393
- 'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
394
388
  {'name': 'Cloud Identity API - Inbound SSO Settings',
395
389
  'api': CLOUDIDENTITY_INBOUND_SSO,
396
390
  'subscopes': READONLY,
@@ -224,6 +224,8 @@ COUNT_N_EXCEEDS_MAX_TO_PROCESS_M = 'Count {0} exceeds maximum to {1} {2}'
224
224
  CORRUPT_FILE = 'Corrupt file'
225
225
  COULD_NOT_FIND_ANY_YUBIKEY = 'Could not find any YubiKey\n'
226
226
  COULD_NOT_FIND_YUBIKEY_WITH_SERIAL = 'Could not find YubiKey with serial number {0}\n'
227
+ CREATE_DELEGATE_NOTIFY_MESSAGE = '#user# has granted you #delegate# access to read, delete and send mail on their behalf.'
228
+ CREATE_DELEGATE_NOTIFY_SUBJECT = '#user# mail delegation to #delegate#'
227
229
  CREATE_USER_NOTIFY_MESSAGE = 'Hello #givenname# #familyname#,\n\nYou have a new account at #domain#\nAccount details:\nUsername: #user#\nPassword: #password#\nStart using your new account by signing in at\nhttps://www.google.com/accounts/AccountChooser?Email=#user#&continue=https://workspace.google.com/dashboard\n'
228
230
  CREATE_USER_NOTIFY_SUBJECT = 'Welcome to #domain#'
229
231
  CSV_DATA_ALREADY_SAVED = 'CSV data already saved'
@@ -441,8 +441,10 @@ gam print courses [todrive <ToDriveAttribute>*]
441
441
  [owneremail] [owneremailmatchpattern <REMatchPattern>]
442
442
  [alias|aliases|aliasesincolumns [delimiter <Character>]]
443
443
  [show all|students|teachers] [countsonly]
444
- [fields <CourseFieldNameList>] [skipfields <CourseFieldNameList>] [formatjson [quotechar <Character>]]
445
444
  [timefilter creationtime|updatetime] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
445
+ [fields <CourseFieldNameList>] [skipfields <CourseFieldNameList>] [formatjson [quotechar <Character>]]
446
+ (addcsvdata <FieldName> <String>)*
447
+ [formatjson [quotechar <Character>]]
446
448
  ```
447
449
  By default, the `print courses` command displays information about all courses.
448
450
 
@@ -477,6 +479,7 @@ By default, all basic course fields are displayed; use the following options to
477
479
  * `countsonly` - Eliminates the student/teacher profile information and outputs only the student/teacher counts.
478
480
  * `fields <CourseFieldNameList>` - Select specific basic fields to display.
479
481
  * `skipfields <CourseFieldNameList>` - Select specific basic fields to eliminate from display; typically used with `coursematerialsets`.
482
+ * `addcsvdata <FieldName> <String>` - Add additional columns of data from the command line to the output
480
483
 
481
484
  By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format,
482
485
  * `formatjson` - Display the fields in JSON format.
@@ -11,7 +11,7 @@
11
11
 
12
12
  ## API documentation
13
13
  * [Cloud Identity Groups Overview](https://cloud.google.com/identity/docs/groups)
14
- * [Create and Manage Groups uning API](https://support.google.com/a/answer/10427204)
14
+ * [Create and Manage Groups using API](https://support.google.com/a/answer/10427204)
15
15
  * [Cloud Identity Groups API - Groups](https://cloud.google.com/identity/docs/reference/rest/v1/groups)
16
16
  * [Restrict Group Membership](https://support.google.com/a/answer/11192679)
17
17
  * [Lock Groups Beta](https://workspaceupdates.googleblog.com/2024/12/locked-groups-open-beta.html)
@@ -26,15 +26,6 @@
26
26
 
27
27
  ## Notes
28
28
 
29
- In version 7.02.01 options `locked` and `unlocked` wre added to `gam update cigroups` that allow locking groups.
30
-
31
- * See: https://workspaceupdates.googleblog.com/2024/12/locked-groups-open-beta.html
32
-
33
- You'll have to do a `gam oauth create` and enable the following scope to use these options:
34
- ```
35
- [*] 22) Cloud Identity Groups API Beta (Enables group locking/unlocking)
36
- ```
37
-
38
29
  In the Admin Directory API a group has the following characteristics:
39
30
  * `id` - The unique ID of a group
40
31
  * `email` - The group's email address
@@ -10,6 +10,42 @@ 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.27.05
14
+
15
+ Added option `addcsvdata <FieldName> <String>` to `gam print courses`
16
+ that adds additional columns of data to the CSV file output.
17
+
18
+ The following scope is no longer necessary: `Cloud Identity API - Groups Beta (Enables group locking/unlocking)`
19
+ as this scope `Cloud Identity API - Groups` now provides group locking/unlocking.
20
+
21
+ ### 7.27.04
22
+
23
+ Added options to `gam <UserTypeEntity> create delegate` that support
24
+ sending email notifications when a user adds a delegate.
25
+
26
+ * See: https://github.com/GAM-team/GAM/wiki/Users-Gmail-Delegates#delegation-notification
27
+
28
+ ### 7.27.03
29
+
30
+ Updated `gam <UserTypeEntity> create|update|sync chatmember` role specification to `role member|manager|owner`.
31
+ This is the mapping between the Chat UI and Chat API; GAM uses the Chat UI role names.
32
+ ```
33
+ UI: Member, API: ROLE_MEMBER
34
+ UI: Manager, API: ROLE_ASSISTANT_MANAGER
35
+ UI: Owner, API: ROLE_MANAGER
36
+ ```
37
+
38
+ Updated `gam <UserTypeEntity> update chatspace` options for permission settings.
39
+ ```
40
+ [managemembersandgroups owners|managers|members]
41
+ [modifyspacedetails owners|managers|members]
42
+ [togglehistory owners|managers|members]
43
+ [useatmentionall owners|managers|members]
44
+ [manageapps owners|managers|members]
45
+ [managewebhooks owners|managers|members]
46
+ [replymessages owners|managers|members]
47
+ ```
48
+
13
49
  ### 7.27.02
14
50
 
15
51
  Added option `clearattachments <String>` to `gam [<UserTypeMessage>] update chatmessage`
@@ -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.27.02 - https://github.com/GAM-team/GAM - pyinstaller
255
+ GAM 7.27.05 - https://github.com/GAM-team/GAM - pyinstaller
256
256
  GAM Team <google-apps-manager@googlegroups.com>
257
257
  Python 3.14.0 64-bit final
258
258
  macOS Tahoe 26.0.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.27.02 - https://github.com/GAM-team/GAM - pythonsource
993
+ GAM 7.27.05 - https://github.com/GAM-team/GAM - pythonsource
994
994
  GAM Team <google-apps-manager@googlegroups.com>
995
995
  Python 3.14.0 64-bit final
996
996
  Windows-10-10.0.17134 AMD64
@@ -12,6 +12,10 @@
12
12
  - [User reports](#user-reports)
13
13
 
14
14
  ## API documentation
15
+ Changes starting 2025-10-29.
16
+
17
+ * [Reports API - Admin log event changes]https://support.google.com/a/answer/16601511
18
+
15
19
  These pages show event/parameter names; scroll down in the left column to: Reports.
16
20
 
17
21
  * [Reports API - Activities](https://developers.google.com/admin-sdk/reports/v1/reference/activities)