gam7 7.9.7__tar.gz → 7.10.1__tar.gz

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

Potentially problematic release.


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

Files changed (318) hide show
  1. {gam7-7.9.7 → gam7-7.10.1}/PKG-INFO +1 -1
  2. {gam7-7.9.7 → gam7-7.10.1}/src/GamCommands.txt +25 -3
  3. {gam7-7.9.7 → gam7-7.10.1}/src/GamUpdate.txt +15 -0
  4. {gam7-7.9.7 → gam7-7.10.1}/src/gam/__init__.py +245 -13
  5. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glapi.py +7 -1
  6. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glclargs.py +5 -1
  7. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glentity.py +2 -0
  8. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glmsgs.py +1 -0
  9. {gam7-7.9.7 → gam7-7.10.1}/wiki/Basic-Items.md +3 -1
  10. {gam7-7.9.7 → gam7-7.10.1}/wiki/GamUpdates.md +14 -0
  11. {gam7-7.9.7 → gam7-7.10.1}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  12. {gam7-7.9.7 → gam7-7.10.1}/wiki/Licenses.md +1 -1
  13. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Chat.md +76 -0
  14. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Files-Display.md +2 -1
  15. {gam7-7.9.7 → gam7-7.10.1}/wiki/Version-and-Help.md +6 -6
  16. {gam7-7.9.7 → gam7-7.10.1}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  17. {gam7-7.9.7 → gam7-7.10.1}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  18. {gam7-7.9.7 → gam7-7.10.1}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  19. {gam7-7.9.7 → gam7-7.10.1}/.github/ISSUE_TEMPLATE.txt +0 -0
  20. {gam7-7.9.7 → gam7-7.10.1}/.github/actions/decrypt.sh +0 -0
  21. {gam7-7.9.7 → gam7-7.10.1}/.github/actions/entitlements.plist +0 -0
  22. {gam7-7.9.7 → gam7-7.10.1}/.github/actions/package_exclusions.txt +0 -0
  23. {gam7-7.9.7 → gam7-7.10.1}/.github/stale.yml +0 -0
  24. {gam7-7.9.7 → gam7-7.10.1}/.github/workflows/build.yml +0 -0
  25. {gam7-7.9.7 → gam7-7.10.1}/.github/workflows/codeql-analysis.yml +0 -0
  26. {gam7-7.9.7 → gam7-7.10.1}/.github/workflows/get-cacerts.yml +0 -0
  27. {gam7-7.9.7 → gam7-7.10.1}/.github/workflows/pushwiki.yml +0 -0
  28. {gam7-7.9.7 → gam7-7.10.1}/.github/workflows/pypi.yml +0 -0
  29. {gam7-7.9.7 → gam7-7.10.1}/.pre-commit-config.yaml +0 -0
  30. {gam7-7.9.7 → gam7-7.10.1}/LICENSE +0 -0
  31. {gam7-7.9.7 → gam7-7.10.1}/README.md +0 -0
  32. {gam7-7.9.7 → gam7-7.10.1}/pyproject.toml +0 -0
  33. {gam7-7.9.7 → gam7-7.10.1}/src/.gitignore +0 -0
  34. {gam7-7.9.7 → gam7-7.10.1}/src/LICENSE +0 -0
  35. {gam7-7.9.7 → gam7-7.10.1}/src/cacerts.pem +0 -0
  36. {gam7-7.9.7 → gam7-7.10.1}/src/callgam.py +0 -0
  37. {gam7-7.9.7 → gam7-7.10.1}/src/gam/__main__.py +0 -0
  38. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/__init__.py +0 -0
  39. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/auth.py +0 -0
  40. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/client.py +0 -0
  41. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/core.py +0 -0
  42. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/data.py +0 -0
  43. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/http.py +0 -0
  44. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/http_core.py +0 -0
  45. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/http_interface.py +0 -0
  46. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/mock_http.py +0 -0
  47. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/mock_http_core.py +0 -0
  48. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/mock_service.py +0 -0
  49. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/service.py +0 -0
  50. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/token_store.py +0 -0
  51. {gam7-7.9.7 → gam7-7.10.1}/src/gam/atom/url.py +0 -0
  52. {gam7-7.9.7 → gam7-7.10.1}/src/gam/cacerts.pem +0 -0
  53. {gam7-7.9.7 → gam7-7.10.1}/src/gam/cbcm-v1.1beta1.json +0 -0
  54. {gam7-7.9.7 → gam7-7.10.1}/src/gam/contactdelegation-v1.json +0 -0
  55. {gam7-7.9.7 → gam7-7.10.1}/src/gam/datastudio-v1.json +0 -0
  56. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/__init__.py +0 -0
  57. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glaction.py +0 -0
  58. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glcfg.py +0 -0
  59. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glgapi.py +0 -0
  60. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glgdata.py +0 -0
  61. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glglobals.py +0 -0
  62. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glindent.py +0 -0
  63. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glskus.py +0 -0
  64. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/gluprop.py +0 -0
  65. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/glverlibs.py +0 -0
  66. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gamlib/yubikey.py +0 -0
  67. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/__init__.py +0 -0
  68. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/alt/__init__.py +0 -0
  69. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/alt/app_engine.py +0 -0
  70. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/alt/appengine.py +0 -0
  71. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/apps/__init__.py +0 -0
  72. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/apps/audit/__init__.py +0 -0
  73. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/apps/audit/service.py +0 -0
  74. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  75. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/apps/contacts/service.py +0 -0
  76. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/apps/service.py +0 -0
  77. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/service.py +0 -0
  78. {gam7-7.9.7 → gam7-7.10.1}/src/gam/gdata/urlfetch.py +0 -0
  79. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/__init__.py +0 -0
  80. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/_auth.py +0 -0
  81. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/_helpers.py +0 -0
  82. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/channel.py +0 -0
  83. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/discovery.py +0 -0
  84. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  85. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  86. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  87. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  88. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/errors.py +0 -0
  89. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/http.py +0 -0
  90. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/mimeparse.py +0 -0
  91. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/model.py +0 -0
  92. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/schema.py +0 -0
  93. {gam7-7.9.7 → gam7-7.10.1}/src/gam/googleapiclient/version.py +0 -0
  94. {gam7-7.9.7 → gam7-7.10.1}/src/gam/iso8601/__init__.py +0 -0
  95. {gam7-7.9.7 → gam7-7.10.1}/src/gam/iso8601/iso8601.py +0 -0
  96. {gam7-7.9.7 → gam7-7.10.1}/src/gam/meet-v2beta.json +0 -0
  97. {gam7-7.9.7 → gam7-7.10.1}/src/gam/serviceaccountlookup-v1.json +0 -0
  98. {gam7-7.9.7 → gam7-7.10.1}/src/gam/six.py +0 -0
  99. {gam7-7.9.7 → gam7-7.10.1}/src/gam-install.sh +0 -0
  100. {gam7-7.9.7 → gam7-7.10.1}/src/gam-setup.bat +0 -0
  101. {gam7-7.9.7 → gam7-7.10.1}/src/gam.exe.manifest +0 -0
  102. {gam7-7.9.7 → gam7-7.10.1}/src/gam.py +0 -0
  103. {gam7-7.9.7 → gam7-7.10.1}/src/gam.spec +0 -0
  104. {gam7-7.9.7 → gam7-7.10.1}/src/gam.wxs +0 -0
  105. {gam7-7.9.7 → gam7-7.10.1}/src/license.rtf +0 -0
  106. {gam7-7.9.7 → gam7-7.10.1}/src/requirements-dev.txt +0 -0
  107. {gam7-7.9.7 → gam7-7.10.1}/src/requirements.txt +0 -0
  108. {gam7-7.9.7 → gam7-7.10.1}/src/setup.cfg +0 -0
  109. {gam7-7.9.7 → gam7-7.10.1}/src/setup.py +0 -0
  110. {gam7-7.9.7 → gam7-7.10.1}/src/tools/a_atleast_b.py +0 -0
  111. {gam7-7.9.7 → gam7-7.10.1}/src/tools/gen-wix-xml-filelist.py +0 -0
  112. {gam7-7.9.7 → gam7-7.10.1}/src/tools/mkGamRef.py +0 -0
  113. {gam7-7.9.7 → gam7-7.10.1}/src/tools/openssl.props +0 -0
  114. {gam7-7.9.7 → gam7-7.10.1}/src/version_info.txt.in +0 -0
  115. {gam7-7.9.7 → gam7-7.10.1}/wiki/00scratch.md +0 -0
  116. {gam7-7.9.7 → gam7-7.10.1}/wiki/Addresses.md +0 -0
  117. {gam7-7.9.7 → gam7-7.10.1}/wiki/Administrators.md +0 -0
  118. {gam7-7.9.7 → gam7-7.10.1}/wiki/Alert-Center.md +0 -0
  119. {gam7-7.9.7 → gam7-7.10.1}/wiki/Aliases.md +0 -0
  120. {gam7-7.9.7 → gam7-7.10.1}/wiki/Authorization.md +0 -0
  121. {gam7-7.9.7 → gam7-7.10.1}/wiki/BNF-Syntax.md +0 -0
  122. {gam7-7.9.7 → gam7-7.10.1}/wiki/Bulk-Processing.md +0 -0
  123. {gam7-7.9.7 → gam7-7.10.1}/wiki/CSV-Input-Filtering.md +0 -0
  124. {gam7-7.9.7 → gam7-7.10.1}/wiki/CSV-Output-Filtering.md +0 -0
  125. {gam7-7.9.7 → gam7-7.10.1}/wiki/CSV-Special-Characters.md +0 -0
  126. {gam7-7.9.7 → gam7-7.10.1}/wiki/Calendars-Access.md +0 -0
  127. {gam7-7.9.7 → gam7-7.10.1}/wiki/Calendars-Events.md +0 -0
  128. {gam7-7.9.7 → gam7-7.10.1}/wiki/Calendars.md +0 -0
  129. {gam7-7.9.7 → gam7-7.10.1}/wiki/Chat-Bot.md +0 -0
  130. {gam7-7.9.7 → gam7-7.10.1}/wiki/Chrome-AUE-Counts.md +0 -0
  131. {gam7-7.9.7 → gam7-7.10.1}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  132. {gam7-7.9.7 → gam7-7.10.1}/wiki/Chrome-Installed-Apps.md +0 -0
  133. {gam7-7.9.7 → gam7-7.10.1}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  134. {gam7-7.9.7 → gam7-7.10.1}/wiki/Chrome-Policies.md +0 -0
  135. {gam7-7.9.7 → gam7-7.10.1}/wiki/Chrome-Printers.md +0 -0
  136. {gam7-7.9.7 → gam7-7.10.1}/wiki/Chrome-Profile-Management.md +0 -0
  137. {gam7-7.9.7 → gam7-7.10.1}/wiki/Chrome-Version-Counts.md +0 -0
  138. {gam7-7.9.7 → gam7-7.10.1}/wiki/Chrome-Version-History.md +0 -0
  139. {gam7-7.9.7 → gam7-7.10.1}/wiki/ChromeOS-Devices.md +0 -0
  140. {gam7-7.9.7 → gam7-7.10.1}/wiki/Classroom-Courses.md +0 -0
  141. {gam7-7.9.7 → gam7-7.10.1}/wiki/Classroom-Guardians.md +0 -0
  142. {gam7-7.9.7 → gam7-7.10.1}/wiki/Classroom-Invitations.md +0 -0
  143. {gam7-7.9.7 → gam7-7.10.1}/wiki/Classroom-Membership.md +0 -0
  144. {gam7-7.9.7 → gam7-7.10.1}/wiki/Cloud-Channel.md +0 -0
  145. {gam7-7.9.7 → gam7-7.10.1}/wiki/Cloud-Identity-Devices.md +0 -0
  146. {gam7-7.9.7 → gam7-7.10.1}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  147. {gam7-7.9.7 → gam7-7.10.1}/wiki/Cloud-Identity-Groups.md +0 -0
  148. {gam7-7.9.7 → gam7-7.10.1}/wiki/Cloud-Identity-Policies.md +0 -0
  149. {gam7-7.9.7 → gam7-7.10.1}/wiki/Cloud-Storage.md +0 -0
  150. {gam7-7.9.7 → gam7-7.10.1}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  151. {gam7-7.9.7 → gam7-7.10.1}/wiki/Collections-of-Items.md +0 -0
  152. {gam7-7.9.7 → gam7-7.10.1}/wiki/Collections-of-Users.md +0 -0
  153. {gam7-7.9.7 → gam7-7.10.1}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  154. {gam7-7.9.7 → gam7-7.10.1}/wiki/Command-Line-Parsing.md +0 -0
  155. {gam7-7.9.7 → gam7-7.10.1}/wiki/Command-Logging-Progress.md +0 -0
  156. {gam7-7.9.7 → gam7-7.10.1}/wiki/Context-Aware-Access-Levels.md +0 -0
  157. {gam7-7.9.7 → gam7-7.10.1}/wiki/Customer.md +0 -0
  158. {gam7-7.9.7 → gam7-7.10.1}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  159. {gam7-7.9.7 → gam7-7.10.1}/wiki/Domain-SharedContacts.md +0 -0
  160. {gam7-7.9.7 → gam7-7.10.1}/wiki/Domains-Verification.md +0 -0
  161. {gam7-7.9.7 → gam7-7.10.1}/wiki/Domains.md +0 -0
  162. {gam7-7.9.7 → gam7-7.10.1}/wiki/Downloads-Installs.md +0 -0
  163. {gam7-7.9.7 → gam7-7.10.1}/wiki/Drive-File-Selection.md +0 -0
  164. {gam7-7.9.7 → gam7-7.10.1}/wiki/Drive-Items.md +0 -0
  165. {gam7-7.9.7 → gam7-7.10.1}/wiki/Drive-REST-API-v3.md +0 -0
  166. {gam7-7.9.7 → gam7-7.10.1}/wiki/Email-Audit-Monitor.md +0 -0
  167. {gam7-7.9.7 → gam7-7.10.1}/wiki/Find-File-Owner.md +0 -0
  168. {gam7-7.9.7 → gam7-7.10.1}/wiki/GAM-Public-Chat-Room.md +0 -0
  169. {gam7-7.9.7 → gam7-7.10.1}/wiki/GAM-Return-Codes.md +0 -0
  170. {gam7-7.9.7 → gam7-7.10.1}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  171. {gam7-7.9.7 → gam7-7.10.1}/wiki/GAM7-on-Android-Devices.md +0 -0
  172. {gam7-7.9.7 → gam7-7.10.1}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  173. {gam7-7.9.7 → gam7-7.10.1}/wiki/Google-Data-Transfers.md +0 -0
  174. {gam7-7.9.7 → gam7-7.10.1}/wiki/Google-Network-Addresses.md +0 -0
  175. {gam7-7.9.7 → gam7-7.10.1}/wiki/Groups-Membership.md +0 -0
  176. {gam7-7.9.7 → gam7-7.10.1}/wiki/Groups.md +0 -0
  177. {gam7-7.9.7 → gam7-7.10.1}/wiki/HTTPS-Proxy.md +0 -0
  178. {gam7-7.9.7 → gam7-7.10.1}/wiki/Home.md +0 -0
  179. {gam7-7.9.7 → gam7-7.10.1}/wiki/How-to-Install-GAM7.md +0 -0
  180. {gam7-7.9.7 → gam7-7.10.1}/wiki/How-to-Uninstall-GAM7.md +0 -0
  181. {gam7-7.9.7 → gam7-7.10.1}/wiki/How-to-Update-GAM7.md +0 -0
  182. {gam7-7.9.7 → gam7-7.10.1}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  183. {gam7-7.9.7 → gam7-7.10.1}/wiki/Inbound-SSO.md +0 -0
  184. {gam7-7.9.7 → gam7-7.10.1}/wiki/Install-GAM-as-Python-Library.md +0 -0
  185. {gam7-7.9.7 → gam7-7.10.1}/wiki/List-Items.md +0 -0
  186. {gam7-7.9.7 → gam7-7.10.1}/wiki/List.md +0 -0
  187. {gam7-7.9.7 → gam7-7.10.1}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  188. {gam7-7.9.7 → gam7-7.10.1}/wiki/Mobile-Devices.md +0 -0
  189. {gam7-7.9.7 → gam7-7.10.1}/wiki/Organizational-Units.md +0 -0
  190. {gam7-7.9.7 → gam7-7.10.1}/wiki/Other-Resources.md +0 -0
  191. {gam7-7.9.7 → gam7-7.10.1}/wiki/Permission-Matches.md +0 -0
  192. {gam7-7.9.7 → gam7-7.10.1}/wiki/Python-Regular-Expressions.md +0 -0
  193. {gam7-7.9.7 → gam7-7.10.1}/wiki/README.md +0 -0
  194. {gam7-7.9.7 → gam7-7.10.1}/wiki/Rclone.md +0 -0
  195. {gam7-7.9.7 → gam7-7.10.1}/wiki/Reports.md +0 -0
  196. {gam7-7.9.7 → gam7-7.10.1}/wiki/Reseller.md +0 -0
  197. {gam7-7.9.7 → gam7-7.10.1}/wiki/Resources.md +0 -0
  198. {gam7-7.9.7 → gam7-7.10.1}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  199. {gam7-7.9.7 → gam7-7.10.1}/wiki/SSL-Root-CA-Certificates.md +0 -0
  200. {gam7-7.9.7 → gam7-7.10.1}/wiki/Schemas.md +0 -0
  201. {gam7-7.9.7 → gam7-7.10.1}/wiki/Scripts.md +0 -0
  202. {gam7-7.9.7 → gam7-7.10.1}/wiki/Send-Email.md +0 -0
  203. {gam7-7.9.7 → gam7-7.10.1}/wiki/Shared-Drives.md +0 -0
  204. {gam7-7.9.7 → gam7-7.10.1}/wiki/Sites.md +0 -0
  205. {gam7-7.9.7 → gam7-7.10.1}/wiki/Tag-Replace.md +0 -0
  206. {gam7-7.9.7 → gam7-7.10.1}/wiki/Todrive.md +0 -0
  207. {gam7-7.9.7 → gam7-7.10.1}/wiki/Unmanaged-Accounts.md +0 -0
  208. {gam7-7.9.7 → gam7-7.10.1}/wiki/Upgrade-Benefits.md +0 -0
  209. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Analytics-Admin.md +0 -0
  210. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Application-Specific-Passwords.md +0 -0
  211. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Backup-Verification-Codes.md +0 -0
  212. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Calendars-Access.md +0 -0
  213. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Calendars-Events.md +0 -0
  214. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Calendars.md +0 -0
  215. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Classification-Labels.md +0 -0
  216. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Classroom-Profile.md +0 -0
  217. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Contacts-Delegates.md +0 -0
  218. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Contacts.md +0 -0
  219. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Deprovision.md +0 -0
  220. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Activity-Settings.md +0 -0
  221. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Cleanup.md +0 -0
  222. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Comments.md +0 -0
  223. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Copy-Move.md +0 -0
  224. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Files-Manage.md +0 -0
  225. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Orphans.md +0 -0
  226. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Ownership.md +0 -0
  227. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Permissions.md +0 -0
  228. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Query.md +0 -0
  229. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Revisions.md +0 -0
  230. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Shortcuts.md +0 -0
  231. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Drive-Transfer.md +0 -0
  232. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Forms.md +0 -0
  233. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Gmail-CSE.md +0 -0
  234. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Gmail-Delegates.md +0 -0
  235. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Gmail-Filters.md +0 -0
  236. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Gmail-Forwarding.md +0 -0
  237. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Gmail-Labels.md +0 -0
  238. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  239. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Gmail-Profile.md +0 -0
  240. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Gmail-S-MIME.md +0 -0
  241. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  242. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Gmail-Settings.md +0 -0
  243. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Group-Membership.md +0 -0
  244. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Keep-Notes.md +0 -0
  245. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Looker-Studio.md +0 -0
  246. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Meet.md +0 -0
  247. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-People-Contacts-Profiles.md +0 -0
  248. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Photo.md +0 -0
  249. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Profile-Photo.md +0 -0
  250. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Profile-Sharing.md +0 -0
  251. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Shared-Drives.md +0 -0
  252. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  253. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Spreadsheets.md +0 -0
  254. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Tasks.md +0 -0
  255. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-Tokens.md +0 -0
  256. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users-YouTube.md +0 -0
  257. {gam7-7.9.7 → gam7-7.10.1}/wiki/Users.md +0 -0
  258. {gam7-7.9.7 → gam7-7.10.1}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  259. {gam7-7.9.7 → gam7-7.10.1}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  260. {gam7-7.9.7 → gam7-7.10.1}/wiki/Vault-Takeout.md +0 -0
  261. {gam7-7.9.7 → gam7-7.10.1}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  262. {gam7-7.9.7 → gam7-7.10.1}/wiki/_Sidebar.md +0 -0
  263. {gam7-7.9.7 → gam7-7.10.1}/wiki/gam.cfg.md +0 -0
  264. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-AdminSettingsExamples.md +0 -0
  265. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Android-Installation.md +0 -0
  266. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-BulkOperations.md +0 -0
  267. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-CalendarExamples.md +0 -0
  268. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Chat-Bot.md +0 -0
  269. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Chrome-Browser-Management.md +0 -0
  270. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Chrome-OS-Installation.md +0 -0
  271. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Chrome-Policy-Settings.md +0 -0
  272. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Cloud-Identity-Groups.md +0 -0
  273. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  274. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Command-Reference-Calendars.md +0 -0
  275. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Command-Reference-Definitions.md +0 -0
  276. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Command-Reference-Drive.md +0 -0
  277. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Command-Reference-Email.md +0 -0
  278. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  279. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Command-Reference-Groups.md +0 -0
  280. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Command-Reference-Users.md +0 -0
  281. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  282. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  283. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-CreatingClientSecretsFile.md +0 -0
  284. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Custom-Schemas.md +0 -0
  285. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Data-Transfers.md +0 -0
  286. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-DomainVerification.md +0 -0
  287. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-ExamplesAccountAuditing.md +0 -0
  288. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-ExamplesCSV.md +0 -0
  289. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-ExamplesEmailSettings.md +0 -0
  290. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-ExamplesOrganizations.md +0 -0
  291. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-GAM-Discussion-Group.md +0 -0
  292. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  293. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-GAM-options-files.md +0 -0
  294. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  295. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-GAM3CSVListings.md +0 -0
  296. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-GAM3DirectoryCommands.md +0 -0
  297. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-GAM3GroupSettings.md +0 -0
  298. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-GAM7-FAQ.md +0 -0
  299. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  300. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-GoogleDriveManagement.md +0 -0
  301. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  302. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Home.md +0 -0
  303. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  304. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Inbound-SSO-Settings.md +0 -0
  305. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-LicenseExamples.md +0 -0
  306. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Managing-Admins.md +0 -0
  307. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  308. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Managing-Devices.md +0 -0
  309. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Managing-Google-Classroom.md +0 -0
  310. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-OAuthKeyManagement.md +0 -0
  311. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Printers.md +0 -0
  312. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-ResellerCommands.md +0 -0
  313. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  314. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-SecurityExamples.md +0 -0
  315. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-UnmanagedUsersExamples.md +0 -0
  316. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Use-a-Yubikey.md +0 -0
  317. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  318. {gam7-7.9.7 → gam7-7.10.1}/wiki/l-_Footer.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.9.7
