gam7 7.7.16__tar.gz → 7.8.0__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 (318) hide show
  1. {gam7-7.7.16 → gam7-7.8.0}/PKG-INFO +1 -1
  2. {gam7-7.7.16 → gam7-7.8.0}/src/GamCommands.txt +23 -2
  3. {gam7-7.7.16 → gam7-7.8.0}/src/GamUpdate.txt +33 -0
  4. {gam7-7.7.16 → gam7-7.8.0}/src/gam/__init__.py +186 -12
  5. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glclargs.py +4 -1
  6. {gam7-7.7.16 → gam7-7.8.0}/wiki/Cloud-Identity-Devices.md +4 -1
  7. {gam7-7.7.16 → gam7-7.8.0}/wiki/GamUpdates.md +5 -0
  8. {gam7-7.7.16 → gam7-7.8.0}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  9. {gam7-7.7.16 → gam7-7.8.0}/wiki/Shared-Drives.md +35 -0
  10. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Gmail-Delegates.md +6 -0
  11. {gam7-7.7.16 → gam7-7.8.0}/wiki/Version-and-Help.md +6 -6
  12. {gam7-7.7.16 → gam7-7.8.0}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  13. {gam7-7.7.16 → gam7-7.8.0}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  14. {gam7-7.7.16 → gam7-7.8.0}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  15. {gam7-7.7.16 → gam7-7.8.0}/.github/ISSUE_TEMPLATE.txt +0 -0
  16. {gam7-7.7.16 → gam7-7.8.0}/.github/actions/decrypt.sh +0 -0
  17. {gam7-7.7.16 → gam7-7.8.0}/.github/actions/entitlements.plist +0 -0
  18. {gam7-7.7.16 → gam7-7.8.0}/.github/actions/package_exclusions.txt +0 -0
  19. {gam7-7.7.16 → gam7-7.8.0}/.github/stale.yml +0 -0
  20. {gam7-7.7.16 → gam7-7.8.0}/.github/workflows/build.yml +0 -0
  21. {gam7-7.7.16 → gam7-7.8.0}/.github/workflows/codeql-analysis.yml +0 -0
  22. {gam7-7.7.16 → gam7-7.8.0}/.github/workflows/get-cacerts.yml +0 -0
  23. {gam7-7.7.16 → gam7-7.8.0}/.github/workflows/pushwiki.yml +0 -0
  24. {gam7-7.7.16 → gam7-7.8.0}/.github/workflows/pypi.yml +0 -0
  25. {gam7-7.7.16 → gam7-7.8.0}/.pre-commit-config.yaml +0 -0
  26. {gam7-7.7.16 → gam7-7.8.0}/LICENSE +0 -0
  27. {gam7-7.7.16 → gam7-7.8.0}/README.md +0 -0
  28. {gam7-7.7.16 → gam7-7.8.0}/pyproject.toml +0 -0
  29. {gam7-7.7.16 → gam7-7.8.0}/src/.gitignore +0 -0
  30. {gam7-7.7.16 → gam7-7.8.0}/src/LICENSE +0 -0
  31. {gam7-7.7.16 → gam7-7.8.0}/src/cacerts.pem +0 -0
  32. {gam7-7.7.16 → gam7-7.8.0}/src/callgam.py +0 -0
  33. {gam7-7.7.16 → gam7-7.8.0}/src/gam/__main__.py +0 -0
  34. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/__init__.py +0 -0
  35. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/auth.py +0 -0
  36. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/client.py +0 -0
  37. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/core.py +0 -0
  38. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/data.py +0 -0
  39. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/http.py +0 -0
  40. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/http_core.py +0 -0
  41. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/http_interface.py +0 -0
  42. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/mock_http.py +0 -0
  43. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/mock_http_core.py +0 -0
  44. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/mock_service.py +0 -0
  45. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/service.py +0 -0
  46. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/token_store.py +0 -0
  47. {gam7-7.7.16 → gam7-7.8.0}/src/gam/atom/url.py +0 -0
  48. {gam7-7.7.16 → gam7-7.8.0}/src/gam/cacerts.pem +0 -0
  49. {gam7-7.7.16 → gam7-7.8.0}/src/gam/cbcm-v1.1beta1.json +0 -0
  50. {gam7-7.7.16 → gam7-7.8.0}/src/gam/contactdelegation-v1.json +0 -0
  51. {gam7-7.7.16 → gam7-7.8.0}/src/gam/datastudio-v1.json +0 -0
  52. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/__init__.py +0 -0
  53. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glaction.py +0 -0
  54. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glapi.py +0 -0
  55. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glcfg.py +0 -0
  56. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glentity.py +0 -0
  57. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glgapi.py +0 -0
  58. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glgdata.py +0 -0
  59. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glglobals.py +0 -0
  60. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glindent.py +0 -0
  61. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glmsgs.py +0 -0
  62. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glskus.py +0 -0
  63. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/gluprop.py +0 -0
  64. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/glverlibs.py +0 -0
  65. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gamlib/yubikey.py +0 -0
  66. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/__init__.py +0 -0
  67. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/alt/__init__.py +0 -0
  68. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/alt/app_engine.py +0 -0
  69. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/alt/appengine.py +0 -0
  70. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/apps/__init__.py +0 -0
  71. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/apps/audit/__init__.py +0 -0
  72. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/apps/audit/service.py +0 -0
  73. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  74. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/apps/contacts/service.py +0 -0
  75. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/apps/service.py +0 -0
  76. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/service.py +0 -0
  77. {gam7-7.7.16 → gam7-7.8.0}/src/gam/gdata/urlfetch.py +0 -0
  78. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/__init__.py +0 -0
  79. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/_auth.py +0 -0
  80. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/_helpers.py +0 -0
  81. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/channel.py +0 -0
  82. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/discovery.py +0 -0
  83. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  84. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  85. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  86. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  87. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/errors.py +0 -0
  88. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/http.py +0 -0
  89. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/mimeparse.py +0 -0
  90. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/model.py +0 -0
  91. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/schema.py +0 -0
  92. {gam7-7.7.16 → gam7-7.8.0}/src/gam/googleapiclient/version.py +0 -0
  93. {gam7-7.7.16 → gam7-7.8.0}/src/gam/iso8601/__init__.py +0 -0
  94. {gam7-7.7.16 → gam7-7.8.0}/src/gam/iso8601/iso8601.py +0 -0
  95. {gam7-7.7.16 → gam7-7.8.0}/src/gam/meet-v2beta.json +0 -0
  96. {gam7-7.7.16 → gam7-7.8.0}/src/gam/serviceaccountlookup-v1.json +0 -0
  97. {gam7-7.7.16 → gam7-7.8.0}/src/gam/six.py +0 -0
  98. {gam7-7.7.16 → gam7-7.8.0}/src/gam-install.sh +0 -0
  99. {gam7-7.7.16 → gam7-7.8.0}/src/gam-setup.bat +0 -0
  100. {gam7-7.7.16 → gam7-7.8.0}/src/gam.exe.manifest +0 -0
  101. {gam7-7.7.16 → gam7-7.8.0}/src/gam.py +0 -0
  102. {gam7-7.7.16 → gam7-7.8.0}/src/gam.spec +0 -0
  103. {gam7-7.7.16 → gam7-7.8.0}/src/gam.wxs +0 -0
  104. {gam7-7.7.16 → gam7-7.8.0}/src/license.rtf +0 -0
  105. {gam7-7.7.16 → gam7-7.8.0}/src/requirements-dev.txt +0 -0
  106. {gam7-7.7.16 → gam7-7.8.0}/src/requirements.txt +0 -0
  107. {gam7-7.7.16 → gam7-7.8.0}/src/setup.cfg +0 -0
  108. {gam7-7.7.16 → gam7-7.8.0}/src/setup.py +0 -0
  109. {gam7-7.7.16 → gam7-7.8.0}/src/tools/a_atleast_b.py +0 -0
  110. {gam7-7.7.16 → gam7-7.8.0}/src/tools/gen-wix-xml-filelist.py +0 -0
  111. {gam7-7.7.16 → gam7-7.8.0}/src/tools/mkGamRef.py +0 -0
  112. {gam7-7.7.16 → gam7-7.8.0}/src/tools/openssl.props +0 -0
  113. {gam7-7.7.16 → gam7-7.8.0}/src/version_info.txt.in +0 -0
  114. {gam7-7.7.16 → gam7-7.8.0}/wiki/00scratch.md +0 -0
  115. {gam7-7.7.16 → gam7-7.8.0}/wiki/Addresses.md +0 -0
  116. {gam7-7.7.16 → gam7-7.8.0}/wiki/Administrators.md +0 -0
  117. {gam7-7.7.16 → gam7-7.8.0}/wiki/Alert-Center.md +0 -0
  118. {gam7-7.7.16 → gam7-7.8.0}/wiki/Aliases.md +0 -0
  119. {gam7-7.7.16 → gam7-7.8.0}/wiki/Authorization.md +0 -0
  120. {gam7-7.7.16 → gam7-7.8.0}/wiki/BNF-Syntax.md +0 -0
  121. {gam7-7.7.16 → gam7-7.8.0}/wiki/Basic-Items.md +0 -0
  122. {gam7-7.7.16 → gam7-7.8.0}/wiki/Bulk-Processing.md +0 -0
  123. {gam7-7.7.16 → gam7-7.8.0}/wiki/CSV-Input-Filtering.md +0 -0
  124. {gam7-7.7.16 → gam7-7.8.0}/wiki/CSV-Output-Filtering.md +0 -0
  125. {gam7-7.7.16 → gam7-7.8.0}/wiki/CSV-Special-Characters.md +0 -0
  126. {gam7-7.7.16 → gam7-7.8.0}/wiki/Calendars-Access.md +0 -0
  127. {gam7-7.7.16 → gam7-7.8.0}/wiki/Calendars-Events.md +0 -0
  128. {gam7-7.7.16 → gam7-7.8.0}/wiki/Calendars.md +0 -0
  129. {gam7-7.7.16 → gam7-7.8.0}/wiki/Chat-Bot.md +0 -0
  130. {gam7-7.7.16 → gam7-7.8.0}/wiki/Chrome-AUE-Counts.md +0 -0
  131. {gam7-7.7.16 → gam7-7.8.0}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  132. {gam7-7.7.16 → gam7-7.8.0}/wiki/Chrome-Installed-Apps.md +0 -0
  133. {gam7-7.7.16 → gam7-7.8.0}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  134. {gam7-7.7.16 → gam7-7.8.0}/wiki/Chrome-Policies.md +0 -0
  135. {gam7-7.7.16 → gam7-7.8.0}/wiki/Chrome-Printers.md +0 -0
  136. {gam7-7.7.16 → gam7-7.8.0}/wiki/Chrome-Profile-Management.md +0 -0
  137. {gam7-7.7.16 → gam7-7.8.0}/wiki/Chrome-Version-Counts.md +0 -0
  138. {gam7-7.7.16 → gam7-7.8.0}/wiki/Chrome-Version-History.md +0 -0
  139. {gam7-7.7.16 → gam7-7.8.0}/wiki/ChromeOS-Devices.md +0 -0
  140. {gam7-7.7.16 → gam7-7.8.0}/wiki/Classroom-Courses.md +0 -0
  141. {gam7-7.7.16 → gam7-7.8.0}/wiki/Classroom-Guardians.md +0 -0
  142. {gam7-7.7.16 → gam7-7.8.0}/wiki/Classroom-Invitations.md +0 -0
  143. {gam7-7.7.16 → gam7-7.8.0}/wiki/Classroom-Membership.md +0 -0
  144. {gam7-7.7.16 → gam7-7.8.0}/wiki/Cloud-Channel.md +0 -0
  145. {gam7-7.7.16 → gam7-7.8.0}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  146. {gam7-7.7.16 → gam7-7.8.0}/wiki/Cloud-Identity-Groups.md +0 -0
  147. {gam7-7.7.16 → gam7-7.8.0}/wiki/Cloud-Identity-Policies.md +0 -0
  148. {gam7-7.7.16 → gam7-7.8.0}/wiki/Cloud-Storage.md +0 -0
  149. {gam7-7.7.16 → gam7-7.8.0}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  150. {gam7-7.7.16 → gam7-7.8.0}/wiki/Collections-of-Items.md +0 -0
  151. {gam7-7.7.16 → gam7-7.8.0}/wiki/Collections-of-Users.md +0 -0
  152. {gam7-7.7.16 → gam7-7.8.0}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  153. {gam7-7.7.16 → gam7-7.8.0}/wiki/Command-Line-Parsing.md +0 -0
  154. {gam7-7.7.16 → gam7-7.8.0}/wiki/Command-Logging-Progress.md +0 -0
  155. {gam7-7.7.16 → gam7-7.8.0}/wiki/Context-Aware-Access-Levels.md +0 -0
  156. {gam7-7.7.16 → gam7-7.8.0}/wiki/Customer.md +0 -0
  157. {gam7-7.7.16 → gam7-7.8.0}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  158. {gam7-7.7.16 → gam7-7.8.0}/wiki/Domain-SharedContacts.md +0 -0
  159. {gam7-7.7.16 → gam7-7.8.0}/wiki/Domains-Verification.md +0 -0
  160. {gam7-7.7.16 → gam7-7.8.0}/wiki/Domains.md +0 -0
  161. {gam7-7.7.16 → gam7-7.8.0}/wiki/Downloads-Installs.md +0 -0
  162. {gam7-7.7.16 → gam7-7.8.0}/wiki/Drive-File-Selection.md +0 -0
  163. {gam7-7.7.16 → gam7-7.8.0}/wiki/Drive-Items.md +0 -0
  164. {gam7-7.7.16 → gam7-7.8.0}/wiki/Drive-REST-API-v3.md +0 -0
  165. {gam7-7.7.16 → gam7-7.8.0}/wiki/Email-Audit-Monitor.md +0 -0
  166. {gam7-7.7.16 → gam7-7.8.0}/wiki/Find-File-Owner.md +0 -0
  167. {gam7-7.7.16 → gam7-7.8.0}/wiki/GAM-Public-Chat-Room.md +0 -0
  168. {gam7-7.7.16 → gam7-7.8.0}/wiki/GAM-Return-Codes.md +0 -0
  169. {gam7-7.7.16 → gam7-7.8.0}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  170. {gam7-7.7.16 → gam7-7.8.0}/wiki/GAM7-on-Android-Devices.md +0 -0
  171. {gam7-7.7.16 → gam7-7.8.0}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  172. {gam7-7.7.16 → gam7-7.8.0}/wiki/Google-Data-Transfers.md +0 -0
  173. {gam7-7.7.16 → gam7-7.8.0}/wiki/Google-Network-Addresses.md +0 -0
  174. {gam7-7.7.16 → gam7-7.8.0}/wiki/Groups-Membership.md +0 -0
  175. {gam7-7.7.16 → gam7-7.8.0}/wiki/Groups.md +0 -0
  176. {gam7-7.7.16 → gam7-7.8.0}/wiki/HTTPS-Proxy.md +0 -0
  177. {gam7-7.7.16 → gam7-7.8.0}/wiki/Home.md +0 -0
  178. {gam7-7.7.16 → gam7-7.8.0}/wiki/How-to-Install-GAM7.md +0 -0
  179. {gam7-7.7.16 → gam7-7.8.0}/wiki/How-to-Uninstall-GAM7.md +0 -0
  180. {gam7-7.7.16 → gam7-7.8.0}/wiki/How-to-Update-GAM7.md +0 -0
  181. {gam7-7.7.16 → gam7-7.8.0}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  182. {gam7-7.7.16 → gam7-7.8.0}/wiki/Inbound-SSO.md +0 -0
  183. {gam7-7.7.16 → gam7-7.8.0}/wiki/Install-GAM-as-Python-Library.md +0 -0
  184. {gam7-7.7.16 → gam7-7.8.0}/wiki/Licenses.md +0 -0
  185. {gam7-7.7.16 → gam7-7.8.0}/wiki/List-Items.md +0 -0
  186. {gam7-7.7.16 → gam7-7.8.0}/wiki/List.md +0 -0
  187. {gam7-7.7.16 → gam7-7.8.0}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  188. {gam7-7.7.16 → gam7-7.8.0}/wiki/Mobile-Devices.md +0 -0
  189. {gam7-7.7.16 → gam7-7.8.0}/wiki/Organizational-Units.md +0 -0
  190. {gam7-7.7.16 → gam7-7.8.0}/wiki/Other-Resources.md +0 -0
  191. {gam7-7.7.16 → gam7-7.8.0}/wiki/Permission-Matches.md +0 -0
  192. {gam7-7.7.16 → gam7-7.8.0}/wiki/Python-Regular-Expressions.md +0 -0
  193. {gam7-7.7.16 → gam7-7.8.0}/wiki/README.md +0 -0
  194. {gam7-7.7.16 → gam7-7.8.0}/wiki/Rclone.md +0 -0
  195. {gam7-7.7.16 → gam7-7.8.0}/wiki/Reports.md +0 -0
  196. {gam7-7.7.16 → gam7-7.8.0}/wiki/Reseller.md +0 -0
  197. {gam7-7.7.16 → gam7-7.8.0}/wiki/Resources.md +0 -0
  198. {gam7-7.7.16 → gam7-7.8.0}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  199. {gam7-7.7.16 → gam7-7.8.0}/wiki/SSL-Root-CA-Certificates.md +0 -0
  200. {gam7-7.7.16 → gam7-7.8.0}/wiki/Schemas.md +0 -0
  201. {gam7-7.7.16 → gam7-7.8.0}/wiki/Scripts.md +0 -0
  202. {gam7-7.7.16 → gam7-7.8.0}/wiki/Send-Email.md +0 -0
  203. {gam7-7.7.16 → gam7-7.8.0}/wiki/Sites.md +0 -0
  204. {gam7-7.7.16 → gam7-7.8.0}/wiki/Tag-Replace.md +0 -0
  205. {gam7-7.7.16 → gam7-7.8.0}/wiki/Todrive.md +0 -0
  206. {gam7-7.7.16 → gam7-7.8.0}/wiki/Unmanaged-Accounts.md +0 -0
  207. {gam7-7.7.16 → gam7-7.8.0}/wiki/Upgrade-Benefits.md +0 -0
  208. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Analytics-Admin.md +0 -0
  209. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Application-Specific-Passwords.md +0 -0
  210. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Backup-Verification-Codes.md +0 -0
  211. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Calendars-Access.md +0 -0
  212. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Calendars-Events.md +0 -0
  213. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Calendars.md +0 -0
  214. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Chat.md +0 -0
  215. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Classification-Labels.md +0 -0
  216. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Classroom-Profile.md +0 -0
  217. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Contacts-Delegates.md +0 -0
  218. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Contacts.md +0 -0
  219. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Deprovision.md +0 -0
  220. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Activity-Settings.md +0 -0
  221. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Cleanup.md +0 -0
  222. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Comments.md +0 -0
  223. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Copy-Move.md +0 -0
  224. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Files-Display.md +0 -0
  225. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Files-Manage.md +0 -0
  226. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Orphans.md +0 -0
  227. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Ownership.md +0 -0
  228. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Permissions.md +0 -0
  229. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Query.md +0 -0
  230. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Revisions.md +0 -0
  231. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Shortcuts.md +0 -0
  232. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Drive-Transfer.md +0 -0
  233. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Forms.md +0 -0
  234. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Gmail-CSE.md +0 -0
  235. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Gmail-Filters.md +0 -0
  236. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Gmail-Forwarding.md +0 -0
  237. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Gmail-Labels.md +0 -0
  238. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  239. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Gmail-Profile.md +0 -0
  240. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Gmail-S-MIME.md +0 -0
  241. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  242. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Gmail-Settings.md +0 -0
  243. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Group-Membership.md +0 -0
  244. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Keep-Notes.md +0 -0
  245. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Looker-Studio.md +0 -0
  246. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Meet.md +0 -0
  247. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-People-Contacts-Profiles.md +0 -0
  248. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Photo.md +0 -0
  249. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Profile-Photo.md +0 -0
  250. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Profile-Sharing.md +0 -0
  251. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Shared-Drives.md +0 -0
  252. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  253. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Spreadsheets.md +0 -0
  254. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Tasks.md +0 -0
  255. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-Tokens.md +0 -0
  256. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users-YouTube.md +0 -0
  257. {gam7-7.7.16 → gam7-7.8.0}/wiki/Users.md +0 -0
  258. {gam7-7.7.16 → gam7-7.8.0}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  259. {gam7-7.7.16 → gam7-7.8.0}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  260. {gam7-7.7.16 → gam7-7.8.0}/wiki/Vault-Takeout.md +0 -0
  261. {gam7-7.7.16 → gam7-7.8.0}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  262. {gam7-7.7.16 → gam7-7.8.0}/wiki/_Sidebar.md +0 -0
  263. {gam7-7.7.16 → gam7-7.8.0}/wiki/gam.cfg.md +0 -0
  264. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-AdminSettingsExamples.md +0 -0
  265. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Android-Installation.md +0 -0
  266. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-BulkOperations.md +0 -0
  267. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-CalendarExamples.md +0 -0
  268. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Chat-Bot.md +0 -0
  269. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Chrome-Browser-Management.md +0 -0
  270. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Chrome-OS-Installation.md +0 -0
  271. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Chrome-Policy-Settings.md +0 -0
  272. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Cloud-Identity-Groups.md +0 -0
  273. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  274. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Command-Reference-Calendars.md +0 -0
  275. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Command-Reference-Definitions.md +0 -0
  276. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Command-Reference-Drive.md +0 -0
  277. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Command-Reference-Email.md +0 -0
  278. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  279. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Command-Reference-Groups.md +0 -0
  280. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Command-Reference-Users.md +0 -0
  281. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  282. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  283. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-CreatingClientSecretsFile.md +0 -0
  284. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Custom-Schemas.md +0 -0
  285. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Data-Transfers.md +0 -0
  286. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-DomainVerification.md +0 -0
  287. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-ExamplesAccountAuditing.md +0 -0
  288. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-ExamplesCSV.md +0 -0
  289. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-ExamplesEmailSettings.md +0 -0
  290. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-ExamplesOrganizations.md +0 -0
  291. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-GAM-Discussion-Group.md +0 -0
  292. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  293. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-GAM-options-files.md +0 -0
  294. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  295. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-GAM3CSVListings.md +0 -0
  296. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-GAM3DirectoryCommands.md +0 -0
  297. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-GAM3GroupSettings.md +0 -0
  298. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-GAM7-FAQ.md +0 -0
  299. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  300. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-GoogleDriveManagement.md +0 -0
  301. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  302. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Home.md +0 -0
  303. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  304. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Inbound-SSO-Settings.md +0 -0
  305. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-LicenseExamples.md +0 -0
  306. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Managing-Admins.md +0 -0
  307. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  308. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Managing-Devices.md +0 -0
  309. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Managing-Google-Classroom.md +0 -0
  310. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-OAuthKeyManagement.md +0 -0
  311. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Printers.md +0 -0
  312. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-ResellerCommands.md +0 -0
  313. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  314. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-SecurityExamples.md +0 -0
  315. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-UnmanagedUsersExamples.md +0 -0
  316. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Use-a-Yubikey.md +0 -0
  317. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  318. {gam7-7.7.16 → gam7-7.8.0}/wiki/l-_Footer.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.7.16
