tableauserverclient.server.request_factory.RequestFactory calls str(value).lower() on two site-level string attributes when serializing to XML:
customSubscriptionEmail — request_factory.py:736 (create-site path) and 840 (update-site path)
customSubscriptionFooter — request_factory.py:742 and 846
This silently mangles caller intent:
site = server.sites.get_by_id(...)
site.custom_subscription_email = "[email protected]"
site.custom_subscription_footer = "Sent by Tableau — Confidential."
server.sites.update(site)
# server receives: customSubscriptionEmail="[email protected]"
# customSubscriptionFooter="sent by tableau — confidential."
Impact
- Email: cosmetic only — SMTP treats mailboxes case-insensitively in practice, so delivery still works. But recipients see the wrong-case "from" address, and admin intent (
[email protected]) is lost.
- Footer: functionally broken — this string is displayed verbatim in outgoing subscription emails. Lowercasing removes company-name casing, sentence-start capitalization, brand terms, everything. Anyone setting a customer-facing footer via TSC gets a mangled result. There is no workaround short of editing the site through the web UI.
Proposed fix
Drop the .lower() on both attributes in both code paths. String values should be sent verbatim. Booleans are already handled by the paired *Enabled attributes and their own serialization.
Discovered while implementing tabcmd editsite parity (tableau/tabcmd#437, tabcmd PR #452).
tableauserverclient.server.request_factory.RequestFactorycallsstr(value).lower()on two site-level string attributes when serializing to XML:customSubscriptionEmail—request_factory.py:736(create-site path) and840(update-site path)customSubscriptionFooter—request_factory.py:742and846This silently mangles caller intent:
Impact
[email protected]) is lost.Proposed fix
Drop the
.lower()on both attributes in both code paths. String values should be sent verbatim. Booleans are already handled by the paired*Enabledattributes and their own serialization.Discovered while implementing tabcmd editsite parity (tableau/tabcmd#437, tabcmd PR #452).