class TrelloHelper(): def __init__(self, api_key, token): self.client = TrelloClient(api_key=api_key, token=token) def create_organization(self, organization_name): post_args = {'displayName': organization_name} obj = self.client.fetch_json( '/organizations', http_method='POST', post_args=post_args ) return self.client.get_organization(obj['id']) def delete_organization(self, organization_id): self.client.fetch_json( '/organizations/{}'.format(organization_id), http_method='DELETE', ) def list_organizations(self): return self.client.list_organizations()
class RecycleBoard(): def __init__(self, API_KEY, API_TOKEN, org_id=None): self.client = TrelloClient(api_key=API_KEY, token=API_TOKEN) self.org = self.client.get_organization(org_id) if org_id else None self.closed_board_gen = self.get_closed_board() self.board = self.closed_board_gen.__next__() def recycle_board(self, name): self.board.open() self.delete_cards() self.board.set_name(name) return self.board def delete_cards(self): for card in self.board.open_cards(): card.delete() def get_closed_board(self): get_boards = (self.org.get_boards, self.client.list_boards) if self.org: for board in get_boards[0](list_filter='closed'): yield board for board in get_boards[1](board_filter='closed'): yield board
class RecycleBoardTests(TestCase): @classmethod def setUpClass(cls): logging.config.dictConfig({"version": 1, "loggers": {"requests": {"level": "INFO"}}}) def setUp(self): self.client = TrelloClient(api_key=API_KEY, token=API_TOKEN) self.org = self.client.get_organization('deletetheseboards') for board in self.org.get_boards(list_filter='open'): board.close() recycler = RecycleBoard(API_KEY, API_TOKEN, org_id='deletetheseboards') self.name = 'NEW BOARD {}'.format(randint(0, 1000)) self.recycled_board = recycler.recycle_board(self.name) def tearDown(self): if self.recycled_board: self.recycled_board.close() def test_name_change(self): self.assertEqual(self.recycled_board.name, self.name) def test_cards_deleted(self): self.assertCountEqual(self.recycled_board.open_cards(), [])
from pprint import pprint import trello from trello import board from trello import TrelloClient client = TrelloClient( api_key='4de1136340ee5e550eb5431d70bf7f9d', api_secret= 'cb15abc1ced2884742c39892084f7bc6cfcb10d21e0cf79eb6810219f29f99fa', token='e7901b564e7f67d2f2c549f7c814b01c925a6dc94bf5b357b317bf88cd07fda5', token_secret='') org = client.get_organization('erochefoucauld') boards = org.get_boards(0) def GetBoard(board_name): show_board = 0 for board in boards: if board_name == board.name: show_board = board return show_board def GetLists(board_name): board = GetBoard(board_name) board_list = board.all_lists() return board_list
class trello: def __init__(self, apiKey, TOKEN): self.apiKey = apiKey self.token = TOKEN self.client = TrelloClient(api_key=apiKey, api_secret='your-secret', token=TOKEN, token_secret='your-oauth-token-secret') def printTrello(self): all_boards = self.client.list_boards() last_board = all_boards[-1] print("Boards ") for board in all_boards: print("Board Name :", board.name, " Board ID", board.id) for list in board.all_lists(): print("\t", "ListName :", list.name, "listID :", list.id) for card in list.list_cards(""): print("\t\t", "cardName :", card.name, "cardID :", card.id) #for card in board.all_cards(): # print("\tCard Name :",card.name," Card ID",card.id) ####### BOARD OPERATIONS def getBoard(self, boardID): self.board = self.client.get_board(board_id=boardID) return self.board def getBoardByName(self, boardName): all_boards = self.client.list_boards() for board in all_boards: if board.name == boardName: self.board = board return board return None # close all boards def clearBoards(self): for board in self.client.list_boards(): board.close() def createBoard(self, boardName, organizationID=None, permission_level="private"): self.board = self.client.add_board(board_name=boardName, source_board=None, organization_id=organizationID, permission_level=permission_level) for list in self.board.get_lists(None): self.board.get_list(list.id).close() self.createList("To Do:", self.board.id, 1) self.createList("Doing:", self.board.id, 2) self.createList("Build:", self.board.id, 3) self.createList("Test:", self.board.id, 4) self.createList("Deploy:", self.board.id, 5) return self.board def closeBoardByName(self, boardName=None): if boardName != None: all_boards = self.client.list_boards() for board in all_boards: if board.name == boardName: return board.close() else: if self.board != None: self.closeBoard(self.board.id) def closeBoard(self, boardId=None): if boardId != None: return self.getBoard(boardID=boardId).close() else: if self.board != None: self.board.close() else: return None def boardList(self): return self.client.list_boards() ####### END BOARD OPERATIONS ####### LIST OPERATIONS def getList(self, listID, boardID): return self.client.get_board(board_id=boardID).get_list(list_id=listID) def getListByName(self, listID, boardID): return self.client.get_board(board_id=boardID).get_list(list_id=listID) def createList(self, listName, boardID, sira=None): board = self.client.get_board(boardID) addedlist = board.add_list(listName, sira) return addedlist def closeList(self, listID, boardID): return self.client.get_board(boardID).get_list(listID).close() def closeJustListID(self, listID): # unsafe url = "https://api.trello.com/1/lists/" + listID + "?closed=true&key=" + self.apiKey + "&token=" + self.token querystring = {} response = requests.request("PUT", url, params=querystring) return response.text ####### END LIST OPERATIONS ####### CARD OPERATIONS def getCard(self, cardID): return self.client.get_card(card_id=cardID) def createCard(self, boardID, listID, cardName): self.getList(boardID=boardID, listID=listID).add_card(name=cardName, labels=None, due="", source=None, position=None) def removeCard(self, cardID): url = "https://api.trello.com/1/cards/" + cardID + "?key=" + self.apiKey + "&token=" + self.token querystring = {} response = requests.request("PUT", url, params=querystring) return response.text def moveCard(self, cardID, desListID): self.getCard(cardID=cardID).change_list(list_id=desListID) ####### END CARD OPERATIONS ####### TEAM MEMBER OPERATIONS def addMemberBoard(self, boardID, memberID): board = self.client.get_board(board_id=boardID) board.add_member(memberID) # ORGANIZATION OPERATIONS def getOrganization(self, organizationID): return self.client.get_organization(organizationID) def getOrganizationByName(self, organizationName): for organization in self.listOrganizations(): if organization.name == "": return organization return None def listOrganizations(self): self.client.list_organizations() return self.client.list_organizations() def createOrganization(self, organizationName): url = "https://api.trello.com/1/organizations?displayName=" + organizationName + "&desc=" + organizationName + "&key=" + self.apiKey + "&token=" + self.token querystring = {} response = requests.request("POST", url, params=querystring) organizationID = str.split(response.text, ",")[0].split("\"")[3] return organizationID def addOrganizationMember(self, organizationID, mail, memberType="normal", fullName="member"): configuredMail = str.replace(mail, "@", "%40") url = "https://api.trello.com/1/organizations/" + organizationID + "/members?email=" + configuredMail + "&fullName=" + fullName + "&type=" + memberType + "&key=" + self.apiKey + "&token=" + self.token querystring = {} response = requests.request("PUT", url, params=querystring) data = (json.loads(response.text)) memberID = (data["memberships"][-1]["idMember"]) return memberID def removeOrganizationMember(self, organizationID, memberID): url = "https://api.trello.com/1/organizations/" + organizationID + "/members/" + memberID + "?key=" + self.apiKey + "&token=" + self.token querystring = {} response = requests.request("DELETE", url, params=querystring) return response.text def removeOrganization(self, organizationID): url = "https://api.trello.com/1/organizations/" + organizationID + "?key=" + self.apiKey + "&token=" + self.token querystring = {} response = requests.request("DELETE", url, params=querystring) return response.text def addCommendToCard(self, cardID, commendText): url = "https://api.trello.com/1/cards/" + cardID + "/actions/comments?text=" + commendText + "&key=" + self.apiKey + "&token=" + self.token querystring = {} response = requests.request("POST", url, params=querystring) return response.text
class Handler(BaseHandler): name = 'Trello' prefix = 'trello' patterns = [ ([ '(?P<command>desligar) (?P<users>.*)', '(?P<command>terminate) (?P<users>.*)', '{prefix} (?P<command>terminate) (?P<users>.*)' ], 'Desliga um funcionário'), ] def __init__(self, bot, slack, api_key=None, api_secret=None, oauth_token=None, oauth_secret=None): super().__init__(bot, slack) self.directed = True if not api_key: api_key = os.environ.get('TRELLO_API_KEY') if not api_secret: api_secret = os.environ.get('TRELLO_API_SECRET') if not oauth_token: oauth_token = os.environ.get('TRELLO_OAUTH_TOKEN') if not oauth_secret: oauth_secret = os.environ.get('TRELLO_OAUTH_SECRET') self.client = TrelloClient(api_key=api_key, api_secret=api_secret, token=oauth_token, token_secret=oauth_secret) self.org_name = os.environ.get('TRELLO_ORGANIZATION', 'pagarmeoficial') self.org_id = self.get_org_id(self.org_name) self.org = self.client.get_organization(self.org_id) self.set_job_status('Initialized') def get_org_id(self, name): orgs = self.client.list_organizations() for org in orgs: if org.name == name: return org.id def process(self, channel, user, ts, message, at_bot, command, **kwargs): if at_bot: if command in ['desligar', 'terminate']: user_handle = self.get_user_handle(user) self.log('@{}: {}'.format(user_handle, message)) self.set_job_status('Processing') if not self.authorized(user_handle, 'Terminator'): self.set_job_status('Unauthorized') self.post_message( channel=channel, text='@{} Unauthorized'.format(user_handle)) return False to_remove = [ x for x in kwargs['users'].split() if '@' not in x ] for r in to_remove: try: c = self.bot.get_config('alias_reverse', r) if c: if c not in to_remove: to_remove.append(c) except: continue for r in to_remove: try: c = self.bot.get_config('alias', r).split() for x in c: if x not in to_remove: to_remove.append(x) except: continue print(to_remove) if len(to_remove) == 0: self.log('No valid usernames') self.set_job_status('Finished') return self.post_message(channel=channel, text='@{} Removendo usuários: {}'.format( user_handle, ', '.join(to_remove))) all_boards = self.org.get_boards({'fields': 'id'}) members = { board.id: board.all_members() for board in all_boards } members_username = { board.id: [x.username for x in members[board.id]] for board in all_boards } for username in to_remove: response = '@{} User {} not found at any boards'.format( user_handle, username) removed = False removed_boards = [] m = None for mm in members: if isinstance(members[mm], list): for member in members[mm]: if member.username == username: m = member break else: if members[mm].username == username: m = mm break if m == None: self.log('User {} doesn\'t exists'.format(username)) continue try: self.client.fetch_json( '/organizations/{}/members/{}'.format( self.org_id, m.id), http_method='DELETE') except: traceback.print_exc() for board in all_boards: if username in members_username[board.id]: try: self.log('Found {} at board {}'.format( username, board.name)) removed = True removed_boards.append('"{}"'.format( board.name)) board.remove_member(m) self.log( 'User {} removed from board {}'.format( username, board.name)) except: self.post_message( channel, 'Failed to remove {} from board {}'.format( username, board.name)) self.log(traceback.format_exc()) if removed: response = '@{} User {} removed from boards {}'.format( user_handle, username, ', '.join(removed_boards)) if response: self.post_message(channel, response) else: self.log( 'User {} not found in any boards'.format(username)) self.post_message( channel, '@{} User {} not found in any boards'.format( user_handle, username)) self.set_job_status('Finished') self.set_job_end(datetime.now())
def add_members(): # TODO pass def add_meta_cards(trello_list): team = list(TEAM) prs = random.choice(team) team.remove(prs) trello_list.add_card('PRs: {}'.format(prs)) web_help = random.choice(team) trello_list.add_card('WebHelp: {}'.format(web_help)) return trello_list if __name__ == "__main__": parser = ArgumentParser() parser.add_argument('--api-key', required=True) parser.add_argument('--token', required=True) parser.add_argument('--organization_id', required=True) args = parser.parse_args() client = TrelloClient(api_key=args.api_key, token=args.token) organization = client.get_organization(args.organization_id) count = len(organization.get_boards('open')) + 1 board = build_board(client, count, organization_id=args.organization_id) board = purge_lists(board) board = add_lists(board) meta = [x for x in board.open_lists() if x.name.lower() == 'meta'][0] add_meta_cards(meta)
def print_hook(hook): print(f"{hook.desc} -> {hook.callback_url} (Active: {hook.active})") def delete_all_webhooks(): for hook in client.list_hooks(): print_hook(hook) hook.delete() def list_orgs(): for org in client.list_organizations(): print(f"{org.id} {org.name}") if __name__ == "__main__": # delete_all_webhooks() # list_orgs() org = client.get_organization(os.getenv("TRELLO_ORG_ID")) for board in org.all_boards(): print(f"{board.name}") hook = client.create_hook( os.getenv("ULTRAHOOK_CALLBACK_URL"), board.id, desc="Ludus" ) if hook: print_hook(hook) else: print("failed to create hook")