3
+ Version: 7.10.1
4
4
  Summary: CLI tool to manage Google Workspace
5
5
  Project-URL: Homepage, https://github.com/GAM-team/GAM
6
6
  Project-URL: Issues, https://github.com/GAM-team/GAM/issues
@@ -1,4 +1,4 @@
1
- This document describes the GAM command line syntax in modified BNF, see https://en.wikipedia.org/wiki/Backus-Naur_Form
1
+ his document describes the GAM command line syntax in modified BNF, see https://en.wikipedia.org/wiki/Backus-Naur_Form
2
2
  Skip the History section and start reading at Introduction.
3
3
 
4
4
  Items on the command line are space separated, when an actual space character is required, it will be indicated by <Space>.
@@ -380,6 +380,8 @@ If an item contains spaces, it should be surrounded by ".
380
380
  domain:<DomainName>|domain|default
381
381
  <CalendarItem> ::= <EmailAddress>
382
382
  <ChannelCustomerID> ::= <String>
383
+ <ChatEmojiName> ::= :<String>:
384
+ <ChatEmoji> ::= emojiname <ChatEmojiName> | customemojis/<String>
383
385
  <ChatMember> ::= spaces/<String>/members/<String>
384
386
  <ChatMessage> ::= spaces/<String>/messages/<String>
