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()
Esempio n. 2
0
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
Esempio n. 3
0
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(), [])
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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())
Esempio n. 7
0
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)
Esempio n. 8
0
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")