gam7 7.6.0__tar.gz → 7.6.2__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 (319) hide show
  1. {gam7-7.6.0 → gam7-7.6.2}/.github/workflows/build.yml +6 -2
  2. {gam7-7.6.0 → gam7-7.6.2}/.github/workflows/codeql-analysis.yml +4 -3
  3. {gam7-7.6.0 → gam7-7.6.2}/.github/workflows/get-cacerts.yml +4 -0
  4. gam7-7.6.2/.github/workflows/pushwiki.yml +41 -0
  5. {gam7-7.6.0 → gam7-7.6.2}/PKG-INFO +1 -1
  6. {gam7-7.6.0 → gam7-7.6.2}/src/GamCommands.txt +12 -2
  7. {gam7-7.6.0 → gam7-7.6.2}/src/GamUpdate.txt +24 -0
  8. {gam7-7.6.0 → gam7-7.6.2}/src/gam/__init__.py +183 -29
  9. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glclargs.py +2 -0
  10. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glgapi.py +13 -2
  11. gam7-7.6.2/wiki/00scratch.md +5 -0
  12. gam7-7.6.2/wiki/Addresses.md +30 -0
  13. gam7-7.6.2/wiki/Administrators.md +907 -0
  14. gam7-7.6.2/wiki/Alert-Center.md +97 -0
  15. gam7-7.6.2/wiki/Aliases.md +199 -0
  16. gam7-7.6.2/wiki/Authorization.md +1235 -0
  17. gam7-7.6.2/wiki/BNF-Syntax.md +31 -0
  18. gam7-7.6.2/wiki/Basic-Items.md +565 -0
  19. gam7-7.6.2/wiki/Bulk-Processing.md +174 -0
  20. gam7-7.6.2/wiki/CSV-Input-Filtering.md +271 -0
  21. gam7-7.6.2/wiki/CSV-Output-Filtering.md +371 -0
  22. gam7-7.6.2/wiki/CSV-Special-Characters.md +94 -0
  23. gam7-7.6.2/wiki/Calendars-Access.md +86 -0
  24. gam7-7.6.2/wiki/Calendars-Events.md +632 -0
  25. gam7-7.6.2/wiki/Calendars.md +66 -0
  26. gam7-7.6.2/wiki/Chat-Bot.md +312 -0
  27. gam7-7.6.2/wiki/Chrome-AUE-Counts.md +87 -0
  28. gam7-7.6.2/wiki/Chrome-Browser-Cloud-Management.md +502 -0
  29. gam7-7.6.2/wiki/Chrome-Installed-Apps.md +139 -0
  30. gam7-7.6.2/wiki/Chrome-Needs-Attention-Counts.md +75 -0
  31. gam7-7.6.2/wiki/Chrome-Policies.md +7135 -0
  32. gam7-7.6.2/wiki/Chrome-Printers.md +182 -0
  33. gam7-7.6.2/wiki/Chrome-Profile-Management.md +195 -0
  34. gam7-7.6.2/wiki/Chrome-Version-Counts.md +93 -0
  35. gam7-7.6.2/wiki/Chrome-Version-History.md +163 -0
  36. gam7-7.6.2/wiki/ChromeOS-Devices.md +1024 -0
  37. gam7-7.6.2/wiki/Classroom-Courses.md +736 -0
  38. gam7-7.6.2/wiki/Classroom-Guardians.md +189 -0
  39. gam7-7.6.2/wiki/Classroom-Invitations.md +163 -0
  40. gam7-7.6.2/wiki/Classroom-Membership.md +166 -0
  41. gam7-7.6.2/wiki/Cloud-Channel.md +318 -0
  42. gam7-7.6.2/wiki/Cloud-Identity-Devices.md +371 -0
  43. gam7-7.6.2/wiki/Cloud-Identity-Groups-Membership.md +502 -0
  44. gam7-7.6.2/wiki/Cloud-Identity-Groups.md +469 -0
  45. gam7-7.6.2/wiki/Cloud-Identity-Policies.md +402 -0
  46. gam7-7.6.2/wiki/Cloud-Storage.md +57 -0
  47. gam7-7.6.2/wiki/Collections-of-ChromeOS-Devices.md +459 -0
  48. gam7-7.6.2/wiki/Collections-of-Items.md +396 -0
  49. gam7-7.6.2/wiki/Collections-of-Users.md +661 -0
  50. gam7-7.6.2/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +109 -0
  51. gam7-7.6.2/wiki/Command-Line-Parsing.md +81 -0
  52. gam7-7.6.2/wiki/Command-Logging-Progress.md +82 -0
  53. gam7-7.6.2/wiki/Context-Aware-Access-Levels.md +478 -0
  54. gam7-7.6.2/wiki/Customer.md +47 -0
  55. gam7-7.6.2/wiki/Domain-People-Contacts-Profiles.md +188 -0
  56. gam7-7.6.2/wiki/Domain-SharedContacts-GAL.md +319 -0
  57. gam7-7.6.2/wiki/Domains-Verification.md +31 -0
  58. gam7-7.6.2/wiki/Domains.md +96 -0
  59. gam7-7.6.2/wiki/Downloads-Installs.md +61 -0
  60. gam7-7.6.2/wiki/Drive-File-Selection.md +411 -0
  61. gam7-7.6.2/wiki/Drive-Items.md +39 -0
  62. gam7-7.6.2/wiki/Drive-REST-API-v3.md +93 -0
  63. gam7-7.6.2/wiki/Email-Audit-Monitor.md +42 -0
  64. gam7-7.6.2/wiki/Find-File-Owner.md +54 -0
  65. gam7-7.6.2/wiki/GAM-Public-Chat-Room.md +26 -0
  66. gam7-7.6.2/wiki/GAM-Return-Codes.md +75 -0
  67. gam7-7.6.2/wiki/GAM-with-minimal-GCP-rights.md +41 -0
  68. gam7-7.6.2/wiki/GAM7-on-Android-Devices.md +16 -0
  69. gam7-7.6.2/wiki/GAM7-on-Chrome-OS-Devices.md +14 -0
  70. gam7-7.6.2/wiki/GamUpdates.md +6524 -0
  71. gam7-7.6.2/wiki/Google-Data-Transfers.md +81 -0
  72. gam7-7.6.2/wiki/Google-Network-Addresses.md +58 -0
  73. gam7-7.6.2/wiki/Groups-Membership.md +1076 -0
  74. gam7-7.6.2/wiki/Groups.md +679 -0
  75. gam7-7.6.2/wiki/HTTPS-Proxy.md +33 -0
  76. gam7-7.6.2/wiki/Home.md +36 -0
  77. gam7-7.6.2/wiki/How-to-Install-GAM7.md +1071 -0
  78. gam7-7.6.2/wiki/How-to-Uninstall-GAM7.md +127 -0
  79. gam7-7.6.2/wiki/How-to-Update-GAM7.md +581 -0
  80. gam7-7.6.2/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +191 -0
  81. gam7-7.6.2/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +1395 -0
  82. gam7-7.6.2/wiki/Inbound-SSO.md +169 -0
  83. gam7-7.6.2/wiki/Install-GAM-as-Python-Library.md +59 -0
  84. gam7-7.6.2/wiki/Licenses.md +346 -0
  85. gam7-7.6.2/wiki/List-Items.md +107 -0
  86. gam7-7.6.2/wiki/List.md +49 -0
  87. gam7-7.6.2/wiki/Meta-Commands-and-File-Redirection.md +241 -0
  88. gam7-7.6.2/wiki/Mobile-Devices.md +177 -0
  89. gam7-7.6.2/wiki/Organizational-Units.md +342 -0
  90. gam7-7.6.2/wiki/Other-Resources.md +18 -0
  91. gam7-7.6.2/wiki/Permission-Matches.md +184 -0
  92. gam7-7.6.2/wiki/Python-Regular-Expressions.md +218 -0
  93. gam7-7.6.2/wiki/README.md +73 -0
  94. gam7-7.6.2/wiki/Rclone.md +38 -0
  95. gam7-7.6.2/wiki/Reports.md +584 -0
  96. gam7-7.6.2/wiki/Reseller.md +173 -0
  97. gam7-7.6.2/wiki/Resources.md +566 -0
  98. gam7-7.6.2/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +74 -0
  99. gam7-7.6.2/wiki/SSL-Root-CA-Certificates.md +26 -0
  100. gam7-7.6.2/wiki/Schemas.md +52 -0
  101. gam7-7.6.2/wiki/Scripts.md +7 -0
  102. gam7-7.6.2/wiki/Send-Email.md +455 -0
  103. gam7-7.6.2/wiki/Shared-Drives.md +739 -0
  104. gam7-7.6.2/wiki/Sites.md +22 -0
  105. gam7-7.6.2/wiki/Tag-Replace.md +269 -0
  106. gam7-7.6.2/wiki/Todrive.md +361 -0
  107. gam7-7.6.2/wiki/Unmanaged-Accounts.md +114 -0
  108. gam7-7.6.2/wiki/Upgrade-Benefits.md +262 -0
  109. gam7-7.6.2/wiki/Users-Analytics-Admin.md +196 -0
  110. gam7-7.6.2/wiki/Users-Application-Specific-Passwords.md +36 -0
  111. gam7-7.6.2/wiki/Users-Backup-Verification-Codes.md +40 -0
  112. gam7-7.6.2/wiki/Users-Calendars-Access.md +184 -0
  113. gam7-7.6.2/wiki/Users-Calendars-Events.md +938 -0
  114. gam7-7.6.2/wiki/Users-Calendars.md +312 -0
  115. gam7-7.6.2/wiki/Users-Chat.md +915 -0
  116. gam7-7.6.2/wiki/Users-Classification-Labels.md +221 -0
  117. gam7-7.6.2/wiki/Users-Classroom-Profile.md +16 -0
  118. gam7-7.6.2/wiki/Users-Contacts-Delegates.md +48 -0
  119. gam7-7.6.2/wiki/Users-Contacts.md +431 -0
  120. gam7-7.6.2/wiki/Users-Deprovision.md +25 -0
  121. gam7-7.6.2/wiki/Users-Drive-Activity-Settings.md +152 -0
  122. gam7-7.6.2/wiki/Users-Drive-Cleanup.md +164 -0
  123. gam7-7.6.2/wiki/Users-Drive-Comments.md +163 -0
  124. gam7-7.6.2/wiki/Users-Drive-Copy-Move.md +662 -0
  125. gam7-7.6.2/wiki/Users-Drive-Files-Display.md +1774 -0
  126. gam7-7.6.2/wiki/Users-Drive-Files-Manage.md +743 -0
  127. gam7-7.6.2/wiki/Users-Drive-Orphans.md +62 -0
  128. gam7-7.6.2/wiki/Users-Drive-Ownership.md +144 -0
  129. gam7-7.6.2/wiki/Users-Drive-Permissions.md +358 -0
  130. gam7-7.6.2/wiki/Users-Drive-Query.md +57 -0
  131. gam7-7.6.2/wiki/Users-Drive-Revisions.md +127 -0
  132. gam7-7.6.2/wiki/Users-Drive-Shortcuts.md +145 -0
  133. gam7-7.6.2/wiki/Users-Drive-Transfer.md +127 -0
  134. gam7-7.6.2/wiki/Users-Forms.md +335 -0
  135. gam7-7.6.2/wiki/Users-Gmail-CSE.md +217 -0
  136. gam7-7.6.2/wiki/Users-Gmail-Delegates.md +86 -0
  137. gam7-7.6.2/wiki/Users-Gmail-Filters.md +198 -0
  138. gam7-7.6.2/wiki/Users-Gmail-Forwarding.md +94 -0
  139. gam7-7.6.2/wiki/Users-Gmail-Labels.md +163 -0
  140. gam7-7.6.2/wiki/Users-Gmail-Messages-Threads.md +763 -0
  141. gam7-7.6.2/wiki/Users-Gmail-Profile.md +16 -0
  142. gam7-7.6.2/wiki/Users-Gmail-S-MIME.md +72 -0
  143. gam7-7.6.2/wiki/Users-Gmail-Send-As-Signature-Vacation.md +297 -0
  144. gam7-7.6.2/wiki/Users-Gmail-Settings.md +66 -0
  145. gam7-7.6.2/wiki/Users-Group-Membership.md +706 -0
  146. gam7-7.6.2/wiki/Users-Keep-Notes.md +242 -0
  147. gam7-7.6.2/wiki/Users-Looker-Studio.md +235 -0
  148. gam7-7.6.2/wiki/Users-Meet.md +183 -0
  149. gam7-7.6.2/wiki/Users-People-Contacts-Profiles.md +682 -0
  150. gam7-7.6.2/wiki/Users-Photo.md +83 -0
  151. gam7-7.6.2/wiki/Users-Profile-Photo.md +39 -0
  152. gam7-7.6.2/wiki/Users-Profile-Sharing.md +16 -0
  153. gam7-7.6.2/wiki/Users-Shared-Drives.md +517 -0
  154. gam7-7.6.2/wiki/Users-Signout-Turnoff2SV.md +30 -0
  155. gam7-7.6.2/wiki/Users-Spreadsheets.md +534 -0
  156. gam7-7.6.2/wiki/Users-Tasks.md +243 -0
  157. gam7-7.6.2/wiki/Users-Tokens.md +130 -0
  158. gam7-7.6.2/wiki/Users-YouTube.md +142 -0
  159. gam7-7.6.2/wiki/Users.md +1352 -0
  160. gam7-7.6.2/wiki/Using-GAM7-with-a-YubiKey.md +72 -0
  161. gam7-7.6.2/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +61 -0
  162. gam7-7.6.2/wiki/Vault-Takeout.md +798 -0
  163. gam7-7.6.2/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +118 -0
  164. gam7-7.6.2/wiki/Version-and-Help.md +95 -0
  165. gam7-7.6.2/wiki/_Sidebar.md +201 -0
  166. gam7-7.6.2/wiki/gam.cfg.md +1162 -0
  167. gam7-7.6.2/wiki/l-AdminSettingsExamples.md +77 -0
  168. gam7-7.6.2/wiki/l-Android-Installation.md +15 -0
  169. gam7-7.6.2/wiki/l-BulkOperations.md +282 -0
  170. gam7-7.6.2/wiki/l-CalendarExamples.md +260 -0
  171. gam7-7.6.2/wiki/l-Chat-Bot.md +95 -0
  172. gam7-7.6.2/wiki/l-Chrome-Browser-Management.md +85 -0
  173. gam7-7.6.2/wiki/l-Chrome-OS-Installation.md +9 -0
  174. gam7-7.6.2/wiki/l-Chrome-Policy-Settings.md +79 -0
  175. gam7-7.6.2/wiki/l-Cloud-Identity-Groups.md +70 -0
  176. gam7-7.6.2/wiki/l-Command-Reference-Calendar-Resources.md +53 -0
  177. gam7-7.6.2/wiki/l-Command-Reference-Calendars.md +76 -0
  178. gam7-7.6.2/wiki/l-Command-Reference-Definitions.md +47 -0
  179. gam7-7.6.2/wiki/l-Command-Reference-Drive.md +115 -0
  180. gam7-7.6.2/wiki/l-Command-Reference-Email.md +101 -0
  181. gam7-7.6.2/wiki/l-Command-Reference-Group-Attributes.md +92 -0
  182. gam7-7.6.2/wiki/l-Command-Reference-Groups.md +63 -0
  183. gam7-7.6.2/wiki/l-Command-Reference-Users.md +132 -0
  184. gam7-7.6.2/wiki/l-Context-Aware-Access-Levels.md +129 -0
  185. gam7-7.6.2/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +39 -0
  186. gam7-7.6.2/wiki/l-CreatingClientSecretsFile.md +185 -0
  187. gam7-7.6.2/wiki/l-Custom-Schemas.md +71 -0
  188. gam7-7.6.2/wiki/l-Data-Transfers.md +75 -0
  189. gam7-7.6.2/wiki/l-DomainVerification.md +128 -0
  190. gam7-7.6.2/wiki/l-ExamplesAccountAuditing.md +317 -0
  191. gam7-7.6.2/wiki/l-ExamplesCSV.md +155 -0
  192. gam7-7.6.2/wiki/l-ExamplesEmailSettings.md +897 -0
  193. gam7-7.6.2/wiki/l-ExamplesOrganizations.md +111 -0
  194. gam7-7.6.2/wiki/l-GAM-Discussion-Group.md +1 -0
  195. gam7-7.6.2/wiki/l-GAM-on-Android-and-Chrome-OS.md +5 -0
  196. gam7-7.6.2/wiki/l-GAM-options-files.md +65 -0
  197. gam7-7.6.2/wiki/l-GAM-with--minimal-GCP-rights.md +41 -0
  198. gam7-7.6.2/wiki/l-GAM3CSVListings.md +434 -0
  199. gam7-7.6.2/wiki/l-GAM3DirectoryCommands.md +1153 -0
  200. gam7-7.6.2/wiki/l-GAM3GroupSettings.md +448 -0
  201. gam7-7.6.2/wiki/l-GAM7-FAQ.md +56 -0
  202. gam7-7.6.2/wiki/l-Google-Vault---Takeout-Commands.md +306 -0
  203. gam7-7.6.2/wiki/l-GoogleDriveManagement.md +389 -0
  204. gam7-7.6.2/wiki/l-Grouping-18-or-Older-Users.md +33 -0
  205. gam7-7.6.2/wiki/l-Home.md +199 -0
  206. gam7-7.6.2/wiki/l-How-to-upgrade-from-Standard-GAM.md +1262 -0
  207. gam7-7.6.2/wiki/l-Inbound-SSO-Settings.md +192 -0
  208. gam7-7.6.2/wiki/l-LicenseExamples.md +121 -0
  209. gam7-7.6.2/wiki/l-Managing-Admins.md +92 -0
  210. gam7-7.6.2/wiki/l-Managing-CloudPrint-Printers.md +219 -0
  211. gam7-7.6.2/wiki/l-Managing-Devices.md +94 -0
  212. gam7-7.6.2/wiki/l-Managing-Google-Classroom.md +298 -0
  213. gam7-7.6.2/wiki/l-OAuthKeyManagement.md +148 -0
  214. gam7-7.6.2/wiki/l-Printers.md +115 -0
  215. gam7-7.6.2/wiki/l-ResellerCommands.md +212 -0
  216. gam7-7.6.2/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +54 -0
  217. gam7-7.6.2/wiki/l-SecurityExamples.md +289 -0
  218. gam7-7.6.2/wiki/l-UnmanagedUsersExamples.md +78 -0
  219. gam7-7.6.2/wiki/l-Use-a-Yubikey.md +49 -0
  220. gam7-7.6.2/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +88 -0
  221. gam7-7.6.2/wiki/l-_Footer.md +3 -0
  222. {gam7-7.6.0 → gam7-7.6.2}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  223. {gam7-7.6.0 → gam7-7.6.2}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  224. {gam7-7.6.0 → gam7-7.6.2}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  225. {gam7-7.6.0 → gam7-7.6.2}/.github/ISSUE_TEMPLATE.txt +0 -0
  226. {gam7-7.6.0 → gam7-7.6.2}/.github/actions/creds.tar.xz.gpg +0 -0
  227. {gam7-7.6.0 → gam7-7.6.2}/.github/actions/decrypt.sh +0 -0
  228. {gam7-7.6.0 → gam7-7.6.2}/.github/actions/entitlements.plist +0 -0
  229. {gam7-7.6.0 → gam7-7.6.2}/.github/actions/package_exclusions.txt +0 -0
  230. {gam7-7.6.0 → gam7-7.6.2}/.github/stale.yml +0 -0
  231. {gam7-7.6.0 → gam7-7.6.2}/.github/workflows/pypi.yml +0 -0
  232. {gam7-7.6.0 → gam7-7.6.2}/.pre-commit-config.yaml +0 -0
  233. {gam7-7.6.0 → gam7-7.6.2}/LICENSE +0 -0
  234. {gam7-7.6.0 → gam7-7.6.2}/README.md +0 -0
  235. {gam7-7.6.0 → gam7-7.6.2}/pyproject.toml +0 -0
  236. {gam7-7.6.0 → gam7-7.6.2}/src/.gitignore +0 -0
  237. {gam7-7.6.0 → gam7-7.6.2}/src/LICENSE +0 -0
  238. {gam7-7.6.0 → gam7-7.6.2}/src/cacerts.pem +0 -0
  239. {gam7-7.6.0 → gam7-7.6.2}/src/callgam.py +0 -0
  240. {gam7-7.6.0 → gam7-7.6.2}/src/gam/__main__.py +0 -0
  241. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/__init__.py +0 -0
  242. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/auth.py +0 -0
  243. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/client.py +0 -0
  244. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/core.py +0 -0
  245. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/data.py +0 -0
  246. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/http.py +0 -0
  247. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/http_core.py +0 -0
  248. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/http_interface.py +0 -0
  249. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/mock_http.py +0 -0
  250. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/mock_http_core.py +0 -0
  251. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/mock_service.py +0 -0
  252. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/service.py +0 -0
  253. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/token_store.py +0 -0
  254. {gam7-7.6.0 → gam7-7.6.2}/src/gam/atom/url.py +0 -0
  255. {gam7-7.6.0 → gam7-7.6.2}/src/gam/cacerts.pem +0 -0
  256. {gam7-7.6.0 → gam7-7.6.2}/src/gam/cbcm-v1.1beta1.json +0 -0
  257. {gam7-7.6.0 → gam7-7.6.2}/src/gam/contactdelegation-v1.json +0 -0
  258. {gam7-7.6.0 → gam7-7.6.2}/src/gam/datastudio-v1.json +0 -0
  259. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/__init__.py +0 -0
  260. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glaction.py +0 -0
  261. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glapi.py +0 -0
  262. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glcfg.py +0 -0
  263. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glentity.py +0 -0
  264. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glgdata.py +0 -0
  265. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glglobals.py +0 -0
  266. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glindent.py +0 -0
  267. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glmsgs.py +0 -0
  268. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glskus.py +0 -0
  269. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/gluprop.py +0 -0
  270. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/glverlibs.py +0 -0
  271. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gamlib/yubikey.py +0 -0
  272. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/__init__.py +0 -0
  273. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/alt/__init__.py +0 -0
  274. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/alt/app_engine.py +0 -0
  275. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/alt/appengine.py +0 -0
  276. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/apps/__init__.py +0 -0
  277. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/apps/audit/__init__.py +0 -0
  278. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/apps/audit/service.py +0 -0
  279. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  280. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/apps/contacts/service.py +0 -0
  281. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/apps/service.py +0 -0
  282. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/service.py +0 -0
  283. {gam7-7.6.0 → gam7-7.6.2}/src/gam/gdata/urlfetch.py +0 -0
  284. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/__init__.py +0 -0
  285. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/_auth.py +0 -0
  286. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/_helpers.py +0 -0
  287. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/channel.py +0 -0
  288. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/discovery.py +0 -0
  289. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  290. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  291. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  292. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  293. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/errors.py +0 -0
  294. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/http.py +0 -0
  295. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/mimeparse.py +0 -0
  296. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/model.py +0 -0
  297. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/schema.py +0 -0
  298. {gam7-7.6.0 → gam7-7.6.2}/src/gam/googleapiclient/version.py +0 -0
  299. {gam7-7.6.0 → gam7-7.6.2}/src/gam/iso8601/__init__.py +0 -0
  300. {gam7-7.6.0 → gam7-7.6.2}/src/gam/iso8601/iso8601.py +0 -0
  301. {gam7-7.6.0 → gam7-7.6.2}/src/gam/meet-v2beta.json +0 -0
  302. {gam7-7.6.0 → gam7-7.6.2}/src/gam/serviceaccountlookup-v1.json +0 -0
  303. {gam7-7.6.0 → gam7-7.6.2}/src/gam/six.py +0 -0
  304. {gam7-7.6.0 → gam7-7.6.2}/src/gam-install.sh +0 -0
  305. {gam7-7.6.0 → gam7-7.6.2}/src/gam-setup.bat +0 -0
  306. {gam7-7.6.0 → gam7-7.6.2}/src/gam.exe.manifest +0 -0
  307. {gam7-7.6.0 → gam7-7.6.2}/src/gam.py +0 -0
  308. {gam7-7.6.0 → gam7-7.6.2}/src/gam.spec +0 -0
  309. {gam7-7.6.0 → gam7-7.6.2}/src/gam.wxs +0 -0
  310. {gam7-7.6.0 → gam7-7.6.2}/src/license.rtf +0 -0
  311. {gam7-7.6.0 → gam7-7.6.2}/src/requirements-dev.txt +0 -0
  312. {gam7-7.6.0 → gam7-7.6.2}/src/requirements.txt +0 -0
  313. {gam7-7.6.0 → gam7-7.6.2}/src/setup.cfg +0 -0
  314. {gam7-7.6.0 → gam7-7.6.2}/src/setup.py +0 -0
  315. {gam7-7.6.0 → gam7-7.6.2}/src/tools/a_atleast_b.py +0 -0
  316. {gam7-7.6.0 → gam7-7.6.2}/src/tools/gen-wix-xml-filelist.py +0 -0
  317. {gam7-7.6.0 → gam7-7.6.2}/src/tools/mkGamRef.py +0 -0
  318. {gam7-7.6.0 → gam7-7.6.2}/src/tools/openssl.props +0 -0
  319. {gam7-7.6.0 → gam7-7.6.2}/src/version_info.txt.in +0 -0