385
387
  <ChatSpace> ::= spaces/<String> | space <String> | space spaces/<String>
@@ -664,6 +666,7 @@ If an item contains spaces, it should be surrounded by ".
664
666
  (gdoc|ghtml <UserGoogleDoc>)|
665
667
  (gcsdoc|gcshtml <StorageBucketObjectName>)
666
668
  <YouTubeChannelID> ::= <String>
669
+
667
670
  ## Lists of basic items
668
671
 
669
672
  <APIScopeURLList> ::= "<APIScopeURL>(,<APIScopeURL>)*"
@@ -4437,13 +4440,14 @@ gam report usage customer [todrive <ToDriveAttribute>*]
4437
4440
  calendar|calendars|
4438
4441
  chat|
4439
4442
  chrome|
4443
+ classroom|
4440
4444
  contextawareaccess|
4441
4445
  currents|gplus|google+|
4442
4446
  datastudio|
4443
4447
  devices|mobile|
4444
4448
  domain|
4445
4449
  drive|doc|docs|
4446
- gcp|
4450
+ gcp|cloud|
4447
4451
  gemini|geminiforworkspace|
4448
4452
  groups|group|
4449
4453
  groupsenterprise|enterprisegroups|
@@ -4462,7 +4466,7 @@ gam report <ActivityApplicationName> [todrive <ToDriveAttribute>*]
4462
4466
  [(user all|<UserItem>)|(orgunit|org|ou <OrgUnitPath> [showorgunit])|(select <UserTypeEntity>)]
