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

This commit is contained in:
upstream-mirror
2026-09-15 15:05:30 +05:00
commit 64898b2c79
8999 changed files with 1757358 additions and 0 deletions

View File

View File

@@ -0,0 +1,66 @@
# Zulip Zendesk integration
Get notifications about Zendesk tickets in Zulip!
{start_tabs}
1. {!create-an-incoming-webhook.md!}
1. {!generate-webhook-url-basic.md!}
1. Append `{%raw%}&ticket_title={{ ticket.title }}&ticket_id={{ ticket.id }}{%endraw%}`
to the URL generated above.
1. In Zendesk, click the **gear** (<i class="fa fa-cog"></i>) icon in the
bottom-left corner. Click on **Extensions**, and then click **add
target**.
1. Click the **URL target**, and fill in the form with the following:
* **Title**: Zulip
* **URL**: the URL generated and updated above
* **Method**: POST
* **Attribute Name**: message
* **Username**: your bot's user name, e.g., `zendesk-bot@yourdomain.com`
* **Password**: your bot's API key
1. Select **Test Target**, and click **Submit**. A test message should
appear Zulip. Save the target by selecting **Create target**, and
clicking **Submit**.
1. Add a new trigger, for every action you'd like to be notified about.
To add a trigger, select **Triggers** in the left menu, and click
**add trigger**.
1. Give the trigger a descriptive title (e.g., "Announce ticket update").
Under **Meet all of the following conditions**, select the conditions
for the trigger. In the **Perform these actions** section, select
**Notification: Notify target**, and select the target created above
(e.g., "Zulip").
1. Enter the message body into the **Message** field. You can use both
Zulip Markdown and Zendesk placeholders. Here's an example message
body template that you can optionally use:
{% raw %}Ticket [#{{ ticket.id }}: {{ ticket.title }}]({{ ticket.link }}), was updated by {{ current_user.name }}
* Status: {{ ticket.status }}
* Priority: {{ ticket.priority }}
* Type: {{ ticket.ticket_type }}
* Assignee: {{ ticket.assignee.name }}
* Tags: {{ ticket.tags }}
* Description:
``` quote
{{ ticket.description }}
```{% endraw %}
1. Click **Submit**.
{end_tabs}
{!congrats.md!}
![](/static/images/integrations/zendesk/001.png)
### Related documentation
{!webhooks-url-specification.md!}

View File

@@ -0,0 +1,50 @@
from typing_extensions import override
from zerver.lib.test_classes import WebhookTestCase
class ZenDeskHookTests(WebhookTestCase):
@override
def get_payload(self, fixture_name: str) -> dict[str, str]:
return {
"ticket_title": self.TICKET_TITLE,
"ticket_id": str(self.TICKET_ID),
"message": self.MESSAGE,
"stream": self.channel_name,
}
def do_test(self, expected_topic: str, expected_message: str) -> None:
self.api_channel_message(
self.test_user,
"",
expected_topic,
expected_message,
content_type=None,
)
def test_short_topic(self) -> None:
self.TICKET_ID = 4
self.TICKET_TITLE = "Test ticket"
self.MESSAGE = "some message"
self.do_test(
expected_topic="#4: Test ticket",
expected_message="some message",
)
def test_long_subject(self) -> None:
self.TICKET_ID = 4
self.TICKET_TITLE = "Test ticket" + "!" * 80
self.MESSAGE = "some message"
self.do_test(
expected_topic="#4: Test ticket" + "!" * 42 + "...",
expected_message="some message",
)
def test_long_content(self) -> None:
self.TICKET_ID = 5
self.TICKET_TITLE = "Some ticket"
self.MESSAGE = "New comment:\n> It is better\n* here"
self.do_test(
expected_topic="#5: Some ticket",
expected_message="New comment:\n> It is better\n* here",
)

View File

@@ -0,0 +1,34 @@
# Webhooks for external integrations.
from django.http import HttpRequest, HttpResponse
from zerver.decorator import authenticated_rest_api_view
from zerver.lib.response import json_success
from zerver.lib.typed_endpoint import typed_endpoint
from zerver.lib.webhooks.common import check_send_webhook_message
from zerver.models import UserProfile
def truncate(string: str, length: int) -> str:
if len(string) > length:
string = string[: length - 3] + "..."
return string
@authenticated_rest_api_view(webhook_client_name="Zendesk")
@typed_endpoint
def api_zendesk_webhook(
request: HttpRequest,
user_profile: UserProfile,
*,
ticket_title: str,
ticket_id: str,
message: str,
) -> HttpResponse:
"""
Zendesk uses triggers with message templates. This webhook uses the
ticket_id and ticket_title to create a topic. And passes with zendesk
user's configured message to zulip.
"""
topic_name = truncate(f"#{ticket_id}: {ticket_title}", 60)
check_send_webhook_message(request, user_profile, topic_name, message)
return json_success(request)