diff --git a/zulip/integrations/trello/README.md b/zulip/integrations/trello/README.md index 230b261..9a15e38 100644 --- a/zulip/integrations/trello/README.md +++ b/zulip/integrations/trello/README.md @@ -1,16 +1,13 @@ -# Easy Trello integration for Zulip - -An easy Trello integration for Zulip +# A script that automates setting up a webhook with Trello Usage : 1. Fill the needed information in `zulip_trello_config.py` : - - The bot API KEY, - The Trello API KEY, - The Trello TOKEN, - - The Zulip host + - The Zulip webhook URL 2. Execute the script : - $ python zulip_trello.py + $ python zulip_trello.py diff --git a/zulip/integrations/trello/zulip_trello.py b/zulip/integrations/trello/zulip_trello.py index 74be8ff..3513792 100755 --- a/zulip/integrations/trello/zulip_trello.py +++ b/zulip/integrations/trello/zulip_trello.py @@ -10,63 +10,26 @@ import sys import argparse import requests -# Import configuration import zulip_trello_config as configuration -VERSION = '0.2' - - -# argument's settings -parser = argparse.ArgumentParser() - -parser.add_argument( - 'stream_name', - help='The stream to which to integrate Trello.' -) - -parser.add_argument( - 'trello_board_name', - help='The Trello board name.' -) - -parser.add_argument( - 'trello_board_id', - help='The Trello board short id.' -) - -parser.add_argument( - '-v', - '--version', - help='Display Version and exit', - action='version', - version='zulip_trello v'+VERSION -) - - -def check_configuration() -> bool: +def check_configuration() -> None: """check_configuration Check if configuration fields have been populated in zulip_trello_config.py - - :returns: config imported from module zulip_trello_config - """ errors = [] - if not configuration.BOT_API_KEY: - errors.append('Error: BOT_API_KEY is not defined in zulip_trello_config.py') - 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_HOST: - errors.append('Error: ZULIP_HOST 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: @@ -74,9 +37,6 @@ def check_configuration() -> bool: sys.exit(1) - return True - - def get_model_id(options: argparse.Namespace) -> str: """get_model_id @@ -88,7 +48,7 @@ def get_model_id(options: argparse.Namespace) -> str: """ - trello_api_url = 'https://api.trello.com/1/board/%s' % ( + trello_api_url = 'https://api.trello.com/1/board/{}'.format( options.trello_board_id ) @@ -128,17 +88,10 @@ def get_webhook_id(options: argparse.Namespace, id_model: str) -> str: data = { 'key': configuration.TRELLO_API_KEY, 'token': configuration.TRELLO_TOKEN, - 'description': 'Webhook for Zulip integration (From Trello %s to Zulip %s)' % ( + 'description': 'Webhook for Zulip integration (From Trello {} to Zulip)'.format( options.trello_board_name, - options.stream_name - ), - 'callbackURL': '%s' % ( - 'https://%s/api/v1/external/trello?api_key=%s&stream=%s' % ( - configuration.ZULIP_HOST, - configuration.BOT_API_KEY, - options.stream_name - ), ), + 'callbackURL': configuration.ZULIP_WEBHOOK_URL, 'idModel': id_model } @@ -156,52 +109,40 @@ def get_webhook_id(options: argparse.Namespace, id_model: str) -> str: return webhook_info_json['id'] -def log_webhook_info(options: argparse.Namespace, id_webhook: str) -> bool: +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 - - :returns: bool - """ with open('zulip_trello_webhooks.csv', 'a') as webhooks_file: webhooks_file.write( - '%s,%s,%s\n' % ( - options.stream_name, + '{},{}\n'.format( options.trello_board_name, id_webhook ) ) - return True - - -def create_webhook(options: argparse.Namespace) -> bool: +def create_webhook(options: argparse.Namespace) -> None: """create_webhook Create Trello webhook :options: argparse.Namespace arguments - :returns: bool - """ # first, we need to get the idModel - print('Getting Trello idModel for the %s board...' % (options.trello_board_name)) + 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) - # Next, we need to create the webhook - print('Creating the webhook for the %s stream...' % (options.stream_name)) - id_webhook = get_webhook_id(options, id_model) if id_webhook: @@ -211,26 +152,20 @@ def create_webhook(options: argparse.Namespace) -> bool: # Log informations for possible future needs print('Logging webhook information') - was_logged = log_webhook_info(options, id_webhook) - - if was_logged: - print( - 'Success! The webhook for the %s stream from the %s Trello board was successfully created.' % ( - options.stream_name, - options.trello_board_name - ) - ) - - print('\nYou can find the webhooks information in the zulip_trello_webhooks.csv file.') - - return True + 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: - options = parser.parse_args() - if check_configuration(): - creation_status = create_webhook(options) + 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() diff --git a/zulip/integrations/trello/zulip_trello_config.py b/zulip/integrations/trello/zulip_trello_config.py index e05039a..39c239f 100644 --- a/zulip/integrations/trello/zulip_trello_config.py +++ b/zulip/integrations/trello/zulip_trello_config.py @@ -23,15 +23,6 @@ ### REQUIRED CONFIGURATION ### -# It needs some API KEY and Token (from Zulip and Trello) -# For more information, please visit https://zulipchat.com/integrations/doc/trello - -# BOT_API_KEY -# -# In Zulip, create a new bot for *incomming Webhook*. -# It will generate an API KEY -BOT_API_KEY = "" - # TRELLO_API_KEY # # Visit https://trello.com/1/appkey/generate to generate @@ -46,7 +37,7 @@ TRELLO_API_KEY = "" # Take care to replace with the appropriate value TRELLO_TOKEN = "" -# ZULIP_HOST +# ZULIP_WEBHOOK_URL # -# The hostname of your Zulip application -ZULIP_HOST = "" +# The webhook URL that Trello will query +ZULIP_WEBHOOK_URL = "" diff --git a/zulip/integrations/trello/zulip_trello_webhooks.csv b/zulip/integrations/trello/zulip_trello_webhooks.csv index e50ae92..585c171 100644 --- a/zulip/integrations/trello/zulip_trello_webhooks.csv +++ b/zulip/integrations/trello/zulip_trello_webhooks.csv @@ -1 +1 @@ -stream_name,trello_board_name,id_webhook +trello_board_name,id_webhook