python-zulip-api/zulip/integrations/trello/zulip_trello.py
Eeshan Garg fa759fc97c integrations/trello: Improve the Trello script.
This commit makes a bunch of improvements:

1. Use format() for string formatting instead of the old style.
2. Stop returning stuff where we don't have to.
3. URL generation should not be done by the script, especially
   since our eventual goal is for the Zulip server to automatically
   generate a webhook URL. So the user should be able to supply
   the URL in the config file. Plus, this makes it easier to test
   the script with non-Zulip URLs (such as RequestBin).
4. Removed unnecessary arguments.
2018-04-03 21:52:10 -02:30

172 lines
4.2 KiB
Python
Executable file

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# An easy Trello integration for Zulip.
from __future__ import absolute_import
import sys
import argparse
import requests
import zulip_trello_config as configuration
def check_configuration() -> None:
"""check_configuration
Check if configuration fields have been populated in
zulip_trello_config.py
"""
errors = []
if not configuration.TRELLO_API_KEY:
errors.append('Error: TRELLO_API_KEY is not defined in zulip_trello_config.py')
if not configuration.TRELLO_TOKEN:
errors.append('Error: TRELLO_TOKEN is not defined in zulip_trello_config.py')
if not configuration.ZULIP_WEBHOOK_URL:
errors.append('Error: ZULIP_WEBHOOK_URL is not defined in zulip_trello_config.py')
if len(errors) > 0:
for error in errors:
print(error)
sys.exit(1)
def get_model_id(options: argparse.Namespace) -> str:
"""get_model_id
Get Model Id from Trello API
:options: argparse.Namespace arguments
:returns: str id_model Trello board idModel
"""
trello_api_url = 'https://api.trello.com/1/board/{}'.format(
options.trello_board_id
)
params = {
'key': configuration.TRELLO_API_KEY,
'token': configuration.TRELLO_TOKEN,
}
trello_response = requests.get(
trello_api_url,
params=params
)
if trello_response.status_code is not 200:
print('Error: Can\'t get the idModel. Please check the configuration')
sys.exit(1)
board_info_json = trello_response.json()
return board_info_json['id']
def get_webhook_id(options: argparse.Namespace, id_model: str) -> str:
"""get_webhook_id
Get webhook id from Trello API
:options: argparse.Namespace arguments
:id_model: str Trello board idModel
:returns: str id_webhook Trello webhook id
"""
trello_api_url = 'https://api.trello.com/1/webhooks/'
data = {
'key': configuration.TRELLO_API_KEY,
'token': configuration.TRELLO_TOKEN,
'description': 'Webhook for Zulip integration (From Trello {} to Zulip)'.format(
options.trello_board_name,
),
'callbackURL': configuration.ZULIP_WEBHOOK_URL,
'idModel': id_model
}
trello_response = requests.post(
trello_api_url,
data=data
)
if trello_response.status_code is not 200:
print('Error: Can\'t create the Webhook:', trello_response.text)
sys.exit(1)
webhook_info_json = trello_response.json()
return webhook_info_json['id']
def log_webhook_info(options: argparse.Namespace, id_webhook: str) -> None:
"""log_webhook_info
Log webhook info in csv file for possible future use
:options: argparse.Namespace arguments
:id_webhook: str Trello webhook id
"""
with open('zulip_trello_webhooks.csv', 'a') as webhooks_file:
webhooks_file.write(
'{},{}\n'.format(
options.trello_board_name,
id_webhook
)
)
def create_webhook(options: argparse.Namespace) -> None:
"""create_webhook
Create Trello webhook
:options: argparse.Namespace arguments
"""
# first, we need to get the idModel
print('Getting Trello idModel for the {} board...'.format(options.trello_board_name))
id_model = get_model_id(options)
if id_model:
print('Success! The idModel is', id_model)
id_webhook = get_webhook_id(options, id_model)
if id_webhook:
print('Success! The webhook id is', id_webhook)
# The webhook was successfully created,
# Log informations for possible future needs
print('Logging webhook information')
log_webhook_info(options, id_webhook)
print('Success! The webhook for the {} Trello board was successfully created.'.format(
options.trello_board_name))
print('\nYou can find the webhooks information in the zulip_trello_webhooks.csv file.')
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument('trello_board_name', help='The Trello board name.')
parser.add_argument('trello_board_id', help='The Trello board short id.')
options = parser.parse_args()
check_configuration()
create_webhook(options)
if __name__ == '__main__':
main()