School Commit Init

This commit is contained in:
2024-08-31 12:07:21 +03:00
commit 0b130ee18c
2801 changed files with 4720552 additions and 0 deletions
@@ -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
@@ -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
@@ -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")