integrations: Improve GitHub issue milestoned notifications.

Earlier, the notifications had no information about the milestone
that was added or removed.
This commit is contained in:
Satyam Bansal
2023-06-13 19:18:40 +05:30
committed by Tim Abbott
parent 1c567ae616
commit 34f31ab9d2
3 changed files with 54 additions and 3 deletions

View File

@@ -55,6 +55,9 @@ ISSUE_LABELED_OR_UNLABELED_MESSAGE_TEMPLATE = (
) )
ISSUE_LABELED_OR_UNLABELED_MESSAGE_TEMPLATE_WITH_TITLE = "[{user_name}]({user_url}) {action} the {label_name} label {preposition} [Issue #{id} {title}]({url})." ISSUE_LABELED_OR_UNLABELED_MESSAGE_TEMPLATE_WITH_TITLE = "[{user_name}]({user_url}) {action} the {label_name} label {preposition} [Issue #{id} {title}]({url})."
ISSUE_MILESTONED_OR_DEMILESTONED_MESSAGE_TEMPLATE = "[{user_name}]({user_url}) {action} milestone [{milestone_name}]({milestone_url}) {preposition} [issue #{id}]({url})."
ISSUE_MILESTONED_OR_DEMILESTONED_MESSAGE_TEMPLATE_WITH_TITLE = "[{user_name}]({user_url}) {action} milestone [{milestone_name}]({milestone_url}) {preposition} [issue #{id} {title}]({url})."
PULL_REQUEST_OR_ISSUE_MESSAGE_TEMPLATE = "{user_name} {action} [{type}{id}]({url})" PULL_REQUEST_OR_ISSUE_MESSAGE_TEMPLATE = "{user_name} {action} [{type}{id}]({url})"
PULL_REQUEST_OR_ISSUE_MESSAGE_TEMPLATE_WITH_TITLE = ( PULL_REQUEST_OR_ISSUE_MESSAGE_TEMPLATE_WITH_TITLE = (
"{user_name} {action} [{type}{id} {title}]({url})" "{user_name} {action} [{type}{id} {title}]({url})"
@@ -302,6 +305,32 @@ def get_issue_labeled_or_unlabeled_event_message(
return ISSUE_LABELED_OR_UNLABELED_MESSAGE_TEMPLATE.format(**args) return ISSUE_LABELED_OR_UNLABELED_MESSAGE_TEMPLATE.format(**args)
def get_issue_milestoned_or_demilestoned_event_message(
user_name: str,
action: str,
url: str,
number: int,
milestone_name: str,
milestone_url: str,
user_url: str,
title: Optional[str] = None,
) -> str:
args = {
"user_name": user_name,
"action": action,
"url": url,
"id": number,
"milestone_name": milestone_name,
"milestone_url": milestone_url,
"user_url": user_url,
"title": title,
"preposition": "to" if action == "added" else "from",
}
if title is not None:
return ISSUE_MILESTONED_OR_DEMILESTONED_MESSAGE_TEMPLATE_WITH_TITLE.format(**args)
return ISSUE_MILESTONED_OR_DEMILESTONED_MESSAGE_TEMPLATE.format(**args)
def get_push_tag_event_message( def get_push_tag_event_message(
user_name: str, tag_name: str, tag_url: Optional[str] = None, action: str = "pushed" user_name: str, tag_name: str, tag_url: Optional[str] = None, action: str = "pushed"
) -> str: ) -> str:

View File

@@ -195,20 +195,20 @@ class GitHubWebhookTest(WebhookTestCase):
def test_issue_milestoned(self) -> None: def test_issue_milestoned(self) -> None:
expected_topic = "testing-gh / issue #6 This is a sample issue to test GH I..." expected_topic = "testing-gh / issue #6 This is a sample issue to test GH I..."
expected_message = "sbansal1999 milestoned [issue #6](https://github.com/sbansal1999/testing-gh/issues/6):\n\n~~~ quote\nThis tests the functionality of the GH Integration. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc id sagittis ex. In at malesuada velit. Nulla convallis sem ultrices sapien finibus, a auctor nibh egestas. Cras mattis tristique ex, vitae pretium ante tempor vel. Vestibulum lacus tellus, rutrum ut neque eu, ornare facilisis diam. Curabitur ultrices mauris dolor, at lacinia felis mollis in. Fusce tincidunt magna a erat mollis volutpat. Etiam fringilla, ipsum ac vehicula pellentesque, purus augue viverra nunc, vel lacinia felis lectus ac risus. Morbi magna elit, tempus quis euismod quis, auctor ac diam. Nam quis tristique ligula. Proin ut est accumsan, ornare risus vel, fringilla ipsum.\n~~~" expected_message = "[sbansal1999](https://github.com/sbansal1999) added milestone [some_random_milestone](https://github.com/sbansal1999/testing-gh/milestone/1) to [issue #6](https://github.com/sbansal1999/testing-gh/issues/6)."
self.check_webhook("issues__milestoned", expected_topic, expected_message) self.check_webhook("issues__milestoned", expected_topic, expected_message)
def test_issue_milestoned_with_custom_topic_in_url(self) -> None: def test_issue_milestoned_with_custom_topic_in_url(self) -> None:
self.url = self.build_webhook_url(topic="notifications") self.url = self.build_webhook_url(topic="notifications")
expected_topic = "notifications" expected_topic = "notifications"
expected_message = "sbansal1999 milestoned [issue #6 This is a sample issue to test GH Integration Func](https://github.com/sbansal1999/testing-gh/issues/6):\n\n~~~ quote\nThis tests the functionality of the GH Integration. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc id sagittis ex. In at malesuada velit. Nulla convallis sem ultrices sapien finibus, a auctor nibh egestas. Cras mattis tristique ex, vitae pretium ante tempor vel. Vestibulum lacus tellus, rutrum ut neque eu, ornare facilisis diam. Curabitur ultrices mauris dolor, at lacinia felis mollis in. Fusce tincidunt magna a erat mollis volutpat. Etiam fringilla, ipsum ac vehicula pellentesque, purus augue viverra nunc, vel lacinia felis lectus ac risus. Morbi magna elit, tempus quis euismod quis, auctor ac diam. Nam quis tristique ligula. Proin ut est accumsan, ornare risus vel, fringilla ipsum.\n~~~" expected_message = "[sbansal1999](https://github.com/sbansal1999) added milestone [some_random_milestone](https://github.com/sbansal1999/testing-gh/milestone/1) to [issue #6 This is a sample issue to test GH Integration Func](https://github.com/sbansal1999/testing-gh/issues/6)."
self.check_webhook("issues__milestoned", expected_topic, expected_message) self.check_webhook("issues__milestoned", expected_topic, expected_message)
def test_issue_demilestoned(self) -> None: def test_issue_demilestoned(self) -> None:
expected_topic = "testing-gh / issue #6 This is a sample issue to test GH I..." expected_topic = "testing-gh / issue #6 This is a sample issue to test GH I..."
expected_message = "sbansal1999 demilestoned [issue #6](https://github.com/sbansal1999/testing-gh/issues/6):\n\n~~~ quote\nThis tests the functionality of the GH Integration. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc id sagittis ex. In at malesuada velit. Nulla convallis sem ultrices sapien finibus, a auctor nibh egestas. Cras mattis tristique ex, vitae pretium ante tempor vel. Vestibulum lacus tellus, rutrum ut neque eu, ornare facilisis diam. Curabitur ultrices mauris dolor, at lacinia felis mollis in. Fusce tincidunt magna a erat mollis volutpat. Etiam fringilla, ipsum ac vehicula pellentesque, purus augue viverra nunc, vel lacinia felis lectus ac risus. Morbi magna elit, tempus quis euismod quis, auctor ac diam. Nam quis tristique ligula. Proin ut est accumsan, ornare risus vel, fringilla ipsum.\n~~~" expected_message = "[sbansal1999](https://github.com/sbansal1999) removed milestone [some_random_milestone](https://github.com/sbansal1999/testing-gh/milestone/1) from [issue #6](https://github.com/sbansal1999/testing-gh/issues/6)."
self.check_webhook("issues__demilestoned", expected_topic, expected_message) self.check_webhook("issues__demilestoned", expected_topic, expected_message)

View File

@@ -29,6 +29,7 @@ from zerver.lib.webhooks.git import (
get_commits_comment_action_message, get_commits_comment_action_message,
get_issue_event_message, get_issue_event_message,
get_issue_labeled_or_unlabeled_event_message, get_issue_labeled_or_unlabeled_event_message,
get_issue_milestoned_or_demilestoned_event_message,
get_pull_request_event_message, get_pull_request_event_message,
get_push_commits_event_message, get_push_commits_event_message,
get_push_tag_event_message, get_push_tag_event_message,
@@ -161,6 +162,10 @@ def get_issue_body(helper: Helper) -> str:
action = payload["action"].tame(check_string) action = payload["action"].tame(check_string)
issue = payload["issue"] issue = payload["issue"]
has_assignee = "assignee" in payload has_assignee = "assignee" in payload
if action in ("milestoned", "demilestoned"):
return get_issue_milestoned_or_demilestoned_body(helper)
base_message = get_issue_event_message( base_message = get_issue_event_message(
user_name=get_sender_name(payload), user_name=get_sender_name(payload),
action=action, action=action,
@@ -221,6 +226,23 @@ def get_issue_labeled_or_unlabeled_body(helper: Helper) -> str:
) )
def get_issue_milestoned_or_demilestoned_body(helper: Helper) -> str:
payload = helper.payload
include_title = helper.include_title
issue = payload["issue"]
return get_issue_milestoned_or_demilestoned_event_message(
user_name=get_sender_name(payload),
action="added" if payload["action"].tame(check_string) == "milestoned" else "removed",
url=issue["html_url"].tame(check_string),
number=issue["number"].tame(check_int),
milestone_name=payload["milestone"]["title"].tame(check_string),
milestone_url=payload["milestone"]["html_url"].tame(check_string),
user_url=get_sender_url(payload),
title=issue["title"].tame(check_string) if include_title else None,
)
def get_fork_body(helper: Helper) -> str: def get_fork_body(helper: Helper) -> str:
payload = helper.payload payload = helper.payload
forkee = payload["forkee"] forkee = payload["forkee"]