gam7 7.5.18__tar.gz → 7.5.19__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 (107) hide show
  1. {gam7-7.5.18 → gam7-7.5.19}/PKG-INFO +1 -1
  2. {gam7-7.5.18 → gam7-7.5.19}/src/GamCommands.txt +66 -36
  3. {gam7-7.5.18 → gam7-7.5.19}/src/GamUpdate.txt +38 -0
  4. {gam7-7.5.18 → gam7-7.5.19}/src/gam/__init__.py +79 -31
  5. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glmsgs.py +1 -0
  6. {gam7-7.5.18 → gam7-7.5.19}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  7. {gam7-7.5.18 → gam7-7.5.19}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  8. {gam7-7.5.18 → gam7-7.5.19}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  9. {gam7-7.5.18 → gam7-7.5.19}/.github/ISSUE_TEMPLATE.txt +0 -0
  10. {gam7-7.5.18 → gam7-7.5.19}/.github/actions/creds.tar.xz.gpg +0 -0
  11. {gam7-7.5.18 → gam7-7.5.19}/.github/actions/decrypt.sh +0 -0
  12. {gam7-7.5.18 → gam7-7.5.19}/.github/actions/entitlements.plist +0 -0
  13. {gam7-7.5.18 → gam7-7.5.19}/.github/actions/package_exclusions.txt +0 -0
  14. {gam7-7.5.18 → gam7-7.5.19}/.github/stale.yml +0 -0
  15. {gam7-7.5.18 → gam7-7.5.19}/.github/workflows/build.yml +0 -0
  16. {gam7-7.5.18 → gam7-7.5.19}/.github/workflows/codeql-analysis.yml +0 -0
  17. {gam7-7.5.18 → gam7-7.5.19}/.github/workflows/get-cacerts.yml +0 -0
  18. {gam7-7.5.18 → gam7-7.5.19}/.github/workflows/pypi.yml +0 -0
  19. {gam7-7.5.18 → gam7-7.5.19}/.pre-commit-config.yaml +0 -0
  20. {gam7-7.5.18 → gam7-7.5.19}/LICENSE +0 -0
  21. {gam7-7.5.18 → gam7-7.5.19}/README.md +0 -0
  22. {gam7-7.5.18 → gam7-7.5.19}/pyproject.toml +0 -0
  23. {gam7-7.5.18 → gam7-7.5.19}/src/.gitignore +0 -0
  24. {gam7-7.5.18 → gam7-7.5.19}/src/LICENSE +0 -0
  25. {gam7-7.5.18 → gam7-7.5.19}/src/cacerts.pem +0 -0
  26. {gam7-7.5.18 → gam7-7.5.19}/src/callgam.py +0 -0
  27. {gam7-7.5.18 → gam7-7.5.19}/src/gam/__main__.py +0 -0
  28. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/__init__.py +0 -0
  29. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/auth.py +0 -0
  30. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/client.py +0 -0
  31. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/core.py +0 -0
  32. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/data.py +0 -0
  33. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/http.py +0 -0
  34. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/http_core.py +0 -0
  35. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/http_interface.py +0 -0
  36. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/mock_http.py +0 -0
  37. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/mock_http_core.py +0 -0
  38. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/mock_service.py +0 -0
  39. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/service.py +0 -0
  40. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/token_store.py +0 -0
  41. {gam7-7.5.18 → gam7-7.5.19}/src/gam/atom/url.py +0 -0
  42. {gam7-7.5.18 → gam7-7.5.19}/src/gam/cacerts.pem +0 -0
  43. {gam7-7.5.18 → gam7-7.5.19}/src/gam/cbcm-v1.1beta1.json +0 -0
  44. {gam7-7.5.18 → gam7-7.5.19}/src/gam/contactdelegation-v1.json +0 -0
  45. {gam7-7.5.18 → gam7-7.5.19}/src/gam/datastudio-v1.json +0 -0
  46. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/__init__.py +0 -0
  47. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glaction.py +0 -0
  48. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glapi.py +0 -0
  49. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glcfg.py +0 -0
  50. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glclargs.py +0 -0
  51. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glentity.py +0 -0
  52. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glgapi.py +0 -0
  53. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glgdata.py +0 -0
  54. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glglobals.py +0 -0
  55. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glindent.py +0 -0
  56. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glskus.py +0 -0
  57. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/gluprop.py +0 -0
  58. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/glverlibs.py +0 -0
  59. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gamlib/yubikey.py +0 -0
  60. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/__init__.py +0 -0
  61. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/alt/__init__.py +0 -0
  62. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/alt/app_engine.py +0 -0
  63. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/alt/appengine.py +0 -0
  64. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/apps/__init__.py +0 -0
  65. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/apps/audit/__init__.py +0 -0
  66. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/apps/audit/service.py +0 -0
  67. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  68. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/apps/contacts/service.py +0 -0
  69. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/apps/service.py +0 -0
  70. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/service.py +0 -0
  71. {gam7-7.5.18 → gam7-7.5.19}/src/gam/gdata/urlfetch.py +0 -0
  72. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/__init__.py +0 -0
  73. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/_auth.py +0 -0
  74. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/_helpers.py +0 -0
  75. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/channel.py +0 -0
  76. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/discovery.py +0 -0
  77. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  78. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  79. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  80. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  81. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/errors.py +0 -0
  82. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/http.py +0 -0
  83. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/mimeparse.py +0 -0
  84. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/model.py +0 -0
  85. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/schema.py +0 -0
  86. {gam7-7.5.18 → gam7-7.5.19}/src/gam/googleapiclient/version.py +0 -0
  87. {gam7-7.5.18 → gam7-7.5.19}/src/gam/iso8601/__init__.py +0 -0
  88. {gam7-7.5.18 → gam7-7.5.19}/src/gam/iso8601/iso8601.py +0 -0
  89. {gam7-7.5.18 → gam7-7.5.19}/src/gam/meet-v2beta.json +0 -0
  90. {gam7-7.5.18 → gam7-7.5.19}/src/gam/serviceaccountlookup-v1.json +0 -0
  91. {gam7-7.5.18 → gam7-7.5.19}/src/gam/six.py +0 -0
  92. {gam7-7.5.18 → gam7-7.5.19}/src/gam-install.sh +0 -0
  93. {gam7-7.5.18 → gam7-7.5.19}/src/gam-setup.bat +0 -0
  94. {gam7-7.5.18 → gam7-7.5.19}/src/gam.exe.manifest +0 -0
  95. {gam7-7.5.18 → gam7-7.5.19}/src/gam.py +0 -0
  96. {gam7-7.5.18 → gam7-7.5.19}/src/gam.spec +0 -0
  97. {gam7-7.5.18 → gam7-7.5.19}/src/gam.wxs +0 -0
  98. {gam7-7.5.18 → gam7-7.5.19}/src/license.rtf +0 -0
  99. {gam7-7.5.18 → gam7-7.5.19}/src/requirements-dev.txt +0 -0
  100. {gam7-7.5.18 → gam7-7.5.19}/src/requirements.txt +0 -0
  101. {gam7-7.5.18 → gam7-7.5.19}/src/setup.cfg +0 -0
  102. {gam7-7.5.18 → gam7-7.5.19}/src/setup.py +0 -0
  103. {gam7-7.5.18 → gam7-7.5.19}/src/tools/a_atleast_b.py +0 -0
  104. {gam7-7.5.18 → gam7-7.5.19}/src/tools/gen-wix-xml-filelist.py +0 -0
  105. {gam7-7.5.18 → gam7-7.5.19}/src/tools/mkGamRef.py +0 -0
  106. {gam7-7.5.18 → gam7-7.5.19}/src/tools/openssl.props +0 -0
  107. {gam7-7.5.18 → gam7-7.5.19}/src/version_info.txt.in +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.5.18