4463
4467
  [([start <Time>] [end <Time>])|(range <Time> <Time>)|
4464
4468
  yesterday|today|thismonth|(previousmonths <Integer>)]
4465
- [filtertime.* <Time>] [filter|filters <String>]
4469
+ [filtertime.String> <Time>] [filter|filters <String>]
4466
4470
  [event|events <EventNameList>] [ip <String>]
4467
4471
  [groupidfilter <String>]
4468
4472
  [maxactivities <Number>] [maxevents <Number>] [maxresults <Number>]
@@ -6436,6 +6440,22 @@ gam <UserTypeEntity> print chatevents [todrive <ToDriveAttribute>*]
6436
6440
  filter <String>
6437
6441
  [formatjson [quotechar <Character>]]
6438
6442
 
6443
+ <ChatEmojiName> ::= :[0-9a-z_-]+:
6444
+ <ChatEmoji> ::= emojiname <ChatEmojiName> | customemojis/<String>
6445
+
6446
+ gam <UserTypeEntity> create chatemoji <ChatEmojiName>
6447
+ ([drivedir|(sourcefolder <FilePath>)] [filename <FileNamePattern>])
6448
+ [formatjson]
6449
+ gam <UserTypeEntity> delete chatemoji <ChatEmoji>
6450
+ gam <UserTypeEntity> info chatemoji <ChatEmoji>
6451
+ [formatjson]
6452
+ gam <UserTypeEntity> show chatemojis
6453
+ [showcreatedby any|me|others]
6454
+ [formatjson]
6455
+ gam <UserTypeEntity> print chatemojis [todrive <ToDriveAttribute>*]
6456
+ [showcreatedby any|me|others]
6457
+ [formatjson [quotechar <Character>]]
6458
+
6439
6459
  # Users - Drive
6440
6460
 
6441
6461
  <DriveFileOrderByFieldName> ::=
@@ -7398,10 +7418,12 @@ gam <UserTypeEntity> print filters [labelidsonly] [todrive <ToDriveAttribute>*]
7398
7418
 
7399
7419
  gam <UserTypeEntity> create form
7400
7420
  title <String> [description <String>] [isquiz [<Boolean>]] [<JSONData>]
7421
+ [ispublished [<Boolean>] isacceptingresponses [<Boolean>]]
7401
7422
  [drivefilename <DriveFileName>] [<DriveFileParentAttribute>]
7402
7423
  [(csv [todrive <ToDriveAttribute>*]) | returnidonly]
7403
7424
  gam <UserTypeEntity> update form <DriveFileEntity>
7404
7425
  [title <String>] [description <String>] [isquiz [<Boolean>]] [<JSONData>]
7426
+ [ispublished [<Boolean>] isacceptingresponses [<Boolean>]]
7405
7427
 
7406
7428
  gam <UserTypeEntity> print forms <DriveFileEntity> [todrive <ToDriveAttribute>*]
7407
7429
  (addcsvdata <FieldName> <String>)*
@@ -1,3 +1,18 @@
1
+ 7.10.01
2
+
3
+ Added options `ispublished [<Boolean>]` and `isacceptingresponses [<Boolean>]` to
4
+ `gam <UserTypeEntity> create|update form`.
5
+
6
+ 7.10.00
7
+
8
+ Added commands to manage/display Chat Custom Emojis.
9
+
10
+ * See: https://github.com/GAM-team/GAM/wiki/Users-Chat#manage-chat-emojis
11
+ * See: https://github.com/GAM-team/GAM/wiki/Users-Chat#display-chat-emojis
12
+
13
+ Updated `gam <UserItem> print|show chatspaces|chatmembers asadmin` to display
14
+ the spaces in ascending display name order.
15
+
1
16
  7.09.07
2
17
 
3
18
  Added `webviewlink` to `<FileTreeFieldName>` for use in `gam <UserTypeEntity> print|show filetree`.
@@ -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.09.07'
28
+ __version__ = '7.10.01'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -13556,7 +13556,10 @@ REPORT_CHOICE_MAP = {
13556
13556
  'calendars': 'calendar',
13557
13557
  'chat': 'chat',
13558
13558
  'chrome': 'chrome',
13559
+ 'classroom': 'classroom',
13560
+ 'cloud': 'gcp',
13559
13561
  'contextawareaccess': 'context_aware_access',
13562
+ 'currents': 'gplus',
13560
13563
  'customer': 'customer',
13561
13564
  'customers': 'customer',
13562
13565
  'datastudio': 'data_studio',
@@ -22786,7 +22789,7 @@ def _processPeopleContactPhotos(users, function):
22786
22789
  if function == 'GetContactPhoto' and not os.path.isdir(targetFolder):
22787
22790
  os.makedirs(targetFolder)
22788
22791
  elif myarg == 'filename':
22789
- filenamePattern = getString(Cmd.OB_PHOTO_FILENAME_PATTERN)
22792
+ filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN)
22790
22793
  else:
22791
22794
  unknownArgumentExit()
22792
22795
  subForContactId = filenamePattern.find('#contactid#') != -1
@@ -25990,6 +25993,8 @@ def _printChatItem(user, citem, parent, entityType, csvPF, FJQC, addCSVData=None
25990
25993
  if entityType == Ent.CHAT_SPACE:
25991
25994
  _cleanChatSpace(citem)
25992
25995
  baserow = {'User': user} if user is not None else {}
25996
+ elif entityType == Ent.CHAT_EMOJI:
25997
+ baserow = {'User': user, 'name': citem['name'], 'emojiName': citem['emojiName']}
25993
25998
  else:
25994
25999
  if user is not None:
25995
26000
  baserow = {'User': user, 'space.name': parent['name'], 'space.displayName': parent['displayName']}
@@ -26009,6 +26014,190 @@ def _printChatItem(user, citem, parent, entityType, csvPF, FJQC, addCSVData=None
26009
26014
  'JSON': json.dumps(cleanJSON(citem, timeObjects=CHAT_TIME_OBJECTS), ensure_ascii=False, sort_keys=True)})
26010
26015
  csvPF.WriteRowNoFilter(row)
26011
26016
 
