Files
zulip/zerver/lib/integrations.py
Tomasz Kolek 0e33b8bd4d Add integrations library.
Define Integration and WebhookIntegration classes.
Change webhook part of integration's guide.
Replace hardcoded webhook urls to generating
based on WEBHOOKS list.
2016-08-04 11:39:20 -07:00

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