@@ -2,7 +2,11 @@ name: Build and test GAM
2
2
 
3
3
  on:
4
4
  push:
5
+ paths-ignore:
6
+ - 'wiki/**'
5
7
  pull_request:
8
+ paths-ignore:
9
+ - 'wiki/**'
6
10
  schedule:
7
11
  - cron: '37 22 * * *'
8
12
  workflow_dispatch:
@@ -18,7 +22,7 @@ defaults:
18
22
  working-directory: src
19
23
 
20
24
  env:
21
- SCRATCH_COUNTER: 11
25
+ SCRATCH_COUNTER: 13
22
26
  OPENSSL_CONFIG_OPTS: no-fips --api=3.0.0
23
27
  OPENSSL_INSTALL_PATH: ${{ github.workspace }}/bin/ssl
24
28
  OPENSSL_SOURCE_PATH: ${{ github.workspace }}/src/openssl
@@ -130,7 +134,7 @@ jobs:
130
134
  with:
131
135
  path: |
132
136
  cache.tar.xz
133
- key: gam-${{ matrix.jid }}-20250408
137
+ key: gam-${{ matrix.jid }}-20250408-01
134
138
 
135
139
  - name: Untar Cache archive
136
140
  if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit == 'true'
@@ -13,10 +13,11 @@ name: "CodeQL"
13
13
 
