diff --git a/Folder/.idea/.gitignore b/Folder/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/Folder/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/Folder/.idea/MovieDatabaseApp.iml b/Folder/.idea/MovieDatabaseApp.iml
new file mode 100644
index 0000000..909438d
--- /dev/null
+++ b/Folder/.idea/MovieDatabaseApp.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Folder/.idea/inspectionProfiles/profiles_settings.xml b/Folder/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/Folder/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Folder/.idea/misc.xml b/Folder/.idea/misc.xml
new file mode 100644
index 0000000..a6218fe
--- /dev/null
+++ b/Folder/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Folder/.idea/modules.xml b/Folder/.idea/modules.xml
new file mode 100644
index 0000000..784f752
--- /dev/null
+++ b/Folder/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Folder/Instructions b/Folder/Instructions
deleted file mode 100644
index b0f1c34..0000000
--- a/Folder/Instructions
+++ /dev/null
@@ -1 +0,0 @@
-Submit your code here
diff --git a/Folder/MovieDatabaseApp/.idea/.gitignore b/Folder/MovieDatabaseApp/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/Folder/MovieDatabaseApp/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/Folder/MovieDatabaseApp/.idea/MovieDatabaseApp.iml b/Folder/MovieDatabaseApp/.idea/MovieDatabaseApp.iml
new file mode 100644
index 0000000..909438d
--- /dev/null
+++ b/Folder/MovieDatabaseApp/.idea/MovieDatabaseApp.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Folder/MovieDatabaseApp/.idea/inspectionProfiles/profiles_settings.xml b/Folder/MovieDatabaseApp/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/Folder/MovieDatabaseApp/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Folder/MovieDatabaseApp/.idea/misc.xml b/Folder/MovieDatabaseApp/.idea/misc.xml
new file mode 100644
index 0000000..a6218fe
--- /dev/null
+++ b/Folder/MovieDatabaseApp/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Folder/MovieDatabaseApp/.idea/modules.xml b/Folder/MovieDatabaseApp/.idea/modules.xml
new file mode 100644
index 0000000..784f752
--- /dev/null
+++ b/Folder/MovieDatabaseApp/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Folder/MovieDatabaseApp/__pycache__/movie.cpython-311.pyc b/Folder/MovieDatabaseApp/__pycache__/movie.cpython-311.pyc
new file mode 100644
index 0000000..a722cd5
Binary files /dev/null and b/Folder/MovieDatabaseApp/__pycache__/movie.cpython-311.pyc differ
diff --git a/Folder/MovieDatabaseApp/__pycache__/review.cpython-311.pyc b/Folder/MovieDatabaseApp/__pycache__/review.cpython-311.pyc
new file mode 100644
index 0000000..fc3a5e0
Binary files /dev/null and b/Folder/MovieDatabaseApp/__pycache__/review.cpython-311.pyc differ
diff --git a/Folder/MovieDatabaseApp/movie.py b/Folder/MovieDatabaseApp/movie.py
new file mode 100644
index 0000000..89a41c2
--- /dev/null
+++ b/Folder/MovieDatabaseApp/movie.py
@@ -0,0 +1,6 @@
+class Movie:
+ def __init__(self, title, director, genre, release_year):
+ self.title = title
+ self.director = director
+ self.genre = genre
+ self.release_year = release_year
diff --git a/Folder/MovieDatabaseApp/movie_database.py b/Folder/MovieDatabaseApp/movie_database.py
new file mode 100644
index 0000000..a8c5970
--- /dev/null
+++ b/Folder/MovieDatabaseApp/movie_database.py
@@ -0,0 +1,163 @@
+#group members
+# Divine UDOH 20231712
+# Blair Nwokike 20230050
+#Edeoga Chukwuemeka 20230941
+
+import tkinter as tk
+from tkinter import simpledialog, messagebox
+from sqlalchemy import create_engine, Column, Integer, String, Float, ForeignKey
+from sqlalchemy.orm import sessionmaker, relationship, declarative_base
+from movie import Movie
+from review import Review
+
+# SQLAlchemy setup
+Base = declarative_base()
+
+class MovieModel(Base):
+ __tablename__ = 'movies'
+ id = Column(Integer, primary_key=True)
+ title = Column(String, unique=True)
+ director = Column(String)
+ genre = Column(String)
+ release_year = Column(Integer)
+ reviews = relationship("ReviewModel", back_populates="movie", cascade="all, delete")
+
+ def average_rating(self):
+ if not self.reviews:
+ return 0
+ return sum(r.rating for r in self.reviews) / len(self.reviews)
+
+class ReviewModel(Base):
+ __tablename__ = 'reviews'
+ id = Column(Integer, primary_key=True)
+ reviewer_name = Column(String)
+ rating = Column(Float)
+ comment = Column(String)
+ movie_id = Column(Integer, ForeignKey('movies.id'))
+ movie = relationship("MovieModel", back_populates="reviews")
+
+# DB engine
+engine = create_engine('sqlite:///movies.db', echo=False)
+Session = sessionmaker(bind=engine)
+session = Session()
+Base.metadata.create_all(engine)
+
+class MovieDatabaseApp:
+ def __init__(self, root):
+ self.root = root
+ self.root.title("🎬 Movie Database")
+ self.root.geometry("500x400")
+ self.root.configure(bg="#2e2e2e")
+
+ title_label = tk.Label(root, text="Movie Database", font=("Arial", 18, "bold"), bg="#2e2e2e", fg="#ffffff")
+ title_label.pack(pady=20)
+
+ button_frame = tk.Frame(root, bg="#2e2e2e")
+ button_frame.pack(pady=10)
+
+ self.create_button(button_frame, "Add Movie", self.add_movie).pack(pady=5)
+ self.create_button(button_frame, "Delete Movie", self.delete_movie).pack(pady=5)
+ self.create_button(button_frame, "View Movies", self.view_movies).pack(pady=5)
+ self.create_button(button_frame, "Search Movies", self.search_movies).pack(pady=5)
+ self.create_button(button_frame, "Exit", root.quit).pack(pady=5)
+
+ def create_button(self, parent, text, command):
+ return tk.Button(parent, text=text, width=20, height=2, bg="#4CAF50", fg="white",
+ font=("Arial", 12), command=command, relief="raised", bd=2)
+
+ def add_movie(self):
+ title = simpledialog.askstring("Movie Title", "Enter the movie title:")
+ if not title :
+ return
+ director = simpledialog.askstring("Director", "Enter the director:")
+ genre = simpledialog.askstring("Genre", "Enter the genre:")
+ year = simpledialog.askinteger("Release Year", "Enter the release year:")
+
+ if session.query(MovieModel).filter_by(title=title).first():
+ messagebox.showwarning("Duplicate", "This movie already exists.")
+ return
+
+ movie = MovieModel(title=title, director=director, genre=genre, release_year=year)
+ session.add(movie)
+ session.commit()
+ messagebox.showinfo("Success", "Movie added successfully.")
+
+ def delete_movie(self):
+ title = simpledialog.askstring("Delete Movie", "Enter the title of the movie to delete:")
+ if not title:
+ return
+ movie = session.query(MovieModel).filter_by(title=title).first()
+ if not movie:
+ messagebox.showerror("Error", "Movie not found.")
+ return
+ confirm = messagebox.askyesno("Confirm Delete", f"Are you sure you want to delete '{title}'?")
+ if confirm:
+ session.delete(movie)
+ session.commit()
+ messagebox.showinfo("Deleted", f"'{title}' has been deleted.")
+
+ def view_movies(self):
+ top = tk.Toplevel(self.root)
+ top.title("All Movies")
+ top.geometry("600x500")
+ top.configure(bg="#1e1e1e")
+
+ movies = session.query(MovieModel).all()
+ reviews = session.query(ReviewModel).all()
+ for movie in movies:
+ rating = round(movie.average_rating(), 2)
+ movie_description = f"{movie.title} ({movie.release_year}) - {movie.genre}, Dir: {movie.director} | ⭐ {rating}"
+
+ tk.Label(top, text=movie_description, bg="#1e1e1e", fg="white", font=("Arial", 14)).pack(anchor="w", padx=10, pady=2)
+ tk.Label(top, text="Reviews:", bg="#1e1e1e", fg="white", font=("Arial", 13)).pack(anchor="w", padx=10, pady=2)
+
+ for review in reviews:
+ if review.movie_id == movie.id:
+ text = (f"{review.reviewer_name} {review.rating}⭐\n "
+ f"{review.comment}")
+ tk.Label(top, text=text, bg="#1e1e1e", fg="white", font=("Times New Roman", 11)).pack(anchor="w", padx=10, pady=2)
+
+ tk.Button(top, text="Add Review", command=lambda m=movie: self.add_review(m), bg="#2196F3", fg="white").pack(pady=2)
+
+ def search_movies(self):
+ query = simpledialog.askstring("Search", "Enter title, director, or genre:")
+ if not query:
+ return
+
+ results = session.query(MovieModel).filter(
+ (MovieModel.title.ilike(f"%{query}%")) |
+ (MovieModel.genre.ilike(f"%{query}%")) |
+ (MovieModel.director.ilike(f"%{query}%"))
+ ).all()
+
+ top = tk.Toplevel(self.root)
+ top.title("Search Results")
+ top.geometry("600x500")
+ top.configure(bg="#1e1e1e")
+
+ if not results:
+ tk.Label(top, text="No results found.", font=("Arial", 12), fg="red", bg="#1e1e1e").pack(pady=20)
+ return
+
+ for movie in results:
+ rating = round(movie.average_rating(), 2)
+ info = f"{movie.title} ({movie.release_year}) - {movie.genre}, Dir: {movie.director} | ⭐ {rating}"
+ tk.Label(top, text=info, bg="#1e1e1e", fg="white", font=("Arial", 11)).pack(anchor="w", padx=10, pady=2)
+
+ def add_review(self, movie):
+ reviewer = simpledialog.askstring("Reviewer", "Enter your name:")
+ rating = simpledialog.askfloat("Rating", "Enter rating (0-5):")
+ comment = simpledialog.askstring("Comment", "Enter your comment:")
+
+ if not reviewer or rating is None:
+ return
+
+ review = ReviewModel(reviewer_name=reviewer, rating=rating, comment=comment, movie=movie)
+ session.add(review)
+ session.commit()
+ messagebox.showinfo("Success", "Review added successfully!")
+
+if __name__ == "__main__":
+ root = tk.Tk()
+ app = MovieDatabaseApp(root)
+ root.mainloop()
diff --git a/Folder/MovieDatabaseApp/review.py b/Folder/MovieDatabaseApp/review.py
new file mode 100644
index 0000000..3bee460
--- /dev/null
+++ b/Folder/MovieDatabaseApp/review.py
@@ -0,0 +1,5 @@
+class Review:
+ def __init__(self, reviewer_name, rating, comment):
+ self.reviewer_name = reviewer_name
+ self.rating = rating
+ self.comment = comment
diff --git a/Folder/guest.py b/Folder/guest.py
deleted file mode 100644
index e1a8097..0000000
--- a/Folder/guest.py
+++ /dev/null
@@ -1,23 +0,0 @@
-class Guest:
- def __init__(self, name, contact_info):
- self.name = name
- self.contact_info = contact_info
- self.checked_in = False
-
- def checkIn(self):
- """Checks a guest into the hotel"""
- self.checked_in = True
- return f"{self.name} has checked in"
-
- def checkOut(self):
- """Checks a guest out of the hotel"""
- if self.checked_in:
- self.checked_in = False
- return f"{self.name} has checked out."
- return f"{self.name} is not checked in."
-
- def __str__(self):
- """"Returns a clean/sanitized string represantation of a guest"""
- status = "Checked in" if self.checked_in else "Not checked in"
- return f"Guest: {self.name}, Contact: {self.contact_info}, Status: {status}"
-
\ No newline at end of file
diff --git a/Folder/hotel_management.py b/Folder/hotel_management.py
deleted file mode 100644
index 5a03a6c..0000000
--- a/Folder/hotel_management.py
+++ /dev/null
@@ -1,347 +0,0 @@
-from pydoc import text
-from sqlite3 import Date
-from tkinter import messagebox
-from turtle import width
-from guest import Guest
-from reservation import Reservation
-from room import HotelRoom
-import json
-import tkinter as tk
-from tkinter import *
-from tkinter import simpledialog
-from tkinter import Tk
-from tkinter import ttk
-import datetime
-
-import room
-
-### Important notes
-# Docstrings give relevant information on functions so when you hover over them with your mouse you can see the information given
-# they are defined with triple quotes """Information here"""
-
-class HotelManagement:
- def __init__(self, root):
- self.root = root
- self.root.title("Hotel Management System")
- self.root.geometry("600x600")
- self.create_widgets()
- self.database = self.load_from_file()
- self.rooms = self.database.get('rooms', [])
- self.reservations = self.database.get('reservations', {})
- self.configure_tree_view()
- self.room_tree_view.bind("<>", self.on_tree_select) # Binds the on_tree_select function to the main tree view
- self.selected_room_number = None
-
- def create_widgets(self):
- """Handles the initial creation of all the gui elements."""
- self.create_room_button = ttk.Button(self.root, text="Add Room", width=60, command=self.request_room_info)
- self.book_reservation_button = ttk.Button(self.root, text="Book Reservation", width=60, command=self.request_reservation_info)
- self.check_in_guest_button = ttk.Button(self.root, text="Check In", width=60, command=self.request_check_in_info)
- self.check_out_guest_button = ttk.Button(self.root, text="Check Out", width=60, command=self.request_check_out_info)
- self.cancel_reservation_button = ttk.Button(self.root, text="Cancel Reservation", width=60, command=self.request_cancel_info)
- self.room_tree_view = ttk.Treeview(self.root, selectmode='browse')
-
- self.create_room_button.grid(row=1, column=0,padx=5, pady=5)
- self.book_reservation_button.grid(row=2, column=0, padx=5, pady=5)
- self.cancel_reservation_button.grid(row=3, column=0, padx=5, pady=5)
- self.check_in_guest_button.grid(row=4, column=0, padx=5, pady=5)
- self.check_out_guest_button.grid(row=5, column=0, padx=5, pady=5)
-
-
- self.room_tree_view.grid(row=0, column=0, padx=5, pady=5)
-
- self.room_tree_view["columns"] = ("1", "2", "3", "4")
- self.room_tree_view['show'] = 'headings'
-
- self.room_tree_view.column("1", width=90, anchor='c')
- self.room_tree_view.column("2", width=90, anchor='se')
- self.room_tree_view.column("3", width=90, anchor='se')
- self.room_tree_view.column("4", width=90, anchor='se')
-
- self.room_tree_view.heading("1", text="Number")
- self.room_tree_view.heading("2", text="Type")
- self.room_tree_view.heading("3", text="Price")
- self.room_tree_view.heading("4", text="Available")
-
- def configure_tree_view(self):
- for room in self.rooms:
- self.room_tree_view.insert("", 0, text="L10", values=(room['room_number'], room['room_type'], room['price'], room['availibility'],))
-
- def on_tree_select(self, event):
- selected_items = self.room_tree_view.selection()
- if selected_items:
- selected_item = selected_items[0]
- room_values = self.room_tree_view.item(selected_item, 'values')
- if room_values:
- self.selected_room_number = int(room_values[0])
- room = self.get_room(self.selected_room_number)
- if room:
- pass
- else:
- self.selected_room_number = None
- else:
- self.selected_room_number = None
-
-
- def load_from_file(self):
- try:
- with open("database.json", "r") as file:
- return json.load(file)
- except FileNotFoundError:
- return {'rooms': [], 'reservations': {}} # Return an empty list if the file doesn't exist yet to prevent a crash.
- except json.JSONDecodeError:
- return {'rooms': [], 'reservations': {}} # Return an empty list if the file is corrupted to prevent a crash.
-
- def save_to_file(self):
- self.database['rooms'] = self.rooms
- self.database['reservations'] = self.reservations
- try:
- with open("database.json", "w") as file:
- json.dump(self.database, file)
- except IOError as e:
- messagebox.showerror("File Error", f"Could not save data: {e}") # Log the error
- pass
-
- def parse_date(self, date_str):
- """Parses a string in DD/MM/YYYY formate to a datetime object to avoid issues"""
- try:
- day, month, year = map(int, date_str.split('/'))
- return datetime.date(year, month, day)
- except ValueError:
- return None
-
- def date_to_str(self, date_obj):
- """Converts a date object to a string"""
- if isinstance(date_obj, datetime.date):
- return date_obj.strftime("%d/%m/%Y")
- return str(date_obj)
-
- def request_reservation_info(self):
- if self.selected_room_number is None:
- messagebox.showerror("Error", "Please select a room first.")
- return
- else:
- check_in_date = Date.today()
- guest_name = simpledialog.askstring("Guest Info", "Enter the guests name.")
- if guest_name is None:
- messagebox.showerror("Invalid Input", "Guest name can only be a string.")
- return
-
- guest_contact_info = simpledialog.askstring("Guest Info", "Enter the guests contact info.")
- if guest_contact_info is None:
- messagebox.showerror("Invalid Input", "Contact info can only be a int.")
- return
-
- check_out_date = simpledialog.askstring("Guest Info", "When will the guest be checking out"
- "Please input a valid date in the format DD/MM/YYYY. ")
- if check_out_date is None:
- messagebox.showerror("Invalid Input", "Please input a valid date in the format DD/MM/YYYY.")
- return
-
- current_guest = {
- "name": guest_name,
- "contact_info": guest_contact_info,
- "checked_in": False
- }
- self.book_room(self.selected_room_number, current_guest, check_in_date, check_out_date)
-
- def request_check_in_info(self):
- """Request information needed to check a guest in."""
- if self.selected_room_number is None:
- messagebox.showerror("Error", "Please select a room first.")
- return
-
- # Check if the reservation exists
- reservation_id = None
- for res_id, res in self.reservations.items():
- if res["room_number"] == self.selected_room_number:
- reservation_id = res_id
- break
-
- if not reservation_id:
- messagebox.showerror("Error", f"No reservation found for room{self.selected_room_number}")
- return
-
- if self.reservations[reservation_id]["checked_in"]:
- messagebox.showerror("Error", f"Guest already checked in to room {self.selected_room_number}.")
- return
-
- # Get guest information
- guest_name = simpledialog.askstring("Guest Info", "Enter the guest's name")
- if guest_name is None:
- messagebox.showerror("Error", "Please input a guest name.")
- return
-
- guest_contact_info = simpledialog.askstring("Guest Info", "Enter the guest's contact info")
- if guest_contact_info is None:
- messagebox.showerror("Error", "Please input guest contact information.")
- return
-
- guest = {
- "name": guest_name,
- "contact_info": guest_contact_info
- }
-
- self.check_in_guest(self.selected_room_number, guest)
-
- def request_check_out_info(self):
- """Requests information needed to check out a guest."""
- if self.selected_room_number is None:
- messagebox.showerror("Error", "Please select a room first.")
- return
-
- confirm = messagebox.askyesno("Confirm Check-out", f"Are your sure you want to check out the guest form room {self.selected_room_number}?")
-
- if confirm:
- self.check_out_guest(self.selected_room_number)
-
- def request_cancel_info(self):
- """Requests information needed to cancel a reservation."""
- if self.selected_room_number is None:
- messagebox.showerror("Error", "Please select a room first.")
- return
-
- confirm = messagebox.askyesno("Confirm Cancellation", f"Are you sure you want to cancel the reservation for room {self.selected_room_number}?")
-
- if confirm:
- self.cancel_reservation(self.selected_room_number)
-
- def request_room_info(self):
- """Opens dialogs to get room details from the user using tkinter gui and adds the room to the json database."""
-
- room_number = simpledialog.askinteger("Add Room", "Enter room number")
- if room_number is None:
- return
-
- room_type = simpledialog.askstring("Add Room", "Enter room type (e.g., Single, Double, Suite):")
- if room_type is None: #Throws an error if one of the valid room types is not provided.
- return
-
- price = simpledialog.askfloat("Add Room", "Enter price per night: ")
- if price is None:
- return
-
- self.add_room(room_number, room_type, price)
- self.room_tree_view.delete(*self.room_tree_view.get_children())
- self.configure_tree_view()
-
- def add_room(self, room_number, room_type, price):
- """Adds a new room to the hotel database."""
- room_exists = any(room['room_number'] == room_number for room in self.rooms)
-
- if room_exists:
- messagebox.showerror("Error", f"Room {room_number} already exists.")
- else:
- new_room = {
- "room_number": room_number,
- "room_type": room_type,
- "price": price,
- "availibility": True
- }
- self.rooms.append(new_room)
- self.save_to_file()
- messagebox.showinfo("Success", f"Room {room_number} added successfully!")
-
- def get_room(self, room_number):
- """Retrieves a room by its number"""
- for room in self.rooms:
- if room["room_number"] == room_number:
- return room
- return None
-
- def book_room(self, room_number: int, guest, check_in_date, check_out_date):
- room = self.get_room(room_number)
- if not room:
- messagebox.showerror("Error", f"Room {room_number} does not exist.")
- return
-
- if not room["availibility"]:
- messagebox.showerror("Error", f"Room {room_number} has already been booked.")
- return
-
- room["availibility"] = False
- guest_dict = guest.__dict__ if hasattr(guest, "__dict__") else guest
-
- reservation_id = f"{room_number}_{self.date_to_str(check_in_date)}"
-
- self.reservations[reservation_id] = {
- "room_number": room_number,
- "guest": guest_dict,
- "check_in_date": self.date_to_str(check_in_date),
- "check_out_date": self.date_to_str(check_out_date),
- "checked_in": False
- }
-
- self.save_to_file()
- messagebox.showinfo("Success", f"Room {room_number} has been booked successfully!")
-
- self.room_tree_view.delete(*self.room_tree_view.get_children())
- self.configure_tree_view()
-
- def cancel_reservation(self, room_number: int):
- reservation_id = None
- for res_id, res in self.reservations.items():
- if res["room_number"] == room_number:
- reservation_id = res_id
- break
-
- if not reservation_id:
- messagebox.showerror("Error", f"No reservation found for room {room_number}.")
- return
-
- room = self.get_room(room_number)
- if room:
- room["availibility"] = True
-
- del self.reservations[reservation_id] # Delete the reservation found using the reservation id
- self.save_to_file()
- messagebox.showinfo("Success", f"Reservation for room {room_number} cancelled!")
-
- self.room_tree_view.delete(*self.room_tree_view.get_children())
- self.configure_tree_view()
-
- def check_in_guest(self, room_number, guest):
- reservation_id = None
- for res_id, res in self.reservations.items():
- if res["room_number"] == room_number:
- reservation_id = res_id
- break
-
- if reservation_id is None:
- messagebox.showerror("Error", f"No reservation found for room {room_number}.")
- return
-
- self.reservations[reservation_id]["checked_in"] = True
-
- if guest:
- guest_dict = guest.__dict__ if hasattr(guest, "__dict__") else guest
- self.reservations[reservation_id]["guest"] = guest_dict
-
- self.save_to_file()
- messagebox.showinfo("Success", f"Guest checked into room {room_number}!")
-
- def check_out_guest(self, room_number):
- reservation_id = None
- for res_id, res in self.reservations.items():
- if res["room_number"] == room_number:
- reservation_id = res_id
- break
-
- if not reservation_id or not self.reservations[reservation_id]["checked_in"]:
- messagebox.showerror("Error", f"No checked-in guest found for room {room_number}.")
- return
-
- room = self.get_room(room_number)
- if room:
- room["availibility"] = True
-
- del self.reservations[reservation_id]
- self.save_to_file()
- messagebox.showinfo("Success", f"Guest checked out from room {room_number}")
-
- self.room_tree_view.delete(*self.room_tree_view.get_children())
- self.configure_tree_view()
-
-root = Tk()
-app = HotelManagement(root)
-root.mainloop()
\ No newline at end of file
diff --git a/Folder/reservation.py b/Folder/reservation.py
deleted file mode 100644
index 89b90ea..0000000
--- a/Folder/reservation.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from room import HotelRoom
-from guest import Guest
-
-class Reservation(object):
- def __init__(self, room: HotelRoom, guest: Guest,check_in_date, check_out_date):
- self.room = room
- self.guest = guest
- self.check_in_date = check_in_date
- self.check_out_date = check_out_date
- self.active = True
-
- def __str__(self):
- return f"Reservation for {self.guest.name} in room {self.room.room_number} from {self.check_in_date} to {self.check_out_date}"
-
- def book_reservation(self):
- self.room.availibility = True
- pass
-
-
- def cancel_reservation(self):
- if self.active:
- self.active = False
- self.room.availibility = True
- return f"The reservation for {self.guest.name} in {self.room.room_number} at {self.check_in_date} has been canceled"
- return f"This reservation has already been canceled."
diff --git a/Folder/room.py b/Folder/room.py
deleted file mode 100644
index 1cb6735..0000000
--- a/Folder/room.py
+++ /dev/null
@@ -1,27 +0,0 @@
-class HotelRoom(object):
- room_number = 0
- room_type = ""
- price = 0
- availibility = True
-
- def __init__(self, room_number: int, room_type: str, price: int, availibility: bool):
- self.room_number = room_number
- self.room_type = room_type
- self.price = price
- self.availibility = availibility
-
- def __repr__(self):
- return f"Room(room_number='{self.room_number}', room_type={self.room_number}, price={self.price})"
-
- def getRoomNumber(self):
- return self.room_number
-
- def getRoomPrice(self):
- return self.price
-
- def getRoomType(self):
- return self.room_type
-
- def getRoomAvailibility(self):
- return self.availibility
-