mirror of
https://github.com/zulip/zulip.git
synced 2025-11-03 13:33:24 +00:00
Define Integration and WebhookIntegration classes. Change webhook part of integration's guide. Replace hardcoded webhook urls to generating based on WEBHOOKS list.
129 lines
5.2 KiB
Python
129 lines
5.2 KiB
Python
from typing import Dict, List, Optional
|
|
from django.conf import settings
|
|
from django.conf.urls import url
|
|
|
|
|
|
class Integration(object):
|
|
DEFAULT_LOGO_STATIC_PATH = 'static/images/integrations/logos/{name}.png'
|
|
|
|
def __init__(self, name, client_name, logo=None, secondary_line_text=None, display_name=None):
|
|
# type: (str, str, Optional[str], Optional[str], Optional[str]) -> None
|
|
self.name = name
|
|
self.client_name = client_name
|
|
self.secondary_line_text = secondary_line_text
|
|
|
|
if logo is None:
|
|
logo = self.DEFAULT_LOGO_STATIC_PATH.format(name=name)
|
|
self.logo = logo
|
|
|
|
if display_name is None:
|
|
display_name = name.title()
|
|
self.display_name = display_name
|
|
|
|
def is_enabled(self):
|
|
# type: () -> bool
|
|
return True
|
|
|
|
class EmailIntegration(Integration):
|
|
def is_enabled(self):
|
|
return settings.EMAIL_GATEWAY_BOT != ""
|
|
|
|
class WebhookIntegration(Integration):
|
|
DEFAULT_FUNCTION_PATH = 'zerver.views.webhooks.{name}.api_{name}_webhook'
|
|
DEFAULT_URL = 'api/v1/external/{name}'
|
|
DEFAULT_CLIENT_NAME = 'Zulip{name}Webhook'
|
|
|
|
def __init__(self, name, client_name=None, logo=None, secondary_line_text=None,
|
|
function=None, url=None, display_name=None):
|
|
# type: (str, Optional[str], Optional[str], Optional[str], Optional[str], Optional[str], Optional[str]) -> None
|
|
if client_name is None:
|
|
client_name = self.DEFAULT_CLIENT_NAME.format(name=name.title())
|
|
super(WebhookIntegration, self).__init__(name, client_name, logo, secondary_line_text, display_name)
|
|
|
|
if function is None:
|
|
function = self.DEFAULT_FUNCTION_PATH.format(name=name)
|
|
self.function = function
|
|
|
|
if url is None:
|
|
url = self.DEFAULT_URL.format(name=name)
|
|
self.url = url
|
|
|
|
@property
|
|
def url_object(self):
|
|
return url(self.url, self.function)
|
|
|
|
|
|
WEBHOOK_INTEGRATIONS = [
|
|
WebhookIntegration('airbrake'),
|
|
WebhookIntegration('beanstalk'),
|
|
WebhookIntegration('bitbucket2', logo='static/images/integrations/logos/bitbucket.png', display_name='Bitbucket'),
|
|
WebhookIntegration('bitbucket', secondary_line_text='(Enterprise)'),
|
|
WebhookIntegration('circleci', display_name='CircleCI'),
|
|
WebhookIntegration('codeship'),
|
|
WebhookIntegration('crashlytics'),
|
|
WebhookIntegration('deskdotcom', logo='static/images/integrations/logos/deskcom.png', display_name='Desk.com'),
|
|
WebhookIntegration('freshdesk'),
|
|
WebhookIntegration('github', function='zerver.views.webhooks.github.api_github_landing', display_name='GitHub'),
|
|
WebhookIntegration('helloworld', display_name='Hello World'),
|
|
WebhookIntegration('ifttt', function='zerver.views.webhooks.ifttt.api_iftt_app_webhook', display_name='IFTTT'),
|
|
WebhookIntegration('jira', secondary_line_text='(hosted or v5.2+)', display_name='JIRA'),
|
|
WebhookIntegration('newrelic', display_name='New Relic'),
|
|
WebhookIntegration('pagerduty'),
|
|
WebhookIntegration('pingdom'),
|
|
WebhookIntegration('pivotal', display_name='Pivotal Tracker'),
|
|
WebhookIntegration('semaphore'),
|
|
WebhookIntegration('stash'),
|
|
WebhookIntegration('taiga'),
|
|
WebhookIntegration('teamcity'),
|
|
WebhookIntegration('transifex'),
|
|
WebhookIntegration('travis', display_name='Travis CI'),
|
|
WebhookIntegration('trello', secondary_line_text='(webhook)'),
|
|
WebhookIntegration('updown'),
|
|
WebhookIntegration(
|
|
'yo',
|
|
function='zerver.views.webhooks.yo.api_yo_app_webhook',
|
|
logo='static/images/integrations/logos/yo-app.png',
|
|
display_name='Yo App'
|
|
),
|
|
WebhookIntegration('zendesk')
|
|
] # type: List[WebhookIntegration]
|
|
|
|
INTEGRATIONS = {
|
|
'asana': Integration('asana', 'asana'),
|
|
'basecamp': Integration('basecamp', 'basecamp'),
|
|
'capistrano': Integration('capistrano', 'capistrano'),
|
|
'codebase': Integration('codebase', 'codebase'),
|
|
'email': Integration('email', 'email'),
|
|
'git': Integration('git', 'git'),
|
|
'hubot': Integration('hubot', 'hubot'),
|
|
'jenkins': Integration('jenkins', 'jenkins', secondary_line_text='(or Hudson)'),
|
|
'jira-plugin': Integration(
|
|
'jira-plugin',
|
|
'jira-plugin',
|
|
logo='static/images/integrations/logos/jira.png',
|
|
secondary_line_text='(locally installed)',
|
|
display_name='JIRA'
|
|
),
|
|
'mercurial': Integration('mercurial', 'mercurial', display_name='Mercurial (hg)'),
|
|
'nagios': Integration('nagios', 'nagios'),
|
|
'perforce': Integration('perforce', 'perforce'),
|
|
'phabricator': Integration('phabricator', 'phabricator'),
|
|
'puppet': Integration('puppet', 'puppet'),
|
|
'redmine': Integration('redmine', 'redmine'),
|
|
'rss': Integration('rss', 'rss', display_name='RSS'),
|
|
'subversion': Integration('subversion', 'subversion'),
|
|
'trac': Integration('trac', 'trac'),
|
|
'trello-plugin': Integration(
|
|
'trello-plugin',
|
|
'trello-plugin',
|
|
logo='static/images/integrations/logos/trello.png',
|
|
secondary_line_text='(legacy)',
|
|
display_name='Trello'
|
|
),
|
|
'twitter': Integration('twitter', 'twitter'),
|
|
|
|
} # type: Dict[str, Integration]
|
|
|
|
for integration in WEBHOOK_INTEGRATIONS:
|
|
INTEGRATIONS[integration.name] = integration
|