gam7 7.6.1__tar.gz → 7.6.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of gam7 might be problematic. Click here for more details.

Files changed (321) hide show
  1. {gam7-7.6.1 → gam7-7.6.3}/PKG-INFO +1 -1
  2. {gam7-7.6.1 → gam7-7.6.3}/src/GamCommands.txt +12 -2
  3. {gam7-7.6.1 → gam7-7.6.3}/src/GamUpdate.txt +24 -0
  4. {gam7-7.6.1 → gam7-7.6.3}/src/gam/__init__.py +178 -26
  5. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glclargs.py +2 -0
  6. {gam7-7.6.1 → gam7-7.6.3}/wiki/Chrome-Policies.md +53 -14
  7. {gam7-7.6.1 → gam7-7.6.3}/wiki/GamUpdates.md +29 -0
  8. {gam7-7.6.1 → gam7-7.6.3}/wiki/Home.md +1 -3
  9. {gam7-7.6.1 → gam7-7.6.3}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +4 -4
  10. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Files-Display.md +27 -3
  11. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users.md +6 -6
  12. {gam7-7.6.1 → gam7-7.6.3}/wiki/Version-and-Help.md +10 -10
  13. gam7-7.6.3/wiki/l-_Footer.md +3 -0
  14. gam7-7.6.1/wiki/_Footer.md +0 -1
  15. gam7-7.6.1/wiki/l-_Footer.md +0 -1
  16. {gam7-7.6.1 → gam7-7.6.3}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  17. {gam7-7.6.1 → gam7-7.6.3}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  18. {gam7-7.6.1 → gam7-7.6.3}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  19. {gam7-7.6.1 → gam7-7.6.3}/.github/ISSUE_TEMPLATE.txt +0 -0
  20. {gam7-7.6.1 → gam7-7.6.3}/.github/actions/creds.tar.xz.gpg +0 -0
  21. {gam7-7.6.1 → gam7-7.6.3}/.github/actions/decrypt.sh +0 -0
  22. {gam7-7.6.1 → gam7-7.6.3}/.github/actions/entitlements.plist +0 -0
  23. {gam7-7.6.1 → gam7-7.6.3}/.github/actions/package_exclusions.txt +0 -0
  24. {gam7-7.6.1 → gam7-7.6.3}/.github/stale.yml +0 -0
  25. {gam7-7.6.1 → gam7-7.6.3}/.github/workflows/build.yml +0 -0
  26. {gam7-7.6.1 → gam7-7.6.3}/.github/workflows/codeql-analysis.yml +0 -0
  27. {gam7-7.6.1 → gam7-7.6.3}/.github/workflows/get-cacerts.yml +0 -0
  28. {gam7-7.6.1 → gam7-7.6.3}/.github/workflows/pushwiki.yml +0 -0
  29. {gam7-7.6.1 → gam7-7.6.3}/.github/workflows/pypi.yml +0 -0
  30. {gam7-7.6.1 → gam7-7.6.3}/.pre-commit-config.yaml +0 -0
  31. {gam7-7.6.1 → gam7-7.6.3}/LICENSE +0 -0
  32. {gam7-7.6.1 → gam7-7.6.3}/README.md +0 -0
  33. {gam7-7.6.1 → gam7-7.6.3}/pyproject.toml +0 -0
  34. {gam7-7.6.1 → gam7-7.6.3}/src/.gitignore +0 -0
  35. {gam7-7.6.1 → gam7-7.6.3}/src/LICENSE +0 -0
  36. {gam7-7.6.1 → gam7-7.6.3}/src/cacerts.pem +0 -0
  37. {gam7-7.6.1 → gam7-7.6.3}/src/callgam.py +0 -0
  38. {gam7-7.6.1 → gam7-7.6.3}/src/gam/__main__.py +0 -0
  39. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/__init__.py +0 -0
  40. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/auth.py +0 -0
  41. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/client.py +0 -0
  42. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/core.py +0 -0
  43. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/data.py +0 -0
  44. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/http.py +0 -0
  45. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/http_core.py +0 -0
  46. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/http_interface.py +0 -0
  47. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/mock_http.py +0 -0
  48. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/mock_http_core.py +0 -0
  49. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/mock_service.py +0 -0
  50. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/service.py +0 -0
  51. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/token_store.py +0 -0
  52. {gam7-7.6.1 → gam7-7.6.3}/src/gam/atom/url.py +0 -0
  53. {gam7-7.6.1 → gam7-7.6.3}/src/gam/cacerts.pem +0 -0
  54. {gam7-7.6.1 → gam7-7.6.3}/src/gam/cbcm-v1.1beta1.json +0 -0
  55. {gam7-7.6.1 → gam7-7.6.3}/src/gam/contactdelegation-v1.json +0 -0
  56. {gam7-7.6.1 → gam7-7.6.3}/src/gam/datastudio-v1.json +0 -0
  57. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/__init__.py +0 -0
  58. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glaction.py +0 -0
  59. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glapi.py +0 -0
  60. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glcfg.py +0 -0
  61. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glentity.py +0 -0
  62. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glgapi.py +0 -0
  63. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glgdata.py +0 -0
  64. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glglobals.py +0 -0
  65. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glindent.py +0 -0
  66. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glmsgs.py +0 -0
  67. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glskus.py +0 -0
  68. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/gluprop.py +0 -0
  69. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/glverlibs.py +0 -0
  70. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gamlib/yubikey.py +0 -0
  71. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/__init__.py +0 -0
  72. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/alt/__init__.py +0 -0
  73. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/alt/app_engine.py +0 -0
  74. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/alt/appengine.py +0 -0
  75. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/apps/__init__.py +0 -0
  76. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/apps/audit/__init__.py +0 -0
  77. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/apps/audit/service.py +0 -0
  78. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  79. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/apps/contacts/service.py +0 -0
  80. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/apps/service.py +0 -0
  81. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/service.py +0 -0
  82. {gam7-7.6.1 → gam7-7.6.3}/src/gam/gdata/urlfetch.py +0 -0
  83. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/__init__.py +0 -0
  84. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/_auth.py +0 -0
  85. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/_helpers.py +0 -0
  86. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/channel.py +0 -0
  87. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/discovery.py +0 -0
  88. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  89. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  90. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  91. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  92. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/errors.py +0 -0
  93. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/http.py +0 -0
  94. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/mimeparse.py +0 -0
  95. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/model.py +0 -0
  96. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/schema.py +0 -0
  97. {gam7-7.6.1 → gam7-7.6.3}/src/gam/googleapiclient/version.py +0 -0
  98. {gam7-7.6.1 → gam7-7.6.3}/src/gam/iso8601/__init__.py +0 -0
  99. {gam7-7.6.1 → gam7-7.6.3}/src/gam/iso8601/iso8601.py +0 -0
  100. {gam7-7.6.1 → gam7-7.6.3}/src/gam/meet-v2beta.json +0 -0
  101. {gam7-7.6.1 → gam7-7.6.3}/src/gam/serviceaccountlookup-v1.json +0 -0
  102. {gam7-7.6.1 → gam7-7.6.3}/src/gam/six.py +0 -0
  103. {gam7-7.6.1 → gam7-7.6.3}/src/gam-install.sh +0 -0
  104. {gam7-7.6.1 → gam7-7.6.3}/src/gam-setup.bat +0 -0
  105. {gam7-7.6.1 → gam7-7.6.3}/src/gam.exe.manifest +0 -0
  106. {gam7-7.6.1 → gam7-7.6.3}/src/gam.py +0 -0
  107. {gam7-7.6.1 → gam7-7.6.3}/src/gam.spec +0 -0
  108. {gam7-7.6.1 → gam7-7.6.3}/src/gam.wxs +0 -0
  109. {gam7-7.6.1 → gam7-7.6.3}/src/license.rtf +0 -0
  110. {gam7-7.6.1 → gam7-7.6.3}/src/requirements-dev.txt +0 -0
  111. {gam7-7.6.1 → gam7-7.6.3}/src/requirements.txt +0 -0
  112. {gam7-7.6.1 → gam7-7.6.3}/src/setup.cfg +0 -0
  113. {gam7-7.6.1 → gam7-7.6.3}/src/setup.py +0 -0
  114. {gam7-7.6.1 → gam7-7.6.3}/src/tools/a_atleast_b.py +0 -0
  115. {gam7-7.6.1 → gam7-7.6.3}/src/tools/gen-wix-xml-filelist.py +0 -0
  116. {gam7-7.6.1 → gam7-7.6.3}/src/tools/mkGamRef.py +0 -0
  117. {gam7-7.6.1 → gam7-7.6.3}/src/tools/openssl.props +0 -0
  118. {gam7-7.6.1 → gam7-7.6.3}/src/version_info.txt.in +0 -0
  119. {gam7-7.6.1 → gam7-7.6.3}/wiki/00scratch.md +0 -0
  120. {gam7-7.6.1 → gam7-7.6.3}/wiki/Addresses.md +0 -0
  121. {gam7-7.6.1 → gam7-7.6.3}/wiki/Administrators.md +0 -0
  122. {gam7-7.6.1 → gam7-7.6.3}/wiki/Alert-Center.md +0 -0
  123. {gam7-7.6.1 → gam7-7.6.3}/wiki/Aliases.md +0 -0
  124. {gam7-7.6.1 → gam7-7.6.3}/wiki/Authorization.md +0 -0
  125. {gam7-7.6.1 → gam7-7.6.3}/wiki/BNF-Syntax.md +0 -0
  126. {gam7-7.6.1 → gam7-7.6.3}/wiki/Basic-Items.md +0 -0
  127. {gam7-7.6.1 → gam7-7.6.3}/wiki/Bulk-Processing.md +0 -0
  128. {gam7-7.6.1 → gam7-7.6.3}/wiki/CSV-Input-Filtering.md +0 -0
  129. {gam7-7.6.1 → gam7-7.6.3}/wiki/CSV-Output-Filtering.md +0 -0
  130. {gam7-7.6.1 → gam7-7.6.3}/wiki/CSV-Special-Characters.md +0 -0
  131. {gam7-7.6.1 → gam7-7.6.3}/wiki/Calendars-Access.md +0 -0
  132. {gam7-7.6.1 → gam7-7.6.3}/wiki/Calendars-Events.md +0 -0
  133. {gam7-7.6.1 → gam7-7.6.3}/wiki/Calendars.md +0 -0
  134. {gam7-7.6.1 → gam7-7.6.3}/wiki/Chat-Bot.md +0 -0
  135. {gam7-7.6.1 → gam7-7.6.3}/wiki/Chrome-AUE-Counts.md +0 -0
  136. {gam7-7.6.1 → gam7-7.6.3}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  137. {gam7-7.6.1 → gam7-7.6.3}/wiki/Chrome-Installed-Apps.md +0 -0
  138. {gam7-7.6.1 → gam7-7.6.3}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  139. {gam7-7.6.1 → gam7-7.6.3}/wiki/Chrome-Printers.md +0 -0
  140. {gam7-7.6.1 → gam7-7.6.3}/wiki/Chrome-Profile-Management.md +0 -0
  141. {gam7-7.6.1 → gam7-7.6.3}/wiki/Chrome-Version-Counts.md +0 -0
  142. {gam7-7.6.1 → gam7-7.6.3}/wiki/Chrome-Version-History.md +0 -0
  143. {gam7-7.6.1 → gam7-7.6.3}/wiki/ChromeOS-Devices.md +0 -0
  144. {gam7-7.6.1 → gam7-7.6.3}/wiki/Classroom-Courses.md +0 -0
  145. {gam7-7.6.1 → gam7-7.6.3}/wiki/Classroom-Guardians.md +0 -0
  146. {gam7-7.6.1 → gam7-7.6.3}/wiki/Classroom-Invitations.md +0 -0
  147. {gam7-7.6.1 → gam7-7.6.3}/wiki/Classroom-Membership.md +0 -0
  148. {gam7-7.6.1 → gam7-7.6.3}/wiki/Cloud-Channel.md +0 -0
  149. {gam7-7.6.1 → gam7-7.6.3}/wiki/Cloud-Identity-Devices.md +0 -0
  150. {gam7-7.6.1 → gam7-7.6.3}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  151. {gam7-7.6.1 → gam7-7.6.3}/wiki/Cloud-Identity-Groups.md +0 -0
  152. {gam7-7.6.1 → gam7-7.6.3}/wiki/Cloud-Identity-Policies.md +0 -0
  153. {gam7-7.6.1 → gam7-7.6.3}/wiki/Cloud-Storage.md +0 -0
  154. {gam7-7.6.1 → gam7-7.6.3}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  155. {gam7-7.6.1 → gam7-7.6.3}/wiki/Collections-of-Items.md +0 -0
  156. {gam7-7.6.1 → gam7-7.6.3}/wiki/Collections-of-Users.md +0 -0
  157. {gam7-7.6.1 → gam7-7.6.3}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  158. {gam7-7.6.1 → gam7-7.6.3}/wiki/Command-Line-Parsing.md +0 -0
  159. {gam7-7.6.1 → gam7-7.6.3}/wiki/Command-Logging-Progress.md +0 -0
  160. {gam7-7.6.1 → gam7-7.6.3}/wiki/Context-Aware-Access-Levels.md +0 -0
  161. {gam7-7.6.1 → gam7-7.6.3}/wiki/Customer.md +0 -0
  162. {gam7-7.6.1 → gam7-7.6.3}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  163. {gam7-7.6.1 → gam7-7.6.3}/wiki/Domain-SharedContacts-GAL.md +0 -0
  164. {gam7-7.6.1 → gam7-7.6.3}/wiki/Domains-Verification.md +0 -0
  165. {gam7-7.6.1 → gam7-7.6.3}/wiki/Domains.md +0 -0
  166. {gam7-7.6.1 → gam7-7.6.3}/wiki/Downloads-Installs.md +0 -0
  167. {gam7-7.6.1 → gam7-7.6.3}/wiki/Drive-File-Selection.md +0 -0
  168. {gam7-7.6.1 → gam7-7.6.3}/wiki/Drive-Items.md +0 -0
  169. {gam7-7.6.1 → gam7-7.6.3}/wiki/Drive-REST-API-v3.md +0 -0
  170. {gam7-7.6.1 → gam7-7.6.3}/wiki/Email-Audit-Monitor.md +0 -0
  171. {gam7-7.6.1 → gam7-7.6.3}/wiki/Find-File-Owner.md +0 -0
  172. {gam7-7.6.1 → gam7-7.6.3}/wiki/GAM-Public-Chat-Room.md +0 -0
  173. {gam7-7.6.1 → gam7-7.6.3}/wiki/GAM-Return-Codes.md +0 -0
  174. {gam7-7.6.1 → gam7-7.6.3}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  175. {gam7-7.6.1 → gam7-7.6.3}/wiki/GAM7-on-Android-Devices.md +0 -0
  176. {gam7-7.6.1 → gam7-7.6.3}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  177. {gam7-7.6.1 → gam7-7.6.3}/wiki/Google-Data-Transfers.md +0 -0
  178. {gam7-7.6.1 → gam7-7.6.3}/wiki/Google-Network-Addresses.md +0 -0
  179. {gam7-7.6.1 → gam7-7.6.3}/wiki/Groups-Membership.md +0 -0
  180. {gam7-7.6.1 → gam7-7.6.3}/wiki/Groups.md +0 -0
  181. {gam7-7.6.1 → gam7-7.6.3}/wiki/HTTPS-Proxy.md +0 -0
  182. {gam7-7.6.1 → gam7-7.6.3}/wiki/How-to-Install-GAM7.md +0 -0
  183. {gam7-7.6.1 → gam7-7.6.3}/wiki/How-to-Uninstall-GAM7.md +0 -0
  184. {gam7-7.6.1 → gam7-7.6.3}/wiki/How-to-Update-GAM7.md +0 -0
  185. {gam7-7.6.1 → gam7-7.6.3}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  186. {gam7-7.6.1 → gam7-7.6.3}/wiki/Inbound-SSO.md +0 -0
  187. {gam7-7.6.1 → gam7-7.6.3}/wiki/Install-GAM-as-Python-Library.md +0 -0
  188. {gam7-7.6.1 → gam7-7.6.3}/wiki/Licenses.md +0 -0
  189. {gam7-7.6.1 → gam7-7.6.3}/wiki/List-Items.md +0 -0
  190. {gam7-7.6.1 → gam7-7.6.3}/wiki/List.md +0 -0
  191. {gam7-7.6.1 → gam7-7.6.3}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  192. {gam7-7.6.1 → gam7-7.6.3}/wiki/Mobile-Devices.md +0 -0
  193. {gam7-7.6.1 → gam7-7.6.3}/wiki/Organizational-Units.md +0 -0
  194. {gam7-7.6.1 → gam7-7.6.3}/wiki/Other-Resources.md +0 -0
  195. {gam7-7.6.1 → gam7-7.6.3}/wiki/Permission-Matches.md +0 -0
  196. {gam7-7.6.1 → gam7-7.6.3}/wiki/Python-Regular-Expressions.md +0 -0
  197. {gam7-7.6.1 → gam7-7.6.3}/wiki/README.md +0 -0
  198. {gam7-7.6.1 → gam7-7.6.3}/wiki/Rclone.md +0 -0
  199. {gam7-7.6.1 → gam7-7.6.3}/wiki/Reports.md +0 -0
  200. {gam7-7.6.1 → gam7-7.6.3}/wiki/Reseller.md +0 -0
  201. {gam7-7.6.1 → gam7-7.6.3}/wiki/Resources.md +0 -0
  202. {gam7-7.6.1 → gam7-7.6.3}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  203. {gam7-7.6.1 → gam7-7.6.3}/wiki/SSL-Root-CA-Certificates.md +0 -0
  204. {gam7-7.6.1 → gam7-7.6.3}/wiki/Schemas.md +0 -0
  205. {gam7-7.6.1 → gam7-7.6.3}/wiki/Scripts.md +0 -0
  206. {gam7-7.6.1 → gam7-7.6.3}/wiki/Send-Email.md +0 -0
  207. {gam7-7.6.1 → gam7-7.6.3}/wiki/Shared-Drives.md +0 -0
  208. {gam7-7.6.1 → gam7-7.6.3}/wiki/Sites.md +0 -0
  209. {gam7-7.6.1 → gam7-7.6.3}/wiki/Tag-Replace.md +0 -0
  210. {gam7-7.6.1 → gam7-7.6.3}/wiki/Todrive.md +0 -0
  211. {gam7-7.6.1 → gam7-7.6.3}/wiki/Unmanaged-Accounts.md +0 -0
  212. {gam7-7.6.1 → gam7-7.6.3}/wiki/Upgrade-Benefits.md +0 -0
  213. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Analytics-Admin.md +0 -0
  214. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Application-Specific-Passwords.md +0 -0
  215. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Backup-Verification-Codes.md +0 -0
  216. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Calendars-Access.md +0 -0
  217. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Calendars-Events.md +0 -0
  218. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Calendars.md +0 -0
  219. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Chat.md +0 -0
  220. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Classification-Labels.md +0 -0
  221. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Classroom-Profile.md +0 -0
  222. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Contacts-Delegates.md +0 -0
  223. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Contacts.md +0 -0
  224. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Deprovision.md +0 -0
  225. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Activity-Settings.md +0 -0
  226. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Cleanup.md +0 -0
  227. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Comments.md +0 -0
  228. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Copy-Move.md +0 -0
  229. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Files-Manage.md +0 -0
  230. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Orphans.md +0 -0
  231. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Ownership.md +0 -0
  232. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Permissions.md +0 -0
  233. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Query.md +0 -0
  234. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Revisions.md +0 -0
  235. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Shortcuts.md +0 -0
  236. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Drive-Transfer.md +0 -0
  237. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Forms.md +0 -0
  238. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Gmail-CSE.md +0 -0
  239. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Gmail-Delegates.md +0 -0
  240. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Gmail-Filters.md +0 -0
  241. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Gmail-Forwarding.md +0 -0
  242. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Gmail-Labels.md +0 -0
  243. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  244. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Gmail-Profile.md +0 -0
  245. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Gmail-S-MIME.md +0 -0
  246. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  247. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Gmail-Settings.md +0 -0
  248. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Group-Membership.md +0 -0
  249. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Keep-Notes.md +0 -0
  250. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Looker-Studio.md +0 -0
  251. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Meet.md +0 -0
  252. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-People-Contacts-Profiles.md +0 -0
  253. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Photo.md +0 -0
  254. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Profile-Photo.md +0 -0
  255. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Profile-Sharing.md +0 -0
  256. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Shared-Drives.md +0 -0
  257. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  258. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Spreadsheets.md +0 -0
  259. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Tasks.md +0 -0
  260. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-Tokens.md +0 -0
  261. {gam7-7.6.1 → gam7-7.6.3}/wiki/Users-YouTube.md +0 -0
  262. {gam7-7.6.1 → gam7-7.6.3}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  263. {gam7-7.6.1 → gam7-7.6.3}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  264. {gam7-7.6.1 → gam7-7.6.3}/wiki/Vault-Takeout.md +0 -0
  265. {gam7-7.6.1 → gam7-7.6.3}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  266. {gam7-7.6.1 → gam7-7.6.3}/wiki/_Sidebar.md +0 -0
  267. {gam7-7.6.1 → gam7-7.6.3}/wiki/gam.cfg.md +0 -0
  268. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-AdminSettingsExamples.md +0 -0
  269. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Android-Installation.md +0 -0
  270. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-BulkOperations.md +0 -0
  271. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-CalendarExamples.md +0 -0
  272. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Chat-Bot.md +0 -0
  273. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Chrome-Browser-Management.md +0 -0
  274. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Chrome-OS-Installation.md +0 -0
  275. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Chrome-Policy-Settings.md +0 -0
  276. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Cloud-Identity-Groups.md +0 -0
  277. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  278. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Command-Reference-Calendars.md +0 -0
  279. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Command-Reference-Definitions.md +0 -0
  280. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Command-Reference-Drive.md +0 -0
  281. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Command-Reference-Email.md +0 -0
  282. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  283. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Command-Reference-Groups.md +0 -0
  284. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Command-Reference-Users.md +0 -0
  285. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  286. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  287. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-CreatingClientSecretsFile.md +0 -0
  288. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Custom-Schemas.md +0 -0
  289. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Data-Transfers.md +0 -0
  290. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-DomainVerification.md +0 -0
  291. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-ExamplesAccountAuditing.md +0 -0
  292. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-ExamplesCSV.md +0 -0
  293. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-ExamplesEmailSettings.md +0 -0
  294. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-ExamplesOrganizations.md +0 -0
  295. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-GAM-Discussion-Group.md +0 -0
  296. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  297. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-GAM-options-files.md +0 -0
  298. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  299. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-GAM3CSVListings.md +0 -0
  300. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-GAM3DirectoryCommands.md +0 -0
  301. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-GAM3GroupSettings.md +0 -0
  302. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-GAM7-FAQ.md +0 -0
  303. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  304. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-GoogleDriveManagement.md +0 -0
  305. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  306. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Home.md +0 -0
  307. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  308. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Inbound-SSO-Settings.md +0 -0
  309. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-LicenseExamples.md +0 -0
  310. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Managing-Admins.md +0 -0
  311. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  312. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Managing-Devices.md +0 -0
  313. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Managing-Google-Classroom.md +0 -0
  314. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-OAuthKeyManagement.md +0 -0
  315. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Printers.md +0 -0
  316. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-ResellerCommands.md +0 -0
  317. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  318. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-SecurityExamples.md +0 -0
  319. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-UnmanagedUsersExamples.md +0 -0
  320. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Use-a-Yubikey.md +0 -0
  321. {gam7-7.6.1 → gam7-7.6.3}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.6.1
