gam7 7.7.11__tar.gz → 7.7.13__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.11 → gam7-7.7.13}/PKG-INFO +1 -1
  2. {gam7-7.7.11 → gam7-7.7.13}/src/GamUpdate.txt +11 -0
  3. {gam7-7.7.11 → gam7-7.7.13}/src/gam/__init__.py +68 -57
  4. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glcfg.py +5 -5
  5. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glglobals.py +1 -4
  6. {gam7-7.7.11 → gam7-7.7.13}/wiki/GamUpdates.md +19 -0
  7. {gam7-7.7.11 → gam7-7.7.13}/wiki/Groups.md +5 -0
  8. {gam7-7.7.11 → gam7-7.7.13}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  9. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Copy-Move.md +17 -1
  10. {gam7-7.7.11 → gam7-7.7.13}/wiki/Version-and-Help.md +6 -6
  11. {gam7-7.7.11 → gam7-7.7.13}/wiki/gam.cfg.md +5 -3
  12. {gam7-7.7.11 → gam7-7.7.13}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  13. {gam7-7.7.11 → gam7-7.7.13}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  14. {gam7-7.7.11 → gam7-7.7.13}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  15. {gam7-7.7.11 → gam7-7.7.13}/.github/ISSUE_TEMPLATE.txt +0 -0
  16. {gam7-7.7.11 → gam7-7.7.13}/.github/actions/decrypt.sh +0 -0
  17. {gam7-7.7.11 → gam7-7.7.13}/.github/actions/entitlements.plist +0 -0
  18. {gam7-7.7.11 → gam7-7.7.13}/.github/actions/package_exclusions.txt +0 -0
  19. {gam7-7.7.11 → gam7-7.7.13}/.github/stale.yml +0 -0
  20. {gam7-7.7.11 → gam7-7.7.13}/.github/workflows/build.yml +0 -0
  21. {gam7-7.7.11 → gam7-7.7.13}/.github/workflows/codeql-analysis.yml +0 -0
  22. {gam7-7.7.11 → gam7-7.7.13}/.github/workflows/get-cacerts.yml +0 -0
  23. {gam7-7.7.11 → gam7-7.7.13}/.github/workflows/pushwiki.yml +0 -0
  24. {gam7-7.7.11 → gam7-7.7.13}/.github/workflows/pypi.yml +0 -0
  25. {gam7-7.7.11 → gam7-7.7.13}/.pre-commit-config.yaml +0 -0
  26. {gam7-7.7.11 → gam7-7.7.13}/LICENSE +0 -0
  27. {gam7-7.7.11 → gam7-7.7.13}/README.md +0 -0
  28. {gam7-7.7.11 → gam7-7.7.13}/pyproject.toml +0 -0
  29. {gam7-7.7.11 → gam7-7.7.13}/src/.gitignore +0 -0
  30. {gam7-7.7.11 → gam7-7.7.13}/src/GamCommands.txt +0 -0
  31. {gam7-7.7.11 → gam7-7.7.13}/src/LICENSE +0 -0
  32. {gam7-7.7.11 → gam7-7.7.13}/src/cacerts.pem +0 -0
  33. {gam7-7.7.11 → gam7-7.7.13}/src/callgam.py +0 -0
  34. {gam7-7.7.11 → gam7-7.7.13}/src/gam/__main__.py +0 -0
  35. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/__init__.py +0 -0
  36. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/auth.py +0 -0
  37. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/client.py +0 -0
  38. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/core.py +0 -0
  39. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/data.py +0 -0
  40. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/http.py +0 -0
  41. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/http_core.py +0 -0
  42. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/http_interface.py +0 -0
  43. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/mock_http.py +0 -0
  44. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/mock_http_core.py +0 -0
  45. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/mock_service.py +0 -0
  46. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/service.py +0 -0
  47. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/token_store.py +0 -0
  48. {gam7-7.7.11 → gam7-7.7.13}/src/gam/atom/url.py +0 -0
  49. {gam7-7.7.11 → gam7-7.7.13}/src/gam/cacerts.pem +0 -0
  50. {gam7-7.7.11 → gam7-7.7.13}/src/gam/cbcm-v1.1beta1.json +0 -0
  51. {gam7-7.7.11 → gam7-7.7.13}/src/gam/contactdelegation-v1.json +0 -0
  52. {gam7-7.7.11 → gam7-7.7.13}/src/gam/datastudio-v1.json +0 -0
  53. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/__init__.py +0 -0
  54. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glaction.py +0 -0
  55. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glapi.py +0 -0
  56. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glclargs.py +0 -0
  57. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glentity.py +0 -0
  58. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glgapi.py +0 -0
  59. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glgdata.py +0 -0
  60. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glindent.py +0 -0
  61. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glmsgs.py +0 -0
  62. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glskus.py +0 -0
  63. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/gluprop.py +0 -0
  64. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/glverlibs.py +0 -0
  65. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gamlib/yubikey.py +0 -0
  66. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/__init__.py +0 -0
  67. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/alt/__init__.py +0 -0
  68. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/alt/app_engine.py +0 -0
  69. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/alt/appengine.py +0 -0
  70. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/__init__.py +0 -0
  71. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/audit/__init__.py +0 -0
  72. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/audit/service.py +0 -0
  73. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  74. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/contacts/service.py +0 -0
  75. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/apps/service.py +0 -0
  76. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/service.py +0 -0
  77. {gam7-7.7.11 → gam7-7.7.13}/src/gam/gdata/urlfetch.py +0 -0
  78. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/__init__.py +0 -0
  79. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/_auth.py +0 -0
  80. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/_helpers.py +0 -0
  81. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/channel.py +0 -0
  82. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/discovery.py +0 -0
  83. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  84. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  85. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  86. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  87. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/errors.py +0 -0
  88. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/http.py +0 -0
  89. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/mimeparse.py +0 -0
  90. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/model.py +0 -0
  91. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/schema.py +0 -0
  92. {gam7-7.7.11 → gam7-7.7.13}/src/gam/googleapiclient/version.py +0 -0
  93. {gam7-7.7.11 → gam7-7.7.13}/src/gam/iso8601/__init__.py +0 -0
  94. {gam7-7.7.11 → gam7-7.7.13}/src/gam/iso8601/iso8601.py +0 -0
  95. {gam7-7.7.11 → gam7-7.7.13}/src/gam/meet-v2beta.json +0 -0
  96. {gam7-7.7.11 → gam7-7.7.13}/src/gam/serviceaccountlookup-v1.json +0 -0
  97. {gam7-7.7.11 → gam7-7.7.13}/src/gam/six.py +0 -0
  98. {gam7-7.7.11 → gam7-7.7.13}/src/gam-install.sh +0 -0
  99. {gam7-7.7.11 → gam7-7.7.13}/src/gam-setup.bat +0 -0
  100. {gam7-7.7.11 → gam7-7.7.13}/src/gam.exe.manifest +0 -0
  101. {gam7-7.7.11 → gam7-7.7.13}/src/gam.py +0 -0
  102. {gam7-7.7.11 → gam7-7.7.13}/src/gam.spec +0 -0
  103. {gam7-7.7.11 → gam7-7.7.13}/src/gam.wxs +0 -0
  104. {gam7-7.7.11 → gam7-7.7.13}/src/license.rtf +0 -0
  105. {gam7-7.7.11 → gam7-7.7.13}/src/requirements-dev.txt +0 -0
  106. {gam7-7.7.11 → gam7-7.7.13}/src/requirements.txt +0 -0
  107. {gam7-7.7.11 → gam7-7.7.13}/src/setup.cfg +0 -0
  108. {gam7-7.7.11 → gam7-7.7.13}/src/setup.py +0 -0
  109. {gam7-7.7.11 → gam7-7.7.13}/src/tools/a_atleast_b.py +0 -0
  110. {gam7-7.7.11 → gam7-7.7.13}/src/tools/gen-wix-xml-filelist.py +0 -0
  111. {gam7-7.7.11 → gam7-7.7.13}/src/tools/mkGamRef.py +0 -0
  112. {gam7-7.7.11 → gam7-7.7.13}/src/tools/openssl.props +0 -0
  113. {gam7-7.7.11 → gam7-7.7.13}/src/version_info.txt.in +0 -0
  114. {gam7-7.7.11 → gam7-7.7.13}/wiki/00scratch.md +0 -0
  115. {gam7-7.7.11 → gam7-7.7.13}/wiki/Addresses.md +0 -0
  116. {gam7-7.7.11 → gam7-7.7.13}/wiki/Administrators.md +0 -0
  117. {gam7-7.7.11 → gam7-7.7.13}/wiki/Alert-Center.md +0 -0
  118. {gam7-7.7.11 → gam7-7.7.13}/wiki/Aliases.md +0 -0
  119. {gam7-7.7.11 → gam7-7.7.13}/wiki/Authorization.md +0 -0
  120. {gam7-7.7.11 → gam7-7.7.13}/wiki/BNF-Syntax.md +0 -0
  121. {gam7-7.7.11 → gam7-7.7.13}/wiki/Basic-Items.md +0 -0
  122. {gam7-7.7.11 → gam7-7.7.13}/wiki/Bulk-Processing.md +0 -0
  123. {gam7-7.7.11 → gam7-7.7.13}/wiki/CSV-Input-Filtering.md +0 -0
  124. {gam7-7.7.11 → gam7-7.7.13}/wiki/CSV-Output-Filtering.md +0 -0
  125. {gam7-7.7.11 → gam7-7.7.13}/wiki/CSV-Special-Characters.md +0 -0
  126. {gam7-7.7.11 → gam7-7.7.13}/wiki/Calendars-Access.md +0 -0
  127. {gam7-7.7.11 → gam7-7.7.13}/wiki/Calendars-Events.md +0 -0
  128. {gam7-7.7.11 → gam7-7.7.13}/wiki/Calendars.md +0 -0
  129. {gam7-7.7.11 → gam7-7.7.13}/wiki/Chat-Bot.md +0 -0
  130. {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-AUE-Counts.md +0 -0
  131. {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  132. {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Installed-Apps.md +0 -0
  133. {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  134. {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Policies.md +0 -0
  135. {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Printers.md +0 -0
  136. {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Profile-Management.md +0 -0
  137. {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Version-Counts.md +0 -0
  138. {gam7-7.7.11 → gam7-7.7.13}/wiki/Chrome-Version-History.md +0 -0
  139. {gam7-7.7.11 → gam7-7.7.13}/wiki/ChromeOS-Devices.md +0 -0
  140. {gam7-7.7.11 → gam7-7.7.13}/wiki/Classroom-Courses.md +0 -0
  141. {gam7-7.7.11 → gam7-7.7.13}/wiki/Classroom-Guardians.md +0 -0
  142. {gam7-7.7.11 → gam7-7.7.13}/wiki/Classroom-Invitations.md +0 -0
  143. {gam7-7.7.11 → gam7-7.7.13}/wiki/Classroom-Membership.md +0 -0
  144. {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Channel.md +0 -0
  145. {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Identity-Devices.md +0 -0
  146. {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  147. {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Identity-Groups.md +0 -0
  148. {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Identity-Policies.md +0 -0
  149. {gam7-7.7.11 → gam7-7.7.13}/wiki/Cloud-Storage.md +0 -0
  150. {gam7-7.7.11 → gam7-7.7.13}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  151. {gam7-7.7.11 → gam7-7.7.13}/wiki/Collections-of-Items.md +0 -0
  152. {gam7-7.7.11 → gam7-7.7.13}/wiki/Collections-of-Users.md +0 -0
  153. {gam7-7.7.11 → gam7-7.7.13}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  154. {gam7-7.7.11 → gam7-7.7.13}/wiki/Command-Line-Parsing.md +0 -0
  155. {gam7-7.7.11 → gam7-7.7.13}/wiki/Command-Logging-Progress.md +0 -0
  156. {gam7-7.7.11 → gam7-7.7.13}/wiki/Context-Aware-Access-Levels.md +0 -0
  157. {gam7-7.7.11 → gam7-7.7.13}/wiki/Customer.md +0 -0
  158. {gam7-7.7.11 → gam7-7.7.13}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  159. {gam7-7.7.11 → gam7-7.7.13}/wiki/Domain-SharedContacts.md +0 -0
  160. {gam7-7.7.11 → gam7-7.7.13}/wiki/Domains-Verification.md +0 -0
  161. {gam7-7.7.11 → gam7-7.7.13}/wiki/Domains.md +0 -0
  162. {gam7-7.7.11 → gam7-7.7.13}/wiki/Downloads-Installs.md +0 -0
  163. {gam7-7.7.11 → gam7-7.7.13}/wiki/Drive-File-Selection.md +0 -0
  164. {gam7-7.7.11 → gam7-7.7.13}/wiki/Drive-Items.md +0 -0
  165. {gam7-7.7.11 → gam7-7.7.13}/wiki/Drive-REST-API-v3.md +0 -0
  166. {gam7-7.7.11 → gam7-7.7.13}/wiki/Email-Audit-Monitor.md +0 -0
  167. {gam7-7.7.11 → gam7-7.7.13}/wiki/Find-File-Owner.md +0 -0
  168. {gam7-7.7.11 → gam7-7.7.13}/wiki/GAM-Public-Chat-Room.md +0 -0
  169. {gam7-7.7.11 → gam7-7.7.13}/wiki/GAM-Return-Codes.md +0 -0
  170. {gam7-7.7.11 → gam7-7.7.13}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  171. {gam7-7.7.11 → gam7-7.7.13}/wiki/GAM7-on-Android-Devices.md +0 -0
  172. {gam7-7.7.11 → gam7-7.7.13}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  173. {gam7-7.7.11 → gam7-7.7.13}/wiki/Google-Data-Transfers.md +0 -0
  174. {gam7-7.7.11 → gam7-7.7.13}/wiki/Google-Network-Addresses.md +0 -0
  175. {gam7-7.7.11 → gam7-7.7.13}/wiki/Groups-Membership.md +0 -0
  176. {gam7-7.7.11 → gam7-7.7.13}/wiki/HTTPS-Proxy.md +0 -0
  177. {gam7-7.7.11 → gam7-7.7.13}/wiki/Home.md +0 -0
  178. {gam7-7.7.11 → gam7-7.7.13}/wiki/How-to-Install-GAM7.md +0 -0
  179. {gam7-7.7.11 → gam7-7.7.13}/wiki/How-to-Uninstall-GAM7.md +0 -0
  180. {gam7-7.7.11 → gam7-7.7.13}/wiki/How-to-Update-GAM7.md +0 -0
  181. {gam7-7.7.11 → gam7-7.7.13}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  182. {gam7-7.7.11 → gam7-7.7.13}/wiki/Inbound-SSO.md +0 -0
  183. {gam7-7.7.11 → gam7-7.7.13}/wiki/Install-GAM-as-Python-Library.md +0 -0
  184. {gam7-7.7.11 → gam7-7.7.13}/wiki/Licenses.md +0 -0
  185. {gam7-7.7.11 → gam7-7.7.13}/wiki/List-Items.md +0 -0
  186. {gam7-7.7.11 → gam7-7.7.13}/wiki/List.md +0 -0
  187. {gam7-7.7.11 → gam7-7.7.13}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  188. {gam7-7.7.11 → gam7-7.7.13}/wiki/Mobile-Devices.md +0 -0
  189. {gam7-7.7.11 → gam7-7.7.13}/wiki/Organizational-Units.md +0 -0
  190. {gam7-7.7.11 → gam7-7.7.13}/wiki/Other-Resources.md +0 -0
  191. {gam7-7.7.11 → gam7-7.7.13}/wiki/Permission-Matches.md +0 -0
  192. {gam7-7.7.11 → gam7-7.7.13}/wiki/Python-Regular-Expressions.md +0 -0
  193. {gam7-7.7.11 → gam7-7.7.13}/wiki/README.md +0 -0
  194. {gam7-7.7.11 → gam7-7.7.13}/wiki/Rclone.md +0 -0
  195. {gam7-7.7.11 → gam7-7.7.13}/wiki/Reports.md +0 -0
  196. {gam7-7.7.11 → gam7-7.7.13}/wiki/Reseller.md +0 -0
  197. {gam7-7.7.11 → gam7-7.7.13}/wiki/Resources.md +0 -0
  198. {gam7-7.7.11 → gam7-7.7.13}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  199. {gam7-7.7.11 → gam7-7.7.13}/wiki/SSL-Root-CA-Certificates.md +0 -0
  200. {gam7-7.7.11 → gam7-7.7.13}/wiki/Schemas.md +0 -0
  201. {gam7-7.7.11 → gam7-7.7.13}/wiki/Scripts.md +0 -0
  202. {gam7-7.7.11 → gam7-7.7.13}/wiki/Send-Email.md +0 -0
  203. {gam7-7.7.11 → gam7-7.7.13}/wiki/Shared-Drives.md +0 -0
  204. {gam7-7.7.11 → gam7-7.7.13}/wiki/Sites.md +0 -0
  205. {gam7-7.7.11 → gam7-7.7.13}/wiki/Tag-Replace.md +0 -0
  206. {gam7-7.7.11 → gam7-7.7.13}/wiki/Todrive.md +0 -0
  207. {gam7-7.7.11 → gam7-7.7.13}/wiki/Unmanaged-Accounts.md +0 -0
  208. {gam7-7.7.11 → gam7-7.7.13}/wiki/Upgrade-Benefits.md +0 -0
  209. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Analytics-Admin.md +0 -0
  210. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Application-Specific-Passwords.md +0 -0
  211. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Backup-Verification-Codes.md +0 -0
  212. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Calendars-Access.md +0 -0
  213. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Calendars-Events.md +0 -0
  214. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Calendars.md +0 -0
  215. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Chat.md +0 -0
  216. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Classification-Labels.md +0 -0
  217. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Classroom-Profile.md +0 -0
  218. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Contacts-Delegates.md +0 -0
  219. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Contacts.md +0 -0
  220. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Deprovision.md +0 -0
  221. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Activity-Settings.md +0 -0
  222. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Cleanup.md +0 -0
  223. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Comments.md +0 -0
  224. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Files-Display.md +0 -0
  225. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Files-Manage.md +0 -0
  226. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Orphans.md +0 -0
  227. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Ownership.md +0 -0
  228. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Permissions.md +0 -0
  229. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Query.md +0 -0
  230. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Revisions.md +0 -0
  231. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Shortcuts.md +0 -0
  232. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Drive-Transfer.md +0 -0
  233. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Forms.md +0 -0
  234. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-CSE.md +0 -0
  235. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Delegates.md +0 -0
  236. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Filters.md +0 -0
  237. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Forwarding.md +0 -0
  238. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Labels.md +0 -0
  239. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  240. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Profile.md +0 -0
  241. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-S-MIME.md +0 -0
  242. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  243. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Gmail-Settings.md +0 -0
  244. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Group-Membership.md +0 -0
  245. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Keep-Notes.md +0 -0
  246. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Looker-Studio.md +0 -0
  247. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Meet.md +0 -0
  248. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-People-Contacts-Profiles.md +0 -0
  249. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Photo.md +0 -0
  250. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Profile-Photo.md +0 -0
  251. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Profile-Sharing.md +0 -0
  252. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Shared-Drives.md +0 -0
  253. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  254. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Spreadsheets.md +0 -0
  255. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Tasks.md +0 -0
  256. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-Tokens.md +0 -0
  257. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users-YouTube.md +0 -0
  258. {gam7-7.7.11 → gam7-7.7.13}/wiki/Users.md +0 -0
  259. {gam7-7.7.11 → gam7-7.7.13}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  260. {gam7-7.7.11 → gam7-7.7.13}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  261. {gam7-7.7.11 → gam7-7.7.13}/wiki/Vault-Takeout.md +0 -0
  262. {gam7-7.7.11 → gam7-7.7.13}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  263. {gam7-7.7.11 → gam7-7.7.13}/wiki/_Sidebar.md +0 -0
  264. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-AdminSettingsExamples.md +0 -0
  265. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Android-Installation.md +0 -0
  266. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-BulkOperations.md +0 -0
  267. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-CalendarExamples.md +0 -0
  268. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Chat-Bot.md +0 -0
  269. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Chrome-Browser-Management.md +0 -0
  270. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Chrome-OS-Installation.md +0 -0
  271. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Chrome-Policy-Settings.md +0 -0
  272. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Cloud-Identity-Groups.md +0 -0
  273. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  274. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Calendars.md +0 -0
  275. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Definitions.md +0 -0
  276. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Drive.md +0 -0
  277. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Email.md +0 -0
  278. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  279. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Groups.md +0 -0
  280. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Command-Reference-Users.md +0 -0
  281. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  282. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  283. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-CreatingClientSecretsFile.md +0 -0
  284. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Custom-Schemas.md +0 -0
  285. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Data-Transfers.md +0 -0
  286. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-DomainVerification.md +0 -0
  287. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-ExamplesAccountAuditing.md +0 -0
  288. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-ExamplesCSV.md +0 -0
  289. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-ExamplesEmailSettings.md +0 -0
  290. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-ExamplesOrganizations.md +0 -0
  291. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM-Discussion-Group.md +0 -0
  292. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  293. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM-options-files.md +0 -0
  294. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  295. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM3CSVListings.md +0 -0
  296. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM3DirectoryCommands.md +0 -0
  297. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM3GroupSettings.md +0 -0
  298. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GAM7-FAQ.md +0 -0
  299. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  300. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-GoogleDriveManagement.md +0 -0
  301. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  302. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Home.md +0 -0
  303. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  304. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Inbound-SSO-Settings.md +0 -0
  305. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-LicenseExamples.md +0 -0
  306. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Managing-Admins.md +0 -0
  307. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  308. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Managing-Devices.md +0 -0
  309. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Managing-Google-Classroom.md +0 -0
  310. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-OAuthKeyManagement.md +0 -0
  311. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Printers.md +0 -0
  312. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-ResellerCommands.md +0 -0
  313. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  314. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-SecurityExamples.md +0 -0
  315. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-UnmanagedUsersExamples.md +0 -0
  316. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Use-a-Yubikey.md +0 -0
  317. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  318. {gam7-7.7.11 → gam7-7.7.13}/wiki/l-_Footer.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.7.11
3
+ Version: 7.7.13
4
4
  Summary: CLI tool to manage Google Workspace
5
5
  Project-URL: Homepage, https://github.com/GAM-team/GAM
6
6
  Project-URL: Issues, https://github.com/GAM-team/GAM/issues
@@ -1,3 +1,14 @@
1
+ 7.07.13
2
+
3
+ Added option `showitemcountonly` to `gam [<UserTypeEntity>] print|show shareddrives` that causes GAM to display the
4
+ number of Shared Drives on stdout; no CSV file is written.
5
+
6
+ 7.07.12
7
+
8
+ Fixed bug in `gam print|show oushareddrives` that caused a trap.
9
+
10
+ Improved getting Shared Drive names from IDs when accessing Shared Drives in external workspaces.
11
+
1
12
  7.07.11
2
13
 
3
14
  Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # GAM7
5
5
  #
6
- # Copyright 2024, All Rights Reserved.
6
+ # Copyright 2025, All Rights Reserved.
7
7
  #
8
8
  # Licensed under the Apache License, Version 2.0 (the "License");
9
9
  # you may not use this file except in compliance with the License.
@@ -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.11'
28
+ __version__ = '7.07.13'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -42021,22 +42021,21 @@ def printShowUserVaultHolds(entityList):
42021
42021
  else:
42022
42022
  printKeyValueList(['Total Holds', totalHolds])
42023
42023
 
42024
- def _cleanVaultQuery(query, cd):
42024
+ def _cleanVaultQuery(query, cd, drive):
42025
42025
  if 'query' in query:
42026
- if cd is not None:
42027
- if 'orgUnitInfo' in query['query']:
42028
- query['query']['orgUnitInfo']['orgUnitPath'] = convertOrgUnitIDtoPath(cd, query['query']['orgUnitInfo']['orgUnitId'])
42029
- if 'sharedDriveInfo' in query['query']:
42030
- query['query']['sharedDriveInfo']['sharedDriveNames'] = []
42031
- for sharedDriveId in query['query']['sharedDriveInfo']['sharedDriveIds']:
42032
- query['query']['sharedDriveInfo']['sharedDriveNames'].append(_getSharedDriveNameFromId(sharedDriveId))
42026
+ if cd is not None and 'orgUnitInfo' in query['query']:
42027
+ query['query']['orgUnitInfo']['orgUnitPath'] = convertOrgUnitIDtoPath(cd, query['query']['orgUnitInfo']['orgUnitId'])
42028
+ if drive is not None and 'sharedDriveInfo' in query['query']:
42029
+ query['query']['sharedDriveInfo']['sharedDriveNames'] = []
42030
+ for sharedDriveId in query['query']['sharedDriveInfo']['sharedDriveIds']:
42031
+ query['query']['sharedDriveInfo']['sharedDriveNames'].append(_getSharedDriveNameFromId(drive, sharedDriveId, False))
42033
42032
  query['query'].pop('searchMethod', None)
42034
42033
  query['query'].pop('teamDriveInfo', None)
42035
42034
 
42036
42035
  VAULT_QUERY_TIME_OBJECTS = {'createTime', 'endTime', 'startTime', 'versionDate'}
42037
42036
 
42038
- def _showVaultQuery(matterNameId, query, cd, FJQC, k=0, kcount=0):
42039
- _cleanVaultQuery(query, cd)
42037
+ def _showVaultQuery(matterNameId, query, cd, drive, FJQC, k=0, kcount=0):
42038
+ _cleanVaultQuery(query, cd, drive)
42040
42039
  if FJQC is not None and FJQC.formatJSON:
42041
42040
  printLine(json.dumps(cleanJSON(query, timeObjects=VAULT_QUERY_TIME_OBJECTS), ensure_ascii=False, sort_keys=False))
42042
42041
  return
@@ -42068,7 +42067,7 @@ def doInfoVaultQuery():
42068
42067
  queryId, queryName, queryNameId = convertQueryNameToID(v, getString(Cmd.OB_QUERY_ITEM), matterId, matterNameId)
42069
42068
  else:
42070
42069
  queryName = getString(Cmd.OB_QUERY_ITEM)
42071
- cd = None
42070
+ cd = drive = None
42072
42071
  fieldsList = []
42073
42072
  FJQC = FormatJSONQuoteChar()
42074
42073
  while Cmd.ArgumentsRemaining():
@@ -42078,8 +42077,8 @@ def doInfoVaultQuery():
42078
42077
  queryId, queryName, queryNameId = convertQueryNameToID(v, queryName, matterId, matterNameId)
42079
42078
  elif myarg == 'shownames':
42080
42079
  cd = buildGAPIObject(API.DIRECTORY)
42081
- _, GM.Globals[GM.ADMIN_DRIVE] = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
42082
- if GM.Globals[GM.ADMIN_DRIVE] is None:
42080
+ _, drive = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
42081
+ if drive is None:
42083
42082
  return
42084
42083
  elif getFieldsList(myarg, VAULT_QUERY_FIELDS_CHOICE_MAP, fieldsList, initialField=['savedQueryId', 'displayName']):
42085
42084
  pass
@@ -42090,7 +42089,7 @@ def doInfoVaultQuery():
42090
42089
  query = callGAPI(v.matters().savedQueries(), 'get',
42091
42090
  throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
42092
42091
  matterId=matterId, savedQueryId=queryId, fields=fields)
42093
- _showVaultQuery(matterNameId, query, cd, FJQC)
42092
+ _showVaultQuery(matterNameId, query, cd, drive, FJQC)
42094
42093
  except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden, GAPI.invalidArgument) as e:
42095
42094
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_QUERY, queryNameId], str(e))
42096
42095
 
@@ -42107,7 +42106,7 @@ def doPrintShowVaultQueries():
42107
42106
  csvPF = CSVPrintFile(PRINT_VAULT_QUERIES_TITLES, 'sortall') if Act.csvFormat() else None
42108
42107
  FJQC = FormatJSONQuoteChar(csvPF)
42109
42108
  matters = []
42110
- cd = None
42109
+ cd = drive = None
42111
42110
  fieldsList = []
42112
42111
  while Cmd.ArgumentsRemaining():
42113
42112
  myarg = getArgument()
@@ -42117,8 +42116,8 @@ def doPrintShowVaultQueries():
42117
42116
  matters = shlexSplitList(getString(Cmd.OB_MATTER_ITEM_LIST))
42118
42117
  elif myarg == 'shownames':
42119
42118
  cd = buildGAPIObject(API.DIRECTORY)
42120
- _, GM.Globals[GM.ADMIN_DRIVE] = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
42121
- if GM.Globals[GM.ADMIN_DRIVE] is None:
42119
+ _, drive = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
42120
+ if drive is None:
42122
42121
  return
42123
42122
  elif getFieldsList(myarg, VAULT_QUERY_FIELDS_CHOICE_MAP, fieldsList, initialField=['savedQueryId', 'displayName']):
42124
42123
  pass
@@ -42180,11 +42179,11 @@ def doPrintShowVaultQueries():
42180
42179
  k = 0
42181
42180
  for query in queries:
42182
42181
  k += 1
42183
- _showVaultQuery(matterNameId, query, cd, FJQC, k, kcount)
42182
+ _showVaultQuery(matterNameId, query, cd, drive, FJQC, k, kcount)
42184
42183
  Ind.Decrement()
42185
42184
  else:
42186
42185
  for query in queries:
42187
- _cleanVaultQuery(query, cd)
42186
+ _cleanVaultQuery(query, cd, drive)
42188
42187
  row = flattenJSON(query, flattened={'matterId': matterId, 'matterName': matterName}, timeObjects=VAULT_QUERY_TIME_OBJECTS)
42189
42188
  if not FJQC.formatJSON:
42190
42189
  csvPF.WriteRowTitles(row)
@@ -52447,20 +52446,15 @@ def _convertSharedDriveNameToId(drive, user, i, count, fileIdEntity, useDomainAd
52447
52446
  ','.join([td['id'] for td in tdlist])), i, count)
52448
52447
  return False
52449
52448
 
52450
- def _getSharedDriveNameFromId(sharedDriveId):
52449
+ def _getSharedDriveNameFromId(drive, sharedDriveId, useDomainAdminAccess=False):
52451
52450
  sharedDriveName = GM.Globals[GM.MAP_SHAREDDRIVE_ID_TO_NAME].get(sharedDriveId)
52452
52451
  if not sharedDriveName:
52453
- if not GM.Globals[GM.ADMIN_DRIVE]:
52454
- _, GM.Globals[GM.ADMIN_DRIVE] = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
52455
- if GM.Globals[GM.ADMIN_DRIVE]:
52456
- try:
52457
- sharedDriveName = callGAPI(GM.Globals[GM.ADMIN_DRIVE].drives(), 'get',
52458
- throwReasons=GAPI.DRIVE_USER_THROW_REASONS+[GAPI.NOT_FOUND],
52459
- useDomainAdminAccess=True,
52460
- driveId=sharedDriveId, fields='name')['name']
52461
- except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy):
52462
- sharedDriveName = TEAM_DRIVE
52463
- else:
52452
+ try:
52453
+ sharedDriveName = callGAPI(drive.drives(), 'get',
52454
+ throwReasons=GAPI.DRIVE_USER_THROW_REASONS+[GAPI.NOT_FOUND],
52455
+ useDomainAdminAccess=useDomainAdminAccess,
52456
+ driveId=sharedDriveId, fields='name')['name']
52457
+ except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy):
52464
52458
  sharedDriveName = TEAM_DRIVE
52465
52459
  GM.Globals[GM.MAP_SHAREDDRIVE_ID_TO_NAME][sharedDriveId] = sharedDriveName
52466
52460
  return sharedDriveName
@@ -52473,7 +52467,7 @@ def _getDriveFileNameFromId(drive, fileId, combineTitleId=True, useDomainAdminAc
52473
52467
  if result:
52474
52468
  fileName = result['name']
52475
52469
  if (result['mimeType'] == MIMETYPE_GA_FOLDER) and result.get('driveId') and (result['name'] == TEAM_DRIVE):
52476
- fileName = _getSharedDriveNameFromId(result['driveId'])
52470
+ fileName = _getSharedDriveNameFromId(drive, result['driveId'])
52477
52471
  if combineTitleId:
52478
52472
  fileName += '('+fileId+')'
52479
52473
  return (fileName, _getEntityMimeType(result), result['mimeType'])
@@ -53555,7 +53549,7 @@ def getFilePaths(drive, fileTree, initialResult, filePathInfo, addParentsToTree=
53555
53549
  fullpath=False, showDepth=False, folderPathOnly=False):
53556
53550
  def _getParentName(result):
53557
53551
  if (result['mimeType'] == MIMETYPE_GA_FOLDER) and result.get('driveId') and (result['name'] == TEAM_DRIVE):
53558
- parentName = _getSharedDriveNameFromId(result['driveId'])
53552
+ parentName = _getSharedDriveNameFromId(drive, result['driveId'])
53559
53553
  if parentName != TEAM_DRIVE:
53560
53554
  return f'{SHARED_DRIVES}{filePathInfo["delimiter"]}{parentName}'
53561
53555
  return result['name']
@@ -54254,9 +54248,9 @@ def showFileInfo(users):
54254
54248
  driveId = result.get('driveId')
54255
54249
  if driveId:
54256
54250
  if result['mimeType'] == MIMETYPE_GA_FOLDER and result['name'] == TEAM_DRIVE:
54257
- result['name'] = _getSharedDriveNameFromId(driveId)
54251
+ result['name'] = _getSharedDriveNameFromId(drive, driveId)
54258
54252
  if DFF.showSharedDriveNames:
54259
- result['driveName'] = _getSharedDriveNameFromId(driveId)
54253
+ result['driveName'] = _getSharedDriveNameFromId(drive, driveId)
54260
54254
  if showNoParents:
54261
54255
  result.setdefault('parents', [])
54262
54256
  if getPermissionsForSharedDrives and driveId and 'permissions' not in result:
@@ -54944,7 +54938,7 @@ def extendFileTreeParents(drive, fileTree, fields):
54944
54938
  result['parents'] = [ORPHANS] if result.get('ownedByMe', False) and 'sharedWithMeTime' not in result else [SHARED_WITHME]
54945
54939
  else:
54946
54940
  if result['name'] == TEAM_DRIVE:
54947
- result['name'] = _getSharedDriveNameFromId(result['driveId'])
54941
+ result['name'] = _getSharedDriveNameFromId(drive, result['driveId'])
54948
54942
  result['parents'] = [SHARED_DRIVES] if 'sharedWithMeTime' not in result else [SHARED_WITHME]
54949
54943
  fileTree[fileId]['info'] = result
54950
54944
  fileTree[fileId]['info']['noDisplay'] = True
@@ -55689,7 +55683,7 @@ def printFileList(users):
55689
55683
  if not pmselect and 'permissions' in fileInfo:
55690
55684
  fileInfo['permissions'] = DLP.GetFileMatchingPermission(fileInfo)
55691
55685
  if DFF.showSharedDriveNames and driveId:
55692
- fileInfo['driveName'] = _getSharedDriveNameFromId(driveId)
55686
+ fileInfo['driveName'] = _getSharedDriveNameFromId(drive, driveId)
55693
55687
  if filepath:
55694
55688
  if not FJQC.formatJSON or not addPathsToJSON:
55695
55689
  addFilePathsToRow(drive, fileTree, fileInfo, filePathInfo, csvPF, row,
@@ -56559,7 +56553,7 @@ def printShowFilePaths(users):
56559
56553
  driveId = result.get('driveId')
56560
56554
  if driveId:
56561
56555
  if result['mimeType'] == MIMETYPE_GA_FOLDER and result['name'] == TEAM_DRIVE:
56562
- result['name'] = _getSharedDriveNameFromId(driveId)
56556
+ result['name'] = _getSharedDriveNameFromId(drive, driveId)
56563
56557
  if returnPathOnly:
56564
56558
  if fullpath:
56565
56559
  writeStdout(f'{SHARED_DRIVES}/{result["name"]}\n')
@@ -56649,7 +56643,7 @@ def printFileParentTree(users):
56649
56643
  driveId = result.get('driveId')
56650
56644
  if driveId:
56651
56645
  if result['mimeType'] == MIMETYPE_GA_FOLDER and result['name'] == TEAM_DRIVE:
56652
- result['name'] = _getSharedDriveNameFromId(driveId)
56646
+ result['name'] = _getSharedDriveNameFromId(drive, driveId)
56653
56647
  result['isRoot'] = True
56654
56648
  result['parents'] = ['']
56655
56649
  fileList.append(result)
@@ -56886,7 +56880,7 @@ def printShowFileCounts(users):
56886
56880
  if not drive:
56887
56881
  continue
56888
56882
  sharedDriveId = fileIdEntity.get('shareddrive', {}).get('driveId', '')
56889
- sharedDriveName = _getSharedDriveNameFromId(sharedDriveId) if sharedDriveId else ''
56883
+ sharedDriveName = _getSharedDriveNameFromId(drive, sharedDriveId) if sharedDriveId else ''
56890
56884
  mimeTypeInfo = {}
56891
56885
  userLastModification = _initLastModification()
56892
56886
  gettingEntity = _getGettingEntity(user, fileIdEntity)
@@ -57031,7 +57025,7 @@ def printShowDrivelastModifications(users):
57031
57025
  if not drive:
57032
57026
  continue
57033
57027
  sharedDriveId = fileIdEntity.get('shareddrive', {}).get('driveId', '')
57034
- sharedDriveName = _getSharedDriveNameFromId(sharedDriveId) if sharedDriveId else ''
57028
+ sharedDriveName = _getSharedDriveNameFromId(drive, sharedDriveId) if sharedDriveId else ''
57035
57029
  userLastModification = _initLastModification()
57036
57030
  gettingEntity = _getGettingEntity(user, fileIdEntity)
57037
57031
  printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, gettingEntity, i, count)
@@ -57214,7 +57208,7 @@ def printDiskUsage(users):
57214
57208
  includeOwner = False
57215
57209
  csvPF.RemoveTitles(['Owner', 'ownedByMe'])
57216
57210
  if topFolder['name'] == TEAM_DRIVE and not topFolder.get('parents'):
57217
- topFolder['name'] = _getSharedDriveNameFromId(driveId)
57211
+ topFolder['name'] = _getSharedDriveNameFromId(drive, driveId)
57218
57212
  topFolder['path'] = f'{SHARED_DRIVES}{pathDelimiter}{topFolder["name"]}'
57219
57213
  else:
57220
57214
  topFolder['path'] = topFolder['name']
@@ -57654,7 +57648,7 @@ def printShowFileTree(users):
57654
57648
  fileId=fileId, fields=fields, supportsAllDrives=True)
57655
57649
  if (fileEntryInfo['mimeType'] == MIMETYPE_GA_FOLDER and fileEntryInfo.get('driveId') and
57656
57650
  fileEntryInfo['name'] == TEAM_DRIVE and not fileEntryInfo.get('parents', [])):
57657
- fileEntryInfo['name'] = f"{SHARED_DRIVES}/{_getSharedDriveNameFromId(fileId)}"
57651
+ fileEntryInfo['name'] = f"{SHARED_DRIVES}/{_getSharedDriveNameFromId(drive, fileId)}"
57658
57652
  if stripCRsFromName:
57659
57653
  fileEntryInfo['name'] = _stripControlCharsFromName(fileEntryInfo['name'])
57660
57654
  if buildTree:
@@ -59295,7 +59289,7 @@ def _getCopyMoveParentInfo(drive, user, i, count, j, jcount, newParentId, statis
59295
59289
  result['destParentType'] = DEST_PARENT_MYDRIVE_FOLDER
59296
59290
  else:
59297
59291
  if result['name'] == TEAM_DRIVE and not result.get('parents', []):
59298
- result['name'] = _getSharedDriveNameFromId(result['driveId'])
59292
+ result['name'] = _getSharedDriveNameFromId(drive, result['driveId'])
59299
59293
  result['destParentType'] = DEST_PARENT_SHAREDDRIVE_ROOT
59300
59294
  else:
59301
59295
  result['destParentType'] = DEST_PARENT_SHAREDDRIVE_FOLDER
@@ -59844,7 +59838,8 @@ def copyDriveFile(users):
59844
59838
  # Source at root of Shared Drive?
59845
59839
  sourceMimeType = source['mimeType']
59846
59840
  if sourceMimeType == MIMETYPE_GA_FOLDER and source.get('driveId') and source['name'] == TEAM_DRIVE and not source.get('parents', []):
59847
- source['name'] = _getSharedDriveNameFromId(source['driveId'])
59841
+ copyMoveOptions['sourceIsMyDriveSharedDrive'] = True
59842
+ source['name'] = _getSharedDriveNameFromId(drive, source['driveId'])
59848
59843
  sourceName = source['name']
59849
59844
  sourceNameId = f"{sourceName}({source['id']})"
59850
59845
  copyMoveOptions['sourceDriveId'] = source.get('driveId')
@@ -60615,7 +60610,7 @@ def moveDriveFile(users):
60615
60610
  if sourceMimeType == MIMETYPE_GA_FOLDER and source['name'] in [MY_DRIVE, TEAM_DRIVE] and not source.get('parents', []):
60616
60611
  copyMoveOptions['sourceIsMyDriveSharedDrive'] = True
60617
60612
  if source.get('driveId'):
60618
- source['name'] = _getSharedDriveNameFromId(source['driveId'])
60613
+ source['name'] = _getSharedDriveNameFromId(drive, source['driveId'])
60619
60614
  sourceName = source['name']
60620
60615
  sourceNameId = f"{sourceName}({source['id']})"
60621
60616
  copyMoveOptions['sourceDriveId'] = source.get('driveId')
@@ -63059,7 +63054,7 @@ def printEmptyDriveFolders(users):
63059
63054
  fileIdEntity['shareddrive'] = {'driveId': sharedDriveId, 'corpora': 'drive', 'includeItemsFromAllDrives': True, 'supportsAllDrives': True}
63060
63055
  csvPF.AddTitles(['driveId'])
63061
63056
  csvPF.MoveTitlesToEnd(['name'])
63062
- pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(sharedDriveId)}']
63057
+ pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(drive, sharedDriveId)}']
63063
63058
  else:
63064
63059
  pathList = [fileEntryInfo['name']]
63065
63060
  mimeType = fileEntryInfo['mimeType']
@@ -63149,7 +63144,7 @@ def deleteEmptyDriveFolders(users):
63149
63144
  if 'driveId' in fileEntryInfo:
63150
63145
  sharedDriveId = fileEntryInfo['driveId']
63151
63146
  fileIdEntity['shareddrive'] = {'driveId': sharedDriveId, 'corpora': 'drive', 'includeItemsFromAllDrives': True, 'supportsAllDrives': True}
63152
- pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(sharedDriveId)}']
63147
+ pathList = [f'{SHARED_DRIVES}/{_getSharedDriveNameFromId(drive, sharedDriveId)}']
63153
63148
  else:
63154
63149
  pathList = [fileEntryInfo['name']]
63155
63150
  mimeType = fileEntryInfo['mimeType']
@@ -65422,12 +65417,14 @@ SHAREDDRIVE_ACL_ROLES_MAP = {
65422
65417
  # (role|roles <SharedDriveACLRoleList>)*
65423
65418
  # [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
65424
65419
  # [guiroles [<Boolean>]] [formatjson [quotechar <Character>]]
65420
+ # [showitemcountonly]
65425
65421
  # gam <UserTypeEntity> show shareddrives
65426
65422
  # [asadmin [shareddriveadminquery|query <QuerySharedDrive>]]
65427
65423
  # [matchname <REMatchPattrn>] [orgunit|org|ou <OrgUnitPath>]
65428
65424
  # (role|roles <SharedDriveACLRoleLIst>)*
65429
65425
  # [fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
65430
65426
  # [guiroles [<Boolean>]] [formatjson]
65427
+ # [showitemcountonly]
65431
65428
  def printShowSharedDrives(users, useDomainAdminAccess=False):
65432
65429
  def stripNonShowFields(shareddrive):
65433
65430
  if orgUnitIdToPathMap:
@@ -65451,7 +65448,7 @@ def printShowSharedDrives(users, useDomainAdminAccess=False):
65451
65448
  SHAREDDRIVE_FIELDS_CHOICE_MAP.update(SHAREDDRIVE_LIST_FIELDS_CHOICE_MAP)
65452
65449
  showOrgUnitPaths = True
65453
65450
  orgUnitIdToPathMap = None
65454
- guiRoles = False
65451
+ guiRoles = showItemCountOnly = False
65455
65452
  while Cmd.ArgumentsRemaining():
65456
65453
  myarg = getArgument()
65457
65454
  if csvPF and myarg == 'todrive':
@@ -65481,6 +65478,9 @@ def printShowSharedDrives(users, useDomainAdminAccess=False):
65481
65478
  showOrgUnitPaths = not getBoolean()
65482
65479
  elif myarg == 'guiroles':
65483
65480
  guiRoles = getBoolean()
65481
+ elif myarg == 'showitemcountonly':
65482
+ showItemCountOnly = True
65483
+ showOrgUnitPaths = False
65484
65484
  else:
65485
65485
  FJQC.GetFormatJSONQuoteChar(myarg, True)
65486
65486
  if query and not useDomainAdminAccess:
@@ -65550,6 +65550,9 @@ def printShowSharedDrives(users, useDomainAdminAccess=False):
65550
65550
  jcount = len(matchedFeed)
65551
65551
  if jcount == 0:
65552
65552
  setSysExitRC(NO_ENTITIES_FOUND_RC)
65553
+ if showItemCountOnly:
65554
+ writeStdout(f'{jcount}\n')
65555
+ return
65553
65556
  if not csvPF:
65554
65557
  if not FJQC.formatJSON:
65555
65558
  entityPerformActionNumItems([Ent.USER, user], jcount, Ent.SHAREDDRIVE, i, count)
@@ -65580,13 +65583,15 @@ def doPrintShowSharedDrives():
65580
65583
  # gam print oushareddrives [todrive <ToDriveAttribute>*]
65581
65584
  # [ou|org|orgunit <OrgUnitPath>]
65582
65585
  # [formatjson [quotechar <Character>]]
65586
+ # [showitemcountonly]
65583
65587
  # gam show oushareddrives
65584
65588
  # [ou|org|orgunit <OrgUnitPath>]
65585
65589
  # [formatjson]
65590
+ # [showitemcountonly]
65586
65591
  def doPrintShowOrgunitSharedDrives():
65587
65592
  def _getOrgUnitSharedDriveInfo(shareddrive):
65588
65593
  shareddrive['driveId'] = shareddrive['name'].rsplit(';')[1]
65589
- shareddrive['driveName'] = _getSharedDriveNameFromId(shareddrive['driveId'])
65594
+ shareddrive['driveName'] = _getSharedDriveNameFromId(drive, shareddrive['driveId'], True)
65590
65595
  shareddrive['orgUnitPath'] = orgUnitPath
65591
65596
 
65592
65597
  def _showOrgUnitSharedDrive(shareddrive, j, jcount, FJQC):
@@ -65600,23 +65605,26 @@ def doPrintShowOrgunitSharedDrives():
65600
65605
  printEntity([Ent.MEMBER_URI, shareddrive['memberUri']])
65601
65606
  printEntity([Ent.SHAREDDRIVE_ID, shareddrive['driveId']])
65602
65607
  printEntity([Ent.SHAREDDRIVE_NAME, shareddrive['driveName']])
65603
- printEntity([Ent.ORGANIZATIONAL_UNIT, shareddrive['orgUnit']])
65608
+ printEntity([Ent.ORGANIZATIONAL_UNIT, shareddrive['orgUnitPath']])
65604
65609
  Ind.Decrement()
65605
65610
 
65606
65611
  ci = buildGAPIObject(API.CLOUDIDENTITY_ORGUNITS_BETA)
65607
65612
  cd = buildGAPIObject(API.DIRECTORY)
65608
- _, GM.Globals[GM.ADMIN_DRIVE] = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
65609
- if not GM.Globals[GM.ADMIN_DRIVE]:
65613
+ _, drive = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
65614
+ if drive is None:
65610
65615
  return
65611
65616
  csvPF = CSVPrintFile(['name', 'type', 'member', 'memberUri', 'driveId', 'driveName', 'orgUnitPath']) if Act.csvFormat() else None
65612
65617
  FJQC = FormatJSONQuoteChar(csvPF)
65613
65618
  orgUnitPath = '/'
65619
+ showItemCountOnly = False
65614
65620
  while Cmd.ArgumentsRemaining():
65615
65621
  myarg = getArgument()
65616
65622
  if csvPF and myarg == 'todrive':
65617
65623
  csvPF.GetTodriveParameters()
65618
65624
  elif myarg in {'ou', 'org', 'orgunit'}:
65619
65625
  orgUnitPath = getString(Cmd.OB_ORGUNIT_ITEM)
65626
+ elif myarg == 'showitemcountonly':
65627
+ showItemCountOnly = True
65620
65628
  else:
65621
65629
  FJQC.GetFormatJSONQuoteChar(myarg, True)
65622
65630
  if csvPF and FJQC.formatJSON:
@@ -65631,6 +65639,9 @@ def doPrintShowOrgunitSharedDrives():
65631
65639
  jcount = len(sds)
65632
65640
  if jcount == 0:
65633
65641
  setSysExitRC(NO_ENTITIES_FOUND_RC)
65642
+ if showItemCountOnly:
65643
+ writeStdout(f'{jcount}\n')
65644
+ return
65634
65645
  if not csvPF:
65635
65646
  if not FJQC.formatJSON:
65636
65647
  entityPerformActionNumItems([Ent.ORGANIZATIONAL_UNIT, orgUnitPath], jcount, Ent.SHAREDDRIVE)
@@ -65685,13 +65696,13 @@ def copySyncSharedDriveACLs(users, useDomainAdminAccess=False):
65685
65696
  if not drive:
65686
65697
  continue
65687
65698
  if not srcFileIdEntity.get('shareddrivename'):
65688
- srcFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(srcFileIdEntity['shareddrive']['driveId'])
65699
+ srcFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(drive, srcFileIdEntity['shareddrive']['driveId'])
65689
65700
  if tgtFileIdEntity.get('shareddrivename'):
65690
65701
  if not _convertSharedDriveNameToId(drive, user, i, count, tgtFileIdEntity, useDomainAdminAccess):
65691
65702
  continue
65692
65703
  tgtFileIdEntity['shareddrive']['corpora'] = 'drive'
65693
65704
  else:
65694
- tgtFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(tgtFileIdEntity['shareddrive']['driveId'])
65705
+ tgtFileIdEntity['shareddrivename'] = _getSharedDriveNameFromId(drive, tgtFileIdEntity['shareddrive']['driveId'])
65695
65706
  statistics = _initStatistics()
65696
65707
  copyMoveOptions['sourceDriveId'] = srcFileIdEntity['shareddrive']['driveId']
65697
65708
  copyMoveOptions['destDriveId'] = tgtFileIdEntity['shareddrive']['driveId']
@@ -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
  #
@@ -260,12 +260,12 @@ SMTP_HOST = 'smtp_host'
260
260
  SMTP_USERNAME = 'smtp_username'
261
261
  # SMTP password
262
262
  SMTP_PASSWORD = 'smtp_password'
263
+ # Time Zone
264
+ TIMEZONE = 'timezone'
263
265
  ## Minimum TLS Version required for HTTPS connections
264
266
  TLS_MIN_VERSION = 'tls_min_version'
265
267
  ## Maximum TLS Version used for HTTPS connections
266
268
  TLS_MAX_VERSION = 'tls_max_version'
267
- # Time Zone
268
- TIMEZONE = 'timezone'
269
269
  # Clear basic filter when updating an existing sheet
270
270
  TODRIVE_CLEARFILTER = 'todrive_clearfilter'
271
271
  # Use client access for todrive
@@ -431,9 +431,9 @@ Defaults = {
431
431
  SMTP_HOST: '',
432
432
  SMTP_USERNAME: '',
433
433
  SMTP_PASSWORD: '',
434
+ TIMEZONE: 'utc',
434
435
  TLS_MIN_VERSION: 'TLSv1_3',
435
436
  TLS_MAX_VERSION: '',
436
- TIMEZONE: 'utc',
437
437
  TODRIVE_CLEARFILTER: FALSE,
438
438
  TODRIVE_CLIENTACCESS: FALSE,
439
439
  TODRIVE_CONVERSION: TRUE,
@@ -599,9 +599,9 @@ VAR_INFO = {
599
599
  SMTP_HOST: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
600
600
  SMTP_USERNAME: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
601
601
  SMTP_PASSWORD: {VAR_TYPE: TYPE_PASSWORD, VAR_LIMITS: (0, None)},
602
+ TIMEZONE: {VAR_TYPE: TYPE_TIMEZONE},
602
603
  TLS_MIN_VERSION: {VAR_TYPE: TYPE_CHOICE, VAR_ENVVAR: 'GAM_TLS_MIN_VERSION', VAR_CHOICES: TLS_CHOICE_MAP},
603
604
  TLS_MAX_VERSION: {VAR_TYPE: TYPE_CHOICE, VAR_ENVVAR: 'GAM_TLS_MAX_VERSION', VAR_CHOICES: TLS_CHOICE_MAP},
604
- TIMEZONE: {VAR_TYPE: TYPE_TIMEZONE},
605
605
  TODRIVE_CLEARFILTER: {VAR_TYPE: TYPE_BOOLEAN},
606
606
  TODRIVE_CLIENTACCESS: {VAR_TYPE: TYPE_BOOLEAN},
607
607
  TODRIVE_CONVERSION: {VAR_TYPE: TYPE_BOOLEAN},
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
- # Copyright (C) 2023 Ross Scroggs All Rights Reserved.
3
+ # Copyright (C) 2025 Ross Scroggs All Rights Reserved.
4
4
  #
5
5
  # All Rights Reserved.
6
6
  #
@@ -25,8 +25,6 @@
25
25
  # Some commands want to set a non-zero return code but not bail
26
26
  # GAM admin user from oauth2.txt or oauth2service.json
27
27
  ADMIN = 'admn'
28
- # Drive service for admin; used to look up Shared Drive Names
29
- ADMIN_DRIVE = 'addr'
30
28
  # Number/length of API call retries
31
29
  API_CALLS_RETRY_DATA = 'rtry'
32
30
  # GAM cache directory. If no_cache is True, this variable will be set to None
@@ -220,7 +218,6 @@ REDIRECT_QUEUE_EOF = 'eof'
220
218
  #
221
219
  Globals = {
222
220
  ADMIN: None,
223
- ADMIN_DRIVE: None,
224
221
  API_CALLS_RETRY_DATA: {},
225
222
  CACHE_DIR: None,
226
223
  CACHE_DISCOVERY_ONLY: True,
@@ -10,6 +10,25 @@ 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.12
14
+
15
+ Fixed bug in `gam print|show oushareddrives` that caused a trap.
16
+
17
+ Improved getting Shared Drive names from IDs when accessing Shared Drives in external workspaces.
18
+
19
+ ### 7.07.11
20
+
21
+ Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
22
+ to handle the following error:
23
+ ```
24
+ ERROR: 400: badRequest - Bad Request
25
+ ```
26
+
27
+ Updated `gam <UserTypeEntity> move drivefile` to handle the following error:
28
+ ```
29
+ ERROR: 400: shareOutNotPermitted
30
+ ```
31
+
13
32
  ### 7.07.10
14
33
 
15
34
  Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
@@ -335,6 +335,11 @@ gam update group group@domain.com whoCanViewMembership ALL_MEMBERS_CAN_VIEW whoC
335
335
  Group: group@domain.com, Updated
336
336
  ```
337
337
 
338
+ If you are entering a valid combination but an error message is returned, do the following and then re-issue your command.
339
+ ```
340
+ gam update group group@domain.com whoCanViewMembership ALL_IN_DOMAIN_CAN_VIEW whoCanDiscoverGroup ALL_IN_DOMAIN_CAN_DISCOVER
341
+ ```
342
+
338
343
  ## Manage groups
339
344
 
340
345
  These commands allow you to create, update and delete groups.
@@ -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.10 - https://github.com/GAM-team/GAM - pyinstaller
254
+ GAM 7.07.12 - 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.10 - https://github.com/GAM-team/GAM - pythonsource
992
+ GAM 7.07.12 - 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
@@ -662,7 +662,7 @@ When moving a folder you can use the `retainsourcefolders` option to cause GAM t
662
662
  Moving a Drive folder to a Shared Drive is not directly supported by the API; GAM has to make a copy of the folder on the Shared Drive and
663
663
  recursively adjust the files/folders within it to point to the new parent folder. Once the original folder is emptied, it is deleted unless `retainsourcefolders` is specified.
664
664
 
665
- ### Move content of a Shared Drive to another Shared Drive
665
+ ## Move content of a Shared Drive to another Shared Drive
666
666
  Suppose you have a source Shared Drive with ID 0AC_1AB with multiple files and folders, and want to move all of its content to the target Shared Drive with ID 0AE_9ZX.
667
667
 
668
668
  The following command will change the parents of the top level files and folders from 0AC_1AB to 0AE_9ZX; the sub files and folders will move along with their top level folder.
@@ -676,3 +676,19 @@ If you want the source Shared Drive with ID 0AC_1AB to be contained in a top lev
676
676
  ```
677
677
  gam user user@domain.com move drivefile teamdriveid 0AC_1AB teamdriveparentid 0AE_9ZX
678
678
  ```
679
+
680
+ ### Inter-workspace moves
681
+ Due to a restructuring, you want to move data from Shared Drive A in domaina.com to Shared Drive B in domainb.com.
682
+ * Shared Drive A in domaina.com has the following unchecked: `Allow people outside of Domain A to access files`
683
+ * Shared Drive B in domainb.com has the following checked: `Allow people outside of Domain B to access files`
684
+ * `user@domaina.com` is a manager of both Shared Drives.
685
+
686
+ ```
687
+ $ gam user user@domaina move drivefile teamdriveid <SharedDriveAID> teamdriveparentid <SharedDriveBID> mergewithparent
688
+ User: user@domaina.com, Move 1 Drive File/Folder
689
+ User: user@domaina.com, Drive Folder: Shared Drive A(<SharedDriveAID>), Move(Merge) contents with Drive Folder: Shared Drive B(<SharedDriveBID>)
690
+ User: user@domaina.com, Drive File: Filename(<FileID>), Move Failed: Bad Request. User message: "shareOutNotPermitted"
691
+ ...
692
+ User: user@domaina.com, Drive Folder: Shared Drive A(<SharedDriveAID>), Retained
693
+ ```
694
+ To get this to work, you must check `Allow people outside of Domain A to access files` on Shared Drive A in domaina.com
@@ -3,7 +3,7 @@
3
3
  Print the current version of Gam with details
4
4
  ```
5
5
  gam version
6
- GAM 7.07.10 - https://github.com/GAM-team/GAM - pyinstaller
6
+ GAM 7.07.12 - 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.10 - https://github.com/GAM-team/GAM - pyinstaller
18
+ GAM 7.07.12 - 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.10 - https://github.com/GAM-team/GAM - pyinstaller
30
+ GAM 7.07.12 - 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.10
67
+ Latest: 7.07.12
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.10
75
+ 7.07.12
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.10 - https://github.com/GAM-team/GAM
85
+ GAM 7.07.12 - 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