26017
+ def _getValidateEmojiName():
26018
+ name = getString(Cmd.OB_CHAT_EMOJI_NAME)
26019
+ if re.match(r'^:[0-9a-z_-]+:$', name):
26020
+ return name
26021
+ Cmd.Backup()
26022
+ usageErrorExit(Msg.INVALID_EMOJI_NAME.format(name))
26023
+
26024
+ # gam <UserTypeEntity> create chatemoji <ChatEmojiName>
26025
+ # ([drivedir|(sourcefolder <FilePath>)] [filename <FileNamePattern>])
26026
+ # [formatjson]
26027
+ def createChatEmoji(users):
26028
+ FJQC = FormatJSONQuoteChar()
26029
+ name = _getValidateEmojiName()
26030
+ body = {'emojiName': name, 'payload': {'filename': '', 'fileContent': ''}}
26031
+ sourceFolder = os.getcwd()
26032
+ filenamePattern = '#email#.jpg'
26033
+ while Cmd.ArgumentsRemaining():
26034
+ myarg = getArgument()
26035
+ if myarg == 'drivedir':
26036
+ sourceFolder = GC.Values[GC.DRIVE_DIR]
26037
+ elif myarg == 'sourcefolder':
26038
+ sourceFolder = os.path.expanduser(getString(Cmd.OB_FILE_PATH))
26039
+ if not os.path.isdir(sourceFolder):
26040
+ entityDoesNotExistExit(Ent.DIRECTORY, sourceFolder)
26041
+ elif myarg == 'filename':
26042
+ filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN)
26043
+ else:
26044
+ FJQC.GetFormatJSON(myarg)
26045
+ i, count, users = getEntityArgument(users)
26046
+ for user in users:
26047
+ i += 1
26048
+ user, chat, kvList = buildChatServiceObject(API.CHAT_CUSTOM_EMOJIS, user, i, count, [Ent.CHAT_EMOJI, name])
26049
+ if not chat:
26050
+ continue
26051
+ user, userName, _ = splitEmailAddressOrUID(user)
26052
+ filename = _substituteForUser(filenamePattern, user, userName)
26053
+ if sourceFolder is not None:
26054
+ filename = os.path.join(sourceFolder, filename)
26055
+ filename = os.path.expanduser(filename)
26056
+ try:
26057
+ with open(filename, 'rb') as f:
26058
+ image_data = f.read()
26059
+ except (OSError, IOError) as e:
26060
+ entityActionFailedWarning([Ent.USER, user, Ent.CHAT_EMOJI, filename], str(e), i, count)
26061
+ continue
26062
+ body['payload'] = {'filename': os.path.basename(filename),
26063
+ 'fileContent':base64.urlsafe_b64encode(image_data).decode(UTF8)}
26064
+ try:
26065
+ emoji = callGAPI(chat.customEmojis(), 'create',
26066
+ throwReasons=[GAPI.ALREADY_EXISTS, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED, GAPI.FAILED_PRECONDITION],
26067
+ body=body)
26068
+ _showChatItem(emoji, Ent.CHAT_EMOJI, FJQC, i, count)
26069
+ except (GAPI.alreadyExists, GAPI.invalidArgument, GAPI.permissionDenied) as e:
26070
+ exitIfChatNotConfigured(chat, kvList, str(e), i, count)
26071
+ except GAPI.failedPrecondition:
26072
+ userChatServiceNotEnabledWarning(user, i, count)
26073
+
26074
+ def getEmojiName(myarg):
26075
+ if myarg == 'emojiname':
26076
+ name = _getValidateEmojiName()
26077
+ return 'customEmojis/'+name
26078
+ _, chatEmoji = Cmd.Previous().split('/', 1)
26079
+ return 'customEmojis/'+chatEmoji
26080
+
26081
+ # gam <UserTypeEntity> delete chatemoji <ChatEmoji>
26082
+ def deleteChatEmoji(users):
26083
+ name = None
26084
+ while Cmd.ArgumentsRemaining():
26085
+ myarg = getArgument()
26086
+ if myarg == 'emojiname':
26087
+ name = getEmojiName(myarg)
26088
+ elif myarg.startswith('customemojis/'):
26089
+ name = getEmojiName(myarg)
26090
+ else:
26091
+ unknownArgumentExit()
26092
+ if not name:
26093
+ missingArgumentExit('ChatEmoji')
26094
+ i, count, users = getEntityArgument(users)
26095
+ for user in users:
26096
+ i += 1
26097
+ user, chat, kvList = buildChatServiceObject(API.CHAT_CUSTOM_EMOJIS, user, i, count, [Ent.CHAT_EMOJI, name])
26098
+ if not chat:
26099
+ continue
26100
+ try:
26101
+ callGAPI(chat.customEmojis(), 'delete',
26102
+ throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED, GAPI.FAILED_PRECONDITION],
26103
+ name=name)
26104
+ entityActionPerformed(kvList, i, count)
26105
+ except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
26106
+ exitIfChatNotConfigured(chat, kvList, str(e), i, count)
26107
+ except GAPI.failedPrecondition:
26108
+ userChatServiceNotEnabledWarning(user, i, count)
26109
+
26110
+ # gam <UserTypeEntity> info chatemoji <ChatEmoji>
26111
+ # [formatjson]
26112
+ def infoChatEmoji(users):
26113
+ FJQC = FormatJSONQuoteChar()
26114
+ name = None
26115
+ while Cmd.ArgumentsRemaining():
26116
+ myarg = getArgument()
26117
+ if myarg == 'emojiname':
26118
+ name = getEmojiName(myarg)
26119
+ elif myarg.startswith('customemojis/'):
26120
+ name = getEmojiName(myarg)
26121
+ else:
26122
+ FJQC.GetFormatJSON(myarg)
26123
+ if not name:
26124
+ missingArgumentExit('ChatEmoji')
26125
+ i, count, users = getEntityArgument(users)
26126
+ for user in users:
26127
+ i += 1
26128
+ user, chat, kvList = buildChatServiceObject(API.CHAT_CUSTOM_EMOJIS, user, i, count, [Ent.CHAT_EMOJI, name])
26129
+ if not chat:
26130
+ continue
26131
+ try:
26132
+ emoji = callGAPI(chat.customEmojis(), 'get',
26133
+ throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED, GAPI.FAILED_PRECONDITION],
26134
+ name=name)
26135
+ if not FJQC.formatJSON:
26136
+ entityPerformAction(kvList, i, count)
26137
+ _showChatItem(emoji, Ent.CHAT_EMOJI, FJQC, i, count)
26138
+ except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
26139
+ exitIfChatNotConfigured(chat, kvList, str(e), i, count)
26140
+ except GAPI.failedPrecondition:
26141
+ userChatServiceNotEnabledWarning(user, i, count)
26142
+
26143
+ CHAT_EMOJI_SHOW_CREATED_BY_CHOICE_MAP = {
26144
+ 'any': None,
26145
+ 'me': 'creator("users/me")',
26146
+ 'others': 'NOT creator("users/me")'
26147
+ }
26148
+
26149
+ # gam <UserTypeEntity> show chatemojis
26150
+ # [showcreatedby any|me|others]
26151
+ # [formatjson]
26152
+ # gam <UserTypeEntity> print chatemojis [todrive <ToDriveAttribute>*]
26153
+ # [showcreatedby any|me|others]
26154
+ # [formatjson [quotechar <Character>]]
26155
+ def printShowChatEmojis(users):
26156
+ csvPF = CSVPrintFile(['User', 'name', 'emojiName']) if Act.csvFormat() else None
26157
+ FJQC = FormatJSONQuoteChar(csvPF)
26158
+ pfilter = CHAT_EMOJI_SHOW_CREATED_BY_CHOICE_MAP['me']
26159
+ while Cmd.ArgumentsRemaining():
26160
+ myarg = getArgument()
26161
+ if csvPF and myarg == 'todrive':
26162
+ csvPF.GetTodriveParameters()
26163
+ elif myarg =='showcreatedby':
26164
+ pfilter = getChoice(CHAT_EMOJI_SHOW_CREATED_BY_CHOICE_MAP, mapChoice=True)
26165
+ else:
26166
+ FJQC.GetFormatJSONQuoteChar(myarg, True)
26167
+ i, count, users = getEntityArgument(users)
26168
+ for user in users:
26169
+ i += 1
26170
+ user, chat, kvList = buildChatServiceObject(API.CHAT_CUSTOM_EMOJIS, user, i, count, [Ent.CHAT_EMOJI, None])
26171
+ if not chat:
26172
+ continue
26173
+ try:
26174
+ emojis = callGAPIpages(chat.customEmojis(), 'list', 'customEmojis',
26175
+ pageMessage=_getChatPageMessage(Ent.CHAT_EMOJI, user, i, count, pfilter),
26176
+ throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
26177
+ retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
26178
+ pageSize=CHAT_PAGE_SIZE, filter=pfilter)
26179
+ except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
26180
+ exitIfChatNotConfigured(chat, kvList, str(e), i, count)
26181
+ continue
26182
+ except GAPI.failedPrecondition:
26183
+ userChatServiceNotEnabledWarning(user, i, count)
26184
+ break
26185
+ if not csvPF:
26186
+ jcount = len(emojis)
26187
+ if not FJQC.formatJSON:
26188
+ entityPerformActionNumItems(kvList, jcount, Ent.CHAT_EMOJI, i, count)
26189
+ Ind.Increment()
26190
+ j = 0
26191
+ for emoji in sorted(emojis, key=lambda k: k['emojiName']):
26192
+ j += 1
26193
+ _showChatItem(emoji, Ent.CHAT_EMOJI, FJQC, j, jcount)
26194
+ Ind.Decrement()
26195
+ else:
26196
+ for emoji in sorted(emojis, key=lambda k: k['emojiName']):
26197
+ _printChatItem(user, emoji, '', Ent.CHAT_EMOJI, csvPF, FJQC)
26198
+ if csvPF:
26199
+ csvPF.writeCSVfile('Chat Custom Emojis')
26200
+
26012
26201
  # gam setup chat
