import logging import json from app import app from data.database import configure, RepositoryNotification, ExternalNotificationMethod configure(app.config) logger = logging.getLogger(__name__) def run_slackwebhook_migration(): slack_method = ExternalNotificationMethod.get(ExternalNotificationMethod.name == "slack") encountered = set() while True: found = list(RepositoryNotification.select(RepositoryNotification.uuid, RepositoryNotification.config_json) .where(RepositoryNotification.method == slack_method, RepositoryNotification.config_json ** "%subdomain%", ~(RepositoryNotification.config_json ** "%url%"))) found = [f for f in found if not f.uuid in encountered] if not found: logger.debug('No additional records found') return logger.debug('Found %s records to be changed', len(found)) for notification in found: encountered.add(notification.uuid) try: config = json.loads(notification.config_json) except: logging.error("Cannot parse config for noticification %s", notification.uuid) continue logger.debug("Checking notification %s", notification.uuid) if 'subdomain' in config and 'token' in config: subdomain = config['subdomain'] token = config['token'] new_url = 'https://%s.slack.com/services/hooks/incoming-webhook?token=%s' % (subdomain, token) config['url'] = new_url logger.debug("Updating notification %s to URL: %s", notification.uuid, new_url) notification.config_json = json.dumps(config) notification.save() if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG) logging.getLogger('boto').setLevel(logging.CRITICAL) run_slackwebhook_migration()