3
+ Version: 7.8.0
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
@@ -1383,7 +1383,7 @@ gam show projects [[admin] <EmailAddress>] [all|<ProjectIDEntity>]
1383
1383
  [states all|active|deleterequested] [showiampolicies 0|1|3]
1384
1384
  gam print projects [[admin] <EmailAddress>] [all|<ProjectIDEntity>] [todrive <ToDriveAttribute>*]
1385
1385
  [states all|active|deleterequested] [showiampolicies 0|1|3 [onememberperrow]]
1386
- [delimiter <Character>]] [[formatjson [quotechar <Character>]]
1386
+ [delimiter <Character>] [[formatjson [quotechar <Character>]]
1387
1387
  gam info currentprojectid
1388
1388
 
1389
1389
  gam create|add svcacct [[admin] <EmailAddress>] [<ProjectIDEntity>]
@@ -4119,7 +4119,7 @@ gam print devices [todrive <ToDriveAttribute>*]
4119
4119
  <DeviceFieldName>* [fields <DeviceFieldNameList>] [userfields <DeviceUserFieldNameList>]
4120
4120
  [orderby <DeviceOrderByFieldName> [ascending|descending]]
4121
4121
  [all|company|personal|nocompanydevices|nopersonaldevices]
4122
- [nodeviceusers]
4122
+ [nodeviceusers|oneuserperrow]
4123
4123
  [formatjson [quotechar <Character>]]
4124
4124
  [showitemcountonly]
4125
4125
 
@@ -4819,6 +4819,16 @@ gam show shareddrives
4819
4819
  [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
4820
4820
  [formatjson] [noorgunits [<Boolean>]]
4821
4821
 
4822
+ gam print shareddriveorganizers [todrive <ToDriveAttribute>*]
4823
+ [shareddriveadminquery|query <QuerySharedDrive>]
4824
+ [orgunit|org|ou <OrgUnitPath>]
4825
+ [matchname <REMatchPattern>]
4826
+ [domainlist <DomainList>]
4827
+ [includetypes <OrganizerTypeList>]
4828
+ [oneorganizer [<Boolean>]]
4829
+ [shownorganizerdrives [false|true|only]]
4830
+ [includefileorganizers [<Boolean>]]
4831
+ [delimiter <Character>]
4822
4832
  gam print oushareddrives [todrive <ToDriveAttribute>*]
4823
4833
  [ou|org|orgunit <OrgUnitPath>]
4824
4834
  [formatjson [quotechar <Character>]]
@@ -8326,6 +8336,17 @@ gam <UserTypeEntity> show shareddrives
8326
8336
  [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
8327
8337
  [formatjson]
8328
8338
 
8339
+ gam <UserTypeEntity> print shareddriveorganizers [todrive <ToDriveAttribute>*]
8340
+ [adminaccess|asadmin] [shareddriveadminquery|query <QuerySharedDrive>]
8341
+ [orgunit|org|ou <OrgUnitPath>]
8342
+ [matchname <REMatchPattern>]
8343
+ [domainlist <DomainList>]
8344
+ [includetypes <OrganizerTypeList>]
8345
+ [oneorganizer [<Boolean>]]
8346
+ [shownorganizerdrives [false|true|only]]
8347
+ [includefileorganizers [<Boolean>]]
8348
+ [delimiter <Character>]
8349
+
8329
8350
  # Users - Force Signout and Turn Off 2-Step Verification
8330
8351
 
8331
8352
  gam <UserTypeEntity> signout
@@ -1,3 +1,36 @@
1
+ 7.08.00
2
+
3
+ Added the following command that can be used instead of the `GetTeamDriveOrganizers.py` script.
4
+
5
+ ```
6
+ gam [<UserTypeEntity>] print shareddriveorganizers [todrive <ToDriveAttribute>*]
7
+ [adminaccess|asadmin] [shareddriveadminquery|query <QuerySharedDrive>]
8
+ [orgunit|org|ou <OrgUnitPath>]
9
+ [matchname <REMatchPattern>]
10
+ [domainlist <DomainList>]
11
+ [includetypes <OrganizerTypeList>]
12
+ [oneorganizer [<Boolean>]]
13
+ [shownorganizerdrives [false|true|only]]
14
+ [includefileorganizers [<Boolean>]]
15
+ [delimiter <Character>]
16
+ ```
17
+ The command defaults match the script defaults:
18
+ * `domainlist` - All domains
19
+ * `includetypes` - user,groups
20
+ * `oneorganizer` - False
21
+ * `shownoorganizerdrives` - True
22
+ * `includefileorganizers` - False
23
+
24
+ For example, to get a single organizer from your domain for all Shared Drives including no organizer drives:
25
+ ```
26
+ gam redirect csv ./TeamDriveOrganizers.csv print shareddriveorganizers domainlist mydomain.com includetypes user oneorganizer shownoorganizerdrives
27
+ ```
28
+
29
+ 7.07.17
30
+
31
+ Added option `oneuserperrow` to `gam print devices` to have each of a
32
+ device's users displayed on a separate row with all of the other device fields.
33
+
1
34
  7.07.16
2
35
 
3
36
  Added `chromeostype`, `diskspaceusage` and `faninfo` to `<CrOSFieldName>` for use in `gam info|print cros`.
@@ -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.07.16'
28
+ __version__ = '7.08.00'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -17102,11 +17102,11 @@ DATA_TRANSFER_SORT_TITLES = ['id', 'requestTime', 'oldOwnerUserEmail', 'newOwner
17102
17102
 
17103
17103
  # gam print datatransfers|transfers [todrive <ToDriveAttribute>*]
17104
17104
  # [olduser|oldowner <UserItem>] [newuser|newowner <UserItem>]
17105
- # [status <String>] [delimiter <Character>]]
17105
+ # [status <String>] [delimiter <Character>]
17106
17106
  # (addcsvdata <FieldName> <String>)*
17107
17107
  # gam show datatransfers|transfers
17108
17108
  # [olduser|oldowner <UserItem>] [newuser|newowner <UserItem>]
17109
- # [status <String>] [delimiter <Character>]]
17109
+ # [status <String>] [delimiter <Character>]
17110
17110
  def doPrintShowDataTransfers():
17111
17111
  dt = buildGAPIObject(API.DATATRANSFER)
17112
17112
  apps = getTransferApplications(dt)
@@ -29587,7 +29587,7 @@ DEVICE_ORDERBY_CHOICE_MAP = {
29587
29587
  # <DeviceFieldName>* [fields <DeviceFieldNameList>] [userfields <DeviceUserFieldNameList>]
29588
29588
  # [orderby <DeviceOrderByFieldName> [ascending|descending]]
29589
29589
  # [all|company|personal|nocompanydevices|nopersonaldevices]
29590
- # [nodeviceusers]
29590
+ # [nodeviceusers|oneuserperrow]
29591
29591
  # [formatjson [quotechar <Character>]]
29592
29592
  # [showitemcountonly]
29593
29593
  def doPrintCIDevices():
@@ -29603,7 +29603,7 @@ def doPrintCIDevices():
29603
29603
  queries = [None]
29604
29604
  view, entityType = DEVICE_VIEW_CHOICE_MAP['all']
29605
29605
  getDeviceUsers = True
29606
- showItemCountOnly = False
29606
+ oneUserPerRow = showItemCountOnly = False
29607
29607
  while Cmd.ArgumentsRemaining():
29608
29608
  myarg = getArgument()
29609
29609
  if csvPF and myarg == 'todrive':
@@ -29618,6 +29618,8 @@ def doPrintCIDevices():
29618
29618
  view, entityType = DEVICE_VIEW_CHOICE_MAP[myarg]
29619
29619
  elif myarg == 'nodeviceusers':
29620
29620
  getDeviceUsers = False
29621
+ elif myarg in {'oneuserperrow', 'oneitemperrow'}:
29622
+ getDeviceUsers = oneUserPerRow = True
29621
29623
  elif getFieldsList(myarg, DEVICE_FIELDS_CHOICE_MAP, fieldsList, initialField='name'):
29622
29624
  pass
29623
29625
  elif getFieldsList(myarg, DEVICEUSER_FIELDS_CHOICE_MAP, userFieldsList, initialField='name', fieldsArg='userfields'):
@@ -29631,6 +29633,8 @@ def doPrintCIDevices():
29631
29633
  fields = getItemFieldsFromFieldsList('devices', fieldsList)
29632
29634
  userFields = getItemFieldsFromFieldsList('deviceUsers', userFieldsList)
29633
29635
  substituteQueryTimes(queries, queryTimes)
29636
+ if FJQC.formatJSON and oneUserPerRow:
29637
+ csvPF.SetJSONTitles(['name', 'user.name', 'JSON'])
29634
29638
  itemCount = 0
29635
29639
  for query in queries:
29636
29640
  printGettingAllAccountEntities(entityType, query)
@@ -29672,13 +29676,26 @@ def doPrintCIDevices():
29672
29676
  except (GAPI.invalid, GAPI.invalidArgument, GAPI.permissionDenied) as e:
29673
29677
  entityActionFailedWarning([entityType, None], str(e))
29674
29678
  for device in devices:
29675
- row = flattenJSON(device, timeObjects=DEVICE_TIME_OBJECTS)
29676
- if not FJQC.formatJSON:
29677
- csvPF.WriteRowTitles(row)
29678
- elif csvPF.CheckRowTitles(row):
29679
- csvPF.WriteRowNoFilter({'name': device['name'],
29680
- 'JSON': json.dumps(cleanJSON(device, timeObjects=DEVICE_TIME_OBJECTS),
29681
- ensure_ascii=False, sort_keys=True)})
29679
+ if not oneUserPerRow or 'users' not in device:
29680
+ row = flattenJSON(device, timeObjects=DEVICE_TIME_OBJECTS)
29681
+ if not FJQC.formatJSON:
29682
+ csvPF.WriteRowTitles(row)
29683
+ elif csvPF.CheckRowTitles(row):
29684
+ csvPF.WriteRowNoFilter({'name': device['name'],
29685
+ 'JSON': json.dumps(cleanJSON(device, timeObjects=DEVICE_TIME_OBJECTS),
29686
+ ensure_ascii=False, sort_keys=True)})
29687
+ else:
29688
+ deviceUsers = device.pop('users')
29689
+ baserow = flattenJSON(device, timeObjects=DEVICE_TIME_OBJECTS)
29690
+ for deviceUser in deviceUsers:
29691
+ row = flattenJSON({'user': deviceUser}, flattened=baserow.copy(), timeObjects=DEVICE_TIME_OBJECTS)
29692
+ if not FJQC.formatJSON:
29693
+ csvPF.WriteRowTitles(row)
29694
+ elif csvPF.CheckRowTitles(row):
29695
+ device['user'] = deviceUser
29696
+ csvPF.WriteRowNoFilter({'name': device['name'], 'user.name': deviceUser['name'],
29697
+ 'JSON': json.dumps(cleanJSON(device, timeObjects=DEVICE_TIME_OBJECTS),
29698
+ ensure_ascii=False, sort_keys=True)})
29682
29699
  if showItemCountOnly:
29683
29700
  writeStdout(f'{itemCount}\n')
29684
29701
  return
@@ -66033,6 +66050,159 @@ def printShowSharedDriveACLs(users, useDomainAdminAccess=False):
66033
66050
  def doPrintShowSharedDriveACLs():
66034
66051
  printShowSharedDriveACLs([_getAdminEmail()], True)
66035
66052
 
66053
+ PRINT_ORGANIZER_TYPES = {'group', 'user'}
66054
+
66055
+ # gam [<UserTypeEntity>] print shareddriveorganizers [todrive <ToDriveAttribute>*]
66056
+ # [adminaccess|asadmin] [shareddriveadminquery|query <QuerySharedDrive>]
66057
+ # [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
66058
+ # [domainlist <DomainList>]
66059
+ # [includetypes user|group]
66060
+ # [oneorganizer [<Boolean>]]
66061
+ # [shownorganizerdrives false|true|only]
66062
+ # [includefileorganizers [<Boolean>]]
66063
+ # [delimiter <Character>]
66064
+ def printSharedDriveOrganizers(users, useDomainAdminAccess=False):
66065
+ csvPF = CSVPrintFile(['id', 'name', 'organizers', 'createdTime'], 'sortall')
66066
+ delimiter = GC.Values[GC.CSV_OUTPUT_FIELD_DELIMITER]
66067
+ roles = set(['organizer'])
66068
+ includeTypes = set()
66069
+ showNoOrganizerDrives = SHOW_NO_PERMISSIONS_DRIVES_CHOICE_MAP['false']
66070
+ fieldsList = ['role', 'type', 'emailAddress']
66071
+ cd = orgUnitId = query = matchPattern = None
66072
+ domainList = []
66073
+ oneOrganizer = False
66074
+ while Cmd.ArgumentsRemaining():
66075
+ myarg = getArgument()
66076
+ if csvPF and myarg == 'todrive':
66077
+ csvPF.GetTodriveParameters()
66078
+ elif myarg == 'delimiter':
66079
+ delimiter = getCharacter()
66080
+ elif myarg in {'teamdriveadminquery', 'shareddriveadminquery', 'query'}:
66081
+ queryLocation = Cmd.Location()
66082
+ query = getString(Cmd.OB_QUERY, minLen=0) or None
66083
+ if query:
66084
+ query = mapQueryRelativeTimes(query, ['createdTime'])
66085
+ elif myarg == 'matchname':
66086
+ matchPattern = getREPattern(re.IGNORECASE)
66087
+ elif myarg in {'ou', 'org', 'orgunit'}:
66088
+ orgLocation = Cmd.Location()
66089
+ if cd is None:
66090
+ cd = buildGAPIObject(API.DIRECTORY)
66091
+ orgUnitPath, orgUnitId = getOrgUnitId(cd)
66092
+ orgUnitId = orgUnitId[3:]
66093
+ orgUnitInfo = {'orgUnit': orgUnitPath, 'orgUnitId': orgUnitId}
66094
+ elif myarg in ADMIN_ACCESS_OPTIONS:
66095
+ useDomainAdminAccess = True
66096
+ elif myarg == 'domainlist':
66097
+ domainList = set(getString(Cmd.OB_DOMAIN_NAME_LIST).replace(',', ' ').lower().split())
66098
+ elif myarg == 'includetypes':
66099
+ for itype in getString(Cmd.OB_ORGANIZER_TYPE_LIST).lower().replace(',', ' ').split():
66100
+ if itype in PRINT_ORGANIZER_TYPES:
66101
+ includeTypes.add(itype)
66102
+ else:
66103
+ invalidChoiceExit(itype, PRINT_ORGANIZER_TYPES, True)
66104
+ elif myarg == 'oneorganizer':
66105
+ oneOrganizer = getBoolean()
66106
+ elif myarg == 'shownoorganizerdrives':
66107
+ showNoOrganizerDrives = getChoice(SHOW_NO_PERMISSIONS_DRIVES_CHOICE_MAP, defaultChoice=1, mapChoice=True)
66108
+ elif myarg in {'includefileorganizers', 'includecontentmanagers'}:
66109
+ if getBoolean():
66110
+ roles.add('fileOrganizer')
66111
+ else:
66112
+ unknownArgumentExit()
66113
+ if query and not useDomainAdminAccess:
66114
+ Cmd.SetLocation(queryLocation-1)
66115
+ usageErrorExit(Msg.ONLY_ADMINISTRATORS_CAN_PERFORM_SHARED_DRIVE_QUERIES)
66116
+ if orgUnitId is not None:
66117
+ if not useDomainAdminAccess:
66118
+ Cmd.SetLocation(orgLocation-1)
66119
+ usageErrorExit(Msg.ONLY_ADMINISTRATORS_CAN_SPECIFY_SHARED_DRIVE_ORGUNIT)
66120
+ csvPF.AddTitles(['orgUnit', 'orgUnitId'])
66121
+ if not includeTypes:
66122
+ includeTypes = PRINT_ORGANIZER_TYPES
66123
+ fields = getItemFieldsFromFieldsList('permissions', fieldsList, True)
66124
+ i, count, users = getEntityArgument(users)
66125
+ for user in users:
66126
+ i += 1
66127
+ user, drive = buildGAPIServiceObject(API.DRIVE3, user, i, count)
66128
+ if not drive:
66129
+ continue
66130
+ if useDomainAdminAccess:
66131
+ printGettingAllAccountEntities(Ent.SHAREDDRIVE, query)
66132
+ pageMessage = getPageMessage()
66133
+ else:
66134
+ printGettingAllEntityItemsForWhom(Ent.SHAREDDRIVE, user, i, count, query)
66135
+ pageMessage = getPageMessageForWhom()
66136
+ try:
66137
+ feed = callGAPIpages(drive.drives(), 'list', 'drives',
66138
+ pageMessage=pageMessage,
66139
+ throwReasons=GAPI.DRIVE_USER_THROW_REASONS+[GAPI.INVALID_QUERY, GAPI.INVALID,
66140
+ GAPI.QUERY_REQUIRES_ADMIN_CREDENTIALS,
66141
+ GAPI.NO_LIST_TEAMDRIVES_ADMINISTRATOR_PRIVILEGE,
66142
+ GAPI.FILE_NOT_FOUND],
66143
+ q=query, useDomainAdminAccess=useDomainAdminAccess,
66144
+ fields='nextPageToken,drives(id,name,createdTime,orgUnitId)', pageSize=100)
66145
+ except (GAPI.invalidQuery, GAPI.invalid, GAPI.queryRequiresAdminCredentials,
66146
+ GAPI.noListTeamDrivesAdministratorPrivilege, GAPI.fileNotFound) as e:
66147
+ entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE, None], str(e), i, count)
66148
+ continue
66149
+ except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
66150
+ userDriveServiceNotEnabledWarning(user, str(e), i, count)
66151
+ continue
66152
+ matchFeed = []
66153
+ jcount = len(feed)
66154
+ j = 0
66155
+ for shareddrive in feed:
66156
+ j += 1
66157
+ if ((matchPattern is not None and matchPattern.match(shareddrive['name']) is None) or
66158
+ (orgUnitId is not None and orgUnitId != shareddrive.get('orgUnitId'))):
66159
+ continue
66160
+ printGettingAllEntityItemsForWhom(Ent.PERMISSION, shareddrive['name'], j, jcount)
66161
+ shareddrive['createdTime'] = formatLocalTime(shareddrive['createdTime'])
66162
+ shareddrive['organizers'] = []
66163
+ try:
66164
+ permissions = callGAPIpages(drive.permissions(), 'list', 'permissions',
66165
+ pageMessage=getPageMessageForWhom(),
66166
+ throwReasons=GAPI.DRIVE3_GET_ACL_REASONS,
66167
+ retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
66168
+ useDomainAdminAccess=useDomainAdminAccess,
66169
+ fileId=shareddrive['id'], fields=fields, supportsAllDrives=True)
66170
+ for permission in permissions:
66171
+ if permission['type'] in includeTypes and permission['role'] in roles:
66172
+ if domainList:
66173
+ _, domain = permission['emailAddress'].lower().split('@', 1)
66174
+ if domain not in domainList:
66175
+ continue
66176
+ shareddrive['organizers'].append(permission['emailAddress'])
66177
+ if oneOrganizer:
66178
+ break
66179
+ if not shareddrive['organizers']:
66180
+ if showNoOrganizerDrives == 0: # no organizers and showNoOrganizerDrives False - ignore
66181
+ continue
66182
+ matchFeed.append(shareddrive) # no organizers and showNoOrganizerDrives Only/True - keep
66183
+ continue
66184
+ if showNoOrganizerDrives < 0: # organizers and showNoOrganizerDrives Only/True - ignore
66185
+ continue
66186
+ matchFeed.append(shareddrive)
66187
+ except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
66188
+ GAPI.insufficientAdministratorPrivileges, GAPI.insufficientFilePermissions,
66189
+ GAPI.unknownError, GAPI.invalid):
66190
+ pass
66191
+ if len(matchFeed) == 0:
66192
+ setSysExitRC(NO_ENTITIES_FOUND_RC)
66193
+ for shareddrive in matchFeed:
66194
+ row = {'id': shareddrive['id'], 'name': shareddrive['name'],
66195
+ 'organizers': delimiter.join(shareddrive['organizers']),
66196
+ 'createdTime': shareddrive['createdTime']}
66197
+ if orgUnitId:
66198
+ row.update(orgUnitInfo)
66199
+ csvPF.WriteRowTitles(row)
66200
+ if csvPF:
66201
+ csvPF.writeCSVfile('SharedDrive Organizers')
66202
+
66203
+ def doPrintSharedDriveOrganizers():
66204
+ printSharedDriveOrganizers([_getAdminEmail()], True)
66205
+
66036
66206
  LOOKERSTUDIO_ASSETTYPE_CHOICE_MAP = {
66037
66207
  'report': ['REPORT'],
66038
66208
  'datasource': ['DATA_SOURCE'],
@@ -75919,6 +76089,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75919
76089
  Cmd.ARG_SCHEMA: doPrintShowUserSchemas,
75920
76090
  Cmd.ARG_SHAREDDRIVE: doPrintShowSharedDrives,
75921
76091
  Cmd.ARG_SHAREDDRIVEACLS: doPrintShowSharedDriveACLs,
76092
+ Cmd.ARG_SHAREDDRIVEORGANIZERS: doPrintSharedDriveOrganizers,
75922
76093
  Cmd.ARG_SITE: deprecatedDomainSites,
75923
76094
  Cmd.ARG_SITEACL: deprecatedDomainSites,
75924
76095
  Cmd.ARG_SITEACTIVITY: deprecatedDomainSites,
@@ -76267,6 +76438,7 @@ MAIN_COMMANDS_OBJ_ALIASES = {
76267
76438
  Cmd.ARG_TEAMDRIVES: Cmd.ARG_SHAREDDRIVE,
76268
76439
  Cmd.ARG_TEAMDRIVEACLS: Cmd.ARG_SHAREDDRIVEACLS,
76269
76440
  Cmd.ARG_TEAMDRIVEINFO: Cmd.ARG_SHAREDDRIVEINFO,
76441
+ Cmd.ARG_TEAMDRIVEORGANIZERS: Cmd.ARG_SHAREDDRIVEORGANIZERS,
76270
76442
  Cmd.ARG_TEAMDRIVETHEMES: Cmd.ARG_SHAREDDRIVETHEMES,
76271
76443
  Cmd.ARG_TOKENS: Cmd.ARG_TOKEN,
76272
76444
  Cmd.ARG_TRANSFER: Cmd.ARG_DATATRANSFER,
@@ -76959,6 +77131,7 @@ USER_COMMANDS_WITH_OBJECTS = {
76959
77131
  Cmd.ARG_SENDAS: printShowSendAs,
76960
77132
  Cmd.ARG_SHAREDDRIVE: printShowSharedDrives,
76961
77133
  Cmd.ARG_SHAREDDRIVEACLS: printShowSharedDriveACLs,
77134
+ Cmd.ARG_SHAREDDRIVEORGANIZERS: printSharedDriveOrganizers,
76962
77135
  Cmd.ARG_SHEET: infoPrintShowSheets,
76963
77136
  Cmd.ARG_SHEETRANGE: printShowSheetRanges,
76964
77137
  Cmd.ARG_SIGNATURE: printShowSignature,
@@ -77316,6 +77489,7 @@ USER_COMMANDS_OBJ_ALIASES = {
77316
77489
  Cmd.ARG_TEAMDRIVES: Cmd.ARG_SHAREDDRIVE,
77317
77490
  Cmd.ARG_TEAMDRIVEACLS: Cmd.ARG_SHAREDDRIVEACLS,
77318
77491
  Cmd.ARG_TEAMDRIVEINFO: Cmd.ARG_SHAREDDRIVEINFO,
77492
+ Cmd.ARG_TEAMDRIVEORGANIZERS: Cmd.ARG_SHAREDDRIVEORGANIZERS,
77319
77493
  Cmd.ARG_TEAMDRIVETHEMES: Cmd.ARG_SHAREDDRIVETHEMES,
77320
77494
  Cmd.ARG_THREADS: Cmd.ARG_THREAD,
77321
77495
  Cmd.ARG_TOKENS: Cmd.ARG_TOKEN,
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
- # Copyright (C) 2024 Ross Scroggs All Rights Reserved.
3
+ # Copyright (C) 2025 Ross Scroggs All Rights Reserved.
4
4
  #
5
5
  # All Rights Reserved.
6
6
  #
@@ -755,6 +755,7 @@ class GamCLArgs():
755
755
  ARG_SHAREDDRIVES = 'shareddrives'
756
756
  ARG_SHAREDDRIVEACLS = 'shareddriveacls'
757
757
  ARG_SHAREDDRIVEINFO = 'shareddriveinfo'
758
+ ARG_SHAREDDRIVEORGANIZERS = 'shareddriveorganizers'
758
759
  ARG_SHAREDDRIVETHEMES = 'shareddrivethemes'
759
760
  ARG_SHEET = 'sheet'
760
761
  ARG_SHEETS = 'sheets'
@@ -784,6 +785,7 @@ class GamCLArgs():
784
785
  ARG_TEAMDRIVES = 'teamdrives'
785
786
  ARG_TEAMDRIVEACLS = 'teamdriveacls'
786
787
  ARG_TEAMDRIVEINFO = 'teamdriveinfo'
788
+ ARG_TEAMDRIVEORGANIZERS = 'teamdriveorganizers'
787
789
  ARG_TEAMDRIVETHEMES = 'teamdrivethemes'
788
790
  ARG_THREAD = 'thread'
789
791
  ARG_THREADS = 'threads'
@@ -964,6 +966,7 @@ class GamCLArgs():
964
966
  OB_MOBILE_ENTITY = 'MobileEntity'
965
967
  OB_NETWORK_ID = 'networkID'
966
968
  OB_NAME = 'Name'
969
+ OB_ORGANIZER_TYPE_LIST = 'OrganizerTypeList'
967
970
  OB_ORGUNIT_ENTITY = 'OrgUnitEntity'
968
971
  OB_ORGUNIT_ITEM = 'OrgUnitItem'
969
972
  OB_ORGUNIT_PATH = 'OrgUnitPath'
@@ -210,7 +210,7 @@ gam print devices [todrive <ToDriveAttribute>*]
210
210
  <DeviceFieldName>* [fields <DeviceFieldNameList>] [userfields <DeviceUserFieldNameList>]
211
211
  [orderby <DeviceOrderByFieldName> [ascending|descending]]
212
212
  [all|company|personal|nocompanydevices|nopersonaldevices]
213
- [nodeviceusers]
213
+ [nodeviceusers|oneuserperrow]
214
214
  [formatjson [quotechar <Character>]]
215
215
  ```
216
216
  By default, all devices are displayed; use the query options to limit the display.
@@ -231,6 +231,9 @@ Select the view of devices to display:
231
231
  By default, Gam makes additional API calls to display the device users for the devices;
232
232
  use `nodeviceuser` to suppress making the additional calls.
233
233
 
234
+ By default, when device users are displayed, they are all displayed on one row;
235
+ use `oneuserperrow` to have each of a device's users displayed on a separate row with all of the other device fields.
236
+
234
237
  By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format,
235
238
  * `formatjson` - Display the fields in JSON format.
236
239
 
@@ -10,6 +10,11 @@ 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.07.17
14
+
15
+ Added option `oneuserperrow` to `gam print devices` to have each of a
16
+ device's users displayed on a separate row with all of the other device fields.
17
+
13
18
  ### 7.07.16
14
19
 
15
20
  Added `chromeostype`, `diskspaceusage` and `faninfo` to `<CrOSFieldName>` for use in `gam info|print cros`.
@@ -251,7 +251,7 @@ writes the credentials into the file oauth2.txt.
251
251
  admin@server:/Users/admin$ rm -f /Users/admin/GAMConfig/oauth2.txt
252
252
  admin@server:/Users/admin$ gam version
253
253
  WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
254
- GAM 7.07.16 - https://github.com/GAM-team/GAM - pyinstaller
254
+ GAM 7.07.17 - https://github.com/GAM-team/GAM - pyinstaller
255
255
  GAM Team <google-apps-manager@googlegroups.com>
256
256
  Python 3.13.3 64-bit final
257
257
  MacOS Sequoia 15.5 x86_64
@@ -989,7 +989,7 @@ writes the credentials into the file oauth2.txt.
989
989
  C:\>del C:\GAMConfig\oauth2.txt
990
990
  C:\>gam version
991
991
  WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
992
- GAM 7.07.16 - https://github.com/GAM-team/GAM - pythonsource
992
+ GAM 7.07.17 - https://github.com/GAM-team/GAM - pythonsource
993
993
  GAM Team <google-apps-manager@googlegroups.com>
994
994
  Python 3.13.3 64-bit final
995
995
  Windows-10-10.0.17134 AMD64
@@ -30,6 +30,7 @@
30
30
  - [Display ACLs for Shared Drives with all organizers outside of your domain](#display-acls-for-shared-drives-with-all-organizers-outside-of-your-domain)
31
31
  - [Display ACLs for Shared Drives with all ACLs outside of your domain](#display-acls-for-shared-drives-with-all-acls-outside-of-your-domain)
32
32
  - [Clean up scammed Shared Drives](#clean-up-scammed-shared-drives)
33
+ - [Delete old empty Shared Drives](#delete-old-empty-shared-drives)
33
34
 
34
35
  ## API documentation
35
36
  * [Drive API - Drives](https://developers.google.com/drive/api/reference/rest/v3/drives)
@@ -791,3 +792,37 @@ This is not reversible, proceed with caution.
791
792
  ```
792
793
  gam redirect stdout ./DeleteSharedDrives.txt multiprocess redirect stderr stdout csv ./SharedDriveACLsAllExternal.csv gam delete teamdrive "~id" allowitemdeletion
793
794
  ```
795
+
796
+ ## Delete old empty Shared Drives
797
+ ```
798
+ # Get a list of Shared Drives created before one year ago; alter date<-1y as required
799
+ gam config csv_output_row_filter "createdTime:date<-1y" redirect csv ./TeamDrives.csv print teamdrives fields id,name,createdtime
800
+
801
+ # You'll need a list of Shared Drive IDs and organizers; get ACLs for Shared Drives from above
802
+ gam redirect csv ./TeamDriveACLs.csv multiprocess csv ./TeamDrives.csv gam print drivefileacls "~id" fields id,emailaddress,role,type,deleted
803
+
804
+ # Customize script: https://github.com/taers232c/GAM-Scripts3/blob/master/GetTeamDriveOrganizers.py
805
+ DOMAIN_LIST = ['yourdomain.org']
806
+
807
+ INCLUDE_TYPES = {
808
+ 'user': True,
809
+ 'group': False,
810
+ }
811
+
812
+ ONE_ORGANIZER = True
813
+ SHOW_NO_ORGANIZER_DRIVES = True
814
+ INCLUDE_FILE_ORGANIZERS = False
815
+
816
+ # Run script
817
+ python GetTeamDriveOrganizers.py TeamDriveACLs.csv TeamDrives.csv TeamDriveOrganizers.csv
818
+
819
+ # Inspect TeamDriveOrganizers.csv, you'll have to deal with Shared Drives with no organizer/manager
820
+
821
+ # Get old empty Shared Drives
822
+ gam config num_threads 10 csv_input_row_filter "organizers:regex:^.+$" csv_output_row_filter "Total:count=0" redirect csv ./OldEmptySharedDrives.csv multiprocess redirect stderr - multiprocess csv ./TeamDriveOrganizers.csv gam user "~organizers" print filecounts select teamdriveid "~id" showsize
823
+
824
+ # Inspect OldEmptySharedDrives.csv, if you're confident of the results, proceed
825
+
826
+ # Delete old empty Shared Drives
827
+ gam redirect stdout ./DeleteOldEmptySharedDrives.txt multiprocess redirect stderr stdout csv ./OldEmptySharedDrives.csv gam user "~User" delete shareddrive "~id"
828
+ ```
@@ -1,4 +1,5 @@
1
1
  # Users - Gmail - Delegates
2
+ - [Notes](#notes)
2
3
  - [API documentation](#api-documentation)
3
4
  - [Definitions](#definitions)
4
5
  - [Aliases](#aliases)
@@ -8,6 +9,11 @@
8
9
  - [Display Gmail delegates](#display-gmail-delegates)
9
10
  - [Delete all delegates for a user](#delete-all-delegates-for-a-user)
10
11
 
12
+ ## Notes
13
+
14
+ To use Gmail delegation, the delegator and delagatee must be in org units where
15
+ mail delegation is enabled. In the admin console, go to Apps/Google Workspace/Gmail/User Settings.
16
+
11
17
  ## API documentation
12
18
  * [Gmail API - Delegates](https://developers.google.com/gmail/api/v1/reference/users.settings.delegates)
13
19
  * [Delegation Notes](https://support.google.com/a/answer/7223765)
@@ -3,7 +3,7 @@
3
3
  Print the current version of Gam with details
4
4
  ```
5
5
  gam version
6
- GAM 7.07.16 - https://github.com/GAM-team/GAM - pyinstaller
6
+ GAM 7.07.17 - https://github.com/GAM-team/GAM - pyinstaller
7
7
  GAM Team <google-apps-manager@googlegroups.com>
8
8
  Python 3.13.3 64-bit final
9
9
  MacOS Sequoia 15.5 x86_64
@@ -15,7 +15,7 @@ Time: 2023-06-02T21:10:00-07:00
15
15
  Print the current version of Gam with details and time offset information
16
16
  ```
17
17
  gam version timeoffset
18
- GAM 7.07.16 - https://github.com/GAM-team/GAM - pyinstaller
18
+ GAM 7.07.17 - https://github.com/GAM-team/GAM - pyinstaller
19
19
  GAM Team <google-apps-manager@googlegroups.com>
20
20
  Python 3.13.3 64-bit final
21
21
  MacOS Sequoia 15.5 x86_64
@@ -27,7 +27,7 @@ Your system time differs from www.googleapis.com by less than 1 second
27
27
  Print the current version of Gam with extended details and SSL information
28
28
  ```
29
29
  gam version extended
30
- GAM 7.07.16 - https://github.com/GAM-team/GAM - pyinstaller
30
+ GAM 7.07.17 - https://github.com/GAM-team/GAM - pyinstaller
31
31
  GAM Team <google-apps-manager@googlegroups.com>
32
32
  Python 3.13.3 64-bit final
33
33
  MacOS Sequoia 15.5 x86_64
@@ -64,7 +64,7 @@ MacOS High Sierra 10.13.6 x86_64
64
64
  Path: /Users/Admin/bin/gam7
65
65
  Version Check:
66
66
  Current: 5.35.08
67
- Latest: 7.07.16
67
+ Latest: 7.07.17
68
68
  echo $?
69
69
  1
70
70
  ```
@@ -72,7 +72,7 @@ echo $?
72
72
  Print the current version number without details
73
73
  ```
74
74
  gam version simple
75
- 7.07.16
75
+ 7.07.17
76
76
  ```
77
77
  In Linux/MacOS you can do:
78
78
  ```
@@ -82,7 +82,7 @@ echo $VER
82
82
  Print the current version of Gam and address of this Wiki
83
83
  ```
84
84
  gam help
85
- GAM 7.07.16 - https://github.com/GAM-team/GAM
85
+ GAM 7.07.17 - https://github.com/GAM-team/GAM
86
86
  GAM Team <google-apps-manager@googlegroups.com>
87
87
  Python 3.13.3 64-bit final
88
88
  MacOS Sequoia 15.5 x86_64
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes