Add support for the Flowdock Team chat API: https://www.flowdock.com/api/push

This commit is contained in:
Joseph Schorr 2014-08-19 14:33:33 -04:00
parent 02d3b70013
commit 35bd28a77e
8 changed files with 84 additions and 3 deletions

View file

@ -184,6 +184,8 @@ class BuildFailureEvent(NotificationEvent):
return 'build_failure' return 'build_failure'
def get_sample_data(self, repository): def get_sample_data(self, repository):
build_uuid = 'fake-build-id'
return build_event_data(repository, { return build_event_data(repository, {
'build_id': build_uuid, 'build_id': build_uuid,
'build_name': 'some-fake-build', 'build_name': 'some-fake-build',

View file

@ -4,9 +4,10 @@ import os.path
import tarfile import tarfile
import base64 import base64
import json import json
import requests
from flask.ext.mail import Message from flask.ext.mail import Message
from app import mail, app from app import mail, app, get_app_url
from data import model from data import model
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -187,3 +188,55 @@ class WebhookMethod(NotificationMethod):
return False return False
return True return True
class FlowdockMethod(NotificationMethod):
""" Method for sending notifications to Flowdock via the Team Inbox API:
https://www.flowdock.com/api/team-inbox
"""
@classmethod
def method_name(cls):
return 'flowdock'
def validate(self, repository, config_data):
token = config_data.get('flow_api_token', '')
if not token:
raise CannotValidateNotificationMethodException('Missing Flowdock API Token')
def perform(self, notification, event_handler, notification_data):
config_data = json.loads(notification.config_json)
token = config_data.get('flow_api_token', '')
if not token:
return False
owner = model.get_user(notification.repository.namespace)
if not owner:
# Something went wrong.
return False
url = 'https://api.flowdock.com/v1/messages/team_inbox/%s' % token
headers = {'Content-type': 'application/json'}
payload = {
'source': 'Quay',
'from_address': 'support@quay.io',
'subject': event_handler.get_summary(notification_data['event_data'], notification_data),
'content': event_handler.get_message(notification_data['event_data'], notification_data),
'from_name': owner.username,
'project': notification.repository.namespace + ' ' + notification.repository.name,
'tags': ['#' + event_handler.event_name()],
'link': notification_data['event_data']['homepage']
}
try:
resp = requests.post(url, data=json.dumps(payload), headers=headers)
if resp.status_code/100 != 2:
logger.error('%s response for flowdock to url: %s' % (resp.status_code,
url))
logger.error(resp.content)
return False
except requests.exceptions.RequestException as ex:
logger.exception('Flowdock method was unable to be sent: %s' % ex.message)
return False
return True

View file

@ -251,6 +251,8 @@ def initialize_database():
ExternalNotificationMethod.create(name='email') ExternalNotificationMethod.create(name='email')
ExternalNotificationMethod.create(name='webhook') ExternalNotificationMethod.create(name='webhook')
ExternalNotificationMethod.create(name='flowdock')
NotificationKind.create(name='repo_push') NotificationKind.create(name='repo_push')
NotificationKind.create(name='build_queued') NotificationKind.create(name='build_queued')
NotificationKind.create(name='build_start') NotificationKind.create(name='build_start')

View file

@ -4559,6 +4559,13 @@ i.quay-icon {
height: 16px; height: 16px;
} }
i.flowdock-icon {
background-image: url(/static/img/flowdock.ico);
background-size: 16px;
width: 16px;
height: 16px;
}
.external-notification-view-element { .external-notification-view-element {
margin: 10px; margin: 10px;
padding: 6px; padding: 6px;

View file

@ -73,7 +73,7 @@
<tr ng-if="currentMethod.fields.length"><td colspan="2"><hr></td></tr> <tr ng-if="currentMethod.fields.length"><td colspan="2"><hr></td></tr>
<tr ng-repeat="field in currentMethod.fields"> <tr ng-repeat="field in currentMethod.fields">
<td>{{ field.title }}:</td> <td valign="top">{{ field.title }}:</td>
<td> <td>
<div ng-switch on="field.type"> <div ng-switch on="field.type">
<span ng-switch-when="email"> <span ng-switch-when="email">
@ -86,7 +86,11 @@
current-entity="currentConfig[field.name]" current-entity="currentConfig[field.name]"
ng-model="currentConfig[field.name]" ng-model="currentConfig[field.name]"
allowed-entities="['user', 'team', 'org']" allowed-entities="['user', 'team', 'org']"
ng-switch-when="entity"> ng-switch-when="entity"></div>
<div ng-if="field.help_url" style="margin-top: 10px">
See: <a href="{{ field.help_url }}" target="_blank">{{ field.help_url }}</a>
</div>
</div> </div>
</td> </td>
</tr> </tr>

BIN
static/img/flowdock.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View file

@ -1076,6 +1076,19 @@ quayApp = angular.module('quay', quayDependencies, function($provide, cfpLoading
'title': 'Webhook URL' 'title': 'Webhook URL'
} }
] ]
},
{
'id': 'flowdock',
'title': 'Flowdock Team Notification',
'icon': 'flowdock-icon',
'fields': [
{
'name': 'flow_api_token',
'type': 'string',
'title': 'Flow API Token',
'help_url': 'https://www.flowdock.com/account/tokens'
}
]
} }
]; ];

Binary file not shown.