3
+ Version: 7.5.19
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
@@ -1908,7 +1908,7 @@ gam calendar|calendars <CalendarEntity> modify <CalendarSettings>+
1908
1908
 
1909
1909
  <ChatContent> ::=
1910
1910
  ((text <String>)|
1911
- (textfile <FileName> [charset <CharSet>])|
1911
+ (textfile <FileName> [charset <Charset>])|
1912
1912
  (gdoc <UserGoogleDoc>)|
1913
1913
  (gcsdoc <StorageBucketObjectName>))
1914
1914
 
@@ -4735,8 +4735,10 @@ gam sendemail [recipient|to] <RecipientEntity>
4735
4735
  [from <EmailAddress>] [mailbox <EmailAddress>] [replyto <EmailAddress>]
4736
4736
  [cc <RecipientEntity>] [bcc <RecipientEntity>] [singlemessage]
4737
4737
  [subject <String>]
4738
- [<MessageContent>] (replace <Tag> <String>)*
4739
- [html [<Boolean>]] (attach <FileName> [charset <CharSet>])*
4738
+ [<MessageContent>]
4739
+ (replace <Tag> <String>)*
4740
+ (replaceregex <RegularExpression> <String> <Tag> <String>)*
4741
+ [html [<Boolean>]] (attach <FileName> [charset <Charset>])*
4740
4742
  (embedimage <FileName> <String>)*