3
+ Version: 7.6.3
4
4
  Summary: CLI tool to manage Google Workspace
5
5
  Project-URL: Homepage, https://github.com/GAM-team/GAM
6
6
  Project-URL: Issues, https://github.com/GAM-team/GAM/issues
@@ -7163,7 +7163,8 @@ gam <UserTypeEntity> print filecounts [todrive <ToDriveAttribute>*]
7163
7163
  [filenamematchpattern <REMatchPattern>]
7164
7164
  <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
7165
7165
  [excludetrashed]
7166
- [showsize] [showmimetypesize] [showlastmodification]
7166
+ [showsize] [showmimetypesize]
7167
+ [showlastmodification] [pathdelimiter <Character>]
7167
7168
  (addcsvdata <FieldName> <String>)*
7168
7169
  [summary none|only|plus] [summaryuser <String>]
7169
7170
  gam <UserTypeEntity> show filecounts
@@ -7178,7 +7179,8 @@ gam <UserTypeEntity> show filecounts
7178
7179
  [filenamematchpattern <REMatchPattern>]
7179
7180
  <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
7180
7181
  [excludetrashed]
7181
- [showsize] [showmimetypesize] [showlastmodification]
7182
+ [showsize] [showmimetypesize]
7183
+ [showlastmodification] [pathdelimiter <Character>]
7182
7184
  [summary none|only|plus] [summaryuser <String>]
