mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 22:13:26 +00:00
8e10ab282a moved UnexpectedWebhookEventType into
`zerver.lib.exceptions`, but left the import into
`zserver.lib.webhooks.common` so that webhooks could continue to
import the exception from there.
This clutters things and adds complexity; there is no compelling
reason that the exception's source of truth should not move alongside
all other exceptions.
55 lines
2.0 KiB
Python
55 lines
2.0 KiB
Python
from typing import Any, Dict, Iterable
|
|
|
|
from django.http import HttpRequest, HttpResponse
|
|
|
|
from zerver.decorator import api_key_only_webhook_view
|
|
from zerver.lib.exceptions import UnexpectedWebhookEventType
|
|
from zerver.lib.request import REQ, has_request_variables
|
|
from zerver.lib.response import json_success
|
|
from zerver.lib.webhooks.common import (
|
|
check_send_webhook_message,
|
|
get_http_headers_from_filename,
|
|
validate_extract_webhook_http_header,
|
|
)
|
|
from zerver.models import UserProfile
|
|
|
|
EVENTS = ['deploy_failed', 'deploy_locked', 'deploy_unlocked', 'deploy_building', 'deploy_created']
|
|
|
|
fixture_to_headers = get_http_headers_from_filename("HTTP_X_NETLIFY_EVENT")
|
|
|
|
@api_key_only_webhook_view('Netlify')
|
|
@has_request_variables
|
|
def api_netlify_webhook(
|
|
request: HttpRequest, user_profile: UserProfile,
|
|
payload: Dict[str, Iterable[Dict[str, Any]]]=REQ(argument_type='body'),
|
|
) -> HttpResponse:
|
|
|
|
message_template = get_template(request, payload)
|
|
|
|
body = message_template.format(build_name=payload['name'],
|
|
build_url=payload['url'],
|
|
branch_name=payload['branch'],
|
|
state=payload['state'])
|
|
|
|
topic = "{topic}".format(topic=payload['branch'])
|
|
|
|
check_send_webhook_message(request, user_profile, topic, body)
|
|
|
|
return json_success()
|
|
|
|
def get_template(request: HttpRequest, payload: Dict[str, Any]) -> str:
|
|
|
|
message_template = 'The build [{build_name}]({build_url}) on branch {branch_name} '
|
|
event = validate_extract_webhook_http_header(request, 'X_NETLIFY_EVENT', 'Netlify')
|
|
|
|
if event == 'deploy_failed':
|
|
return message_template + payload['error_message']
|
|
elif event == 'deploy_locked':
|
|
return message_template + 'is now locked.'
|
|
elif event == 'deploy_unlocked':
|
|
return message_template + 'is now unlocked.'
|
|
elif event in EVENTS:
|
|
return message_template + 'is now {state}.'.format(state=payload['state'])
|
|
else:
|
|
raise UnexpectedWebhookEventType('Netlify', event)
|