26013
26202
  def doSetupChat():
26014
26203
  checkForExtraneousArguments()
@@ -26472,6 +26661,9 @@ def printShowChatSpaces(users):
26472
26661
  substituteQueryTimes(queries, queryTimes)
26473
26662
  pfilter = kwargsCS['query'] = queries[0]
26474
26663
  kwargsCS['useAdminAccess'] = True
26664
+ sortName = 'displayName'
26665
+ else:
26666
+ sortName = 'name'
26475
26667
  for user in users:
26476
26668
  i += 1
26477
26669
  user, chat, kvList = buildChatServiceObject(api, user, i, count, None, useAdminAccess)
@@ -26499,12 +26691,12 @@ def printShowChatSpaces(users):
26499
26691
  entityPerformActionNumItems(kvList, jcount, Ent.CHAT_SPACE, i, count)
26500
26692
  Ind.Increment()
26501
26693
  j = 0
26502
- for space in spaces:
26694
+ for space in sorted(spaces, key=lambda k: k[sortName]):
26503
26695
  j += 1
26504
26696
  _showChatItem(space, Ent.CHAT_SPACE, FJQC, j, jcount)
26505
26697
  Ind.Decrement()
26506
26698
  else:
26507
- for space in spaces:
26699
+ for space in sorted(spaces, key=lambda k: k[sortName]):
26508
26700
  _printChatItem(user, space, None, Ent.CHAT_SPACE, csvPF, FJQC)
26509
26701
  if csvPF:
26510
26702
  csvPF.writeCSVfile('Chat Spaces')
@@ -27139,6 +27331,9 @@ def printShowChatMembers(users):
27139
27331
  i, count, users = getEntityArgument(users)
27140
27332
  if useAdminAccess:
27141
27333
  _chkChatAdminAccess(count)
27334
+ sortName = 'displayName'
27335
+ else:
27336
+ sortName = 'name'
27142
27337
  for user in users:
27143
27338
  i += 1
27144
27339
  user, chat, kvList = buildChatServiceObject(api, user, i, count, [Ent.CHAT_SPACE, None], useAdminAccess)
@@ -27161,7 +27356,7 @@ def printShowChatMembers(users):
27161
27356
  retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
27162
27357
  fields="nextPageToken,spaces(name,displayName,spaceType,membershipCount)", pageSize=CHAT_PAGE_SIZE,
27163
27358
  **kwargsCS)
27164
- for space in spaces:
27359
+ for space in sorted(spaces, key=lambda k: k[sortName]):
27165
27360
  if space['spaceType'] == 'SPACE' and 'membershipCount' in space:
27166
27361
  parentList.append({'name': space['name'], 'displayName': space.get('displayName', 'None')})
27167
27362
  except (GAPI.notFound, GAPI.invalidArgument, GAPI.internalError,
@@ -27178,7 +27373,7 @@ def printShowChatMembers(users):
27178
27373
  retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
27179
27374
  fields="nextPageToken,spaces(name,displayName,spaceType,membershipCount)", pageSize=CHAT_PAGE_SIZE,
27180
27375
  **kwargsCS)
27181
- for space in spaces:
27376
+ for space in sorted(spaces, key=lambda k: k[sortName]):
27182
27377
  # if 'membershipCount' in space:
27183
27378
  # parentList.append({'name': space['name'], 'displayName': space.get('displayName', 'None')})
27184
27379
  parentList.append({'name': space['name'], 'displayName': space.get('displayName', 'None')})
@@ -67871,7 +68066,7 @@ def updatePhoto(users):
67871
68066
  baseFileIdEntity = drive = owner = None
67872
68067
  sourceFolder = os.getcwd()
67873
68068
  if Cmd.NumArgumentsRemaining() == 1:
67874
- filenamePattern = getString(Cmd.OB_PHOTO_FILENAME_PATTERN)
68069
+ filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN)
67875
68070
  else:
67876
68071
  filenamePattern = '#email#.jpg'
67877
68072
  while Cmd.ArgumentsRemaining():
@@ -67883,7 +68078,7 @@ def updatePhoto(users):
67883
68078
  if not os.path.isdir(sourceFolder):
67884
68079
  entityDoesNotExistExit(Ent.DIRECTORY, sourceFolder)
67885
68080
  elif myarg == 'filename':
67886
- filenamePattern = getString(Cmd.OB_PHOTO_FILENAME_PATTERN)
68081
+ filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN)
67887
68082
  elif myarg == 'gphoto':
67888
68083
  owner, drive = buildGAPIServiceObject(API.DRIVE3, getEmailAddress())
67889
68084
  if not drive:
@@ -67984,7 +68179,7 @@ def getPhoto(users, profileMode):
67984
68179
  if not os.path.isdir(targetFolder):
67985
68180
  os.makedirs(targetFolder)
67986
68181
  elif myarg == 'filename':
67987
- filenamePattern = getString(Cmd.OB_PHOTO_FILENAME_PATTERN)
68182
+ filenamePattern = getString(Cmd.OB_FILE_NAME_PATTERN)
67988
68183
  elif myarg == 'nofile':
67989
68184
  writeFileData = False
67990
68185
  elif myarg == 'noshow':
@@ -72411,8 +72606,23 @@ def updateFormRequestUpdateMasks(ubody):
72411
72606
  v['updateMask'] = ','.join(v['updateMask'])
72412
72607
  break
72413
72608
 
72609
+ def _initPublishSettings():
72610
+ return {'publishSettings': {'publishState': {'isPublished': False, 'isAcceptingResponses': False}},
72611
+ 'updateMask': ''}
72612
+
72613
+ def _getPublishSettings(myarg, pbody):
72614
+ if myarg == 'ispublished':
72615
+ pbody['publishSettings']['publishState']['isPublished'] = getBoolean()
72616
+ elif myarg == 'isacceptingresponses':
72617
+ pbody['publishSettings']['publishState']['isAcceptingResponses'] = getBoolean()
72618
+ else:
72619
+ return False
72620
+ pbody['updateMask'] = 'publishState'
72621
+ return True
72622
+
72414
72623
  # gam <UserTypeEntity> create form
72415
72624
  # title <String> [description <String>] [isquiz [<Boolean>]] [<JSONData>]
72625
+ # [ispublished [<Boolean>] isacceptingresponses [<Boolean>]]
72416
72626
  # [drivefilename <DriveFileName>] [<DriveFileParentAttribute>]
72417
72627
  # [(csv [todrive <ToDriveAttribute>*]) | returnidonly]
72418
72628
  def createForm(users):
@@ -72421,6 +72631,7 @@ def createForm(users):
72421
72631
  title = ''
72422
72632
  body = {'mimeType': MIMETYPE_GA_FORM}
72423
72633
  ubody = {'includeFormInResponse': True, 'requests': []}
72634
+ pbody = _initPublishSettings()
72424
72635
  parentParms = initDriveFileAttributes()