7183
7185
 
7184
7186
  gam <UserTypeEntity> print filesharecounts [todrive <ToDriveAttribute>*]
@@ -7308,6 +7310,14 @@ gam <UserTypeEntity> print driveactivity [todrive <ToDriveAttribute>*]
7308
7310
  usageindrivetrash
7309
7311
  <DriveSettingsFieldNameList> ::= "<DriveSettingsFieldName>(,<DriveSettingsFieldName>)*"
7310
7312
 
7313
+ gam <UserTypeEntity> print drivelastmodification [todrive <ToDriveAttribute>*]
7314
+ [select <SharedDriveEntity>]
7315
+ [pathdelimiter <Character>]
7316
+ (addcsvdata <FieldName> <String>)*
7317
+ gam <UserTypeEntity> show drivelastmodification
7318
+ [select <SharedDriveEntity>]
7319
+ [pathdelimiter <Character>]
7320
+
7311
7321
  gam <UserTypeEntity> print drivesettings [todrive <ToDriveAttribute>*]
7312
7322
  [allfields|<DriveSettingsFieldName>*|(fields <DriveSettingsFieldNameList>)]
7313
7323
  [delimiter <Character>] [showusagebytes]
@@ -1,8 +1,32 @@
1
+ 7.06.03
2
+
3
+ Fixed bug in `gam <UserTypeEntity> print|show drivelastmodification` that caused a trap
4
+ when an empty drive was specified.
5
+
6
+ 7.06.02
7
+
8
+ Updated `gam <UserTypeEntity> print|show filecounts ... showlastmodification` to include
9
+ file mimetype and path information for the last modified file.
10
+
11
+ Added simple commands to get information about the last modified file on a drive.
12
+ By default, a user's My Drive is processed; optionally, a Shared Drive can be processed.
13
+ ```
14
+ gam <UserTypeEntity> print drivelastmodification [todrive <ToDriveAttribute>*]
15
+ [select <SharedDriveEntity>]
16
+ [pathdelimiter <Character>]
17
+ (addcsvdata <FieldName> <String>)*
18
+ gam <UserTypeEntity> show drivelastmodification
19
+ [select <SharedDriveEntity>]
20
+ [pathdelimiter <Character>]
21
+ ```
22
+
1
23
  7.06.01
