diff --git a/Project/Trello/Models/Board.py b/Project/Trello/Models/Board.py new file mode 100644 index 0000000..76eea4d --- /dev/null +++ b/Project/Trello/Models/Board.py @@ -0,0 +1,40 @@ +from Library import IdGenerator +from Library import Access + + +class Board(object): + + def __init__(self, name="", url=""): + self.id = IdGenerator.generateUniqueId() + self.name = name + self.privacy = Access.PUBLIC + self.url = url + self.members = set() + self.lists = set() + + def setBoardName(self, name): + self.name = name + + def setAccessSpecifier(self, access): + self.privacy = access + + def getBoardName(self): + return self.name + + def addMemberToBoard(self, userId): + self.members.add(userId) + + def removeMemberFromBoard(self, userId): + if userId not in self.members: + print str(userId) + "not present in Board: " + str(self.id) + return + self.members.remove(userId) + + def addListToBoard(self, listId): + self.lists.add(listId) + + def removeListFromBoard(self, listId): + if listId not in self.lists: + print str(listId) + " not present in Board: " + str(self.id) + return + self.lists.remove(listId) diff --git a/Project/Trello/Models/Cards.py b/Project/Trello/Models/Cards.py new file mode 100644 index 0000000..7c3d5aa --- /dev/null +++ b/Project/Trello/Models/Cards.py @@ -0,0 +1,35 @@ +from Trello.Models.Library import IdGenerator + + +class Cards(object): + userAssigned = None # type: String + + def __init__(self, name="", listId=None): + self.id = IdGenerator.generateUniqueId() + self.name = name + self.description = None + self.userAssigned = None + self.listId = listId + + def setName(self, name): + self.name = name + + def getName(self): + return self.name + + def setDescription(self, description): + self.description = description + + def getDescription(self): + if self.description is not None: + return self.description + return None + + def assignUser(self, userId): + self.userAssigned = userId + + def removeUser(self): + self.userAssigned = None + + def getUserName(self): + return self.userAssigned \ No newline at end of file diff --git a/Project/Trello/Models/Library.py b/Project/Trello/Models/Library.py new file mode 100644 index 0000000..aaebd17 --- /dev/null +++ b/Project/Trello/Models/Library.py @@ -0,0 +1,27 @@ +import string +import random + + +class IdGenerator(object): + generatedIds = set() + + @staticmethod + def getStringId(): + randomString = ''.join([random.choice(string.ascii_letters + + string.digits) for _ in range(10)]) + return randomString + + @classmethod + def generateUniqueId(cls): + randomString = cls.getStringId() + while randomString in cls.generatedIds: + randomString = cls.getStringId() + cls.generatedIds.add(randomString) + return randomString + + +class Access(object): + PRIVATE = "PRIVATE" + PUBLIC = "PUBLIC" + + diff --git a/Project/Trello/Models/Lists.py b/Project/Trello/Models/Lists.py new file mode 100644 index 0000000..23b5b6e --- /dev/null +++ b/Project/Trello/Models/Lists.py @@ -0,0 +1,22 @@ +from Trello.Models.Library import IdGenerator + + +class Lists(object): + + def __init__(self, name="", boardId=""): + self.id = IdGenerator.generateUniqueId() + self.name = name + self.boardId = boardId + self.cards = set() + + def setName(self, name): + self.name = name + + def addCard(self, cardId): + self.cards.add(cardId) + + def removeCard(self, cardId): + if cardId not in self.cards: + print str(cardId) + " not present in List: " + str(self.id) + return + self.cards.remove(cardId) diff --git a/Project/Trello/Models/User.py b/Project/Trello/Models/User.py new file mode 100644 index 0000000..87e50a5 --- /dev/null +++ b/Project/Trello/Models/User.py @@ -0,0 +1,17 @@ +from Trello.Models.Library import IdGenerator + + +class User(object): + def __init__(self, name="", email=""): + self.id = IdGenerator.generateUniqueId() + self.name = name + self.email = email + + def setName(self, name): + self.name = name + + def getName(self): + return self.name + + def setEmail(self, email): + self.email = email diff --git a/Project/Trello/Models/__init__.py b/Project/Trello/Models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Project/Trello/Services/BoardService.py b/Project/Trello/Services/BoardService.py new file mode 100644 index 0000000..5676783 --- /dev/null +++ b/Project/Trello/Services/BoardService.py @@ -0,0 +1,107 @@ +from Trello.Models.Board import Board +from Trello.Models.Library import Access + + +class BoardService(object): + + def __init__(self): + self.boards = dict() + self.listService = None + self.cardService = None + + def setServices(self, listService, cardService): + self.listService = listService + self.cardService = cardService + + def validatePresent(self, boardId): + if boardId not in self.boards: + print "Board Id not present" + return False + return True + + def createBoard(self, name): + board = Board(name) + self.boards[board.id] = board + print "Created Board: ", board.id + + def updateName(self, boardId, name): + if not self.validatePresent(boardId): + return + board = self.boards[boardId] + board.setBoardName(name) + + def updateAccess(self, boardId, access): + if not self.validatePresent(boardId): + return + board = self.boards[boardId] + board.setAccessSpecifier(access) + + def addMemberToBoard(self, boardId, userId): + if not self.validatePresent(boardId): + return + board = self.boards[boardId] + board.addMemberToBoard(userId) + + def removeMemberFromBoard(self, boardId, userId): + if not self.validatePresent(boardId): + return + board = self.boards[boardId] + board.removeMemberFromBoard(userId) + + def addListInBoard(self, boardId, listId): + if not self.validatePresent(boardId): + return + board = self.boards[boardId] + board.addListToBoard(listId) + + def removeListFromBoard(self, boardId, listId): + if not self.validatePresent(boardId): + return + board = self.boards[boardId] + board.removeListFromBoard(listId) + + def deleteBoard(self, boardId): + if not self.validatePresent(boardId): + return + board = self.boards[boardId] + for memberId in board.members: + self.removeMemberFromBoard(boardId, memberId) + for listId in board.lists: + # self.removeListFromBoard(boardId, listId) + self.listService.deleteList(listId) + del self.boards[boardId] + + def showBoardDetailItem(self, boardId): + if not self.validatePresent(boardId): + return + board = self.boards[boardId] + boardItemInfo = "" + boardItemInfo += "ID: " + str( board.id ) + boardItemInfo += ", Name: " + str( board.name ) + boardItemInfo += ", privacy: " + str( board.privacy ) + + listInfo = "" + isListPresent = False + for listId in board.lists: + isListPresent = True + if len(listInfo)>0: + listInfo += ", " + listInfo += "{ "+ self.listService.showListDetail(listId)+ " }" + if isListPresent: + boardItemInfo += "Lists: ", listInfo + # TODO List + isMembersPresent = False + membersInfo = "" + for members in board.members: + isMembersPresent = True + membersInfo += "{ Name: "+ str(members)+ "}" + if isMembersPresent: + boardItemInfo += "{ members: " + membersInfo + "}" + return boardItemInfo + + def showBoardDetail(self): + boardInfo = "" + for boardId in self.boards: + boardInfo += "{ " + self.showBoardDetailItem(boardId)+ "}\n" + return boardInfo if len(boardInfo)>0 else None + diff --git a/Project/Trello/Services/CardService.py b/Project/Trello/Services/CardService.py new file mode 100644 index 0000000..c4c8923 --- /dev/null +++ b/Project/Trello/Services/CardService.py @@ -0,0 +1,59 @@ +from Trello.Models.Cards import Cards + + +class CardService(object): + def __init__(self): + self.cards = dict() + self.listService = None + self.boardService = None + + def setServices(self, boardService, listService): + self.listService = listService + self.boardService = boardService + + def createCard(self, cardName, listId): + card = Cards(name=cardName, listId=listId) + self.cards[card.id] = card + self.listService.addCardToList(listId, card.id) + print "Created Card: ", card.id + + def updateCardName(self, cardId, name): + card = self.cards[cardId] + card.setName(name) + + def updateDescription(self, cardId, description): + card = self.cards[cardId] + card.setDescription = description + + def assignUserToCard(self, userId, cardId): + card = self.cards[cardId] + card.assignUser(userId) + + def unAssignUserFromCard(self, cardId): + card = self.cards[cardId] + card.removeUser() + + def moveCardToAnotherList(self, cardId, newListId): + card = self.cards[cardId] + if card.listId==newListId: + print "Same list id" + return + self.listService.removeCardFromList(card.listId, cardId) + self.listService.addCardToList(newListId, cardId) + card.listId = newListId + + def deleteCard(self, cardId): + card = self.card[cardId] + self.listService.removeCardFromList(card.listId, cardId) + del self.cards[cardId] + + def showCardDetail(self, cardId): + card = self.cards[cardId] + cardInfo = "" + cardInfo += "Id: "+ str(cardId) + cardInfo += " Name: "+ str(card.getName()) + if card.getDescription(): + cardInfo += " Description: " + str(card.getDescription()) + if card.getUserName(): + cardInfo += " UserName: " + card.getUserName() + return cardInfo diff --git a/Project/Trello/Services/ListService.py b/Project/Trello/Services/ListService.py new file mode 100644 index 0000000..f07a72a --- /dev/null +++ b/Project/Trello/Services/ListService.py @@ -0,0 +1,59 @@ +from Trello.Models.Lists import Lists + + +class ListService(object): + + def __init__(self): + self.lists = dict() + self.boardService = None + self.cardService = None + + def setServices(self, boardService, cardService): + self.boardService = boardService + self.cardService = cardService + + def createList(self, boardId, name): + listWorks = Lists(name, boardId) + self.lists[listWorks.id] = listWorks + self.boardService.addListToBoard(boardId, listWorks.id) + print "Created List: ", listWorks.id + + def addCardToList(self, listId, cardId): + listWorks = self.lists[listId] + listWorks.addCard(cardId) + + def removeCardFromList(self, listId, cardId): + if listId not in self.lists: + print "ListId not present" + return + listWorks = self.lists[listId] + listWorks.removeCardFromList(cardId) + + def deleteList(self, listId): + if listId not in self.lists: + print "List Id not present" + return + listWorks = self.lists[listId] + for cardId in listWorks.cards: + self.cardService.deleteCard(cardId) + del self.lists[listId] + self.boardService.removeListFromBoard(listWorks.boardId, listId) + + def showListDetail(self, listId): + if listId not in self.lists: + return "" + listWorks = self.lists[listId] + listInfo = "" + listInfo += "ListID: " + str(listId) + listInfo += " Name: "+ str(listWorks.name) + isCardsPresent = False + cardInfo = "" + for cardId in listWorks.cards: + isCardsPresent = True + if len(cardInfo) > 0: + cardInfo += "," + cardInfo += " {" + self.cardService.showCardDetail(cardId) + "}" + if isCardsPresent: + listInfo += ", Cards: " + cardInfo + return listInfo + diff --git a/Project/Trello/Services/__init__.py b/Project/Trello/Services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Project/Trello/TrelloManager.py b/Project/Trello/TrelloManager.py new file mode 100644 index 0000000..14a34fb --- /dev/null +++ b/Project/Trello/TrelloManager.py @@ -0,0 +1,17 @@ +from Trello.Services.BoardService import BoardService + +from Trello.Services.ListService import ListService + +from Trello.Services.CardService import CardService + + +class TrelloManager(object): + def __init__(self): + self.boardService = BoardService() + self.listService = ListService() + self.cardService = CardService() + + # Initialize each of these objects in other service class. + self.boardService.setServices(self.listService, self.cardService) + self.listService.setServices(self.boardService, self.cardService) + self.cardService.setServices(self.boardService, self.listService) diff --git a/Project/Trello/__init__.py b/Project/Trello/__init__.py new file mode 100644 index 0000000..40f6ac6 --- /dev/null +++ b/Project/Trello/__init__.py @@ -0,0 +1,79 @@ +from Trello.TrelloManager import TrelloManager + + +class TrelloApplication(object): + + @classmethod + def run(cls): + trelloManager = TrelloManager() + while True: + try: + userInput = raw_input() + wordsSplit = userInput.split() + if wordsSplit[0] == "BOARD": + if wordsSplit[1] == "CREATE": + trelloManager.boardService.createBoard(wordsSplit[2]) + elif wordsSplit[1] == "DELETE": + trelloManager.boardService.deleteBoard(wordsSplit[2]) + else: + boardId = wordsSplit[1] + if wordsSplit[2] == "name": + trelloManager.boardService.updateName(boardId, wordsSplit[3]) + elif wordsSplit[2] == "privacy": + trelloManager.boardService.updateAccess(boardId, wordsSplit[3]) + elif wordsSplit[2] == "ADD_MEMBER": + trelloManager.boardService.addMemberToBoard(boardId, wordsSplit[3]) + elif wordsSplit[2] == "REMOVE_MEMBER": + trelloManager.boardService.removeMemberFromBoard(boardId, wordsSplit[3]) + elif wordsSplit[0] == "SHOW": + output = None + if len(wordsSplit) == 1: + output = trelloManager.boardService.showBoardDetail() + elif wordsSplit[1] == "BOARD": + output = trelloManager.boardService.showBoardDetailItem(wordsSplit[2]) + elif wordsSplit[1] == "LIST": + output = trelloManager.listService.showListDetail(wordsSplit[2]) + elif wordsSplit[1] == "CARD": + output = trelloManager.cardService.showCardDetail(wordsSplit[[2]]) + else: + print "No such option, try again" + if output is None: + print "No Boards" + else: + print output + elif wordsSplit[0] == "LIST": + if wordsSplit[1] == "CREATE": + boardId = wordsSplit[2] + listName = ' '.join(wordsSplit[3:]) + trelloManager.listService.createList(boardId, listName) + + elif wordsSplit[1] == "DELETE": + trelloManager.listService.deleteList(wordsSplit[2]) + elif wordsSplit[0] == "CARD": + if wordsSplit[1] == "CREATE": + listId = wordsSplit[2] + trelloManager.cardService.createCard(wordsSplit[3], listId) + elif wordsSplit[1] == "DELETE": + trelloManager.cardService.deleteCard(wordsSplit[2]) + else: + cardId = wordsSplit[1] + if wordsSplit[2] == "name": + name = wordsSplit[3] + trelloManager.cardService.updateCardName(cardId, name) + + elif wordsSplit[2] == "description": + trelloManager.cardService.updateDescription(cardId, wordsSplit[3]) + + elif wordsSplit[2] == "ASSIGN": + trelloManager.cardService.assignUserToCard(wordsSplit[3], cardId) + elif wordsSplit[2] =="UNASSIGN": + trelloManager.cardService.unAssignUserFromCard(cardId) + except Exception as e: + print "Exception raised: ", e.message + +def main(): + TrelloApplication.run() + + +if __name__ == '__main__': + main() \ No newline at end of file