14
14
  on:
15
15
  push:
16
- branches: [ main ]
16
+ paths-ignore:
17
+ - 'wiki/**'
17
18
  pull_request:
18
- # The branches below must be a subset of the branches above
19
- branches: [ main ]
19
+ paths-ignore:
20
+ - 'wiki/**'
20
21
  schedule:
21
22
  - cron: '25 10 * * 1'
22
23
 
@@ -2,7 +2,11 @@ name: Check for Google Root CA Updates
2
2
 
3
3
  on:
4
4
  push:
5
+ paths-ignore:
6
+ - 'wiki/**'
5
7
  pull_request:
8
+ paths-ignore:
9
+ - 'wiki/**'
6
10
  schedule:
7
11
  - cron: '23 23 * * *'
8
12
 
@@ -0,0 +1,41 @@
1
+ name: Push wiki
2
+ permissions:
3
+ contents: write
4
+ on:
5
+ push:
6
+ paths:
7
+ - 'wiki/**'
8
+ jobs:
9
+ pushwiki:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - name: Checkout GAM source
13
+ run: |
14
+ # checkout via normal shell here
15
+ # so we're not authorized to actually make any changes
16
+ git clone https://github.com/GAM-team/GAM
17
+
18
+ - name: Checkout Wiki source
19
+ uses: actions/checkout@master
20
+ with:
21
+ path: GAM.wiki
22
+ repository: GAM-team/GAM.wiki
23
+ persist-credentials: true
24
+ fetch-depth: 0
25
+
26
+ - name: Overwrite all Wiki repo files with /wiki from main git
27
+ run: |
28
+ # remove all wiki repo files so deletes work
29
+ rm -fv GAM.wiki/*.md
30
+ # copy all files from main GAM repo wiki folder
31
+ cp -fv GAM/wiki/*.md GAM.wiki/
32
+
33
+ - name: Commit Wiki changes
34
+ run: |
35
+ cd GAM.wiki
36
+ git config --local user.email "action@github.com"
37
+ git config --local user.name "GitHub Action"
38
+ git add *.md
39
+ git commit -m "[no ci] Push Wiki changes"
40
+ git status
41
+ git push
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.6.0
3
+ Version: 7.6.2
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,3 +1,27 @@
1
+ 7.06.02
2
+
3
+ Updated `gam <UserTypeEntity> print|show filecounts ... showlastmodification` to include
4
+ file mimetype and path information for the last modified file.
5
+
6
+ Added simple commands to get information about the last modified file on a drive.
7
+ By default, a user's My Drive is processed; optionally, a Shared Drive can be processed.
8
+ ```
9
+ gam <UserTypeEntity> print drivelastmodification [todrive <ToDriveAttribute>*]
10
+ [select <SharedDriveEntity>]
11
+ [pathdelimiter <Character>]
12
+ (addcsvdata <FieldName> <String>)*
13
+ gam <UserTypeEntity> show drivelastmodification
14
+ [select <SharedDriveEntity>]
15
+ [pathdelimiter <Character>]
16
+ ```
17
+
18
+ 7.06.01
19
+
20
+ Updated `gam <UserTypeEntity> create|update drivefileacl ... expiration <Time>`
21
+ to handle additional API errors.
22
+
23
+ Updated to Python 3.13.3.
24
+
1
25
  7.06.00
2
26
 
3
27
  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.00'
28
+ __version__ = '7.06.02'
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,44 @@ 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': '', 'lastModifiedFilaPath': '',
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
+ filePathInfo = initFilePathInfo(pathDelimiter)
56508
+ _, paths, _ = getFilePaths(drive, {}, userLastModification['fileEntryInfo'], filePathInfo)
56509
+ userLastModification['lastModifiedFilePath'] = paths[0] if paths else UNKNOWN
56510
+
56511
+ def _showLastModification(lastModification):
56512
+ printKeyValueList(['lastModifiedFileId', lastModification['lastModifiedFileId']])
56513
+ printKeyValueList(['lastModifiedFileName', lastModification['lastModifiedFileName']])
56514
+ printKeyValueList(['lastModifiedFileMimeType', lastModification['lastModifiedFileMimeType']])
56515
+ printKeyValueList(['lastModifiedFilePath', lastModification['lastModifiedFilePath']])
56516
+ printKeyValueList(['lastModifyingUser', lastModification['lastModifyingUser']])
56517
+ printKeyValueList(['lastModifiedTime', formatLocalTime(lastModification['lastModifiedTime'])])
56518
+
56519
+ def _updateLastModificationRow(row, lastModification):
56520
+ row.update({'lastModifiedFileId': lastModification['lastModifiedFileId'],
56521
+ 'lastModifiedFileName': lastModification['lastModifiedFileName'],
56522
+ 'lastModifiedFileMimeType': lastModification['lastModifiedFileMimeType'],
56523
+ 'lastModifiedFilePath': lastModification['lastModifiedFilePath'],
56524
+ 'lastModifyingUser': lastModification['lastModifyingUser'],
56525
+ 'lastModifiedTime': formatLocalTime(lastModification['lastModifiedTime'])})
56526
+
56477
56527
  # gam <UserTypeEntity> print filecounts [todrive <ToDriveAttribute>*]
56478
56528
  # [((query <QueryDriveFile>) | (fullquery <QueryDriveFile>) | <DriveFileQueryShortcut>) (querytime<String> <Time>)*]
56479
56529
  # [continueoninvalidquery [<Boolean>]]
@@ -56485,7 +56535,8 @@ def printFileParentTree(users):
56485
56535
  # [filenamematchpattern <REMatchPattern>]
56486
56536
  # <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
56487
56537
  # [excludetrashed] (addcsvdata <FieldName> <String>)*
56488
- # [showsize] [showmimetypesize] [showlastmodification]
56538
+ # [showsize] [showmimetypesize]
56539
+ # [showlastmodification] [pathdelimiter <Character>]
56489
56540
  # (addcsvdata <FieldName> <String>)*
56490
56541
  # [summary none|only|plus] [summaryuser <String>]
56491
56542
  # gam <UserTypeEntity> show filecounts
@@ -56499,7 +56550,8 @@ def printFileParentTree(users):
56499
56550
  # [filenamematchpattern <REMatchPattern>]
56500
56551
  # <PermissionMatch>* [<PermissionMatchMode>] [<PermissionMatchAction>]
56501
56552
  # [excludetrashed]
56502
- # [showsize] [showmimetypesize] [showlastmodification]
56553
+ # [showsize] [showmimetypesize]
56554
+ # [showlastmodification] [pathdelimiter <Character>]
56503
56555
  # [summary none|only|plus] [summaryuser <String>]
56504
56556
  def printShowFileCounts(users):
56505
56557
  def _setSelectionFields():
@@ -56508,7 +56560,7 @@ def printShowFileCounts(users):
56508
56560
  if showSize or (DLP.minimumFileSize is not None) or (DLP.maximumFileSize is not None):
56509
56561
  fieldsList.append(sizeField)
56510
56562
  if showLastModification:
56511
- fieldsList.extend(['id,name,modifiedTime,lastModifyingUser(me, displayName, emailAddress)'])
56563
+ fieldsList.extend(['id,name,modifiedTime,lastModifyingUser(me, displayName, emailAddress),parents'])
56512
56564
  if DLP.filenameMatchPattern:
56513
56565
  fieldsList.append('name')
56514
56566
  if DLP.excludeTrashed:
@@ -56544,9 +56596,7 @@ def printShowFileCounts(users):
56544
56596
  printEntityKVList(kvList, dataList, i, count)
56545
56597
  Ind.Increment()
56546
56598
  if showLastModification:
56547
- printKeyValueList(['lastModifiedFile', f"{lastModification['lastModifiedFileName']}({lastModification['lastModifiedFileId']})",
56548
- 'lastModifyingUser', lastModification['lastModifyingUser'],
56549
- 'lastModifiedTime', formatLocalTime(lastModification['lastModifiedTime'])])
56599
+ _showLastModification(lastModification)
56550
56600
  for mimeType, mtinfo in sorted(iter(mimeTypeInfo.items())):
56551
56601
  if not showMimeTypeSize:
56552
56602
  printKeyValueList([mimeType, mtinfo['count']])
@@ -56561,10 +56611,7 @@ def printShowFileCounts(users):
56561
56611
  if showSize:
56562
56612
  row['Size'] = sizeTotal
56563
56613
  if showLastModification:
56564
- row.update({'lastModifiedFileId': lastModification['lastModifiedFileId'],
56565
- 'lastModifiedFileName': lastModification['lastModifiedFileName'],
56566
- 'lastModifyingUser': lastModification['lastModifyingUser'],
56567
- 'lastModifiedTime': formatLocalTime(lastModification['lastModifiedTime'])})
56614
+ _updateLastModificationRow(row, lastModification)
56568
56615
  if addCSVData:
56569
56616
  row.update(addCSVData)
56570
56617
  for mimeType, mtinfo in sorted(iter(mimeTypeInfo.items())):
@@ -56578,6 +56625,7 @@ def printShowFileCounts(users):
56578
56625
  csvPF.SetZeroBlankMimeTypeCounts(True)
56579
56626
  fieldsList = ['mimeType']
56580
56627
  DLP = DriveListParameters({'allowChoose': False, 'allowCorpora': True, 'allowQuery': True, 'mimeTypeInQuery': True})
56628
+ pathDelimiter = '/'
56581
56629
  sharedDriveId = sharedDriveName = ''
56582
56630
  continueOnInvalidQuery = showSize = showLastModification = showMimeTypeSize = False
56583
56631
  sizeField = 'quotaBytesUsed'
@@ -56586,9 +56634,7 @@ def printShowFileCounts(users):
56586
56634
  summaryMimeTypeInfo = {}
56587
56635
  fileIdEntity = {}
56588
56636
  addCSVData = {}
56589
- summaryLastModification = {
56590
- 'lastModifiedFileId': '', 'lastModifiedFileName': '',
56591
- 'lastModifyingUser': '', 'lastModifiedTime': NEVER_TIME}
56637
+ summaryLastModification = _initLastModification()
56592
56638
  while Cmd.ArgumentsRemaining():
56593
56639
  myarg = getArgument()
56594
56640
  if csvPF and myarg == 'todrive':
@@ -56611,6 +56657,8 @@ def printShowFileCounts(users):
56611
56657
  summary = getChoice(FILECOUNT_SUMMARY_CHOICE_MAP, mapChoice=True)
56612
56658
  elif myarg == 'summaryuser':
56613
56659
  summaryUser = getString(Cmd.OB_STRING)
56660
+ elif myarg == 'pathdelimiter':
56661
+ pathDelimiter = getCharacter()
56614
56662
  elif csvPF and myarg == 'addcsvdata':
56615
56663
  k = getString(Cmd.OB_STRING)
56616
56664
  addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
@@ -56637,7 +56685,9 @@ def printShowFileCounts(users):
56637
56685
  if showSize:
56638
56686
  sortTitles.insert(sortTitles.index('Total')+1, 'Size')
56639
56687
  if showLastModification:
56640
- sortTitles.extend(['lastModifiedFileId', 'lastModifiedFileName', 'lastModifyingUser', 'lastModifiedTime'])
56688
+ sortTitles.extend(['lastModifiedFileId', 'lastModifiedFileName',
56689
+ 'lastModifiedFileMimeType', 'lastModifiedFilePath',
56690
+ 'lastModifyingUser', 'lastModifiedTime'])
56641
56691
  if addCSVData:
56642
56692
  sortTitles.extend(sorted(addCSVData.keys()))
56643
56693
  csvPF.SetTitles(sortTitles)
@@ -56652,9 +56702,7 @@ def printShowFileCounts(users):
56652
56702
  sharedDriveId = fileIdEntity.get('shareddrive', {}).get('driveId', '')
56653
56703
  sharedDriveName = _getSharedDriveNameFromId(sharedDriveId) if sharedDriveId else ''
56654
56704
  mimeTypeInfo = {}
56655
- userLastModification = {
56656
- 'lastModifiedFileId': '', 'lastModifiedFileName': '',
56657
- 'lastModifyingUser': '', 'lastModifiedTime': NEVER_TIME}
56705
+ userLastModification = _initLastModification()
56658
56706
  gettingEntity = _getGettingEntity(user, fileIdEntity)
56659
56707
  printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, gettingEntity, i, count, query=DLP.fileIdEntity['query'])
56660
56708
  try:
@@ -56666,7 +56714,7 @@ def printShowFileCounts(users):
56666
56714
  retryReasons=[GAPI.UNKNOWN_ERROR],
56667
56715
  q=DLP.fileIdEntity['query'],
56668
56716
  fields=pagesFields, pageSize=GC.Values[GC.DRIVE_MAX_RESULTS], **btkwargs)
56669
- for files in feed:
56717
+ for files in feed:
56670
56718
  for f_file in files:
56671
56719
  driveId = f_file.get('driveId')
56672
56720
  checkSharedDrivePermissions = getPermissionsForSharedDrives and driveId and 'permissions' not in f_file
@@ -56697,12 +56745,8 @@ def printShowFileCounts(users):
56697
56745
  mimeTypeInfo[f_file['mimeType']]['count'] += 1
56698
56746
  mimeTypeInfo[f_file['mimeType']]['size'] += int(f_file.get(sizeField, '0'))
56699
56747
  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))
56748
+ _checkUpdateLastModifiction(f_file, userLastModification)
56749
+ _getLastModificationPath(drive, userLastModification, pathDelimiter)
56706
56750
  showMimeTypeInfo(user, mimeTypeInfo, sharedDriveId, sharedDriveName, userLastModification, i, count)
56707
56751
  if showLastModification and userLastModification['lastModifiedTime'] > summaryLastModification['lastModifiedTime']:
56708
56752
  summaryLastModification = userLastModification.copy()
@@ -56726,6 +56770,110 @@ def printShowFileCounts(users):
56726
56770
  if csvPF:
56727
56771
  csvPF.writeCSVfile('Drive File Counts')
56728
56772
 
56773
+ # gam <UserTypeEntity> print drivelastmodification [todrive <ToDriveAttribute>*]
56774
+ # [select <SharedDriveEntity>]
56775
+ # [pathdelimiter <Character>]
56776
+ # (addcsvdata <FieldName> <String>)*
56777
+ # gam <UserTypeEntity> show drivelastmodification
56778
+ # [select <SharedDriveEntity>]
56779
+ # [pathdelimiter <Character>]
56780
+ def printShowDrivelastModifications(users):
56781
+ def showLastModificationInfo(user, sharedDriveId, sharedDriveName, lastModification, i, count):
56782
+ if not csvPF:
56783
+ if sharedDriveId:
56784
+ kvList = [Ent.USER, user, Ent.SHAREDDRIVE, f'{sharedDriveName} ({sharedDriveId})']
56785
+ else:
56786
+ kvList = [Ent.USER, user]
56787
+ printEntity(kvList, i, count)
56788
+ Ind.Increment()
56789
+ _showLastModification(lastModification)
56790
+ Ind.Decrement()
56791
+ else:
56792
+ if sharedDriveId:
56793
+ row = {'User': user, 'id': sharedDriveId, 'name': sharedDriveName}
56794
+ else:
56795
+ row = {'User': user}
56796
+ _updateLastModificationRow(row, lastModification)
56797
+ if addCSVData:
56798
+ row.update(addCSVData)
56799
+ csvPF.WriteRowTitles(row)
56800
+
56801
+ csvPF = CSVPrintFile() if Act.csvFormat() else None
56802
+ fieldsList = ['id', 'driveId', 'name', 'mimeType', 'lastModifyingUser', 'modifiedTime', 'parents']
56803
+ DLP = DriveListParameters({'allowChoose': False, 'allowCorpora': False, 'allowQuery': False, 'mimeTypeInQuery': True})
56804
+ pathDelimiter = '/'
56805
+ sharedDriveId = sharedDriveName = ''
56806
+ fileIdEntity = {}
56807
+ addCSVData = {}
56808
+ while Cmd.ArgumentsRemaining():
56809
+ myarg = getArgument()
56810
+ if csvPF and myarg == 'todrive':
56811
+ csvPF.GetTodriveParameters()
56812
+ elif myarg == 'select':
56813
+ if fileIdEntity:
56814
+ usageErrorExit(Msg.CAN_NOT_BE_SPECIFIED_MORE_THAN_ONCE.format('select'))
56815
+ fileIdEntity = getSharedDriveEntity()
56816
+ elif myarg == 'pathdelimiter':
56817
+ pathDelimiter = getCharacter()
56818
+ elif csvPF and myarg == 'addcsvdata':
56819
+ k = getString(Cmd.OB_STRING)
56820
+ addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
56821
+ else:
56822
+ unknownArgumentExit()
56823
+ if not fileIdEntity:
56824
+ fileIdEntity = DLP.GetFileIdEntity()
56825
+ if not fileIdEntity.get('shareddrive'):
56826
+ btkwargs = DLP.kwargs
56827
+ else:
56828
+ btkwargs = fileIdEntity['shareddrive']
56829
+ fieldsList.append('driveId')
56830
+ DLP.Finalize(fileIdEntity)
56831
+ if csvPF:
56832
+ sortTitles = ['User', 'id', 'name'] if fileIdEntity.get('shareddrive') else ['User']
56833
+ sortTitles.extend(['lastModifiedFileId', 'lastModifiedFileName',
56834
+ 'lastModifiedFileMimeType', 'lastModifiedFilePath',
56835
+ 'lastModifyingUser', 'lastModifiedTime'])
56836
+ if addCSVData:
56837
+ sortTitles.extend(sorted(addCSVData.keys()))
56838
+ csvPF.SetTitles(sortTitles)
56839
+ csvPF.SetSortAllTitles()
56840
+ pagesFields = getItemFieldsFromFieldsList('files', fieldsList)
56841
+ i, count, users = getEntityArgument(users)
56842
+ for user in users:
56843
+ i += 1
56844
+ user, drive = _validateUserSharedDrive(user, i, count, fileIdEntity)
56845
+ if not drive:
56846
+ continue
56847
+ sharedDriveId = fileIdEntity.get('shareddrive', {}).get('driveId', '')
56848
+ sharedDriveName = _getSharedDriveNameFromId(sharedDriveId) if sharedDriveId else ''
56849
+ userLastModification = _initLastModification()
56850
+ gettingEntity = _getGettingEntity(user, fileIdEntity)
56851
+ printGettingAllEntityItemsForWhom(Ent.DRIVE_FILE_OR_FOLDER, gettingEntity, i, count)
56852
+ try:
56853
+ feed = yieldGAPIpages(drive.files(), 'list', 'files',
56854
+ pageMessage=getPageMessageForWhom(),
56855
+ throwReasons=GAPI.DRIVE_USER_THROW_REASONS+[GAPI.INVALID, GAPI.BAD_REQUEST, GAPI.FILE_NOT_FOUND,
56856
+ GAPI.NOT_FOUND, GAPI.TEAMDRIVE_MEMBERSHIP_REQUIRED],
56857
+ retryReasons=[GAPI.UNKNOWN_ERROR],
56858
+ fields=pagesFields, pageSize=GC.Values[GC.DRIVE_MAX_RESULTS], **btkwargs)
56859
+ for files in feed:
56860
+ for f_file in files:
56861
+ _checkUpdateLastModifiction(f_file, userLastModification)
56862
+ _getLastModificationPath(drive, userLastModification, pathDelimiter)
56863
+ showLastModificationInfo(user, sharedDriveId, sharedDriveName, userLastModification, i, count)
56864
+ except (GAPI.invalid, GAPI.badRequest) as e:
56865
+ entityActionFailedWarning([Ent.USER, user, Ent.DRIVE_FILE_OR_FOLDER, None], str(e), i, count)
56866
+ continue
56867
+ except GAPI.fileNotFound:
56868
+ printGotEntityItemsForWhom(0)
56869
+ except (GAPI.notFound, GAPI.teamDriveMembershipRequired) as e:
56870
+ entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE_ID, sharedDriveId], str(e), i, count)
56871
+ except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
56872
+ userDriveServiceNotEnabledWarning(user, str(e), i, count)
56873
+ continue
56874
+ if csvPF:
56875
+ csvPF.writeCSVfile('Drive File Last Modification')
56876
+
56729
56877
  DISKUSAGE_SHOW_CHOICES = {'all', 'summary', 'summaryandtrash'}
56730
56878
 
56731
56879
  # gam <UserTypeEntity> print diskusage <DriveFileEntity> [todrive <ToDriveAttribute>*]
@@ -63090,7 +63238,8 @@ def createDriveFileACL(users, useDomainAdminAccess=False):
63090
63238
  if showDetails:
63091
63239
  _showDriveFilePermission(permission, printKeys, timeObjects)
63092
63240
  except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
63093
- GAPI.cannotSetExpiration, GAPI.expirationDateNotAllowedForSharedDriveMembers,
63241
+ GAPI.cannotSetExpiration, GAPI.cannotSetExpirationOnAnyoneOrDomain,
63242
+ GAPI.expirationDateNotAllowedForSharedDriveMembers, GAPI.expirationDatesMustBeInTheFuture,
63094
63243
  GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
63095
63244
  GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
63096
63245
  GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
@@ -63225,7 +63374,8 @@ def updateDriveFileACLs(users, useDomainAdminAccess=False):
63225
63374
  if showDetails:
63226
63375
  _showDriveFilePermission(permission, printKeys, timeObjects)
63227
63376
  except (GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError, GAPI.insufficientFilePermissions, GAPI.unknownError,
63228
- GAPI.cannotSetExpiration, GAPI.expirationDateNotAllowedForSharedDriveMembers,
63377
+ GAPI.cannotSetExpiration, GAPI.cannotSetExpirationOnAnyoneOrDomain,
63378
+ GAPI.expirationDateNotAllowedForSharedDriveMembers, GAPI.expirationDatesMustBeInTheFuture,
63229
63379
  GAPI.badRequest, GAPI.invalidOwnershipTransfer, GAPI.cannotRemoveOwner,
63230
63380
  GAPI.fileNeverWritable, GAPI.ownershipChangeAcrossDomainNotPermitted, GAPI.sharingRateLimitExceeded,
63231
63381
  GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges,
@@ -63325,7 +63475,8 @@ def createDriveFilePermissions(users, useDomainAdminAccess=False):
63325
63475
  body=_makePermissionBody(ri[RI_ITEM]), fields='', supportsAllDrives=True)
63326
63476
  entityActionPerformed([Ent.DRIVE_FILE_OR_FOLDER_ID, ri[RI_ENTITY], Ent.PERMITTEE, ri[RI_ITEM]], int(ri[RI_J]), int(ri[RI_JCOUNT]))
63327
63477
  except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
63328
- GAPI.cannotSetExpiration, GAPI.expirationDateNotAllowedForSharedDriveMembers,
63478
+ GAPI.cannotSetExpiration, GAPI.cannotSetExpirationOnAnyoneOrDomain,
63479
+ GAPI.expirationDateNotAllowedForSharedDriveMembers, GAPI.expirationDatesMustBeInTheFuture,
63329
63480
  GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
63330
63481
  GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
63331
63482
  GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
@@ -76540,6 +76691,7 @@ USER_COMMANDS_WITH_OBJECTS = {
76540
76691
  Cmd.ARG_DRIVEFILEACL: printShowDriveFileACLs,
76541
76692
  Cmd.ARG_DRIVELABEL: printShowDriveLabels,
76542
76693
  Cmd.ARG_DRIVELABELPERMISSION: printShowDriveLabelPermissions,
76694
+ Cmd.ARG_DRIVELASTMODIFICATION: printShowDrivelastModifications,
76543
76695
  Cmd.ARG_DRIVESETTINGS: printShowDriveSettings,
76544
76696
  Cmd.ARG_EMPTYDRIVEFOLDERS: printEmptyDriveFolders,
76545
76697
  Cmd.ARG_EVENT: printShowCalendarEvents,
@@ -76647,6 +76799,7 @@ USER_COMMANDS_WITH_OBJECTS = {
76647
76799
  Cmd.ARG_DRIVEFILEACL: printShowDriveFileACLs,
76648
76800
  Cmd.ARG_DRIVELABEL: printShowDriveLabels,
76649
76801
  Cmd.ARG_DRIVELABELPERMISSION: printShowDriveLabelPermissions,
76802
+ Cmd.ARG_DRIVELASTMODIFICATION: printShowDrivelastModifications,
76650
76803
  Cmd.ARG_DRIVESETTINGS: printShowDriveSettings,
76651
76804
  Cmd.ARG_EVENT: printShowCalendarEvents,
76652
76805
  Cmd.ARG_FILECOMMENT: printShowFileComments,
@@ -76871,13 +77024,14 @@ USER_COMMANDS_OBJ_ALIASES = {
76871
77024
  Cmd.ARG_DOMAINCONTACT: Cmd.ARG_PEOPLECONTACT,
76872
77025
  Cmd.ARG_DOMAINCONTACTS: Cmd.ARG_PEOPLECONTACT,
76873
77026
  Cmd.ARG_DRIVEFILEACLS: Cmd.ARG_DRIVEFILEACL,
76874
- Cmd.ARG_FILEDRIVELABELS: Cmd.ARG_FILEDRIVELABEL,
76875
77027
  Cmd.ARG_DRIVEFILESHORTCUTS: Cmd.ARG_DRIVEFILESHORTCUT,
76876
77028
  Cmd.ARG_DRIVELABELS: Cmd.ARG_DRIVELABEL,
76877
77029
  Cmd.ARG_DRIVELABELPERMISSIONS: Cmd.ARG_DRIVELABELPERMISSION,
77030
+ Cmd.ARG_DRIVELASTMODIFICATIONS: Cmd.ARG_DRIVELASTMODIFICATION,
76878
77031
  Cmd.ARG_EVENTS: Cmd.ARG_EVENT,
76879
77032
  Cmd.ARG_FILECOMMENTS: Cmd.ARG_FILECOMMENT,
76880
77033
  Cmd.ARG_FILECOUNTS: Cmd.ARG_FILECOUNT,
77034
+ Cmd.ARG_FILEDRIVELABELS: Cmd.ARG_FILEDRIVELABEL,
76881
77035
  Cmd.ARG_FILEPATHS: Cmd.ARG_FILEPATH,
76882
77036
  Cmd.ARG_FILEREVISIONS: Cmd.ARG_FILEREVISION,
76883
77037
  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'
@@ -48,6 +48,7 @@ CANNOT_MOVE_TRASHED_ITEM_INTO_TEAMDRIVE = 'cannotMoveTrashedItemIntoTeamDrive'
48
48
  CANNOT_MOVE_TRASHED_ITEM_OUT_OF_TEAMDRIVE = 'cannotMoveTrashedItemOutOfTeamDrive'
49
49
  CANNOT_REMOVE_OWNER = 'cannotRemoveOwner'
50
50
  CANNOT_SET_EXPIRATION = 'cannotSetExpiration'
51
+ CANNOT_SET_EXPIRATION_ON_ANYONE_OR_DOMAIN = 'cannotSetExpirationOnAnyoneOrDomain'
51
52
  CANNOT_SHARE_GROUPS_WITHLINK = 'cannotShareGroupsWithLink'
52
53
  CANNOT_SHARE_USERS_WITHLINK = 'cannotShareUsersWithLink'
53
54
  CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS = 'cannotShareTeamDriveTopFolderWithAnyoneOrDomains'
@@ -71,6 +72,7 @@ DOMAIN_POLICY = 'domainPolicy'
71
72
  DOWNLOAD_QUOTA_EXCEEDED = 'downloadQuotaExceeded'
72
73
  DUPLICATE = 'duplicate'
73
74
  EVENT_DURATION_EXCEEDS_LIMIT = 'eventDurationExceedsLimit'
75
+ EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE = 'expirationDatesMustBeInTheFuture'
74
76
  EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS = 'expirationDateNotAllowedForSharedDriveMembers'
75
77
  FAILED_PRECONDITION = 'failedPrecondition'
76
78
  FIELD_IN_USE = 'fieldInUse'
@@ -211,7 +213,8 @@ DRIVE_COPY_THROW_REASONS = DRIVE_ACCESS_THROW_REASONS+[CANNOT_COPY_FILE, BAD_REQ
211
213
  STORAGE_QUOTA_EXCEEDED, TEAMDRIVE_FILE_LIMIT_EXCEEDED, TEAMDRIVE_HIERARCHY_TOO_DEEP]
212
214
  DRIVE_GET_THROW_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, DOWNLOAD_QUOTA_EXCEEDED]
213
215
  DRIVE3_CREATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID, INVALID_SHARING_REQUEST, OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED,
214
- CANNOT_SET_EXPIRATION, EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS,
216
+ CANNOT_SET_EXPIRATION, CANNOT_SET_EXPIRATION_ON_ANYONE_OR_DOMAIN,
217
+ EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE, EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS,
215
218
  NOT_FOUND, TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION, TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION,
216
219
  TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION, INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
217
220
  PUBLISH_OUT_NOT_PERMITTED, SHARE_IN_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED_TO_USER,
@@ -228,7 +231,8 @@ DRIVE3_GET_ACL_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, FORBIDDEN, IN
228
231
  INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, INSUFFICIENT_FILE_PERMISSIONS,
229
232
  UNKNOWN_ERROR, INVALID]
230
233
  DRIVE3_UPDATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID_OWNERSHIP_TRANSFER, CANNOT_REMOVE_OWNER,
231
- CANNOT_SET_EXPIRATION, EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS,
234
+ CANNOT_SET_EXPIRATION, CANNOT_SET_EXPIRATION_ON_ANYONE_OR_DOMAIN,
235
+ EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE, EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS,
232
236
  OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED,
233
237
  NOT_FOUND, TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION, TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION,
234
238
  TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION, INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
@@ -300,6 +304,7 @@ REASON_MESSAGE_MAP = {
300
304
  ('userId', USER_NOT_FOUND),
301
305
  ('memberKey', INVALID_MEMBER),
302
306
  ('A system error has occurred', SYSTEM_ERROR),
307
+ ('Expiration dates must be in the future', EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE),
303
308
  ('Invalid attribute value', INVALID_ATTRIBUTE_VALUE),
304
309
  ('Invalid Customer Id', INVALID_CUSTOMER_ID),
305
310
  ('Invalid Input: INVALID_OU_ID', INVALID_ORGUNIT),
@@ -405,6 +410,8 @@ class cannotRemoveOwner(Exception):
405
410
  pass
406
411
  class cannotSetExpiration(Exception):
407
412
  pass
413
+ class cannotSetExpirationOnAnyoneOrDomain(Exception):
414
+ pass
408
415
  class cannotShareGroupsWithLink(Exception):
409
416
  pass
410
417
  class cannotShareUsersWithLink(Exception):
@@ -449,6 +456,8 @@ class duplicate(Exception):
449
456
  pass
450
457
  class eventDurationExceedsLimit(Exception):
451
458
  pass
459
+ class expirationDatesMustBeInTheFuture(Exception):
460
+ pass
452
461
  class expirationDateNotAllowedForSharedDriveMembers(Exception):
453
462
  pass
454
463
  class failedPrecondition(Exception):
@@ -690,6 +699,7 @@ REASON_EXCEPTION_MAP = {
690
699
  CANNOT_MOVE_TRASHED_ITEM_OUT_OF_TEAMDRIVE: cannotMoveTrashedItemOutOfTeamDrive,
691
700
  CANNOT_REMOVE_OWNER: cannotRemoveOwner,
692
701
  CANNOT_SET_EXPIRATION: cannotSetExpiration,
702
+ CANNOT_SET_EXPIRATION_ON_ANYONE_OR_DOMAIN: cannotSetExpirationOnAnyoneOrDomain,
693
703
  CANNOT_SHARE_GROUPS_WITHLINK: cannotShareGroupsWithLink,
694
704
  CANNOT_SHARE_USERS_WITHLINK: cannotShareUsersWithLink,
695
705
  CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS: cannotShareTeamDriveTopFolderWithAnyoneOrDomains,
@@ -712,6 +722,7 @@ REASON_EXCEPTION_MAP = {
712
722
  DOWNLOAD_QUOTA_EXCEEDED: downloadQuotaExceeded,
713
723
  DUPLICATE: duplicate,
714
724
  EVENT_DURATION_EXCEEDS_LIMIT: eventDurationExceedsLimit,
725
+ EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE: expirationDatesMustBeInTheFuture,
715
726
  EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS: expirationDateNotAllowedForSharedDriveMembers,
716
727
  FAILED_PRECONDITION: failedPrecondition,
717
728
  FIELD_IN_USE: fieldInUse,
@@ -0,0 +1,5 @@
1
+ # Scratch Me Wiki
2
+ editing these files shouldn't trigger a regular GitHub Action build.
3
+
4
+ # Counter
5
+ 00010