2
24
 
3
25
  Updated `gam <UserTypeEntity> create|update drivefileacl ... expiration <Time>`
4
26
  to handle additional API errors.
5
27
 
28
+ Updated to Python 3.13.3.
29
+
6
30
  7.06.00
7
31
 
8
32
  Upgraded to OpenSSL 3.5.0.
@@ -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.06.01'
28
+ __version__ = '7.06.03'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -28152,10 +28152,18 @@ CHROME_SCHEMA_TYPE_MESSAGE = {
28152
28152
  {'autoupdatecheckperiodminutesnew':
28153
28153
  {'casedField': 'autoUpdateCheckPeriodMinutesNew',
28154
28154
  'type': 'duration', 'minVal': 1, 'maxVal': 720, 'scale': 60}},
28155
+ 'chrome.users.AutoUpdateCheckPeriodNewV2':
28156
+ {'autoupdatecheckperiodminutesnew':
28157
+ {'casedField': 'autoUpdateCheckPeriodMinutesNew',
28158
+ 'type': 'duration', 'minVal': 1, 'maxVal': 720, 'scale': 60}},
28155
28159
  'chrome.users.BrowserSwitcherDelayDuration':
28156
28160
  {'browserswitcherdelayduration':
28157
28161
  {'casedField': 'browserSwitcherDelayDuration',
28158
28162
  'type': 'duration', 'minVal': 0, 'maxVal': 30, 'scale': 1}},
28163
+ 'chrome.users.CloudReportingUploadFrequencyV2':
28164
+ {'cloudreportinguploadfrequency':
28165
+ {'casedField': 'cloudReportingUploadFrequency',
28166
+ 'type': 'count', 'minVal': 3, 'maxVal': 24, 'scale': 1}},
28159
28167
  'chrome.users.FetchKeepaliveDurationSecondsOnShutdown':
28160
28168
  {'fetchkeepalivedurationsecondsonshutdown':
28161
28169
  {'casedField': 'fetchKeepaliveDurationSecondsOnShutdown',
@@ -28172,6 +28180,10 @@ CHROME_SCHEMA_TYPE_MESSAGE = {
28172
28180
  {'printjobhistoryexpirationperioddaysnew':
28173
28181
  {'casedField': 'printJobHistoryExpirationPeriodDaysNew',
28174
28182
  'type': 'duration', 'minVal': -1, 'maxVal': None, 'scale': 86400}},
28183
+ 'chrome.users.RelaunchNotificationWithDurationV2':
28184
+ {'relaunchnotificationperiodduration':
28185
+ {'casedField': 'relaunchNotificationPeriodDuration',
28186
+ 'type': 'duration', 'minVal': -1, 'maxVal': None, 'scale': 3600}},
28175
28187
  'chrome.users.SecurityTokenSessionSettings':
28176
28188
  {'securitytokensessionnotificationseconds':
28177
28189
  {'casedField': 'securityTokenSessionNotificationSeconds',
@@ -56474,6 +56486,45 @@ def printFileParentTree(users):
56474
56486
  kcount -= 1
56475
56487
  csvPF.writeCSVfile('Drive File Parent Tree')
56476
56488
 
56489
+ # Last file modification utilities
56490
+ def _initLastModification():
56491
+ return {'lastModifiedFileId': '', 'lastModifiedFileName': '',
56492
+ 'lastModifiedFileMimeType': '', 'lastModifiedFilePath': '',
56493
+ 'lastModifyingUser': '', 'lastModifiedTime': NEVER_TIME,
56494
+ 'fileEntryInfo': {}}
56495
+
56496
+ def _checkUpdateLastModifiction(f_file, userLastModification):
56497
+ if f_file.get('modifiedTime', NEVER_TIME) > userLastModification['lastModifiedTime'] and 'lastModifyingUser' in f_file:
56498
+ userLastModification['lastModifiedFileId'] = f_file['id']
56499
+ userLastModification['lastModifiedFileName'] = _stripControlCharsFromName(f_file['name'])
56500
+ userLastModification['lastModifiedFileMimeType'] = f_file['mimeType']
56501
+ userLastModification['lastModifiedTime'] = f_file['modifiedTime']
56502
+ userLastModification['lastModifyingUser'] = f_file['lastModifyingUser'].get('emailAddress',
56503
+ f_file['lastModifyingUser'].get('displayName', UNKNOWN))
56504
+ userLastModification['fileEntryInfo'] = f_file.copy()
56505
+
56506
+ def _getLastModificationPath(drive, userLastModification, pathDelimiter):
56507
+ if userLastModification['fileEntryInfo']:
56508
+ filePathInfo = initFilePathInfo(pathDelimiter)
56509
+ _, paths, _ = getFilePaths(drive, {}, userLastModification['fileEntryInfo'], filePathInfo)
56510
+ userLastModification['lastModifiedFilePath'] = paths[0] if paths else UNKNOWN
56511
+
56512
+ def _showLastModification(lastModification):
56513
+ printKeyValueList(['lastModifiedFileId', lastModification['lastModifiedFileId']])
56514
+ printKeyValueList(['lastModifiedFileName', lastModification['lastModifiedFileName']])
56515
+ printKeyValueList(['lastModifiedFileMimeType', lastModification['lastModifiedFileMimeType']])
56516
+ printKeyValueList(['lastModifiedFilePath', lastModification['lastModifiedFilePath']])
56517
+ printKeyValueList(['lastModifyingUser', lastModification['lastModifyingUser']])
56518
+ printKeyValueList(['lastModifiedTime', formatLocalTime(lastModification['lastModifiedTime'])])
56519
+
56520
+ def _updateLastModificationRow(row, lastModification):
56521
+ row.update({'lastModifiedFileId': lastModification['lastModifiedFileId'],
56522
+ 'lastModifiedFileName': lastModification['lastModifiedFileName'],
56523
+ 'lastModifiedFileMimeType': lastModification['lastModifiedFileMimeType'],
56524
+ 'lastModifiedFilePath': lastModification['lastModifiedFilePath'],
56525
+ 'lastModifyingUser': lastModification['lastModifyingUser'],
56526
+ 'lastModifiedTime': formatLocalTime(lastModification['lastModifiedTime'])})
56527
+
56477
56528
  # gam <UserTypeEntity> print filecounts [todrive <ToDriveAttribute>*]
56478
56529
  # [((query <QueryDriveFile>) | (fullquery <QueryDriveFile>) | <DriveFileQueryShortcut>) (querytime<String> <Time>)*]
56479
56530
  # [continueoninvalidquery [<Boolean>]]
@@ -56485,7 +56536,8 @@ def printFileParentTree(users):
56485
56536
  # [filenamematchpattern <REMatchPattern>]
56486
56537
  # <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
56487
56538
  # [excludetrashed] (addcsvdata <FieldName> <String>)*
56488
- # [showsize] [showmimetypesize] [showlastmodification]
56539
+ # [showsize] [showmimetypesize]
56540
+ # [showlastmodification] [pathdelimiter <Character>]
56489
56541
  # (addcsvdata <FieldName> <String>)*
56490
56542
  # [summary none|only|plus] [summaryuser <String>]
56491
56543
  # gam <UserTypeEntity> show filecounts
@@ -56499,7 +56551,8 @@ def printFileParentTree(users):
56499
56551
  # [filenamematchpattern <REMatchPattern>]
56500
56552
  # <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
56501
56553
  # [excludetrashed]
56502
- # [showsize] [showmimetypesize] [showlastmodification]
56554
+ # [showsize] [showmimetypesize]
56555
+ # [showlastmodification] [pathdelimiter <Character>]
56503
56556
  # [summary none|only|plus] [summaryuser <String>]
56504
56557
  def printShowFileCounts(users):
56505
56558
  def _setSelectionFields():
@@ -56508,7 +56561,7 @@ def printShowFileCounts(users):
56508
56561
  if showSize or (DLP.minimumFileSize is not None) or (DLP.maximumFileSize is not None):
56509
56562
  fieldsList.append(sizeField)
56510
56563
  if showLastModification:
56511
- fieldsList.extend(['id,name,modifiedTime,lastModifyingUser(me, displayName, emailAddress)'])
56564
+ fieldsList.extend(['id,name,modifiedTime,lastModifyingUser(me, displayName, emailAddress),parents'])
56512
56565
  if DLP.filenameMatchPattern:
56513
56566
  fieldsList.append('name')
56514
56567
  if DLP.excludeTrashed:
@@ -56544,9 +56597,7 @@ def printShowFileCounts(users):
56544
56597
  printEntityKVList(kvList, dataList, i, count)
56545
56598
  Ind.Increment()
56546
56599
  if showLastModification:
56547
- printKeyValueList(['lastModifiedFile', f"{lastModification['lastModifiedFileName']}({lastModification['lastModifiedFileId']})",
56548
- 'lastModifyingUser', lastModification['lastModifyingUser'],
56549
- 'lastModifiedTime', formatLocalTime(lastModification['lastModifiedTime'])])
56600
+ _showLastModification(lastModification)
56550
56601
  for mimeType, mtinfo in sorted(iter(mimeTypeInfo.items())):
56551
56602
  if not showMimeTypeSize:
56552
56603
  printKeyValueList([mimeType, mtinfo['count']])
@@ -56561,10 +56612,7 @@ def printShowFileCounts(users):
56561
56612
  if showSize:
56562
56613
  row['Size'] = sizeTotal
56563
56614
  if showLastModification:
56564
- row.update({'lastModifiedFileId': lastModification['lastModifiedFileId'],
56565
- 'lastModifiedFileName': lastModification['lastModifiedFileName'],
56566
- 'lastModifyingUser': lastModification['lastModifyingUser'],
56567
- 'lastModifiedTime': formatLocalTime(lastModification['lastModifiedTime'])})
56615
+ _updateLastModificationRow(row, lastModification)
56568
56616
  if addCSVData:
56569
56617
  row.update(addCSVData)
56570
56618
  for mimeType, mtinfo in sorted(iter(mimeTypeInfo.items())):
@@ -56578,6 +56626,7 @@ def printShowFileCounts(users):
56578
56626
  csvPF.SetZeroBlankMimeTypeCounts(True)
56579
56627
  fieldsList = ['mimeType']
56580
56628
  DLP = DriveListParameters({'allowChoose': False, 'allowCorpora': True, 'allowQuery': True, 'mimeTypeInQuery': True})
56629
+ pathDelimiter = '/'
56581
56630
  sharedDriveId = sharedDriveName = ''
56582
56631
  continueOnInvalidQuery = showSize = showLastModification = showMimeTypeSize = False
56583
56632
  sizeField = 'quotaBytesUsed'
@@ -56586,9 +56635,7 @@ def printShowFileCounts(users):
56586
56635
  summaryMimeTypeInfo = {}
56587
56636
  fileIdEntity = {}
56588
56637
  addCSVData = {}
56589
- summaryLastModification = {
56590
- 'lastModifiedFileId': '', 'lastModifiedFileName': '',
56591
- 'lastModifyingUser': '', 'lastModifiedTime': NEVER_TIME}
56638
+ summaryLastModification = _initLastModification()
56592
56639
  while Cmd.ArgumentsRemaining():
56593
56640
  myarg = getArgument()
56594
56641
  if csvPF and myarg == 'todrive':
@@ -56611,6 +56658,8 @@ def printShowFileCounts(users):
56611
56658
  summary = getChoice(FILECOUNT_SUMMARY_CHOICE_MAP, mapChoice=True)
56612
56659
  elif myarg == 'summaryuser':
56613
56660
  summaryUser = getString(Cmd.OB_STRING)
56661
+ elif myarg == 'pathdelimiter':
56662
+ pathDelimiter = getCharacter()
56614
56663
  elif csvPF and myarg == 'addcsvdata':
56615
56664
  k = getString(Cmd.OB_STRING)
56616
56665
  addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
@@ -56637,7 +56686,9 @@ def printShowFileCounts(users):
56637
56686
  if showSize:
56638
56687
  sortTitles.insert(sortTitles.index('Total')+1, 'Size')
56639
56688
  if showLastModification:
56640
- sortTitles.extend(['lastModifiedFileId', 'lastModifiedFileName', 'lastModifyingUser', 'lastModifiedTime'])
56689
+ sortTitles.extend(['lastModifiedFileId', 'lastModifiedFileName',
56690
+ 'lastModifiedFileMimeType', 'lastModifiedFilePath',
56691
+ 'lastModifyingUser', 'lastModifiedTime'])
56641
56692
  if addCSVData:
56642
56693
  sortTitles.extend(sorted(addCSVData.keys()))
56643
56694
  csvPF.SetTitles(sortTitles)
@@ -56652,9 +56703,7 @@ def printShowFileCounts(users):
56652
56703
  sharedDriveId = fileIdEntity.get('shareddrive', {}).get('driveId', '')
56653
56704
  sharedDriveName = _getSharedDriveNameFromId(sharedDriveId) if sharedDriveId else ''
56654
56705
  mimeTypeInfo = {}
56655
- userLastModification = {
56656
- 'lastModifiedFileId': '', 'lastModifiedFileName': '',
56657
- 'lastModifyingUser': '', 'lastModifiedTime': NEVER_TIME}
56706
+ userLastModification = _initLastModification()
56658
56707
  gettingEntity = _getGettingEntity(user, fileIdEntity)
56659
56708
  printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, gettingEntity, i, count, query=DLP.fileIdEntity['query'])
56660
56709
  try:
@@ -56666,7 +56715,7 @@ def printShowFileCounts(users):
56666
56715
  retryReasons=[GAPI.UNKNOWN_ERROR],
56667
56716
  q=DLP.fileIdEntity['query'],
56668
56717
  fields=pagesFields, pageSize=GC.Values[GC.DRIVE_MAX_RESULTS], **btkwargs)
56669
- for files in feed:
56718
+ for files in feed:
56670
56719
  for f_file in files:
56671
56720
  driveId = f_file.get('driveId')
56672
56721
  checkSharedDrivePermissions = getPermissionsForSharedDrives and driveId and 'permissions' not in f_file
@@ -56697,12 +56746,8 @@ def printShowFileCounts(users):
56697
56746
  mimeTypeInfo[f_file['mimeType']]['count'] += 1
56698
56747
  mimeTypeInfo[f_file['mimeType']]['size'] += int(f_file.get(sizeField, '0'))
56699
56748
  if showLastModification:
56700
- if f_file.get('modifiedTime', NEVER_TIME) > userLastModification['lastModifiedTime'] and 'lastModifyingUser' in f_file:
56701
- userLastModification['lastModifiedFileId'] = f_file['id']
56702
- userLastModification['lastModifiedFileName'] = _stripControlCharsFromName(f_file['name'])
56703
- userLastModification['lastModifiedTime'] = f_file['modifiedTime']
56704
- userLastModification['lastModifyingUser'] = f_file['lastModifyingUser'].get('emailAddress',
56705
- f_file['lastModifyingUser'].get('displayName', UNKNOWN))
56749
+ _checkUpdateLastModifiction(f_file, userLastModification)
56750
+ _getLastModificationPath(drive, userLastModification, pathDelimiter)
56706
56751
  showMimeTypeInfo(user, mimeTypeInfo, sharedDriveId, sharedDriveName, userLastModification, i, count)
56707
56752
  if showLastModification and userLastModification['lastModifiedTime'] > summaryLastModification['lastModifiedTime']:
56708
56753
  summaryLastModification = userLastModification.copy()
@@ -56726,6 +56771,110 @@ def printShowFileCounts(users):
56726
56771
  if csvPF:
56727
56772
  csvPF.writeCSVfile('Drive File Counts')
56728
56773
 
56774
+ # gam <UserTypeEntity> print drivelastmodification [todrive <ToDriveAttribute>*]
56775
+ # [select <SharedDriveEntity>]
56776
+ # [pathdelimiter <Character>]
56777
+ # (addcsvdata <FieldName> <String>)*
56778
+ # gam <UserTypeEntity> show drivelastmodification
56779
+ # [select <SharedDriveEntity>]
56780
+ # [pathdelimiter <Character>]
56781
+ def printShowDrivelastModifications(users):
56782
+ def showLastModificationInfo(user, sharedDriveId, sharedDriveName, lastModification, i, count):
56783
+ if not csvPF:
56784
+ if sharedDriveId:
56785
+ kvList = [Ent.USER, user, Ent.SHAREDDRIVE, f'{sharedDriveName} ({sharedDriveId})']
56786
+ else:
56787
+ kvList = [Ent.USER, user]
56788
+ printEntity(kvList, i, count)
56789
+ Ind.Increment()
56790
+ _showLastModification(lastModification)
56791
+ Ind.Decrement()
56792
+ else:
56793
+ if sharedDriveId:
56794
+ row = {'User': user, 'id': sharedDriveId, 'name': sharedDriveName}
56795
+ else:
56796
+ row = {'User': user}
56797
+ _updateLastModificationRow(row, lastModification)
56798
+ if addCSVData:
56799
+ row.update(addCSVData)
56800
+ csvPF.WriteRowTitles(row)
56801
+
56802
+ csvPF = CSVPrintFile() if Act.csvFormat() else None
56803
+ fieldsList = ['id', 'driveId', 'name', 'mimeType', 'lastModifyingUser', 'modifiedTime', 'parents']
56804
+ DLP = DriveListParameters({'allowChoose': False, 'allowCorpora': False, 'allowQuery': False, 'mimeTypeInQuery': True})
56805
+ pathDelimiter = '/'
56806
+ sharedDriveId = sharedDriveName = ''
56807
+ fileIdEntity = {}
56808
+ addCSVData = {}
56809
+ while Cmd.ArgumentsRemaining():
56810
+ myarg = getArgument()
56811
+ if csvPF and myarg == 'todrive':
56812
+ csvPF.GetTodriveParameters()
56813
+ elif myarg == 'select':
56814
+ if fileIdEntity:
56815
+ usageErrorExit(Msg.CAN_NOT_BE_SPECIFIED_MORE_THAN_ONCE.format('select'))
56816
+ fileIdEntity = getSharedDriveEntity()
56817
+ elif myarg == 'pathdelimiter':
56818
+ pathDelimiter = getCharacter()
56819
+ elif csvPF and myarg == 'addcsvdata':
56820
+ k = getString(Cmd.OB_STRING)
56821
+ addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
56822
+ else:
56823
+ unknownArgumentExit()
56824
+ if not fileIdEntity:
56825
+ fileIdEntity = DLP.GetFileIdEntity()
56826
+ if not fileIdEntity.get('shareddrive'):
56827
+ btkwargs = DLP.kwargs
56828
+ else:
56829
+ btkwargs = fileIdEntity['shareddrive']
56830
+ fieldsList.append('driveId')
56831
+ DLP.Finalize(fileIdEntity)
56832
+ if csvPF:
56833
+ sortTitles = ['User', 'id', 'name'] if fileIdEntity.get('shareddrive') else ['User']
56834
+ sortTitles.extend(['lastModifiedFileId', 'lastModifiedFileName',
56835
+ 'lastModifiedFileMimeType', 'lastModifiedFilePath',
56836
+ 'lastModifyingUser', 'lastModifiedTime'])
56837
+ if addCSVData:
56838
+ sortTitles.extend(sorted(addCSVData.keys()))
56839
+ csvPF.SetTitles(sortTitles)
56840
+ csvPF.SetSortAllTitles()
56841
+ pagesFields = getItemFieldsFromFieldsList('files', fieldsList)
56842
+ i, count, users = getEntityArgument(users)
56843
+ for user in users:
56844
+ i += 1
56845
+ user, drive = _validateUserSharedDrive(user, i, count, fileIdEntity)
56846
+ if not drive:
56847
+ continue
56848
+ sharedDriveId = fileIdEntity.get('shareddrive', {}).get('driveId', '')
56849
+ sharedDriveName = _getSharedDriveNameFromId(sharedDriveId) if sharedDriveId else ''
56850
+ userLastModification = _initLastModification()
56851
+ gettingEntity = _getGettingEntity(user, fileIdEntity)
56852
+ printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, gettingEntity, i, count)
56853
+ try:
56854
+ feed = yieldGAPIpages(drive.files(), 'list', 'files',
56855
+ pageMessage=getPageMessageForWhom(),
56856
+ throwReasons=GAPI.DRIVE_USER_THROW_REASONS+[GAPI.INVALID, GAPI.BAD_REQUEST, GAPI.FILE_NOT_FOUND,
56857
+ GAPI.NOT_FOUND, GAPI.TEAMDRIVE_MEMBERSHIP_REQUIRED],
56858
+ retryReasons=[GAPI.UNKNOWN_ERROR],
56859
+ fields=pagesFields, pageSize=GC.Values[GC.DRIVE_MAX_RESULTS], **btkwargs)
56860
+ for files in feed:
56861
+ for f_file in files:
56862
+ _checkUpdateLastModifiction(f_file, userLastModification)
56863
+ _getLastModificationPath(drive, userLastModification, pathDelimiter)
56864
+ showLastModificationInfo(user, sharedDriveId, sharedDriveName, userLastModification, i, count)
56865
+ except (GAPI.invalid, GAPI.badRequest) as e:
56866
+ entityActionFailedWarning([Ent.USER, user, Ent.DRIVE_FILE_OR_FOLDER, None], str(e), i, count)
56867
+ continue
56868
+ except GAPI.fileNotFound:
56869
+ printGotEntityItemsForWhom(0)
56870
+ except (GAPI.notFound, GAPI.teamDriveMembershipRequired) as e:
56871
+ entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE_ID, sharedDriveId], str(e), i, count)
56872
+ except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
56873
+ userDriveServiceNotEnabledWarning(user, str(e), i, count)
56874
+ continue
56875
+ if csvPF:
56876
+ csvPF.writeCSVfile('Drive File Last Modification')
56877
+
56729
56878
  DISKUSAGE_SHOW_CHOICES = {'all', 'summary', 'summaryandtrash'}
56730
56879
 
56731
56880
  # gam <UserTypeEntity> print diskusage <DriveFileEntity> [todrive <ToDriveAttribute>*]
@@ -76543,6 +76692,7 @@ USER_COMMANDS_WITH_OBJECTS = {
76543
76692
  Cmd.ARG_DRIVEFILEACL: printShowDriveFileACLs,
76544
76693
  Cmd.ARG_DRIVELABEL: printShowDriveLabels,
76545
76694
  Cmd.ARG_DRIVELABELPERMISSION: printShowDriveLabelPermissions,
76695
+ Cmd.ARG_DRIVELASTMODIFICATION: printShowDrivelastModifications,
76546
76696
  Cmd.ARG_DRIVESETTINGS: printShowDriveSettings,
76547
76697
  Cmd.ARG_EMPTYDRIVEFOLDERS: printEmptyDriveFolders,
76548
76698
  Cmd.ARG_EVENT: printShowCalendarEvents,
@@ -76650,6 +76800,7 @@ USER_COMMANDS_WITH_OBJECTS = {
76650
76800
  Cmd.ARG_DRIVEFILEACL: printShowDriveFileACLs,
76651
76801
  Cmd.ARG_DRIVELABEL: printShowDriveLabels,
76652
76802
  Cmd.ARG_DRIVELABELPERMISSION: printShowDriveLabelPermissions,
76803
+ Cmd.ARG_DRIVELASTMODIFICATION: printShowDrivelastModifications,
76653
76804
  Cmd.ARG_DRIVESETTINGS: printShowDriveSettings,
76654
76805
  Cmd.ARG_EVENT: printShowCalendarEvents,
76655
76806
  Cmd.ARG_FILECOMMENT: printShowFileComments,
@@ -76874,13 +77025,14 @@ USER_COMMANDS_OBJ_ALIASES = {
76874
77025
  Cmd.ARG_DOMAINCONTACT: Cmd.ARG_PEOPLECONTACT,
76875
77026
  Cmd.ARG_DOMAINCONTACTS: Cmd.ARG_PEOPLECONTACT,
76876
77027
  Cmd.ARG_DRIVEFILEACLS: Cmd.ARG_DRIVEFILEACL,
76877
- Cmd.ARG_FILEDRIVELABELS: Cmd.ARG_FILEDRIVELABEL,
76878
77028
  Cmd.ARG_DRIVEFILESHORTCUTS: Cmd.ARG_DRIVEFILESHORTCUT,
76879
77029
  Cmd.ARG_DRIVELABELS: Cmd.ARG_DRIVELABEL,
76880
77030
  Cmd.ARG_DRIVELABELPERMISSIONS: Cmd.ARG_DRIVELABELPERMISSION,
77031
+ Cmd.ARG_DRIVELASTMODIFICATIONS: Cmd.ARG_DRIVELASTMODIFICATION,
76881
77032
  Cmd.ARG_EVENTS: Cmd.ARG_EVENT,
76882
77033
  Cmd.ARG_FILECOMMENTS: Cmd.ARG_FILECOMMENT,
76883
77034
  Cmd.ARG_FILECOUNTS: Cmd.ARG_FILECOUNT,
77035
+ Cmd.ARG_FILEDRIVELABELS: Cmd.ARG_FILEDRIVELABEL,
76884
77036
  Cmd.ARG_FILEPATHS: Cmd.ARG_FILEPATH,
76885
77037
  Cmd.ARG_FILEREVISIONS: Cmd.ARG_FILEREVISION,
76886
77038
  Cmd.ARG_FILESHARECOUNTS: Cmd.ARG_FILESHARECOUNT,
@@ -579,6 +579,8 @@ class GamCLArgs():
579
579
  ARG_DRIVELABELS = 'drivelabels'
580
580
  ARG_DRIVELABELPERMISSION = 'drivelabelpermission'
581
581
  ARG_DRIVELABELPERMISSIONS = 'drivelabelpermissions'
582
+ ARG_DRIVELASTMODIFICATION = 'drivelastmodification'
583
+ ARG_DRIVELASTMODIFICATIONS = 'drivelastmodifications'
582
584
  ARG_DRIVESETTINGS = 'drivesettings'
583
585
  ARG_DRIVETRASH = 'drivetrash'
584
586
  ARG_EMPTYDRIVEFOLDERS = 'emptydrivefolders'