snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
118
zerver/webhooks/trello/view/board_actions.py
Normal file
118
zerver/webhooks/trello/view/board_actions.py
Normal file
@@ -0,0 +1,118 @@
|
||||
from collections.abc import Mapping
|
||||
|
||||
from zerver.lib.exceptions import UnsupportedWebhookEventTypeError
|
||||
from zerver.lib.validator import WildValue, check_string
|
||||
|
||||
SUPPORTED_BOARD_ACTIONS = [
|
||||
"removeMemberFromBoard",
|
||||
"addMemberToBoard",
|
||||
"createList",
|
||||
"updateBoard",
|
||||
]
|
||||
|
||||
REMOVE_MEMBER = "removeMemberFromBoard"
|
||||
ADD_MEMBER = "addMemberToBoard"
|
||||
CREATE_LIST = "createList"
|
||||
CHANGE_NAME = "changeName"
|
||||
|
||||
TRELLO_BOARD_URL_TEMPLATE = "[{board_name}]({board_url})"
|
||||
|
||||
ACTIONS_TO_MESSAGE_MAPPER = {
|
||||
REMOVE_MEMBER: "removed {member_name} from {board_url_template}.",
|
||||
ADD_MEMBER: "added {member_name} to {board_url_template}.",
|
||||
CREATE_LIST: "added {list_name} list to {board_url_template}.",
|
||||
CHANGE_NAME: "renamed the board from {old_name} to {board_url_template}.",
|
||||
}
|
||||
|
||||
|
||||
def process_board_action(payload: WildValue, action_type: str | None) -> tuple[str, str] | None:
|
||||
action_type = get_proper_action(payload, action_type)
|
||||
if action_type is not None:
|
||||
return get_topic(payload), get_body(payload, action_type)
|
||||
return None
|
||||
|
||||
|
||||
def get_proper_action(payload: WildValue, action_type: str | None) -> str | None:
|
||||
if action_type == "updateBoard":
|
||||
data = get_action_data(payload)
|
||||
# we don't support events for when a board's background
|
||||
# is changed
|
||||
if "background" in data["old"].get("prefs", {}):
|
||||
return None
|
||||
elif data["old"]["name"].tame(check_string):
|
||||
return CHANGE_NAME
|
||||
raise UnsupportedWebhookEventTypeError(action_type)
|
||||
return action_type
|
||||
|
||||
|
||||
def get_topic(payload: WildValue) -> str:
|
||||
return get_action_data(payload)["board"]["name"].tame(check_string)
|
||||
|
||||
|
||||
def get_body(payload: WildValue, action_type: str) -> str:
|
||||
message_body = ACTIONS_TO_FILL_BODY_MAPPER[action_type](payload, action_type)
|
||||
creator = payload["action"]["memberCreator"]["fullName"].tame(check_string)
|
||||
return f"{creator} {message_body}"
|
||||
|
||||
|
||||
def get_managed_member_body(payload: WildValue, action_type: str) -> str:
|
||||
data = {
|
||||
"member_name": payload["action"]["member"]["fullName"].tame(check_string),
|
||||
}
|
||||
return fill_appropriate_message_content(payload, action_type, data)
|
||||
|
||||
|
||||
def get_create_list_body(payload: WildValue, action_type: str) -> str:
|
||||
data = {
|
||||
"list_name": get_action_data(payload)["list"]["name"].tame(check_string),
|
||||
}
|
||||
return fill_appropriate_message_content(payload, action_type, data)
|
||||
|
||||
|
||||
def get_change_name_body(payload: WildValue, action_type: str) -> str:
|
||||
data = {
|
||||
"old_name": get_action_data(payload)["old"]["name"].tame(check_string),
|
||||
}
|
||||
return fill_appropriate_message_content(payload, action_type, data)
|
||||
|
||||
|
||||
def fill_appropriate_message_content(
|
||||
payload: WildValue, action_type: str, data: Mapping[str, str] = {}
|
||||
) -> str:
|
||||
data = dict(data)
|
||||
if "board_url_template" not in data:
|
||||
data["board_url_template"] = get_filled_board_url_template(payload)
|
||||
message_body = get_message_body(action_type)
|
||||
return message_body.format(**data)
|
||||
|
||||
|
||||
def get_filled_board_url_template(payload: WildValue) -> str:
|
||||
return TRELLO_BOARD_URL_TEMPLATE.format(
|
||||
board_name=get_board_name(payload), board_url=get_board_url(payload)
|
||||
)
|
||||
|
||||
|
||||
def get_board_name(payload: WildValue) -> str:
|
||||
return get_action_data(payload)["board"]["name"].tame(check_string)
|
||||
|
||||
|
||||
def get_board_url(payload: WildValue) -> str:
|
||||
return "https://trello.com/b/{}".format(
|
||||
get_action_data(payload)["board"]["shortLink"].tame(check_string)
|
||||
)
|
||||
|
||||
|
||||
def get_message_body(action_type: str) -> str:
|
||||
return ACTIONS_TO_MESSAGE_MAPPER[action_type]
|
||||
|
||||
|
||||
def get_action_data(payload: WildValue) -> WildValue:
|
||||
return payload["action"]["data"]
|
||||
|
||||
|
||||
ACTIONS_TO_FILL_BODY_MAPPER = {
|
||||
REMOVE_MEMBER: get_managed_member_body,
|
||||
ADD_MEMBER: get_managed_member_body,
|
||||
CREATE_LIST: get_create_list_body,
|
||||
CHANGE_NAME: get_change_name_body,
|
||||
}
|
||||
Reference in New Issue
Block a user