def test_search_unique(self): repoRental = RepositoryRentals("Reporentals:") repoRental.add(Rental(1, Book(1, "Title1", "Author1"), Client(1, "Name1"), datetime.date(2019, 10, 5), None)) repoRental.add(Rental(2, Book(2, "Title2", "Author2"), Client(2, "Name2"), datetime.date(2019, 10, 6), None)) self.assertRaises(RepositoryError, lambda : repoRental.search_unique(Rental(1, Book(2, "Title1", "Author1"), Client(1, "Name1"), datetime.date(2019, 10, 5), None))) self.assertRaises(RepositoryError, lambda : repoRental.search_unique(Rental(12, Book(1, "Title1", "Author1"), Client(1, "Name1"), datetime.date(2019, 10, 5), None)))
def test_rental_remove_book(self): repoRental = RepositoryRentals("Reporentals:") repoRental.add(Rental(1, Book(1, "Title1", "Author1"), Client(1, "Name1"), datetime.date(2019, 10, 5), None)) repoRental.add(Rental(2, Book(2, "Title2", "Author2"), Client(2, "Name2"), datetime.date(2019, 10, 6), None)) repoRental.remove_book(2) assert(repoRental.size() == 1)
def initFromMemory(self): self.listOfBooks.extend([ Book("1", "B", "E"), Book("2", "E", "x"), Book("5", "po", "k"), Book("4", "T", "J"), Book("3", "z", "E"), Book("7", "Iz", "Pzz") ]) self.listOfClients.extend([ Client("1", "jo"), Client("2", "Richy"), Client("3", "Iu"), Client("4", "Jaz"), Client("5", "Qwe") ]) self.listOfRentedBooks.extend([ Rental("1", "1", "1", datetime.datetime(2012, 12, 5), datetime.datetime(2012, 12, 10)), Rental("2", "1", "4", datetime.datetime(2012, 12, 22), datetime.datetime(2013, 1, 22)), Rental("3", "1", "2", datetime.datetime(2012, 12, 29), datetime.datetime(2013, 12, 10)), Rental("3", "2", "5", datetime.datetime(2010, 9, 20), datetime.datetime(2011, 1, 1)) ]) self.mostRentedBooks = {} self.mostRentedAuthor = {} self.mostActiveClients = {}
def initialiserentals(self): r = Rental(1, 1, datetime.date(2019, 7, 2), datetime.date(1, 1, 1)) self._rentals.append(r) r = Rental(3, 2, datetime.date(2019, 10, 15), datetime.date(1, 1, 1)) self._rentals.append(r) r = Rental(4, 4, datetime.date(2019, 12, 2), datetime.date(1, 1, 1)) self._rentals.append(r)
def test_validate_rental(self): validatorRental = ValidateRental() with self.assertRaises(ValidationError) as context: validatorRental.validate_rental(Rental(-2, Book(2, "Title2", "Author2"), Client(2, "Name2"), datetime.date(2019, 10, 6), datetime.date(2018, 10, 5))) self.assertTrue("\n[VALIDATION ERROR] -> Invalid Rental ID! Invalid returned Date!" in str(context.exception)) self.assertRaises(ValidationError, lambda : validatorRental.validate_rental(Rental(-2, Book(2, "Title2", "Author2"), Client(2, "Name2"), datetime.date(2019, 10, 6), datetime.date(2018, 10, 5))))
def initialRentalList(repoRental): r1 = Rental(300, 100, 201, date(2018, 8, 15), date(2018, 8, 25), None) r2 = Rental(301, 102, 202, date(2018, 8, 23), date(2018, 9, 1), date(2018, 8, 30)) r3 = Rental(302, 103, 203, date(2018, 9, 1), date(2018, 9, 8), None) r4 = Rental(303, 104, 205, date(2018, 9, 7), date(2018, 9, 14), date(2018, 8, 14)) r5 = Rental(304, 105, 205, date(2018, 10, 1), date(2018, 10, 8), date(2018, 10, 7)) r6 = Rental(305, 102, 205, date(2018, 5, 1), date(2018, 5, 8), date(2018, 10, 3)) r7 = Rental(306, 106, 206, date(2018, 11, 1), date(2018, 12, 10), None) r8 = Rental(307, 102, 204, date(2018, 1, 11), date(2018, 1, 21), None) r9 = Rental(308, 104, 202, date(2018, 11, 5), date(2018, 12, 15), None) r10 = Rental(309, 108, 209, date(2018, 11, 9), date(2018, 12, 19), None) repoRental.addRental(r1) repoRental.addRental(r2) repoRental.addRental(r3) repoRental.addRental(r4) repoRental.addRental(r5) repoRental.addRental(r6) repoRental.addRental(r7) repoRental.addRental(r8) repoRental.addRental(r9) repoRental.addRental(r10)
def rent_book(self, client, book, date): ''' 'rents a book': basically adds a new entry to the rental list ''' self._repo.append( Rental(client.get_id(), book.get_id(), len(self._repo), date, date + timedelta(days=14), None)) Iterator.addaos( self, Rental(client.get_id(), book.get_id(), len(self._repo), date, date + timedelta(days=14), None))
def test_most_clients(self): repoClients = RepositoryClients("Repoclients:") repoRental = RepositoryRentals("Reporentals:") repoClients.add(Client(1, "Name1")) repoClients.add(Client(2, "Name2")) repoRental.add(Rental(1, Book(1, "Title1", "Author1"), Client(1, "Name1"), datetime.date(2019, 10, 5), None)) repoRental.add(Rental(2, Book(2, "Title2", "Author2"), Client(2, "Name2"), datetime.date(2019, 10, 6), datetime.date(2019, 10, 15))) c = repoClients.get_all() clist = repoRental.most_clients(c) assert(len(c) == len(clist))
def test_most_authors(self): repoBooks = RepositoryBooks("Repobooks:") repoRental = RepositoryRentals("Reporentals:") repoBooks.add(Book(1, "Title1", "Author1")) repoBooks.add(Book(2, "Title2", "Author2")) repoRental.add(Rental(1, Book(1, "Title1", "Author1"), Client(1, "Name1"), datetime.date(2019, 10, 5), None)) repoRental.add(Rental(2, Book(2, "Title2", "Author2"), Client(2, "Name2"), datetime.date(2019, 10, 6), None)) a = repoBooks.get_all_authors() alist = repoRental.most_authors(a) assert(len(a) == len(alist))
def create (self, ID, movieID, clientID, rentedDate, dueDate): ''' Adds a new rental to the repository ''' rental = Rental(ID, movieID, clientID, rentedDate, dueDate) self._validator.validate(rental) self._repository.add(rental)
def update_rental(self, rentalId, returnedDate, u): #updates a rental by adding its returnedDate #rentalID = (int) the rental ID #returnedDate = (date) the returnedDate rent = Rental(rentalId, None, None, None, returnedDate) book = self._repoRental.search(rent).book client = self._repoRental.search(rent).client rentedDate = self._repoRental.search(rent).rentedDate rent = Rental(rentalId, book, client, rentedDate, returnedDate) self._validatorRental.validate_rental(rent) rent2 = self._repoRental.search(rent) self._repoRental.update(rent) if u == True: UndoManager.register_operation(self, UndoHandler.UPDATE_RENTAL, int(rentalId), book.bookID, client.clientID, rentedDate, rent2.returnedDate)
def remove_rental(self, rentalId, u): rent = Rental(int(rentalId), None, None, None, None) rent = self._repoRental.search(rent) #print(self._repoRental.size()) self._repoRental.remove(rent) if u == True: UndoManager.register_operation(self, UndoHandler.REMOVE_RENTAL, rent.rentalID, rent.book.bookID, rent.client.clientID, rent.rentedDate, rent.returnedDate)
def add_rent(self, bookid, clientid, rentdate): ''' adds a rent to rentals list :param bookid: book id :param clientid: client id :param rentdate: rent date :return: append to the list of rentals ''' r = Rental(bookid, clientid, rentdate, datetime.date(1, 1, 1)) self._rentals.append(r)
def read_data(self): #reads all the data from the sql table self._entities = [] cmd = 'SELECT * FROM ' + self._table_name self._cursor.execute(cmd) line = self._cursor.fetchone() while line is not None: if line[4] is not None: obj = Rental( int(line[0]), Book(int(line[1]), None, None), Client(int(line[2]), None), datetime.datetime.strptime(line[3], '%Y-%m-%d').date(), datetime.datetime.strptime(line[4], '%Y-%m-%d').date()) else: obj = Rental( int(line[0]), Book(int(line[1]), None, None), Client(int(line[2]), None), datetime.datetime.strptime(line[3], '%Y-%m-%d').date(), None) self._entities.append(obj) line = self._cursor.fetchone()
def add_rental(self, rentalId, bookId, clientId, rentedDate, returnedDate, u): #adds a new rental to the list of rentals #rentalID = (int) the rental ID #bookID = (int) the book ID #clientID = (int) the client ID #rentedDate = (date) the rentedDate #returnedDate = (date) the returnedDate rent = Rental(rentalId, Book(bookId, None, None), Client(clientId, None), rentedDate, returnedDate) book = self._booksList.search(rent.book) client = self._clientsList.search(rent.client) rent = Rental(rentalId, book, client, rentedDate, returnedDate) self._validatorRental.validate_rental(rent) self._repoRental.search_unique(rent) self._repoRental.add(rent) if u == True: UndoManager.register_operation(self, UndoHandler.ADD_RENTAL, int(rentalId), int(bookId), int(clientId), rentedDate, returnedDate)
def search(self, keyobj): #returns an object with a specific key (keyobj) from the repo #raises a RepositoryError if the id is not in the repo #print(str(keyobj.bookID)) cmd = "SELECT * FROM " + self._table_name + " WHERE Id=" + str( keyobj.rentalID) + ";" self._cursor.execute(cmd) line = self._cursor.fetchone() if line is None: raise RepositoryError(self._name + " Inexistent ID!\n") if line[4] is not None: obj = Rental( int(line[0]), Book(int(line[1]), None, None), Client(int(line[2]), None), datetime.datetime.strptime(line[3], '%Y-%m-%d').date(), datetime.datetime.strptime(line[4], '%Y-%m-%d').date()) else: obj = Rental( int(line[0]), Book(int(line[1]), None, None), Client(int(line[2]), None), datetime.datetime.strptime(line[3], '%Y-%m-%d').date(), None) return obj
def createRental(self, rentalID, bookID, clientID, rd, dd, retd): rental = Rental(rentalID, bookID, clientID, rd, dd, retd) self.__repositoryRental.addRental(rental) rentals = self.__repositoryRental.getAll() """for rent in rentals: if rent.getRentalID == rentalID: raise ValueError("The ID must be unique!")""" redo = FunctionCall(self.createRental, rentalID, bookID, clientID, rd, dd, retd) undo = FunctionCall(self.removeRental, rentalID) oper = Operation(undo, redo) self.__UndoController.add(oper) self.__repositoryRental.addRental(rental) return rental
def generateRentals(self, dimension, idBasis, books, clients): result = [] for i in range(dimension): rentedDate = datetime.date(random.randint(2000, 2018), random.randint(1, 12), random.randint(1, 28)) dueDate = rentedDate + datetime.timedelta( days=random.randint(150, 300)) returnedDate = rentedDate + datetime.timedelta( days=random.randint(60, 400)) if random.choice([True, False, False ]) or returnedDate > datetime.date.today(): returnedDate = None r = Rental(idBasis + i, random.choice(books).getID(), random.choice(clients).getID(), rentedDate, dueDate, returnedDate) result.append(r) return result
def readRental(self): ID = input("Rental ID:") if self._rentalController.exists(ID): print("Rental ID " + ID + " allready exists") return None movieID = input("Movie ID: ") if self._movieController.exists(movieID) == False: print("Movie id: " + movieID + " not found!") return None clientID = input("Client ID: ") if self._rentalController.clientCanRent(clientID) == False: print("Cleint " + cleintID + " cant rent any movie") return None if self._clientController.exists(clientID) == False: print("Client id: " + clientID + " not found!") return None rentedDate = self.readDate("Rented date(zi/luna/an): ") dueDate = self.readDate("Due date(zi/luna/an): ") return Rental(ID, movieID, clientID, rentedDate, dueDate)
def _loadFile(self): try: #self._fileName = "D:\\INFO2018-2019\\~INFO\\FP\\Assignments\\AICIASS5-7\\57\\repository\\" + self._fileName f = open(self._fileName, "r") s = f.readline() while len(s) > 1: tok = s.split(",") if len(tok) == 6: rental = Rental(int(tok[0]), int(tok[1]), int(tok[2]), datetime.strptime(tok[3], '%Y-%m-%d'), datetime.strptime(tok[4], '%Y-%m-%d'), datetime.strptime(tok[5], '%Y-%m-%d')) RentalRepository.addRental(self, rental) """if len(tok) == 5: rental = Rental(int(tok[0]), int(tok[1]), int(tok[2]), datetime.strptime(tok[3], '%Y-%m-%d'), datetime.strptime(tok[4], '%Y-%m-%d'),None) RentalRepository.addRental(self, rental)""" s = f.readline().strip() except Exception as e: raise RepositoryError("The file cannot be open") finally: f.close()
def initFromText(self, fileForBooks, fileForClients, fileForRentals): fBooks = open(fileForBooks, "r") fClients = open(fileForClients, "r") fRentals = open(fileForRentals, "r") linesBook = fBooks.readlines() linesClient = fClients.readlines() linesRental = fRentals.readlines() for lines in linesBook: list = lines.split(",") newBook = Book(list[0], list[1], list[2]) self.addTheBookToTheRepo(newBook) for lines in linesClient: list = lines.split(",") newClient = Client(list[0], list[1]) self.addTheClientToTheRepo(newClient) for lines in linesRental: list = lines.split(",") list[3] = self.stringToDate(list[3]) if list[4] != "notReturned": list[4] = self.stringToDate(list[4]) newRental = Rental(list[0], list[1], list[2], list[3], list[4]) self.insertIntoRentals(newRental)
def createRental(self, rentalId, client, car, start, end): """ Create a rental using the provided data rentalId - id of the new rental client - The client that will rent the car car - The car to be rented start, end - The endpoints of the rental """ rental = Rental(rentalId, start, end, client, car) self._validator.validate(rental) ''' Check the car's availability for the given period ''' if self.isCarAvailable(car, start, end) == False: raise CarRentalException("Car is not available during that time!") self._repository.store(rental) ''' If the operation did not raise an Exception, then we record it for Undo/Redo ''' self._operations.append(AddOperation(rental)) self._index += 1 self._undoController.recordUpdatedControllers([self])
#________________CLIENTS____________________________________________________ repoClients.add(Client(20, "John Wright")) repoClients.add(Client(40, "Andrei Ivan")) repoClients.add(Client(35, "Frank Lampard")) repoClients.add(Client(78, "Gerard Pique")) repoClients.add(Client(24, "Moussa Dembele")) repoClients.add(Client(12, "Mohamed Salah")) repoClients.add(Client(4, "Virgil Van Dijk")) repoClients.add(Client(67, "Frenkie De Jong")) repoClients.add(Client(80, "Luuk De Jong")) repoClients.add(Client(36, "Joshua Kimmich")) #____________________________________________________________________________ repoRental.add( Rental(1, Book(1, "The Secret Crusade", "Oliver Bowden"), Client(20, "John Wright"), datetime.date(2019, 10, 5), None)) repoRental.add( Rental(2, Book(2, "The Illustrated Man", "Ray Bradbury"), Client(40, "Andrei Ivan"), datetime.date(2019, 10, 7), None)) #repoRental.add(Rental(3, Book(3, "The Glass Castle", "Jeannette Walls"), Client(35, "Frank Lampard"), datetime.date(2019, 10, 15), None)) repoRental.add( Rental(4, Book(4, "Still Alice", "Lisa Genova"), Client(78, "Gerard Pique"), datetime.date(2019, 11, 1), None)) repoRental.add( Rental(5, Book(5, "Olive Again", "Elizabeth Strout"), Client(24, "Moussa Dembele"), datetime.date(2019, 11, 7), None)) repoRental.add( Rental(6, Book(6, "The Nightshift Before Christmas", "Adam Kay"), Client(12, "Mohamed Salah"), datetime.date(2019, 11, 9), None)) repoRental.add(
def addToMostRentedBooks(self, newBook): self.mostRentedBooks.append([Rental.getBookId(newBook), 1])