4741
4743
  [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
4742
4744
  (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
@@ -4744,8 +4746,10 @@ gam <UserTypeEntity> sendemail recipient|to <RecipientEntity>
4744
4746
  [replyto <EmailAddress>]
4745
4747
  [cc <RecipientEntity>] [bcc <RecipientEntity>] [singlemessage]
4746
4748
  [subject <String>]
4747
- [<MessageContent>] (replace <Tag> <String>)*
4748
- [html [<Boolean>]] (attach <FileName> [charset <CharSet>])*
4749
+ [<MessageContent>]
4750
+ (replace <Tag> <String>)*
4751
+ (replaceregex <RegularExpression> <String> <Tag> <String>)*
4752
+ [html [<Boolean>]] (attach <FileName> [charset <Charset>])*
4749
4753
  (embedimage <FileName> <String>)*
4750
4754
  [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
4751
4755
  (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
@@ -4753,8 +4757,10 @@ gam <UserTypeEntity> sendemail from <EmailAddress>
4753
4757
  [replyto <EmailAddress>]
4754
4758
  [cc <RecipientEntity>] [bcc <RecipientEntity>] [singlemessage]
4755
4759
  [subject <String>]
4756
- [<MessageContent>] (replace <Tag> <String>)*
4757
- [html [<Boolean>]] (attach <FileName> [charset <CharSet>])*
4760
+ [<MessageContent>]
4761
+ (replace <Tag> <String>)*
4762
+ (replaceregex <RegularExpression> <String> <Tag> <String>)*
4763
+ [html [<Boolean>]] (attach <FileName> [charset <Charset>])*
4758
4764
  (embedimage <FileName> <String>)*
4759
4765
  [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
4760
4766
  (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
@@ -5560,7 +5566,9 @@ gam create|add user <EmailAddress> [ignorenullpassword] <UserAttribute>*
5560
5566
  [mailbox <EmailAaddress>]
5561
5567
  [replyto <EmailAaddress>]
5562
5568
  [<NotifyMessageContent>]
5563
- (replace <Tag> <UserReplacement>)*]
5569
+ (replace <Tag> <UserReplacement>)*
5570
+ (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*
5571
+ ]
5564
5572
  [logpassword <FileName>]
5565
5573
  [addnumericsuffixonduplicate <Number>]
5566
5574
 
@@ -5569,7 +5577,7 @@ gam <UserTypeEntity> waitformailbox [retries <Number>]
5569
5577
  gam update user <UserItem> [ignorenullpassword] <UserAttribute>*
5570
5578
  [verifynotinvitable|alwaysevict] [noactionifalias]
5571
5579
  [updateprimaryemail <RegularExpression> <EmailReplacement>]
5572
- [updateoufromgroup <FileName> [charset <CharSet>]
5580
+ [updateoufromgroup <FileName> [charset <Charset>]
5573
5581
  [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
5574
5582
  [fields <FieldNameList>] [keyfield <FieldName>] [datafield <FieldName>]]
5575
5583
  [immutableous <OrgUnitEntity>]|
@@ -5581,10 +5589,12 @@ gam update user <UserItem> [ignorenullpassword] <UserAttribute>*
5581
5589
  [subject <String>]
5582
5590
  [notifypassword <String>]
5583
5591
  [from <EmailAaddress>]
5584
- [mailbox <EmailAaddress>]
5585
- [replyto <EmailAaddress>]
5592
+ [mailbox <EmailAddress>]
5593
+ [replyto <EmailAddress>]
5586
5594
  [<NotifyMessageContent>]
5587
- (replace <Tag> <UserReplacement>)*]
5595
+ (replace <Tag> <UserReplacement>)*
5596
+ (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*
5597
+ ]
5588
5598
  [notifyonupdate [<Boolean>]] [setchangepasswordoncreate [<Boolean>]]
5589
5599
  [logpassword <FileName>]
5590
5600
  gam delete user <UserItem> [noactionifalias]
@@ -5603,9 +5613,9 @@ gam info user [<UserItem>]
5603
5613
  [formatjson]
5604
5614
 
5605
5615
  gam update users <UserTypeEntity> [ignorenullpassword] <UserAttribute>*
5606
- [verifynotinvitable] [noactionifalias]
5616
+ [verifynotinvitable|alwaysevict] [noactionifalias]
5607
5617
  [updateprimaryemail <RegularExpression> <EmailReplacement>]
5608
- [updateoufromgroup <FileName> [charset <CharSet>]
5618
+ [updateoufromgroup <FileName> [charset <Charset>]
5609
5619
  [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
5610
5620
  [fields <FieldNameList>] [keyfield <FieldName>] [datafield <FieldName>]]
5611
5621
  [clearschema <SchemaName>|<SchemaNameField>]
@@ -5615,13 +5625,15 @@ gam update users <UserTypeEntity> [ignorenullpassword] <UserAttribute>*
5615
5625
  [notify <EmailAddressList>
5616
5626
  [subject <String>]
5617
5627
  [notifypassword <String>]
5618
- [from <EmailAaddress>]
5619
- [mailbox <EmailAaddress>]
5628
+ [from <EmailAddress>]
5629
+ [mailbox <EmailAddress>]
5630
+ [replyto <EmailAaddress>]
5620
5631
  [<NotifyMessageContent>]
5621
- (replace <Tag> <UserReplacement>)*]
5632
+ (replace <Tag> <UserReplacement>)*
5633
+ (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*
5634
+ ]
5622
5635
  [notifyonupdate [<Boolean>]] [setchangepasswordoncreate [<Boolean>]]
5623
5636
  [logpassword <FileName>]
5624
- [verifynotinvitable]
5625
5637
  gam delete users <UserTypeEntity> [noactionifalias]
5626
5638
  gam undelete users <UserEntity> [ou|org|orgunit <OrgUnitPath>]
5627
5639
  gam suspend users <UserTypeEntity> [noactionifalias]
@@ -5638,9 +5650,11 @@ gam info users <UserTypeEntity>
5638
5650
  [formatjson]
5639
5651
 
5640
5652
  gam <UserTypeEntity> update users [ignorenullpassword] <UserAttribute>*
5641
- [verifynotinvitable] [noactionifalias]
5653
+ [verifynotinvitable|alwaysevict] [noactionifalias]
5642
5654
  [updateprimaryemail <RegularExpression> <EmailReplacement>]
5643
- [updateoufromgroup <CSVFileInput> [keyfield <FieldName>] [datafield <FieldName>]]
5655
+ [updateoufromgroup <FileName> [charset <Charset>]
5656
+ [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
5657
+ [fields <FieldNameList>] [keyfield <FieldName>] [datafield <FieldName>]]
5644
5658
  [clearschema <SchemaName>|<SchemaNameField>]
5645
5659
  [createifnotfound] [notfoundpassword (random [<Integer>])|blocklogin|<Password>]
5646
5660
  (groups [<GroupRole>] [[delivery] <DeliverySetting>] <GroupEntity>)*
@@ -5649,12 +5663,14 @@ gam <UserTypeEntity> update users [ignorenullpassword] <UserAttribute>*
5649
5663
  [subject <String>]
5650
5664
  [notifypassword <String>]
5651
5665
  [from <EmailAaddress>]
5652
- [mailbox <EmailAaddress>]
5666
+ [mailbox <EmailAddress>]
5667
+ [replyto <EmailAddress>]
5653
5668
  [<NotifyMessageContent>]
5654
- (replace <Tag> <UserReplacement>)*]
5669
+ (replace <Tag> <UserReplacement>)*
5670
+ (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*
5671
+ ]
5655
5672
  [notifyonupdate [<Boolean>]] [setchangepasswordoncreate [<Boolean>]]
5656
5673
  [logpassword <FileName>]
5657
- [verifynotinvitable]
5658
5674
  gam <UserTypeEntity> delete users [noactionifalias]
5659
5675
  gam <UserEntity> undelete users [ou|org|orgunit <OrgUnitPath>]
5660
5676
  gam <UserTypeEntity> suspend users [noactionifalias]
@@ -6165,7 +6181,7 @@ gam <UserTypeEntity> print focustime|outofoffice|workinglocation
6165
6181
 
6166
6182
  <ChatContent> ::=
6167
6183
  ((text <String>)|
6168
- (textfile <FileName> [charset <CharSet>])|
6184
+ (textfile <FileName> [charset <Charset>])|
6169
6185
  (gdoc <UserGoogleDoc>)|
6170
6186
  (gcsdoc <StorageBucketObjectName>))
6171
6187
 
@@ -6527,7 +6543,7 @@ gam <UserTypeEntity> update drivefile <DriveFileEntity> [copy] [returnidonly|ret
6527
6543
  [timestamp [<Boolean>]] [timeformat <String>]
6528
6544
  <DriveFileUpdateAttribute>*
6529
6545
  [(gsheet|csvsheet <SheetEntity> [clearfilter])|(addsheet <String>)]
6530
- [charset <CharSet>] [columndelimiter <Character>]
6546
+ [charset <Charset>] [columndelimiter <Character>]
6531
6547
 
6532
6548
  <DriveFileCopyAttribute> ::=
6533
6549
  (contentrestrictions (readonly false)|(readonly true [reason <String>]) [ownerrestricted [<Boolean>]])|
@@ -7532,22 +7548,28 @@ gam <UserTypeEntity> print labels|label [todrive <ToDriveAttribute>*]
7532
7548
  (emlfile <FileName> [charset <Charset>])
7533
7549
 
7534
7550
  gam <UserTypeEntity> draft message
7535
- <MessageContent> (replace <Tag> <UserReplacement>)*
7551
+ <MessageContent>
7552
+ (replace <Tag> <UserReplacement>)*
7553
+ (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*
7536
7554
  (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
7537
- (attach <FileName> [charset <CharSet>])*
7555
+ (attach <FileName> [charset <Charset>])*
7538
7556
  (embedimage <FileName> <String>)*
7539
7557
  gam <UserTypeEntity> import message
7540
- <MessageContent> (replace <Tag> <UserReplacement>)*
7558
+ <MessageContent>
7559
+ (replace <Tag> <UserReplacement>)*
7560
+ (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*
7541
7561
  (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
7542
7562
  (addlabel <LabelName>)* [labels <LabelNameList>]
7543
- (attach <FileName> [charset <CharSet>])*
7563
+ (attach <FileName> [charset <Charset>])*
7544
7564
  (embedimage <FileName> <String>)*
7545
7565
  [deleted [<Boolean>]] [checkspam|nevermarkspam [<Boolean>]] [processforcalendar [<Boolean>]]
7546
7566
  gam <UserTypeEntity> insert message
7547
- <MessageContent> (replace <Tag> <UserReplacement>)*
7567
+ <MessageContent>
7568
+ (replace <Tag> <UserReplacement>)*
7569
+ (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*
7548
7570
  (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
7549
7571
  (addlabel <LabelName>)* [labels <LabelNameList>]
7550
- (attach <FileName> [charset <CharSet>])*
7572
+ (attach <FileName> [charset <Charset>])*
7551
7573
  (embedimage <FileName> <String>)*
7552
7574
  [deleted [<Boolean>]]
7553
7575
 
@@ -7626,13 +7648,17 @@ gam <UserTypeEntity> print gmailprofile [todrive <ToDriveAttribute>*]
7626
7648
  # Users - Gmail - Send As/Signature/Vacation
7627
7649
 
7628
7650
  gam <UserTypeEntity> [create|add] sendas <EmailAddress> [name] <String>
7629
- [<SendAsContent> (replace <Tag> <UserReplacement>)*]
7651
+ [<SendAsContent>
7652
+ (replace <Tag> <UserReplacement>)*
7653
+ (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*]
7630
7654
  [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
7631
7655
  [smtpmsa.host <SMTPHostName> smtpmsa.port 25|465|587
7632
7656
  smtpmsa.username <UserName> smtpmsa.password <Password>
7633
7657
  [smtpmsa.securitymode none|ssl|starttls]]
7634
7658
  gam <UserTypeEntity> update sendas <EmailAddress> [name <String>]
7635
- [<SendAsContent> (replace <Tag> <UserReplacement>)*]
7659
+ [<SendAsContent>
7660
+ (replace <Tag> <UserReplacement>)*
7661
+ (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*]
7636
7662
  [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
7637
7663
  gam <UserTypeEntity> delete sendas <EmailAddressEntity>
7638
7664
  gam <UserTypeEntity> info sendas <EmailAddressEntity> [compact|format|html]
@@ -7642,7 +7668,9 @@ gam <UserTypeEntity> print sendas [compact]
7642
7668
  [primary|default] [verifyonly] [todrive <ToDriveAttribute>*]
7643
7669
 
7644
7670
  gam <UserTypeEntity> signature|sig
7645
- <SignatureContent> (replace <Tag> <UserReplacement>)*
7671
+ <SignatureContent>
7672
+ (replace <Tag> <UserReplacement>)*
7673
+ (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*
7646
7674
  [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
7647
7675
  [name <String>]
7648
7676
  [primary]
@@ -7652,7 +7680,9 @@ gam <UserTypeEntity> print signature [compact]
7652
7680
  [primary|default] [verifyonly] [todrive <ToDriveAttribute>*]
7653
7681
 
7654
7682
  gam <UserTypeEntity> vacation [<Boolean>] [subject <String>]
7655
- [<VacationMessageContent> (replace <Tag> <UserReplacement>)*]
7683
+ [<VacationMessageContent>
7684
+ (replace <Tag> <UserReplacement>)*
7685
+ (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*]
7656
7686
  [html [<Boolean>]] [contactsonly [<Boolean>]] [domainonly [<Boolean>]]
7657
7687
  [start|startdate <Date>|Started] [end|enddate <Date>|NotSpecified]
7658
7688
  gam <UserTypeEntity> show vacation [compact|format|html] [enabledonly]
@@ -7779,7 +7809,7 @@ gam <UserTypeEntity> check isinvitable [todrive <ToDriveAttribute>*]
7779
7809
 
7780
7810
  <NoteContent> ::=
7781
7811
  ((text <String>)|
7782
- (textfile <FileName> [charset <CharSet>])|
7812
+ (textfile <FileName> [charset <Charset>])|
7783
7813
  (gdoc <UserGoogleDoc>)|
7784
7814
  (gcsdoc <StorageBucketObjectName>)|
7785
7815
  <JSONData>)
@@ -1,3 +1,41 @@
1
+ 7.05.19
2
+
3
+ Added `replaceregex <RegularExpression> <ReplacementString> <Tag> <String>` to the following commands:
4
+ ```
5
+ gam sendemail subject <String> <MessageContent>
6
+ gam <UserTypeEntity> sendemail subject <String> <MessageContent>
7
+ ```
8
+
9
+ The `<RegularExpression>` is used as a match pattern against `<String>` to produce `<ReplacementString>`.
10
+ Instances of `{Tag}` will be replaced by `<ReplacementString>` in the message subject and body.
11
+
12
+ Added `replaceregex <RegularExpression> <ReplacementString> <Tag> <UserReplacement>` to the following commands:
13
+ ```
14
+ gam create user <NotifyMessageContent>
15
+ gam update user <NotifyMessageContent>
16
+ gam update users <NotifyMessageContent>
17
+ gam <UserTypeEntity> update users <NotifyMessageContent>
18
+ gam <UserTypeEntity> draft message <MessageContent>
19
+ gam <UserTypeEntity> import message <MessageContent>
20
+ gam <UserTypeEntity> insert messageo <MessageContent>
21
+ gam <UserTypeEntity> create sendas <SendAsContent>
22
+ gam <UserTypeEntity> update sendas <SendAsContent>
23
+ gam <UserTypeEntity> signature <SignatureContent>
24
+ gam <UserTypeEntity> vacation subject <String> <VacationMessageContent>
25
+ ```
26
+
27
+ The `<RegularExpression>` is used as a match pattern against `<UserReplacement>` to produce `<ReplacementString>`.
28
+ Instances of `{Tag}` will be replaced by `<ReplacementString>` in the indicated items.
29
+
30
+ For example, when adding a phone number to a signature, an unformatted number can be formatted:
31
+ ```
32
+ replaceregex "(\d{3})(\d{3})(\d{4})" "(\1) \2-\3" Phone "9876543210"
33
+ replaces 9876543210 with (987) 654-3210
34
+
35
+ replaceregex "(\+\d{2})(\d{3})(\d{3})(\d{3})" "\1 \2 \3 \4" Phone "+61987654321"
36
+ replaces +61421221506 with +61 987 654 321
37
+ ```
38
+
1
39
  7.05.18
2
40
 
3
41
  Updated `gam calendars <CalendarEntity> show events` and `gam <UserTypeEntity> show events`
@@ -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.05.18'
28
+ __version__ = '7.05.19'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -14517,7 +14517,13 @@ def _initTagReplacements():
14517
14517
  'fieldsSet': set(), 'fields': '',
14518
14518
  'schemasSet': set(), 'customFieldMask': None}
14519
14519
 
14520
- def _getTagReplacement(tagReplacements, allowSubs):
14520
+ def _getTagReplacement(myarg, tagReplacements, allowSubs):
14521
+ if myarg == 'replace':
14522
+ trregex = None
14523
+ elif myarg == 'replaceregex':
14524
+ trregex = (getREPattern(re.IGNORECASE), getString(Cmd.OB_STRING, minLen=0))
14525
+ else:
14526
+ return False
14521
14527
  matchTag = getString(Cmd.OB_TAG)
14522
14528
  matchReplacement = getString(Cmd.OB_STRING, minLen=0)
14523
14529
  if matchReplacement.startswith('field:'):
@@ -14562,7 +14568,8 @@ def _getTagReplacement(tagReplacements, allowSubs):
14562
14568
  tagReplacements['fieldsSet'].add(field)
14563
14569
  tagReplacements['fields'] = ','.join(tagReplacements['fieldsSet'])
14564
14570
  tagReplacements['tags'][matchTag] = {'field': field, 'subfield': subfield,
14565
- 'matchfield': matchfield, 'matchvalue': matchvalue, 'value': ''}
14571
+ 'matchfield': matchfield, 'matchvalue': matchvalue, 'value': '',
14572
+ 'trregex': trregex}
14566
14573
  if field == 'locations' and subfield == 'buildingName':
14567
14574
  _makeBuildingIdNameMap()
14568
14575
  elif matchReplacement.startswith('schema:'):
@@ -14580,15 +14587,24 @@ def _getTagReplacement(tagReplacements, allowSubs):
14580
14587
  tagReplacements['fields'] = ','.join(tagReplacements['fieldsSet'])
14581
14588
  tagReplacements['schemasSet'].add(schemaName)
14582
14589
  tagReplacements['customFieldMask'] = ','.join(tagReplacements['schemasSet'])
14583
- tagReplacements['tags'][matchTag] = {'schema': schemaName, 'schemafield': schemaField, 'value': ''}
14590
+ tagReplacements['tags'][matchTag] = {'schema': schemaName, 'schemafield': schemaField, 'value': '',
14591
+ 'trregex': trregex}
14584
14592
  elif ((matchReplacement.find('#') >= 0) and
14585
14593
  (matchReplacement.find('#user#') >= 0) or (matchReplacement.find('#email#') >= 0) or (matchReplacement.find('#username#') >= 0)):
14586
14594
  if not allowSubs:
14587
14595
  usageErrorExit(Msg.USER_SUBS_NOT_ALLOWED_TAG_REPLACEMENT)
14588
14596
  tagReplacements['subs'] = True
14589
- tagReplacements['tags'][matchTag] = {'template': matchReplacement, 'value': ''}
14597
+ tagReplacements['tags'][matchTag] = {'template': matchReplacement, 'value': '',
14598
+ 'trregex': trregex}
14590
14599
  else:
14591
- tagReplacements['tags'][matchTag] = {'value': matchReplacement}
14600
+ if trregex is None:
14601
+ tagReplacements['tags'][matchTag] = {'value': matchReplacement}
14602
+ else:
14603
+ try:
14604
+ tagReplacements['tags'][matchTag] = {'value': re.sub(trregex[0], trregex[1], matchReplacement)}
14605
+ except re.error as e:
14606
+ systemErrorExit(ACTION_FAILED_RC, Msg.REGEX_REPLACEMENT_ERROR.format(trregex[1], str(e)))
14607
+ return True
14592
14608
 
14593
14609
  def _getTagReplacementFieldValues(user, i, count, tagReplacements, results=None):
14594
14610
  if results is None:
@@ -14670,6 +14686,12 @@ def _getTagReplacementFieldValues(user, i, count, tagReplacements, results=None)
14670
14686
  tag['value'] = str(results.get('customSchemas', {}).get(tag['schema'], {}).get(tag['schemafield'], ''))
14671
14687
  elif tag.get('template'):
14672
14688
  tag['value'] = _substituteForUser(tag['template'], user, userName)
14689
+ trregex = tag.get('trregex', None)
14690
+ if trregex is not None:
14691
+ try:
14692
+ tag['value'] = re.sub(trregex[0], trregex[1], tag['value'])
14693
+ except re.error as e:
14694
+ systemErrorExit(ACTION_FAILED_RC, Msg.REGEX_REPLACEMENT_ERROR.format(trregex[1], str(e)))
14673
14695
 
14674
14696
  RTL_PATTERN = re.compile(r'(?s){RTL}.*?{/RTL}')
14675
14697
  RT_PATTERN = re.compile(r'(?s){RT}.*?{/RT}')
@@ -14922,7 +14944,9 @@ def getRecipients():
14922
14944
  # gam sendemail [recipient|to] <RecipientEntity> [from <EmailAddress>] [mailbox <EmailAddress>] [replyto <EmailAddress>]
14923
14945
  # [cc <RecipientEntity>] [bcc <RecipientEntity>] [singlemessage]
14924
14946
  # [subject <String>]
14925
- # [<MessageContent>] (replace <Tag> <String>)*
14947
+ # [<MessageContent>]
14948
+ # (replace <Tag> <String>)*
14949
+ # (replaceregex <RegularExpression> <String> <Tag> <String>)*
14926
14950
  # [html [<Boolean>]] (attach <FileName> [charset <CharSet>])*
14927
14951
  # (embedimage <FileName> <String>)*
14928
14952
  # [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
@@ -14930,7 +14954,9 @@ def getRecipients():
14930
14954
  # gam <UserTypeEntity> sendemail recipient <RecipientEntity> [replyto <EmailAddress>]
14931
14955
  # [cc <RecipientEntity>] [bcc <RecipientEntity>] [singlemessage]
14932
14956
  # [subject <String>]
14933
- # [<MessageContent>] (replace <Tag> <String>)*
14957
+ # [<MessageContent>]
14958
+ # (replace <Tag> <String>)*
14959
+ # (replaceregex <RegularExpression> <String> <Tag> <String>)*
14934
14960
  # [html [<Boolean>]] (attach <FileName> [charset <CharSet>])*
14935
14961
  # (embedimage <FileName> <String>)*
14936
14962
  # [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
@@ -14938,7 +14964,9 @@ def getRecipients():
14938
14964
  # gam <UserTypeEntity> sendemail from <EmailAddress> [replyto <EmailAddress>]
14939
14965
  # [cc <RecipientEntity>] [bcc <RecipientEntity>] [singlemessage]
14940
14966
  # [subject <String>]
14941
- # [<MessageContent>] (replace <Tag> <String>)*
14967
+ # [<MessageContent>]
14968
+ # (replace <Tag> <String>)*
14969
+ # (replaceregex <RegularExpression> <String> <Tag> <String>)*
14942
14970
  # [html [<Boolean>]] (attach <FileName> [charset <CharSet>])*
14943
14971
  # (embedimage <FileName> <String>)*
14944
14972
  # [newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
@@ -15001,8 +15029,8 @@ def doSendEmail(users=None):
15001
15029
  body['name']['familyName'] = getString(Cmd.OB_STRING, minLen=0, maxLen=60)
15002
15030
  elif myarg in {'password', 'notifypassword'}:
15003
15031
  body['password'] = notify['password'] = getString(Cmd.OB_PASSWORD, maxLen=100)
15004
- elif myarg == 'replace':
15005
- _getTagReplacement(tagReplacements, False)
15032
+ elif _getTagReplacement(myarg, tagReplacements, False):
15033
+ pass
15006
15034
  elif myarg == 'attach':
15007
15035
  attachments.append((getFilename(), getCharSet()))
15008
15036
  elif myarg == 'embedimage':
@@ -39081,7 +39109,10 @@ def _updateCalendarEvents(origUser, user, origCal, calIds, count, calendarEventE
39081
39109
  if 'description' in updateFieldList and 'description' in event:
39082
39110
  body['description'] = event['description']
39083
39111
  for replacement in parameters['replaceDescription']:
39084
- body['description'] = re.sub(replacement[0], replacement[1], body['description'])
39112
+ try:
39113
+ body['description'] = re.sub(replacement[0], replacement[1], body['description'])
39114
+ except re.error as e:
39115
+ systemErrorExit(ACTION_FAILED_RC, Msg.REGEX_REPLACEMENT_ERROR.format(replacement[1], str(e)))
39085
39116
  if 'attendees' in updateFieldList:
39086
39117
  if not parameters['clearAttendees']:
39087
39118
  if 'attendees' in event:
@@ -42835,8 +42866,8 @@ def getUserAttributes(cd, updateCmd, noUid=False):
42835
42866
  notify['mailbox'] = getString(Cmd.OB_EMAIL_ADDRESS)
42836
42867
  elif PwdOpts.ProcessArgument(myarg, notify, notFoundBody):
42837
42868
  pass
42838
- elif myarg == 'replace':
42839
- _getTagReplacement(tagReplacements, True)
42869
+ elif _getTagReplacement(myarg, tagReplacements, True):
42870
+ pass
42840
42871
  elif myarg == 'admin':
42841
42872
  value = getBoolean()
42842
42873
  if updateCmd or value:
@@ -43253,9 +43284,9 @@ def createUserAddAliases(cd, user, aliasList, i, count):
43253
43284
  # [from <EmailAaddress>]
43254
43285
  # [replyto <EmailAaddress>]
43255
43286
  # [<NotifyMessageContent>]
43256
- # (replace <Tag> <UserReplacement>)*]
43287
+ # (replace <Tag> <UserReplacement>)*
43288
+ # (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*]
43257
43289
  # [logpassword <FileName>] [ignorenullpassword]
43258
- # [verifynotinvitable]
43259
43290
  # [addnumericsuffixonduplicate <Number>]
43260
43291
  def doCreateUser():
43261
43292
  cd = buildGAPIObject(API.DIRECTORY)
@@ -43354,8 +43385,9 @@ def verifyUserPrimaryEmail(cd, user, createIfNotFound, i, count):
43354
43385
  # [notifypassword <String>]
43355
43386
  # [from <EmailAaddress>]
43356
43387
  # [replyto <EmailAaddress>]
43357
- # [<NotifyMessageContent>]
43358
- # (replace <Tag> <UserReplacement>)*]
43388
+ # [<NotifyMessageContent>
43389
+ # (replace <Tag> <UserReplacement>)*
43390
+ # (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*]
43359
43391
  # [notifyonupdate [<Boolean>]]
43360
43392
  # [logpassword <FileName>] [ignorenullpassword]
43361
43393
  def updateUsers(entityList):
@@ -57348,7 +57380,10 @@ def writeReturnIdLink(returnIdLink, mimeType, result):
57348
57380
 
57349
57381
  def processFilenameReplacements(name, replacements):
57350
57382
  for replacement in replacements:
57351
- name = re.sub(replacement[0], replacement[1], name)
57383
+ try:
57384
+ name = re.sub(replacement[0], replacement[1], name)
57385
+ except re.error as e:
57386
+ systemErrorExit(ACTION_FAILED_RC, Msg.REGEX_REPLACEMENT_ERROR.format(replacement[1], str(e)))
57352
57387
  return name
57353
57388
 
57354
57389
  def addTimestampToFilename(parameters, body):
@@ -69991,8 +70026,8 @@ def _draftImportInsertMessage(users, operation):
69991
70026
  internalDateSource = 'dateHeader'
69992
70027
  if checkArgumentPresent('emlutf8'):
69993
70028
  emlEncoding = UTF8
69994
- elif myarg == 'replace':
69995
- _getTagReplacement(tagReplacements, True)
70029
+ elif _getTagReplacement(myarg, tagReplacements, True):
70030
+ pass
69996
70031
  elif operation in IMPORT_INSERT and myarg == 'addlabel':
69997
70032
  addLabelNames.append(getString(Cmd.OB_LABEL_NAME, minLen=1))
69998
70033
  elif operation in IMPORT_INSERT and myarg == 'labels':
@@ -70127,7 +70162,9 @@ def _draftImportInsertMessage(users, operation):
70127
70162
  userGmailServiceNotEnabledWarning(user, i, count)
70128
70163
 
70129
70164
  # gam <UserTypeEntity> draft message
70130
- # <MessageContent> (replace <Tag> <UserReplacement>)*
70165
+ # <MessageContent>
70166
+ # (replace <Tag> <UserReplacement>)*
70167
+ # (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*
70131
70168
  # (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
70132
70169
  # (attach <FileName> [charset <CharSet>])*
70133
70170
  # (embedimage <FileName> <String>)*
@@ -70135,7 +70172,9 @@ def draftMessage(users):
70135
70172
  _draftImportInsertMessage(users, 'draft')
70136
70173
 
70137
70174
  # gam <UserTypeEntity> import message
70138
- # <MessageContent> (replace <Tag> <UserReplacement>)*
70175
+ # <MessageContent>
70176
+ # (replace <Tag> <UserReplacement>)*
70177
+ # (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*
70139
70178
  # (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
70140
70179
  # (addlabel <LabelName>)* [labels <LabelNameList>]
70141
70180
  # (attach <FileName> [charset <CharSet>])*
@@ -70145,7 +70184,9 @@ def importMessage(users):
70145
70184
  _draftImportInsertMessage(users, 'import')
70146
70185
 
70147
70186
  # gam <UserTypeEntity> insert message
70148
- # <MessageContent> (replace <Tag> <UserReplacement>)*
70187
+ # <MessageContent>
70188
+ # (replace <Tag> <UserReplacement>)*
70189
+ # (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*
70149
70190
  # (<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
70150
70191
  # (addlabel <LabelName>)* [labels <LabelNameList>]
70151
70192
  # (attach <FileName> [charset <CharSet>])*
@@ -72432,8 +72473,8 @@ def _processSendAs(user, i, count, entityType, emailAddress, j, jcount, gmail, f
72432
72473
  return userDefined
72433
72474
 
72434
72475
  def getSendAsAttributes(myarg, body, tagReplacements):
72435
- if myarg == 'replace':
72436
- _getTagReplacement(tagReplacements, True)
72476
+ if _getTagReplacement(myarg, tagReplacements, True):
72477
+ pass
72437
72478
  elif myarg == 'name':
72438
72479
  body['displayName'] = getString(Cmd.OB_NAME, minLen=0)
72439
72480
  elif myarg == 'replyto':
@@ -72452,13 +72493,17 @@ SMTPMSA_SECURITY_MODES = ['none', 'ssl', 'starttls']
72452
72493
  SMTPMSA_REQUIRED_FIELDS = ['host', 'port', 'username', 'password']
72453
72494
 
72454
72495
  # gam <UserTypeEntity> [create] sendas <EmailAddress> [name] <String>
72455
- # [<SendAsContent> (replace <Tag> <UserReplacement>)*]
72496
+ # [<SendAsContent>
72497
+ # (replace <Tag> <UserReplacement>)*
72498
+ # (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*]
72456
72499
  # [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
72457
72500
  # [smtpmsa.host <SMTPHostName> smtpmsa.port 25|465|587
72458
72501
  # smtpmsa.username <UserName> smtpmsa.password <Password>
72459
72502
  # [smtpmsa.securitymode none|ssl|starttls]]
72460
72503
  # gam <UserTypeEntity> update sendas <EmailAddress> [name <String>]
72461
- # [<SendAsContent> (replace <Tag> <UserReplacement>)*]
72504
+ # [<SendAsContent>
72505
+ # (replace <Tag> <UserReplacement>)*
72506
+ # (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*]
72462
72507
  # [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
72463
72508
  def createUpdateSendAs(users):
72464
72509
  updateCmd = Act.Get() == Act.UPDATE
@@ -73295,6 +73340,7 @@ def printShowCSEKeyPairs(users):
73295
73340
  # gam <UserTypeEntity> signature|sig
73296
73341
  # <SignatureContent>
73297
73342
  # (replace <Tag> <String>)*
73343
+ # (replaceregex <RegularExpression> <String> <Tag> <String>)*
73298
73344
  # [html [<Boolean>]] [replyto <EmailAddress>] [default] [treatasalias <Boolean>]
73299
73345
  # [name <String>]
73300
73346
  # [primary]
@@ -73388,7 +73434,9 @@ def _showVacation(user, i, count, result, showDisabled, sigReplyFormat):
73388
73434
  Ind.Decrement()
73389
73435
 
73390
73436
  # gam <UserTypeEntity> vacation [<Boolean>] [subject <String>]
73391
- # [<VacationMessageContent> (replace <Tag> <UserReplacement>)*]
73437
+ # [<VacationMessageContent>
73438
+ # (replace <Tag> <UserReplacement>)*
73439
+ # (replaceregex <RegularExpression> <String> <Tag> <UserReplacement>)*]
73392
73440
  # [html [<Boolean>]] [contactsonly [<Boolean>]] [domainonly [<Boolean>]]
73393
73441
  # [start|startdate <Date>|Started] [end|enddate <Date>|NotSpecified]
73394
73442
  def setVacation(users):
@@ -73406,8 +73454,8 @@ def setVacation(users):
73406
73454
  message, _, html = getStringOrFile(myarg)
73407
73455
  if html:
73408
73456
  responseBodyType = 'responseBodyHtml'
73409
- elif myarg == 'replace':
73410
- _getTagReplacement(tagReplacements, True)
73457
+ elif _getTagReplacement(myarg, tagReplacements, True):
73458
+ pass
73411
73459
  elif myarg == 'html':
73412
73460
  if getBoolean():
73413
73461
  responseBodyType = 'responseBodyHtml'
@@ -465,6 +465,7 @@ REASON_ONLY_VALID_WITH_CONTENTRESTRICTIONS_READONLY_TRUE = 'reason only valid wi
465
465
  REAUTHENTICATION_IS_NEEDED = 'Reauthentication is needed, please run\n\ngam oauth create'
466
466
  RECOMMEND_RUNNING_GAM_ROTATE_SAKEY = 'Recommend running "gam rotate sakey" to get a new key\n'
467
467
  REFUSING_TO_DEPROVISION_DEVICES = 'Refusing to deprovision {0} devices because acknowledge_device_touch_requirement not specified.\nDeprovisioning a device means the device will have to be physically wiped and re-enrolled to be managed by your domain again.\nThis requires physical access to the device and is very time consuming to perform for each device.\nPlease add "acknowledge_device_touch_requirement" to the GAM command if you understand this and wish to proceed with the deprovision.\nPlease also be aware that deprovisioning can have an effect on your device license count.\nSee https://support.google.com/chrome/a/answer/3523633 for full details.'
468
+ REGEX_REPLACEMENT_ERROR = 'Regular expression replacement string "{0}" error: {1}'
468
469
  REPLY_TO_CUSTOM_REQUIRES_EMAIL_ADDRESS = 'replyto REPLY_TO_CUSTOM requires customReplyTo <EmailAddress>'
469
470
  REQUEST_COMPLETED_NO_FILES = 'Request completed but no results/files were returned, try requesting again'
470
471
  REQUEST_NOT_COMPLETE = 'Request needs to be completed before downloading, current status is: {0}'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes