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,129 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
@@ -0,0 +1 @@
# Remember to commit and push your work to GitHub.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,5 @@
01,2
02,2
03,4
04,4
05,1
@@ -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")
@@ -0,0 +1 @@
1,Smith,John,01,1,2023-01-01,2023-01-02