72425
72636
  while Cmd.ArgumentsRemaining():
72426
72637
  myarg = getArgument()
@@ -72434,6 +72645,8 @@ def createForm(users):
72434
72645
  elif myarg == 'json':
72435
72646
  jsonData = getJSON([])
72436
72647
  ubody['requests'].extend(jsonData.get('requests', []))
72648
+ elif _getPublishSettings(myarg, pbody):
72649
+ pass
72437
72650
  elif myarg == 'drivefilename':
72438
72651
  body['name'] = getString(Cmd.OB_DRIVE_FILE_NAME)
72439
72652
  elif getDriveFileParentAttribute(myarg, parentParms):
@@ -72474,6 +72687,10 @@ def createForm(users):
72474
72687
  form = callGAPI(gform.forms(), 'batchUpdate',
72475
72688
  throwReasons=[GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
72476
72689
  formId=formId, body=ubody)
72690
+ if pbody['updateMask']:
72691
+ callGAPI(gform.forms(), 'setPublishSettings',
72692
+ throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
72693
+ formId=formId, body=pbody)
72477
72694
  if returnIdOnly:
72478
72695
  writeStdout(f'{formId}\n')
72479
72696
  elif not csvPF:
@@ -72498,8 +72715,10 @@ def createForm(users):
72498
72715
 
72499
72716
  # gam <UserTypeEntity> update form <DriveFileEntity>
72500
72717
  # [title <String>] [description <String>] [isquiz [Boolean>]] [<JSONData>]
72718
+ # [ispublished [<Boolean>] isacceptingresponses [<Boolean>]]
72501
72719
  def updateForm(users):
72502
72720
  ubody = {'includeFormInResponse': False, 'requests': []}
72721
+ pbody = _initPublishSettings()
72503
72722
  fileIdEntity = getDriveFileEntity()
72504
72723
  while Cmd.ArgumentsRemaining():
72505
72724
  myarg = getArgument()
@@ -72512,10 +72731,12 @@ def updateForm(users):
72512
72731
  elif myarg == 'json':
72513
72732
  jsonData = getJSON([])
72514
72733
  ubody['requests'].extend(jsonData.get('requests', []))
72734
+ elif _getPublishSettings(myarg, pbody):
72735
+ pass
72515
72736
  else:
72516
72737
  unknownArgumentExit()
72517
72738
  updateFormRequestUpdateMasks(ubody)
72518
- if not ubody['requests']:
72739
+ if not ubody['requests'] and not pbody['updateMask']:
72519
72740
  return
72520
72741
  i, count, users = getEntityArgument(users)
72521
72742
  for user in users:
@@ -72531,9 +72752,14 @@ def updateForm(users):
72531
72752
  for formId in fileIdEntity['list']:
72532
72753
  j += 1
72533
72754
  try:
72534
- callGAPI(gform.forms(), 'batchUpdate',
72535
- throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
72536
- formId=formId, body=ubody)
72755
+ if ubody['requests']:
72756
+ callGAPI(gform.forms(), 'batchUpdate',
72757
+ throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
72758
+ formId=formId, body=ubody)
72759
+ if pbody['updateMask']:
72760
+ callGAPI(gform.forms(), 'setPublishSettings',
72761
+ throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
72762
+ formId=formId, body=pbody)
72537
72763
  entityActionPerformed([Ent.USER, user, Ent.FORM, formId], j, jcount)
72538
72764
  except (GAPI.notFound, GAPI.invalidArgument) as e:
72539
72765
  entityActionFailedWarning([Ent.USER, user, Ent.FORM, formId], str(e), j, jcount)
@@ -76983,6 +77209,7 @@ USER_ADD_CREATE_FUNCTIONS = {
76983
77209
  Cmd.ARG_CALENDAR: addCreateCalendars,
76984
77210
  Cmd.ARG_GROUP: addUserToGroups,
76985
77211
  Cmd.ARG_CALENDARACL: createCalendarACLs,
77212
+ Cmd.ARG_CHATEMOJI: createChatEmoji,
76986
77213
  Cmd.ARG_CHATMEMBER: createChatMember,
76987
77214
  Cmd.ARG_CHATMESSAGE: createChatMessage,
76988
77215
  Cmd.ARG_CHATSPACE: createChatSpace,
@@ -77099,6 +77326,7 @@ USER_COMMANDS_WITH_OBJECTS = {
77099
77326
  Cmd.ARG_BACKUPCODE: deleteBackupCodes,
77100
77327
  Cmd.ARG_CALENDAR: deleteCalendars,
77101
77328
  Cmd.ARG_CALENDARACL: deleteCalendarACLs,
77329
+ Cmd.ARG_CHATEMOJI: deleteChatEmoji,
77102
77330
  Cmd.ARG_CHATMEMBER: deleteUpdateChatMember,
77103
77331
  Cmd.ARG_CHATMESSAGE: deleteChatMessage,
77104
77332
  Cmd.ARG_CHATSPACE: deleteChatSpace,
@@ -77203,6 +77431,7 @@ USER_COMMANDS_WITH_OBJECTS = {
77203
77431
  (Act.INFO,
77204
77432
  {Cmd.ARG_CALENDAR: infoCalendars,
77205
77433
  Cmd.ARG_CALENDARACL: infoCalendarACLs,
77434
+ Cmd.ARG_CHATEMOJI: infoChatEmoji,
77206
77435
  Cmd.ARG_CHATEVENT: infoChatEvent,
77207
77436
  Cmd.ARG_CHATMEMBER: infoChatMember,
77208
77437
  Cmd.ARG_CHATMESSAGE: infoChatMessage,
@@ -77275,6 +77504,7 @@ USER_COMMANDS_WITH_OBJECTS = {
77275
77504
  Cmd.ARG_CALENDAR: printShowCalendars,
77276
77505
  Cmd.ARG_CALENDARACL: printShowCalendarACLs,
77277
77506
  Cmd.ARG_CALSETTINGS: printShowCalSettings,
77507
+ Cmd.ARG_CHATEMOJI: printShowChatEmojis,
77278
77508
  Cmd.ARG_CHATEVENT: printShowChatEvents,
77279
77509
  Cmd.ARG_CHATMEMBER: printShowChatMembers,
77280
77510
  Cmd.ARG_CHATMESSAGE: printShowChatMessages,
@@ -77382,6 +77612,7 @@ USER_COMMANDS_WITH_OBJECTS = {
77382
77612
  Cmd.ARG_CALENDAR: printShowCalendars,
77383
77613
  Cmd.ARG_CALENDARACL: printShowCalendarACLs,
77384
77614
  Cmd.ARG_CALSETTINGS: printShowCalSettings,
77615
+ Cmd.ARG_CHATEMOJI: printShowChatEmojis,
77385
77616
  Cmd.ARG_CHATEVENT: printShowChatEvents,
77386
77617
  Cmd.ARG_CHATMEMBER: printShowChatMembers,
77387
77618
  Cmd.ARG_CHATMESSAGE: printShowChatMessages,
@@ -77598,6 +77829,7 @@ USER_COMMANDS_OBJ_ALIASES = {
77598
77829
  Cmd.ARG_CLASSIFICATIONLABELPERMISSION: Cmd.ARG_DRIVELABELPERMISSION,
77599
77830
  Cmd.ARG_CLASSIFICATIONLABELPERMISSIONS: Cmd.ARG_DRIVELABELPERMISSION,
77600
77831
  Cmd.ARG_CLASSROOMINVITATIONS: Cmd.ARG_CLASSROOMINVITATION,
77832
+ Cmd.ARG_CHATEMOJIS: Cmd.ARG_CHATEMOJI,
77601
77833
  Cmd.ARG_CHATEVENTS: Cmd.ARG_CHATEVENT,
77602
77834
  Cmd.ARG_CHATMEMBERS: Cmd.ARG_CHATMEMBER,
77603
77835
  Cmd.ARG_CHATMESSAGES: Cmd.ARG_CHATMESSAGE,
@@ -26,6 +26,7 @@ ANALYTICS_ADMIN = 'analyticsadmin'
26
26
  CALENDAR = 'calendar'
27
27
  CBCM = 'cbcm'
28
28
  CHAT = 'chat'
29
+ CHAT_CUSTOM_EMOJIS = 'chatcustomemojis'
29
30
  CHAT_EVENTS = 'chatevents'
30
31
  CHAT_MEMBERSHIPS = 'chatmemberships'
31
32
  CHAT_MEMBERSHIPS_ADMIN = 'chatmembershipsadmin'
@@ -210,6 +211,7 @@ _INFO = {
210
211
  CALENDAR: {'name': 'Calendar API', 'version': 'v3', 'v2discovery': True, 'mappedAPI': 'calendar-json'},
211
212
  CBCM: {'name': 'Chrome Browser Cloud Management API', 'version': 'v1.1beta1', 'v2discovery': True, 'localjson': True},
212
213
  CHAT: {'name': 'Chat API', 'version': 'v1', 'v2discovery': True},
214
+ CHAT_CUSTOM_EMOJIS: {'name': 'Chat API - Custom Emojis', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
213
215
  CHAT_EVENTS: {'name': 'Chat API - Events', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
214
216
  CHAT_MEMBERSHIPS: {'name': 'Chat API - Memberships', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
215
217
  CHAT_MEMBERSHIPS_ADMIN: {'name': 'Chat API - Memberships Admin', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
@@ -544,6 +546,10 @@ _SVCACCT_SCOPES = [
544
546
  'api': CALENDAR,
545
547
  'subscopes': READONLY,
546
548
  'scope': 'https://www.googleapis.com/auth/calendar'},
549
+ {'name': 'Chat API - Custom Emojis',
550
+ 'api': CHAT_CUSTOM_EMOJIS,
551
+ 'subscopes': READONLY,
552
+ 'scope': 'https://www.googleapis.com/auth/chat.customemojis'},
547
553
  {'name': 'Chat API - Memberships',
548
554
  'api': CHAT_MEMBERSHIPS,
549
555
  'subscopes': READONLY,
@@ -644,7 +650,7 @@ _SVCACCT_SCOPES = [
644
650
  'api': GMAIL,
645
651
  'subscopes': [],
646
652
  'scope': 'https://www.googleapis.com/auth/gmail.modify'},
647
- {'name': 'Gmail API - Basic Settings (Filters,IMAP, Language, POP, Vacation) - read/write, Sharing Settings (Delegates, Forwarding, SendAs) - read',
653
+ {'name': 'Gmail API - Basic Settings (Filters, IMAP, Language, POP, Vacation) - read/write, Sharing Settings (Delegates, Forwarding, SendAs) - read',
648
654
  'api': GMAIL,
649
655
  'subscopes': [],
650
656
  'scope': 'https://www.googleapis.com/auth/gmail.settings.basic'},
@@ -461,6 +461,8 @@ class GamCLArgs():
461
461
  ARG_CHANNELSKU = 'channelsku'
462
462
  ARG_CHANNELSKUS = 'channelskus'
463
463
  ARG_CHAT = 'chat'
464
+ ARG_CHATEMOJI = 'chatemoji'
465
+ ARG_CHATEMOJIS = 'chatemojis'
464
466
  ARG_CHATEVENT = 'chatevent'
465
467
  ARG_CHATEVENTS = 'chatevents'
466
468
  ARG_CHATMEMBER = 'chatmember'
@@ -843,6 +845,8 @@ class GamCLArgs():
843
845
  OB_CHARACTER = 'Character'
844
846
  OB_CHAR_SET = 'CharacterSet'
845
847
  OG_CHAT_ATTACHMENT = 'ChatAttachment'
848
+ OB_CHAT_EMOJI = 'ChatEmoji'
849
+ OB_CHAT_EMOJI_NAME = 'ChatEmojiName'
846
850
  OB_CHAT_EVENT = 'ChatEvent'
847
851
  OB_CHAT_MEMBER = 'ChatMember'
848
852
  OB_CHAT_MESSAGE = 'ChatMessage'
@@ -930,6 +934,7 @@ class GamCLArgs():
930
934
  OB_FILE_NAME = 'FileName'
931
935
  OB_FILE_NAME_FIELD_NAME = OB_FILE_NAME+'(:'+OB_FIELD_NAME+')+'
932
936
  OB_FILE_NAME_OR_URL = 'FileName|URL'
937
+ OB_FILE_NAME_PATTERN = 'FileNamePattern'
933
938
  OB_FILE_PATH = 'FilePath'
934
939
  OB_FILTER_ID_ENTITY = 'FilterIDEntity'
935
940
  OB_FORMAT_LIST = 'FormatList'
@@ -975,7 +980,6 @@ class GamCLArgs():
975
980
  OB_PERMISSION_ID_LIST = 'PermissionIDList'
976
981
  OB_PERMISSION_ROLE_LIST = 'PermissionRoleList'
977
982
  OB_PERMISSION_TYPE_LIST = 'PermissionTypeList'
978
- OB_PHOTO_FILENAME_PATTERN = 'FilenameNamePattern'
979
983
  OB_PRINTER_ID = 'PrinterID'
980
984
  OB_PRIVILEGE_LIST = 'PrivilegeList'
981
985
  OB_PRODUCT_ID = 'ProductID'
@@ -86,6 +86,7 @@ class GamEntity():
86
86
  CHANNEL_SKU = 'chsk'
87
87
  CHAT_BOT = 'chbo'
88
88
  CHAT_ADMIN = 'chad'
89
+ CHAT_EMOJI = 'chem'
89
90
  CHAT_EVENT = 'chev'
90
91
  CHAT_MANAGER_USER = 'chgu'
91
92
  CHAT_MEMBER = 'chme'
@@ -436,6 +437,7 @@ class GamEntity():
436
437
  CHANNEL_SKU: ['Channel SKUs', 'Channel SKU'],
437
438
  CHAT_BOT: ['Chat BOTs', 'Chat BOT'],
438
439
  CHAT_ADMIN: ['Chat Admins', 'Chat Admin'],
440
+ CHAT_EMOJI: ['Chat Emojis', 'Chat Emoji'],
439
441
  CHAT_EVENT: ['Chat Events', 'Chat Event'],
440
442
  CHAT_MANAGER_USER: ['Chat User Managers', 'Chat User Manager'],
441
443
  CHAT_MESSAGE: ['Chat Messages', 'Chat Message'],
@@ -309,6 +309,7 @@ INVALID_ALIAS = 'Invalid Alias'
309
309
  INVALID_ATTENDEE_CHANGE = 'Invalid attendee change "{0}"'
310
310
  INVALID_CHARSET = 'Invalid charset "{0}"'
311
311
  INVALID_DATE_TIME_RANGE = '{0} {1} must be greater than/equal to {2} {3}'
312
+ INVALID_EMOJI_NAME = '{0} does not match pattern :[0-9a-z_-]:'
312
313
  INVALID_ENTITY = 'Invalid {0}, {1}'
313
314
  INVALID_EVENT_TIMERANGE = '{0} {1} must be less than {2}'
314
315
  INVALID_FILE_SELECTION_WITH_ADMIN_ACCESS = 'Invalid file selection with adminaccess|asadmin'
@@ -96,7 +96,7 @@
96
96
  banana|basil|blueberry|flamingo|graphite|grape|
97
97
  lavender|peacock|sage|tangerine|tomato
98
98
  <FileFormat> ::=
99
- csv|doc|dot|docx|dotx|epub|html|jpeg|jpg|mht|odp|ods|odt|
99
+ csv|doc|dot|docx|dotx|epub|html|jpeg|jpg|json|mht|odp|ods|odt|
100
100
  pdf|png|ppt|pot|potx|pptx|rtf|svg|tsv|txt|xls|xlt|xlsx|xltx|zip|
101
101
  ms|microsoft|openoffice|
102
102
  <LabelColorHex> ::=
@@ -278,6 +278,8 @@
278
278
  domain:<DomainName>|domain|default
279
279
  <CalendarItem> ::= <EmailAddress>
280
280
  <ChannelCustomerID> ::= <String>
281
+ <ChatEmojiName> ::= :[0-9a-z_-]+:
282
+ <ChatEmoji> ::= emojiname <ChatEmojiName> | customemojis/<String>
281
283
  <ChatMember> ::= spaces/<String>/members/<String>
282
284
  <ChatMessage> ::= spaces/<String>/messages/<String>
283
285
  <ChatSpace> ::= spaces/<String> | space <String> | space spaces/<String>