School Commit Init
This commit is contained in:
+66
@@ -0,0 +1,66 @@
|
||||
from repository import Repository
|
||||
from reservation import Reservation
|
||||
import random
|
||||
from datetime import date,timedelta
|
||||
|
||||
class Controller:
|
||||
def __init__(self,repo) -> None:
|
||||
self.repo=repo
|
||||
def display(self,start,end):
|
||||
return sorted(sorted(self.repo.get_by_date(start,end),key=lambda x:x.last_name),key=lambda x:x.start_date)
|
||||
def get_empty_rooms(self,start,end):
|
||||
"""
|
||||
:params:
|
||||
start: date
|
||||
end: date
|
||||
:return:
|
||||
list of empty rooms
|
||||
|
||||
Function that returns a list of empty rooms for a given period of time
|
||||
"""
|
||||
return self.repo.get_empty_rooms(start,end)
|
||||
def create_reservation(self,last_name,first_name,room_type,guests,start,end):
|
||||
"""
|
||||
:params:
|
||||
last_name: string
|
||||
first_name: string
|
||||
room_type: string
|
||||
guests: string
|
||||
start: date
|
||||
end: date
|
||||
:return:
|
||||
None
|
||||
|
||||
Function that creates a reservation. The id is generated randomly and the reservation is added to the repository
|
||||
"""
|
||||
new_reservation=Reservation(random.randint(1000,9999),last_name,first_name,room_type,guests,start,end)
|
||||
self.repo.add_reservation(new_reservation)
|
||||
pass
|
||||
def delete_reservation(self,id):
|
||||
self.repo.delete_reservation(id)
|
||||
def delete_reservation_by_date(self,start,end,room):
|
||||
res = sorted(sorted(self.repo.get_by_date(start,end),key=lambda x:x.last_name),key=lambda x:x.start_date)
|
||||
res_returned = []
|
||||
for i in res:
|
||||
if i.room_type == room:
|
||||
self.repo.delete_reservation(i.id)
|
||||
res_returned.append(i)
|
||||
return res_returned
|
||||
|
||||
pass
|
||||
def monthly_report(self,month):
|
||||
weeks=[[] for i in range(6)]
|
||||
days=[None for i in range(1,(date(2023,month+1,1)-date(2023,month,1)).days+1)]
|
||||
for i in range(1,(date(2023,month+1,1)-date(2023,month,1)).days+1):
|
||||
days[i-1] = len(self.repo.get_empty_rooms(date(2023,month,i),date(2023,month,i)+timedelta(1)))
|
||||
week=0
|
||||
for i in range(date(2023,month,1).weekday()):
|
||||
weeks[week].append("x")
|
||||
for i in range(1,(date(2023,month+1,1)-date(2023,month,1)).days+1):
|
||||
weeks[week].append(str(i)+"/"+str(days[i-1]))
|
||||
if (i+date(2023,month,1).weekday())%7==0:
|
||||
week+=1
|
||||
while len(weeks[week])<7:
|
||||
weeks[week].append("x")
|
||||
return weeks
|
||||
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
from datetime import date
|
||||
from reservation import Reservation
|
||||
|
||||
class Repository:
|
||||
def __init__(self,path) -> None:
|
||||
self.path = path
|
||||
self.__data = []
|
||||
self._rooms=[]
|
||||
self.__load()
|
||||
self.__load_rooms()
|
||||
def __load(self):
|
||||
with open(self.path,"r") as file:
|
||||
for line in file:
|
||||
res=line.strip().split(",")
|
||||
self.__data.append(Reservation(res[0],res[1],res[2],res[3],res[4],date.fromisoformat(res[5]),date.fromisoformat(res[6])))
|
||||
def __save(self):
|
||||
with open(self.path,"w") as file:
|
||||
for data in self.__data:
|
||||
l=[str(data.id),data.last_name,data.first_name,data.room_type,data.guests,str(data.start_date),str(data.end_date)]
|
||||
file.write(",".join(l)+"\n")
|
||||
|
||||
def __load_rooms(self):
|
||||
with open("room_types.txt","r") as file:
|
||||
for line in file:
|
||||
self._rooms.append(line.strip().split(","))
|
||||
|
||||
def add_reservation(self,reservation):
|
||||
"""
|
||||
:params:
|
||||
reservation: Reservation
|
||||
:return:
|
||||
None
|
||||
|
||||
Function that adds a reservation to the repository. Raises ValueError if the reservation already exists or if there is not enough space for the guests
|
||||
"""
|
||||
for res in self.__data:
|
||||
if res.id==reservation.id:
|
||||
raise ValueError("Reservation already exists")
|
||||
if int(reservation.guests)>int(self._rooms[int(reservation.room_type)-1][1]):
|
||||
raise ValueError("Not enough space for the guests")
|
||||
self.__data.append(reservation)
|
||||
self.__save()
|
||||
def get_all(self):
|
||||
return self.__data
|
||||
def get_by_date(self,start,end):
|
||||
return [reservation for reservation in self.__data if (reservation.start_date>=start and reservation.start_date<=end) or (reservation.end_date<=end and reservation.end_date>=start)]
|
||||
def delete_reservation(self,id):
|
||||
for reservation in self.__data:
|
||||
if reservation.id==id:
|
||||
self.__data.remove(reservation)
|
||||
self.__save()
|
||||
return
|
||||
raise ValueError("Reservation not found")
|
||||
|
||||
def get_empty_rooms(self,start,end):
|
||||
"""
|
||||
:params:
|
||||
start: date
|
||||
end: date
|
||||
:return:
|
||||
list of room types that are empty
|
||||
"""
|
||||
room_types = ["01","02","03","04","05"]
|
||||
for reservation in self.__data:
|
||||
if (reservation.start_date>=start and reservation.start_date<=end) or (reservation.end_date<=end and reservation.end_date>=start):
|
||||
if reservation.room_type in room_types:
|
||||
room_types.remove(reservation.room_type)
|
||||
return room_types
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
class Reservation:
|
||||
def __init__(self,id,last_name,first_name,room_type,guests,start_date,end_date) -> None:
|
||||
self.id=id
|
||||
self.last_name=last_name
|
||||
self.first_name=first_name
|
||||
self.room_type=room_type
|
||||
self.guests=guests
|
||||
self.start_date=start_date
|
||||
self.end_date=end_date
|
||||
def __str__(self) -> str:
|
||||
return f"{self.id},{self.last_name},{self.first_name},{self.room_type},{self.guests},{self.start_date},{self.end_date}"
|
||||
def __repr__(self) -> str:
|
||||
return str(self)
|
||||
def __eq__(self, o: object) -> bool:
|
||||
return self.id==o.id
|
||||
@@ -0,0 +1,43 @@
|
||||
from controller import Controller
|
||||
from repository import Repository
|
||||
from ui import UI
|
||||
import random
|
||||
from datetime import date,timedelta
|
||||
|
||||
last_names=["Smith","Adam","Barbu","Munteanu","Dinu","Popescu","Ionescu","Vasile","Cirlea","Enache"]
|
||||
first_names=["John","George","Maria","Ana","Ioana","Daniel","Gabriel","Alexandru","Vlad","Arthur"]
|
||||
|
||||
def generate_data(n):
|
||||
reservations=[]
|
||||
current_date= date(2023, 1, 1)
|
||||
rooms=[]
|
||||
with open("room_types.txt") as f:
|
||||
for line in f:
|
||||
rooms.append(line.strip().split(","))
|
||||
i=1
|
||||
while(i<=n):
|
||||
departure_date=current_date + timedelta(random.randint(0,1))
|
||||
for j in range(1,random.randint(2,3)+1):
|
||||
if i>n:
|
||||
break
|
||||
last_name=random.choice(last_names)
|
||||
first_name=random.choice(first_names)
|
||||
room=rooms[j-1]
|
||||
reservations.append([str(i),last_name,first_name,room[0],room[1],str(current_date),str(departure_date)])
|
||||
i+=1
|
||||
current_date=departure_date
|
||||
|
||||
with open("data.txt","w") as f:
|
||||
for reservation in reservations:
|
||||
f.write(",".join(reservation)+"\n")
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
repo = Repository("data.txt")
|
||||
controller = Controller(repo)
|
||||
ui = UI(controller)
|
||||
ui.start()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,44 @@
|
||||
from repository import Repository
|
||||
from controller import Controller
|
||||
from datetime import date
|
||||
from reservation import Reservation
|
||||
|
||||
def test_get_empty_rooms():
|
||||
f=open("test_data.txt","w")
|
||||
f.close()
|
||||
repo = Repository("test_data.txt")
|
||||
controller = Controller(repo)
|
||||
rooms = controller.get_empty_rooms(date(2023, 1, 1),date(2023, 1, 1))
|
||||
assert len(rooms) == 5
|
||||
print("test_get_empty_rooms passed")
|
||||
|
||||
def test_get_empty_rooms_repo():
|
||||
f=open("test_data.txt","w")
|
||||
f.close()
|
||||
repo = Repository("test_data.txt")
|
||||
rooms = repo.get_empty_rooms(date(2023, 1, 1),date(2023, 1, 1))
|
||||
assert len(rooms) == 5
|
||||
print("test_get_empty_rooms_repo passed")
|
||||
|
||||
def test_create_reservation_repo():
|
||||
f=open("test_data.txt","w")
|
||||
f.close()
|
||||
repo = Repository("test_data.txt")
|
||||
repo.add_reservation(Reservation("1","Smith", "John", "01", "1", date(2023, 1, 1), date(2023, 1, 2)))
|
||||
assert len(repo.get_all()) == 1
|
||||
print("test_create_reservation passed")
|
||||
|
||||
def test_create_reservation():
|
||||
f=open("test_data.txt","w")
|
||||
f.close()
|
||||
repo = Repository("test_data.txt")
|
||||
controller = Controller(repo)
|
||||
controller.create_reservation("Smith", "John", "01", "1", date(2023, 1, 1), date(2023, 1, 2))
|
||||
assert len(repo.get_all()) == 1
|
||||
print("test_create_reservation passed")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_get_empty_rooms()
|
||||
test_get_empty_rooms_repo()
|
||||
test_create_reservation()
|
||||
test_create_reservation_repo()
|
||||
@@ -0,0 +1,128 @@
|
||||
from controller import Controller
|
||||
from datetime import date
|
||||
from prettytable import PrettyTable
|
||||
|
||||
|
||||
class UI:
|
||||
def __init__(self, controller):
|
||||
self.__controller = controller
|
||||
self.months=["January","February","March","April","May","June","July","August","September","October","November","December"]
|
||||
|
||||
def start(self):
|
||||
while True:
|
||||
print("""
|
||||
1. Display reservations
|
||||
2. Create reservation
|
||||
3. Delete reservation
|
||||
4. Monthly report
|
||||
5. Exit
|
||||
""")
|
||||
command = input("Enter command: ")
|
||||
match command:
|
||||
case "1":
|
||||
try:
|
||||
start ="2023-" + input("Enter start date: ")
|
||||
end = "2023-" + input("Enter end date: ")
|
||||
reservations = self.__controller.display(date.fromisoformat(start), date.fromisoformat(end))
|
||||
i=0
|
||||
while i<12:
|
||||
table = PrettyTable((self.months[i],"Name","Guests"))
|
||||
for reservation in reservations:
|
||||
if reservation.start_date.month<=i+1 and reservation.end_date.month>=i+1:
|
||||
table.add_row((str(reservation.start_date)+"|-| "+str(reservation.end_date),reservation.last_name+" "+reservation.first_name,reservation.guests))
|
||||
if len(table.rows)>0:
|
||||
print(table)
|
||||
i+=1
|
||||
except Exception as e:
|
||||
raise e
|
||||
|
||||
case "2":
|
||||
try:
|
||||
arrival ="2023-"+ input("Enter arrival date: ")
|
||||
departure ="2023-"+ input("Enter departure date: ")
|
||||
rooms = self.__controller.get_empty_rooms(date.fromisoformat(arrival), date.fromisoformat(departure))
|
||||
if len(rooms) == 0:
|
||||
print("No rooms available")
|
||||
break
|
||||
print("Available rooms: ")
|
||||
for room in rooms:
|
||||
print(room)
|
||||
room_type = input("Enter room type: ")
|
||||
if room_type == "exit":
|
||||
break
|
||||
if room_type not in rooms:
|
||||
print("Invalid room type")
|
||||
break
|
||||
guests = input("Enter number of guests: ")
|
||||
if guests == "exit":
|
||||
break
|
||||
if guests == "":
|
||||
print("Invalid number of guests")
|
||||
break
|
||||
last_name = input("Enter last name: ")
|
||||
if last_name == "exit":
|
||||
break
|
||||
if last_name == "":
|
||||
print("Invalid last name")
|
||||
break
|
||||
first_name = input("Enter first name: ")
|
||||
if first_name == "exit":
|
||||
break
|
||||
if first_name == "":
|
||||
print("Invalid first name")
|
||||
break
|
||||
self.__controller.create_reservation(last_name, first_name, room_type, guests, date.fromisoformat(arrival), date.fromisoformat(departure))
|
||||
except Exception as e:
|
||||
print("Error")
|
||||
case "3":
|
||||
try:
|
||||
print("""
|
||||
1. Delete by id
|
||||
2. Delete by date
|
||||
""")
|
||||
command2 = input("Enter command: ")
|
||||
match command2:
|
||||
case "1":
|
||||
id = input("Enter id: ")
|
||||
self.__controller.delete_reservation(id)
|
||||
case "2":
|
||||
start ="2023-" + input("Enter start date: ")
|
||||
end ="2023-" + input("Enter end date: ")
|
||||
room=input("Enter room type: ")
|
||||
reservations=self.__controller.delete_reservation_by_date(date.fromisoformat(start), date.fromisoformat(end),room)
|
||||
if len(reservations)==0:
|
||||
print("No reservations deleted")
|
||||
else:
|
||||
i=0
|
||||
while i<12:
|
||||
table = PrettyTable((self.months[i],"Name","Guests"))
|
||||
for reservation in reservations:
|
||||
if reservation.start_date.month<=i+1 and reservation.end_date.month>=i+1:
|
||||
table.add_row((str(reservation.start_date)+"|-| "+str(reservation.end_date),reservation.last_name+" "+reservation.first_name,reservation.guests))
|
||||
if len(table.rows)>0:
|
||||
print(table)
|
||||
i+=1
|
||||
|
||||
case _:
|
||||
print("Invalid command")
|
||||
except Exception as e:
|
||||
print("Error")
|
||||
case "4":
|
||||
try:
|
||||
month = int(input("Enter month: "))
|
||||
if month < 1 or month > 12:
|
||||
raise Exception("Invalid month")
|
||||
report = self.__controller.monthly_report(month)
|
||||
table = PrettyTable(("M", "Tu", "W", "Th", "F", "Sa", "Su"))
|
||||
for week in report:
|
||||
if len(week) < 7:
|
||||
continue
|
||||
table.add_row(week)
|
||||
print(table)
|
||||
except Exception as e:
|
||||
raise e
|
||||
case "5":
|
||||
break
|
||||
case _:
|
||||
print("Invalid command")
|
||||
|
||||
Reference in New Issue
Block a user