diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/feedback_handler.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/feedback_handler.cpython-311.pyc new file mode 100644 index 0000000..d7e38ae Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/feedback_handler.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/feedback_handler.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/feedback_handler.cpython-312.pyc new file mode 100644 index 0000000..54a7b38 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/feedback_handler.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_manager.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_manager.cpython-311.pyc new file mode 100644 index 0000000..1f9f390 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_manager.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_manager.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_manager.cpython-312.pyc new file mode 100644 index 0000000..51c946e Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_manager.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_viewer.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_viewer.cpython-311.pyc new file mode 100644 index 0000000..dd80c59 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_viewer.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_viewer.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_viewer.cpython-312.pyc new file mode 100644 index 0000000..1202582 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/menu_viewer.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/roll_out_manager.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/roll_out_manager.cpython-311.pyc new file mode 100644 index 0000000..2f88b3f Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/roll_out_manager.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/roll_out_manager.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/roll_out_manager.cpython-312.pyc new file mode 100644 index 0000000..8455dff Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/roll_out_manager.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_manager.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_manager.cpython-311.pyc new file mode 100644 index 0000000..80715a0 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_manager.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_manager.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_manager.cpython-312.pyc new file mode 100644 index 0000000..45ceac0 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_manager.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_preference_manager.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_preference_manager.cpython-311.pyc new file mode 100644 index 0000000..5e58d5e Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_preference_manager.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_preference_manager.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_preference_manager.cpython-312.pyc new file mode 100644 index 0000000..b731dc3 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/user_preference_manager.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/voting_handler.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/voting_handler.cpython-311.pyc new file mode 100644 index 0000000..0a3c7e3 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/voting_handler.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/voting_handler.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/voting_handler.cpython-312.pyc new file mode 100644 index 0000000..d3d0288 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/__pycache__/voting_handler.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/feedback_handler.py b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/feedback_handler.py new file mode 100644 index 0000000..dd7939d --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/feedback_handler.py @@ -0,0 +1,38 @@ +import json +class FeedbackHandler: + def __init__(self, server_communicator, role, user_id): + self.server_communicator = server_communicator + self.user_id = user_id + self.role = role + + def give_feedback(self): + menu_item_id = input("Enter the Menu Item ID: ") + rating = input("Enter your Rating (e.g., 4.5): ") + comment = input("Enter your Comment: ") + + endpoint = "/give-feedback" + data = { + "UserID": self.user_id, + "MenuItemID": int(menu_item_id), + "Rating": float(rating), + "Comment": comment, + "RoleName": "Employee" + } + + response = self.server_communicator.send_request(endpoint, data) + if response["status"] == "success": + print(response["message"]) + else: + print(response["message"]) + + def view_feedback(self): + endpoint = "/view-feedback" + data = {"role_name": self.role} + response = self.server_communicator.send_request(endpoint, data) + + if response["status"] == "success": + print(f"{'FoodName':<35} {'UserName':<25} {'Rating':<10} {'Comment':<70} {'Date':<20}") + for item in response['feedback']: + print(f"{item['FoodName']:<35} {item['UserName']:<25} {item['Rating']:<10} {item['Comment']:<70} {item['Date']:<20}") + else: + print("Failed to fetch feedback: ", response["message"]) \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/menu_manager.py b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/menu_manager.py new file mode 100644 index 0000000..a1b718f --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/menu_manager.py @@ -0,0 +1,106 @@ +import json +class MenuManager: + def __init__(self, server_communicator, role, user_id): + self.server_communicator = server_communicator + self.role = role + self.user_id = user_id + + def add_menu_item(self): + food_name = input("Enter the food item name : ") + price = input("Enter Price : ") + mealtype = input("Meal Type : ") + mealtypeid = 0 + if mealtype.upper() == "BREAKFAST": + mealtypeid = 1 + elif mealtype.upper() == "LUNCH": + mealtypeid = 2 + elif mealtype.upper() == "DINNER": + mealtypeid = 3 + + endpoint = "/add-menu-item" + data = {"Name": food_name, "Price": price, "MealTypeID": mealtypeid, "RoleName": "Admin", "AvailabilityStatus": 1} + response = self.server_communicator.send_request(endpoint, data) + if response["status"] == "success": + print(response["message"]) + else: + print(response["message"]) + + def delete_menu_item(self): + item_id = int(input("Please enter food ID : ")) + endpoint = "/delete-menu-item" + data = {"RoleName": "Admin", "MenuItemID": item_id} + response = self.server_communicator.send_request(endpoint, data) + if response["status"] == "success": + print(response["message"]) + else: + print(response["message"]) + + def update_menu_item(self): + item_id = int(input("Please enter food ID to Update : ")) + endpoint = "/update-menu-item" + new_price = int(input("Enter new price : ")) + availability = input("Enter availability (Yes or No)") + if availability.upper() == "YES": + availability = 1 + elif availability.upper() == "NO": + availability = 0 + else: + print("Invalid Input") + return + data = {"RoleName": "Admin", "MenuItemID": item_id, "Price": new_price, "AvailabilityStatus": availability} + response = self.server_communicator.send_request(endpoint, data) + if response["status"] == "success": + print(response["message"]) + else: + print(response["message"]) + + def update_item_availability(self): + item_id = int(input("Please enter food ID to Update : ")) + endpoint = "/update-availability" + availability = input("Enter availability (Yes or No)") + if availability.upper() == "YES": + availability = 1 + elif availability.upper() == "NO": + availability = 0 + else: + print("Invalid Input") + return + data = {"RoleName": "Chef", "MenuItemID": item_id, "AvailabilityStatus": availability} + + response = self.server_communicator.send_request(endpoint, data) + if response["status"] == "success": + print(response["message"]) + else: + print(response["message"]) + + def add_moms_recipe(self): + print("Enter the mom's recipe (press Enter once to finish):") + recipe = [] + + while True: + line = input() + if line == "": + break + recipe.append(line) + + recipe_text = "\n".join(recipe) + + print("\nRecipe entered:") + print(recipe_text) + + data = { + "UserID": self.user_id, + "Recipe": recipe_text, + "RoleName": self.role + } + + endpoint = "/add-moms-recipe" + response = self.server_communicator.send_request(endpoint, data) + + if response["status"] == "success": + print(response["message"]) + else: + print(response["message"]) + + + diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/menu_viewer.py b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/menu_viewer.py new file mode 100644 index 0000000..d730d50 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/menu_viewer.py @@ -0,0 +1,31 @@ +class MenuViewer: + def __init__(self, server_communicator, role): + self.server_communicator = server_communicator + self.role = role + + def view_menu(self): + endpoint = "/food_menu" + data = {"role_name": self.role} + response = self.server_communicator.send_request(endpoint, data) + print(f"{'ID':<5} {'Name':<35} {'Price':<10} {'AvailabilityStatus':<20}") + for item in response['menu']: + availability = "Yes" if item['AvailabilityStatus'] == 1 else "No" + print(f"{item['ID']:<5} {item['Name']:<35} {item['Price']:<10} {availability:<20}") + + def view_low_rating_items(self): + endpoint = "/view-low-rating-items" + data = {"role_name": self.role} + response = self.server_communicator.send_request(endpoint, data) + if response["status"] == "success": + print(f"{'FoodName':<35} {'OverallRating':<10}") + for item in response['low_rating_items']: + print(f"{item['FoodName']:<35} {item['AvgRating']:<10.2f}") + else: + print("Failed to fetch low rating items: ", response["message"]) + + def view_momsrecipe(self): + endpoint = "/view-moms-recipe" + response = self.server_communicator.send_request(endpoint) + print(f"{'ID':<10} {'UserName':<25} {'Recipe':<70}") + for item in response['feedback']: + print(f"{item['UserID']:<10} {item['UserName']:<25} {item['Recipe']:<70}") diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/roll_out_manager.py b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/roll_out_manager.py new file mode 100644 index 0000000..ee46dc7 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/roll_out_manager.py @@ -0,0 +1,42 @@ +class RolloutManager: + def __init__(self, server_communicator, role, user_id): + self.server_communicator = server_communicator + self.role = role + self.user_id = user_id + + def get_recomendation(self): + endpoint = "/view-recomendation" + data = {"RoleName": self.role} + response = self.server_communicator.send_request(endpoint, data) + print("\nBreakfast Recommendations\n") + print(f"{'ID':<5} {'Name':<35}") + + food_id_for_roll_out = {"Breakfast": [], "Lunch": [], "Dinner": []} + for item in response['recomendations']['Breakfast']: + print(f"{item['ID']:<5} {item['Name']:<35}") + + food_id_for_roll_out["Breakfast"] = input("Enter the Two ID for breakfast: ").split() + + print("\nLunch Recommendations") + for item in response['recomendations']['Lunch']: + print(f"{item['ID']:<5} {item['Name']:<35}") + + food_id_for_roll_out["Lunch"] = input("Enter the ID for Lunch: ").split() + + print("\nDinner Recommendations") + for item in response['recomendations']['Dinner']: + print(f"{item['ID']:<5} {item['Name']:<35}") + + food_id_for_roll_out["Dinner"] = input("Enter the ID for Dinner: ").split() + + return food_id_for_roll_out + + def roll_out_menu(self): + food_id_for_roll_out = self.get_recomendation() + endpoint = "/roll-out" + data = {"data": food_id_for_roll_out} + response = self.server_communicator.send_request(endpoint, data) + if response["status"] == "success": + print(response["message"]) + else: + print(response["message"]) \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/user_preference_manager.py b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/user_preference_manager.py new file mode 100644 index 0000000..bf939de --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/user_preference_manager.py @@ -0,0 +1,81 @@ +import json + +class UserPreferenceManager: + def __init__(self, server_communicator, role, user_id): + self.server_communicator = server_communicator + self.role = role + self.user_id = user_id + + def update_user_profile(self): + endpoint = "/update-user-profile" + print("updateeeee") + diet_preference= self.get_diet_preference() + spice_level= self.get_spice_level() + + cuisine_preference= self.get_cuisine_preference() + sweet_tooth= self.get_sweetness_preference() + data = { + "RoleName": "Employee", + "UserId": self.user_id, + "DietPreference": diet_preference, + "SpiceLevel": spice_level, + "CuisinePreference": cuisine_preference, + "SweetTooth": sweet_tooth + } + print(data) + response = self.server_communicator.send_request(endpoint, data) + if response["status"] == "success": + print(response["message"]) + else: + print(response["message"]) + + def get_diet_preference(self): + while 1: + print("\nPlease select your diet preference:\n1. Vegetarian\n2. Non-Vegetarian\n3. Eggetarian") + spice_level_choice = int(input("Enter choice (1/2/3): ")) + if spice_level_choice == 1: + return "Vegetarian" + elif spice_level_choice == 2: + return "Non-Vegetarian" + elif spice_level_choice == 3: + return "Eggetarian" + else: + print("Invalid Input") + + def get_spice_level(self): + while 1: + print("\nPlease select your spice level:\n1. High\n2. Medium\n3. Low") + spice_level_choice = int(input("Enter choice (1/2/3): ")) + if spice_level_choice == 1: + return "High" + elif spice_level_choice == 2: + return "Medium" + elif spice_level_choice == 3: + return "Low" + else: + print("Invalid Input") + + def get_cuisine_preference(self): + while 1: + print("\nWhat do you prefer most?\n1. North Indian\n2. South Indian\n3. Other") + cuisine_preference_choice = int(input("Enter choice (1/2/3): ")) + if cuisine_preference_choice == 1: + return "North Indian" + elif cuisine_preference_choice == 2: + return "South Indian" + elif cuisine_preference_choice == 3: + return "Other" + else: + print("Invalid Input") + + def get_sweetness_preference(self): + while 1: + print("\nDo you have a sweet tooth?\n1. Yes\n2. No") + sweet_tooth_choice = int(input("Enter choice (1/2): ")) + if sweet_tooth_choice == 1: + return 1 + elif sweet_tooth_choice == 2: + return 0 + else: + print("Invalid Input") + \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/Modules/voting_handler.py b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/voting_handler.py new file mode 100644 index 0000000..17b4b62 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/Modules/voting_handler.py @@ -0,0 +1,67 @@ +import json + +class VotingHandler: + def __init__(self, server_communicator, role, user_id): + self.server_communicator = server_communicator + self.role = role + self.user_id = user_id + + def view_voting_items(self): + endpoint = "/voting-items" + data = {"UserID": self.user_id} + response = self.server_communicator.send_request(endpoint, data) + response = response["data"] + voting_items = {"Breakfast": [], "Lunch": [], "Dinner": []} + + print("Breakfast Recommendations") + print(f"{'MenuItemID':<10} {'Name':<35}") + for item in response['Breakfast']: + print(f"{item['MenuItemID']:<10} {item['MenuItemName']:<35}") + voting_items['Breakfast'].append(item) + + print("Lunch Recommendations") + print(f"{'MenuItemID':<10} {'Name':<35} ") + for item in response['Lunch']: + print(f"{item['MenuItemID']:<10} {item['MenuItemName']:<35} ") + voting_items['Lunch'].append(item) + + print("Dinner Recommendations") + print(f"{'MenuItemID':<10} {'Name':<35}") + for item in response['Dinner']: + print(f"{item['MenuItemID']:<10} {item['MenuItemName']:<35} ") + voting_items['Dinner'].append(item) + + return voting_items + + def vote_for_menu(self): + voting_items = self.view_voting_items() + votes = {} + for meal_type in ["Breakfast", "Lunch", "Dinner"]: + valid_choices = [str(item['MenuItemID']) for item in voting_items[meal_type]] + while True: + menu_item_id = input(f"Enter the ID for {meal_type} ({', '.join(valid_choices)}): ") + if menu_item_id in valid_choices: + votes[meal_type] = menu_item_id + break + else: + print(f"Incorrect choice. Please enter a valid ID for {meal_type} ({', '.join(valid_choices)}).") + + endpoint = "/voting" + data = {"employee_id": self.user_id, "data": votes} + response = self.server_communicator.send_request(endpoint, data) + if response["status"] == "success": + print(response["message"]) + else: + print(response["message"]) + + def view_yesterday_voting(self): + endpoint = "/voting-items" + data = {} + response = self.server_communicator.send_request(endpoint, data) + categorized_items = response['data'] + + for meal_type, items in categorized_items.items(): + print(f"\n{meal_type} Recommendations") + print(f"{'MenuItemID':<10} {'Name':<35} {'Votes':<5}") + for item in items: + print(f"{item['MenuItemID']:<10} {item['MenuItemName']:<35} {item['Votes']:<5}") diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/client.py b/Final Project/Cafeteria_Recommnedation_system/Client/client.py new file mode 100644 index 0000000..0fae64d --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/client.py @@ -0,0 +1,46 @@ +import socket +from userHandler.chef import Chef +from userHandler.admin import Admin +from userHandler.employee import Employee +from utility.server_communicator import ServerCommunicator + + +def login(username, password): + client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_communicator = ServerCommunicator(client_socket) + + + endpoint = "/login" + data = { + "username": username, + "password": password + } + + server_communicator.connect_to_server('localhost', 12345) + response = server_communicator.send_request(endpoint, data) + + if(response['status'] != "success"): + print("Invalid creds!\nExiting...") + return + + response = response['user'] + if(response['RoleName'] == "Admin"): + user = Admin(response['ID'], response['Name'], response['RoleName'], server_communicator) + user.user_menu() + elif(response['RoleName'] == "Chef"): + user = Chef(response['ID'], response['Name'], response['RoleName'], server_communicator) + user.user_menu() + elif(response['RoleName'] == "Employee"): + user = Employee(response['ID'], response['Name'], response['RoleName'], server_communicator) + user.user_menu() + + + + +if __name__ == "__main__": + username = input("Enter username: ") + password = input("Enter password: ") + login_response = login(username, password) + print(login_response) + + diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__init__.py b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/__init__.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..2f03aef Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/__init__.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/__init__.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..1ea219a Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/__init__.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/admin.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/admin.cpython-311.pyc new file mode 100644 index 0000000..ad7d2f4 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/admin.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/admin.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000..f0e22fb Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/admin.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/chef.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/chef.cpython-311.pyc new file mode 100644 index 0000000..52ba84a Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/chef.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/chef.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/chef.cpython-312.pyc new file mode 100644 index 0000000..6467406 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/chef.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/employee.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/employee.cpython-311.pyc new file mode 100644 index 0000000..c3995e3 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/employee.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/employee.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/employee.cpython-312.pyc new file mode 100644 index 0000000..375520b Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/employee.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/user.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/user.cpython-311.pyc new file mode 100644 index 0000000..6aca392 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/user.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/user.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/user.cpython-312.pyc new file mode 100644 index 0000000..c01dd17 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/__pycache__/user.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/admin.py b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/admin.py new file mode 100644 index 0000000..27f047d --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/admin.py @@ -0,0 +1,37 @@ +from userHandler.user import User +from Modules.menu_manager import MenuManager +from Modules.menu_viewer import MenuViewer + +class Admin(User): + def __init__(self, id, name, role, server_communicator): + super().__init__(id, name, role, server_communicator) + self.menu_viewer = MenuViewer(server_communicator, self.role) + self.menu_manager = MenuManager(server_communicator, self.role, self.id) + + def user_menu(self): + print(f"\nWelcome {self.name}({self.role})!") + while True: + print("\n1. View Menu\n2. Add Menu Item\n3. Delete Menu Item\n4. Update Menu Item\n5. View Discard Item\n6. View Mom's Recipes\n7. Exit") + choice = int(input("Enter a choice : ")) + if choice == 1: + self.menu_viewer.view_menu() + elif choice == 2: + self.menu_manager.add_menu_item() + elif choice == 3: + self.menu_manager.delete_menu_item() + elif choice == 4: + self.menu_manager.update_menu_item() + elif choice == 5: + self.menu_viewer.view_low_rating_items() + elif choice == 6: + self.menu_viewer.view_momsrecipe() + elif choice == 7: + print("\nEXITING...Bye") + self.server_communicator.close_connection() + exit() + else: + print("Invalid choice. Please enter a valid option.") + + + + diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/chef.py b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/chef.py new file mode 100644 index 0000000..2aae691 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/chef.py @@ -0,0 +1,50 @@ +from userHandler.user import User +from Modules.menu_viewer import MenuViewer +from Modules.feedback_handler import FeedbackHandler +from Modules.menu_manager import MenuManager +from Modules.roll_out_manager import RolloutManager +from Modules.user_preference_manager import UserPreferenceManager +from Modules.voting_handler import VotingHandler +from utility.notification_handler import NotificationHandler + +class Chef(User): + def __init__(self, id, name, role, server_communicator): + super().__init__(id, name, role, server_communicator) + self.user_manager = UserPreferenceManager(server_communicator, self.role, self.id) + self.menu_manager = MenuManager(server_communicator, self.role, self.id) + self.notification_handler = NotificationHandler(server_communicator) + self.menu_viewer = MenuViewer(server_communicator, self.role) + self.feedback_handler = FeedbackHandler(server_communicator, self.role, self.id) + self.roll_out_manager = RolloutManager(server_communicator, self.role, self.id) + self.voting_handler = VotingHandler(server_communicator, self.role, self.id) + + + def user_menu(self): + print(f"\nWelcome {self.name}({self.role})!") + while True: + print("\n1. View Menu Item\n2. Roll Out Tomorrow's Menu\n3. View Yesterday's Vote \n4. Update Availability of Menu Item\n5. View Feedback\n6. View Discard Item\n7. Delete Menu Item\n8. View Mom's Recipes\n9. Exit") + choice = int(input("Enter a choice : ")) + if(choice == 1): + self.menu_viewer.view_menu() + elif(choice == 2): + self.roll_out_manager.roll_out_menu() + elif choice == 3: + self.voting_handler.view_yesterday_voting() + elif choice == 4: + self.menu_manager.update_item_availability() + elif choice == 5: + self.feedback_handler.view_feedback() + elif choice == 6: + self.menu_viewer.view_low_rating_items() + elif choice == 7: + self.menu_manager.delete_menu_item() + elif choice == 8: + self.menu_viewer.view_momsrecipe() + elif choice == 9: + print("\nEXITING...Bye") + self.server_communicator.close_connection() + exit() + else: + print("Invalid choice. Please enter a valid option.") + + diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/employee.py b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/employee.py new file mode 100644 index 0000000..d07ea0c --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/employee.py @@ -0,0 +1,52 @@ +from userHandler.user import User +from Modules.menu_viewer import MenuViewer +from Modules.feedback_handler import FeedbackHandler +from Modules.menu_manager import MenuManager +from Modules.roll_out_manager import RolloutManager +from Modules.user_preference_manager import UserPreferenceManager +from Modules.voting_handler import VotingHandler +from utility.notification_handler import NotificationHandler + +class Employee(User): + def __init__(self, id, name, role, server_communicator): + super().__init__(id, name, role, server_communicator) + self.user_manager = UserPreferenceManager(server_communicator, self.role, self.id) + self.menu_manager = MenuManager(server_communicator, self.role, self.id) + self.notification_handler = NotificationHandler(server_communicator) + self.menu_viewer = MenuViewer(server_communicator, self.role) + self.feedback_handler = FeedbackHandler(server_communicator, self.role, self.id) + self.roll_out_manager = RolloutManager(server_communicator, self.role, self.id) + self.voting_handler = VotingHandler(server_communicator, self.role, self.id) + + def user_menu(self): + print(f"\nWelcome {self.name}({self.role})!") + while True: + notifications = self.notification_handler.get_notification() + if notifications: + print("\nNOTIFICATIONS\n=============") + for notification in notifications: + print(notification[1]) + else: + print() + print("\n1. View Menu Item\n2. Update Profile \n3. Food Recommendation for Tomorrow\n4. Give Feedback\n5. View Feedback\n6. Mom's Recipe\n7. Exit") + choice = int(input("Enter a choice : ")) + if(choice == 1): + self.menu_viewer.view_menu() + elif choice == 2: + self.user_manager.update_user_profile() + elif choice == 3: + self.voting_handler.vote_for_menu() + elif choice == 4: + self.feedback_handler.give_feedback() + elif choice == 5: + self.feedback_handler.view_feedback() + elif choice == 6: + self.menu_manager.add_moms_recipe() + elif(choice == 7): + print("\nEXITING...Bye") + self.server_communicator.close_connection() + exit() + else: + print("Invalid choice. Please enter a valid option.") + + diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/user.py b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/user.py new file mode 100644 index 0000000..ddfe2d7 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/userHandler/user.py @@ -0,0 +1,11 @@ +class User: + def __init__(self, id, name, role, server_communicator): + self.id = id + self.name = name + self.role = role + self.server_communicator = server_communicator + + def user_menu(): + pass + + \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/utility/__init__.py b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/__init__.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..8c70758 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/__init__.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/__init__.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..cf1789b Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/__init__.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/notification_handler.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/notification_handler.cpython-311.pyc new file mode 100644 index 0000000..3068bd3 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/notification_handler.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/notification_handler.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/notification_handler.cpython-312.pyc new file mode 100644 index 0000000..1e19f9f Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/notification_handler.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/server_communicator.cpython-311.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/server_communicator.cpython-311.pyc new file mode 100644 index 0000000..926a9b9 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/server_communicator.cpython-311.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/server_communicator.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/server_communicator.cpython-312.pyc new file mode 100644 index 0000000..26beeff Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/server_communicator.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/socket_functions.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/socket_functions.cpython-312.pyc new file mode 100644 index 0000000..a77f57a Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Client/utility/__pycache__/socket_functions.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/utility/notification_handler.py b/Final Project/Cafeteria_Recommnedation_system/Client/utility/notification_handler.py new file mode 100644 index 0000000..8cf659f --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/utility/notification_handler.py @@ -0,0 +1,18 @@ +class NotificationHandler: + def __init__(self, server_communicator): + self.server_communicator = server_communicator + + def get_notification(self): + endpoint = "/get-notification" + response = self.server_communicator.send_request(endpoint) + response = response["notifications"] + return response + + + def send_notification(self, message): + endpoint = "send-notification" + response = self.server_communicator.send_request(endpoint, message) + if response["status"] == "success": + return "Notification is send successfully" + else: + return "Not able to send the notification" \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Client/utility/server_communicator.py b/Final Project/Cafeteria_Recommnedation_system/Client/utility/server_communicator.py new file mode 100644 index 0000000..dd0f895 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Client/utility/server_communicator.py @@ -0,0 +1,37 @@ +import socket +import json + +class ServerCommunicator: + def __init__(self, client_socket): + self.client_socket = client_socket + + def connect_to_server(self, host, port): + self.client_socket.connect((host, port)) + + def send_to_server(self, msg): + self.client_socket.sendall(msg) + + def receive_msg_from_server(self): + return self.client_socket.recv(1024).decode() + + def close_connection(self): + self.client_socket.close() + + def send_request(self, endpoint, data=None): + request = {"endpoint": endpoint} + if data: + request.update(data) + client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + client_socket.connect(('localhost', 12345)) + client_socket.sendall(json.dumps(request).encode()) + + buffer_size = 4096 + response = "" + while True: + part = client_socket.recv(buffer_size).decode() + response += part + if len(part) < buffer_size: + break + + client_socket.close() + return json.loads(response) \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/database_handler.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/database_handler.cpython-312.pyc new file mode 100644 index 0000000..2f9065f Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/database_handler.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/feedback_handler.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/feedback_handler.cpython-312.pyc new file mode 100644 index 0000000..9a56394 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/feedback_handler.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/food_menu_handler.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/food_menu_handler.cpython-312.pyc new file mode 100644 index 0000000..3cdde37 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/food_menu_handler.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/login_handler.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/login_handler.cpython-312.pyc new file mode 100644 index 0000000..eccccd8 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/login_handler.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/moms_recipe_handler.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/moms_recipe_handler.cpython-312.pyc new file mode 100644 index 0000000..610b705 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/moms_recipe_handler.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/notification_handler.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/notification_handler.cpython-312.pyc new file mode 100644 index 0000000..bcc5494 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/notification_handler.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/recomendation.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/recomendation.cpython-312.pyc new file mode 100644 index 0000000..b1d5fdf Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/recomendation.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/rollout_menu.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/rollout_menu.cpython-312.pyc new file mode 100644 index 0000000..debb00d Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/rollout_menu.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/update_user_profile.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/update_user_profile.cpython-312.pyc new file mode 100644 index 0000000..8f1044c Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/update_user_profile.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/voting_handler.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/voting_handler.cpython-312.pyc new file mode 100644 index 0000000..bbe219b Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/__pycache__/voting_handler.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/database_handler.py b/Final Project/Cafeteria_Recommnedation_system/Server/database_handler.py new file mode 100644 index 0000000..f9738db --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/database_handler.py @@ -0,0 +1,383 @@ +import mysql.connector +from datetime import datetime + +class DatabaseHandler: + def __init__(self, host, user, password, database): + self.host = host + self.user = user + self.password = password + self.database = database + self.conn = None + + def connect(self): + try: + self.conn = mysql.connector.connect( + host=self.host, + user=self.user, + password=self.password, + database=self.database + ) + print("Connection established") + except mysql.connector.Error as err: + print(f"Error: Could not establish connection: {err}") + + def check_login(self, username, password): + cursor = self.conn.cursor() + query = """ + SELECT u.ID, u.Name, r.RoleName + FROM user u + JOIN Role r ON u.RoleID = r.ID + WHERE u.Name=%s AND u.Password=%s + """ + cursor.execute(query, (username, password)) + result = cursor.fetchone() + cursor.close() + if result: + return {"ID": result[0], "Name": result[1], "RoleName": result[2]} + return None + + def get_food_menu(self): + cursor = self.conn.cursor() + query = "SELECT ID, Name, Price, AvailabilityStatus FROM menuitem" + cursor.execute(query) + result = cursor.fetchall() + cursor.close() + menu = [] + for item in result: + menu.append({ + "ID": item[0], + "Name": item[1], + "Price": item[2], + "AvailabilityStatus": item[3] + }) + return menu + + def get_feedback_details(self): + cursor = self.conn.cursor() + query = """ + SELECT + f.ID, + u.Name AS UserName, + m.Name AS FoodName, + f.Rating, + f.Comment, + f.Date + FROM + feedback f + JOIN + user u ON f.UserID = u.ID + JOIN + menuitem m ON f.MenuItemID = m.ID + """ + cursor.execute(query) + result = cursor.fetchall() + cursor.close() + feedback_details = [] + for item in result: + feedback_details.append({ + "FeedbackID": item[0], + "UserName": item[1], + "FoodName": item[2], + "Rating": item[3], + "Comment": item[4], + "Date": item[5].strftime('%Y-%m-%d') # Convert date to string + }) + return feedback_details + + + def give_menuItemfeedback(self, data): + cursor = self.conn.cursor() + query = """ + INSERT INTO feedback (UserID, MenuItemID, Rating, Comment, Date) + VALUES (%s, %s, %s, %s, %s) + """ + current_date = datetime.now().date() # Get current date + values = (data["UserID"], data["MenuItemID"], float(data["Rating"]), data["Comment"], current_date) + + try: + cursor.execute(query, values) + self.conn.commit() + return "success" + except Exception as e: + print(f"An error occurred while inserting feedback: {e}") + self.conn.rollback() + return "error" + finally: + cursor.close() + + + def add_menuItem(self, data): + cursor = self.conn.cursor() + query = """ + INSERT INTO menuitem (Name, Price, AvailabilityStatus, MealTypeID) + VALUES (%s, %s, %s, %s) + """ + values = (data["Name"], int(data["Price"]), data["AvailabilityStatus"], data["MealTypeID"]) + try: + cursor.execute(query, values) + self.conn.commit() + return "success" + except Exception as e: + print(f"An error occurred: {e}") + self.conn.rollback() + return "error" + + def delete_menuItem(self, menu_item_id): + cursor = self.conn.cursor() + delete_feedback_query = """ + DELETE FROM feedback + WHERE MenuItemID = %s + """ + delete_menu_item_query = """ + DELETE FROM menuitem + WHERE ID = %s + """ + try: + cursor.execute(delete_feedback_query, (menu_item_id,)) + cursor.execute(delete_menu_item_query, (menu_item_id,)) + self.conn.commit() + return "success" + except Exception as e: + print(f"An error occurred: {e}") + self.conn.rollback() + return "error" + finally: + cursor.close() + + def update_menuItem(self, menu_item_id, new_price, new_availability): + cursor = self.conn.cursor() + update_query = """ + UPDATE menuitem + SET Price = %s, AvailabilityStatus = %s + WHERE ID = %s + """ + try: + cursor.execute(update_query, (new_price, new_availability, menu_item_id)) + self.conn.commit() + return "success" + except Exception as e: + print(f"An error occurred: {e}") + self.conn.rollback() + return "error" + finally: + cursor.close() + + def update_menuItemavailabilty(self, menu_item_id, new_availability): + cursor = self.conn.cursor() + update_query = """ + UPDATE menuitem + SET AvailabilityStatus = %s + WHERE ID = %s + """ + try: + cursor.execute(update_query, (new_availability, menu_item_id)) + self.conn.commit() + return "success" + except Exception as e: + print(f"An error occurred: {e}") + self.conn.rollback() + return "error" + finally: + cursor.close() + + + def close(self): + if self.conn and self.conn.is_connected(): + self.conn.close() + print("Connection closed") + + def calculate_average_ratings(self): + self.connect() + cursor = self.conn.cursor(dictionary=True) + query = """ + SELECT m.ID AS MenuItemID, m.Name AS MenuItem, AVG(f.Rating) AS AvgRating, f.Comment, m.MealTypeID + FROM feedback f + JOIN menuitem m ON f.MenuItemID = m.ID + GROUP BY f.MenuItemID, m.Name, f.Comment, m.MealTypeID; + """ + cursor.execute(query) + avg_ratings = cursor.fetchall() + cursor.close() + print(avg_ratings) + return avg_ratings + + def add_recommended_menu_item(self, menu_item_id, votes): + cursor = self.conn.cursor() + query = "INSERT INTO recommendedmenuitem (MenuItemID, Votes) VALUES (%s, %s)" + try: + cursor.execute(query, (menu_item_id, votes)) + self.conn.commit() + return "success" + except Exception as e: + print(f"Error in add_recommended_menu_item: {e}") + self.conn.rollback() + return "error" + finally: + cursor.close() + + def truncate_recommended_menu_item_table(self): + try: + if self.conn is None or not self.conn.is_connected(): + raise Exception("MySQL Connection not available") + + cursor = self.conn.cursor() + cursor.execute("TRUNCATE TABLE recommendedmenuitem") + self.conn.commit() + return "success" + except mysql.connector.Error as err: + print(f"Error: {err}") + return "failure" + except Exception as e: + print(f"Error: {e}") + return "failure" + + + def get_voting_items(self, diet_preference): + query = """ + SELECT ri.MenuItemID, mi.Name as MenuItemName, m.MealType, ri.Votes, + (mi.DietPreference = %s) AS is_preferred + FROM recommendedmenuitem ri + JOIN menuitem mi ON ri.MenuItemID = mi.ID + JOIN mealtype m ON mi.MealTypeID = m.ID + ORDER BY is_preferred DESC, m.MealType, mi.Name + """ + cursor = self.conn.cursor() + cursor.execute(query, (diet_preference,)) + return cursor.fetchall() + + def add_vote(self, menu_item_id): + query = "UPDATE recommendedmenuitem SET Votes = Votes + 1 WHERE MenuItemID = %s" + cursor = self.conn.cursor() + cursor.execute(query, (menu_item_id,)) + self.conn.commit() + return "success" + + def reset_form_filled_status_for_all_user(self): + query = "UPDATE user SET FormFilledStatus = 0" + cursor = self.conn.cursor() + cursor.execute(query) + self.conn.commit() + return "success" + + def check_form_filled_status(self, user_id): + query = "SELECT FormFilledStatus FROM user WHERE ID = %s" + cursor = self.conn.cursor() + cursor.execute(query, (user_id,)) + result = cursor.fetchone() + return result[0] + + def update_form_filled_status(self, user_id, status): + query = "UPDATE user SET FormFilledStatus = %s WHERE ID = %s" + cursor = self.conn.cursor() + cursor.execute(query, (status, user_id)) + self.conn.commit() + return "success" + + def send_notification(self, message): + cursor = self.conn.cursor() + print("send_notification") + today_date = datetime.today().strftime('%Y-%m-%d') + query = "INSERT INTO notification (Message, Date) VALUES (%s, %s)" + cursor.execute(query, (message, today_date)) + self.conn.commit() + cursor.close() + + def get_notification(self): + cursor = self.conn.cursor() + today_date = datetime.today().strftime('%Y-%m-%d') + query = "SELECT ID, Message, Date FROM notification WHERE Date = %s" + cursor.execute(query, (today_date,)) + result = cursor.fetchall() + cursor.close() + return result + + def update_userprofile(self, user_id, new_dietpreference, new_spicelevel, new_cuisinepreference, new_sweettooth): + cursor = self.conn.cursor() + print((new_dietpreference, new_spicelevel, new_cuisinepreference, new_sweettooth, user_id)) + update_query = """ + UPDATE user + SET DietPreference = %s, SpiceLevel = %s, CuisinePreference = %s, SweetTooth = %s + WHERE ID = %s + """ + try: + cursor.execute(update_query, (new_dietpreference, new_spicelevel, new_cuisinepreference, new_sweettooth, user_id)) + self.conn.commit() + return "success" + except Exception as e: + print(f"An error occurred: {e}") + self.conn.rollback() + return "error" + finally: + cursor.close() + + def get_diet_preference(self, user_id): + query = "SELECT DietPreference FROM user WHERE ID = %s" + cursor = self.conn.cursor() + cursor.execute(query, (user_id,)) + result = cursor.fetchone() + return result[0] if result else None + + def get_low_rating_items(self): + cursor = self.conn.cursor() + query = """ + SELECT + m.ID AS MenuItemID, + m.Name AS MenuItem, + AVG(f.Rating) AS AvgRating, + m.MealTypeID + FROM + feedback f + JOIN + menuitem m ON f.MenuItemID = m.ID + GROUP BY + m.ID, m.Name, m.MealTypeID + HAVING + AVG(f.Rating) <= 2; + """ + cursor.execute(query) + result = cursor.fetchall() + cursor.close() + low_rating_items = [] + for item in result: + low_rating_items.append({ + "MenuItemID": item[0], + "FoodName": item[1], + "AvgRating": float(item[2]) + }) + return low_rating_items + + def add_moms_recipe(self, user_id, moms_recipe): + cursor = self.conn.cursor() + query = """ + INSERT INTO momsrecipe (UserID, MomsRecipe) + VALUES (%s, %s) + """ + try: + cursor.execute(query, (user_id, moms_recipe)) + self.conn.commit() + return "success" + except Exception as e: + print(f"An error occurred while adding mom's recipe: {e}") + self.conn.rollback() + return "error" + finally: + cursor.close() + + def get_moms_recipe(self): + cursor = self.conn.cursor() + query = """ + SELECT mr.ID, u.Name AS Username, mr.MomsRecipe + FROM momsrecipe mr + JOIN user u ON mr.UserID = u.ID; + """ + cursor.execute(query) + result = cursor.fetchall() + cursor.close() + momsrecipe_details = [] + for item in result: + momsrecipe_details.append({ + "UserID": item[0], + "UserName": item[1], + "Recipe": item[2], + }) + return momsrecipe_details diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/feedback_handler.py b/Final Project/Cafeteria_Recommnedation_system/Server/feedback_handler.py new file mode 100644 index 0000000..3bc99ba --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/feedback_handler.py @@ -0,0 +1,32 @@ +import json +class FeedbackHandler: + def __init__(self, db_handler): + self.db_handler= db_handler + + def endpointHandler(self, client_socket, request): + endpoint = request.get("endpoint") + if endpoint == "/view-feedback": + self.view_feedback(client_socket, request) + elif endpoint == "/give-feedback": + self.give_feedback(client_socket, request) + + def view_feedback(self, client_socket, request): + role_name = request.get("role_name") + feedback = self.db_handler.get_feedback_details() + print(feedback) + response = {"status": "success", "feedback": feedback} + client_socket.sendall(json.dumps(response).encode()) + + def give_feedback(self, client_socket, request): + role_name = request.get("RoleName") + if role_name == "Employee": + response = self.db_handler.give_menuItemfeedback(request) + if "success" in response: + response = {"status": "success", "message": "Successfully given feedback"} + else: + response = {"status": "failure", "message": "There is an error"} + else: + response = {"status": "failure", "message": "Invalid role for giving feedback"} + + client_socket.sendall(json.dumps(response).encode()) + \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/food_menu_handler.py b/Final Project/Cafeteria_Recommnedation_system/Server/food_menu_handler.py new file mode 100644 index 0000000..049de47 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/food_menu_handler.py @@ -0,0 +1,85 @@ +import json +class FoodMenuHandler: + def __init__(self, db_handler): + self.db_handler= db_handler + + def endpointHandler(self, client_socket, request): + endpoint = request.get("endpoint") + if endpoint == "/food_menu": + self.view_food_menu(client_socket, request) + elif endpoint == "/delete-menu-item": + self.delete_menu_item(client_socket, request) + elif endpoint == "/add-menu-item": + self.add_menu_item(client_socket, request) + elif endpoint == "/update-menu-item": + self.update_menu_item(client_socket, request) + elif endpoint == "/update-availability": + self.update_availability(client_socket, request) + elif endpoint == "/view-low-rating-items": + self.view_low_rating_items(client_socket, request) + + def add_menu_item(self, client_socket, request): + role_name = request.get("RoleName") + if role_name == "Admin": + response = self.db_handler.add_menuItem(request) + if "success" in response: + response = {"status": "success", "message": "Item successfully added"} + else: + response = {"status": "failure", "message": "There is an error"} + client_socket.sendall(json.dumps(response).encode()) + + def update_menu_item(self, client_socket, request): + role_name = request.get("RoleName") + menuitemid = request.get("MenuItemID") + new_price = request.get("Price") + new_availability = request.get("AvailabilityStatus") + if role_name == "Admin": + response = self.db_handler.update_menuItem(menuitemid, new_price, new_availability) + if "success" in response: + response = {"status": "success", "message": "Item successfully Updated"} + else: + response = {"status": "failure", "message": "There is an error"} + client_socket.sendall(json.dumps(response).encode()) + + def delete_menu_item(self, client_socket, request): + role_name = request.get("RoleName") + menuitemid = request.get("MenuItemID") + if role_name == "Admin": + response = self.db_handler.delete_menuItem(menuitemid) + if "success" in response: + response = {"status": "success", "message": "Item successfully Deleted"} + else: + response = {"status": "failure", "message": "There is an error"} + client_socket.sendall(json.dumps(response).encode()) + + def view_food_menu(self, client_socket, request): + role_name = request.get("role_name") + if role_name in ["Admin", "Chef","Employee"]: + menu = self.db_handler.get_food_menu() + response = {"status": "success", "menu": menu} + else: + response = {"status": "failure", "message": "Access denied"} + client_socket.sendall(json.dumps(response).encode()) + + def update_availability(self, client_socket, request): + role_name = request.get("RoleName") + menuitemid = request.get("MenuItemID") + new_availability = request.get("AvailabilityStatus") + print(request) + if role_name == "Chef": + response = self.db_handler.update_menuItemavailabilty(menuitemid, new_availability) + if "success" in response: + response = {"status": "success", "message": "Item successfully Updated"} + else: + response = {"status": "failure", "message": "There is an error"} + client_socket.sendall(json.dumps(response).encode()) + + def view_low_rating_items(self, client_socket, request): + role_name = request.get("role_name") + if role_name in ["Admin", "Chef"]: + low_rating_items = self.db_handler.get_low_rating_items() + response = {"status": "success", "low_rating_items": low_rating_items} + else: + response = {"status": "failure", "message": "Access denied"} + client_socket.sendall(json.dumps(response).encode()) + \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/login_handler.py b/Final Project/Cafeteria_Recommnedation_system/Server/login_handler.py new file mode 100644 index 0000000..4a1430c --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/login_handler.py @@ -0,0 +1,23 @@ +import json + +class LoginHandler: + def __init__(self, db_handler): + self.db_handler = db_handler + + def login(self, request, client_socket): + username = request["username"] + password = request["password"] + user = self.db_handler.check_login(username, password) + if user: + response = { + "status": "success", + "user": { + "ID": user["ID"], + "Name": user["Name"], + "RoleName": user["RoleName"] + } + } + else: + response = {"status": "failure", "message": "Invalid credentials"} + print(response) + client_socket.sendall(json.dumps(response).encode()) diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/moms_recipe_handler.py b/Final Project/Cafeteria_Recommnedation_system/Server/moms_recipe_handler.py new file mode 100644 index 0000000..f3cc3d2 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/moms_recipe_handler.py @@ -0,0 +1,33 @@ +import json +class MomsrecipeHandler: + def __init__(self, db_handler): + self.db_handler= db_handler + + def endpointHandler(self, client_socket, request): + endpoint = request.get("endpoint") + if endpoint == "/add-moms-recipe": + self.moms_recipe(client_socket,request) + elif endpoint == "/view-moms-recipe": + self.view_moms_recipe(client_socket,request) + + def moms_recipe(self, client_socket, request): + user_id = request.get("UserID") + moms_recipe = request.get("Recipe") + print(request) + try: + response = self.db_handler.add_moms_recipe(user_id, moms_recipe) + if response == "success": + response = {"status": "success", "message": "Mom's recipe successfully added"} + else: + response = {"status": "failure", "message": "Failed to add Mom's recipe"} + except Exception as e: + print(f"Error in moms_recipe: {e}") + response = {"status": "failure", "message": "An error occurred while adding Mom's recipe"} + client_socket.sendall(json.dumps(response).encode()) + + def view_moms_recipe(self, client_socket, request): + role_name = request.get("role_name") + recipe = self.db_handler.get_moms_recipe() + print(recipe) + response = {"status": "success", "feedback": recipe} + client_socket.sendall(json.dumps(response).encode()) \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/notification_handler.py b/Final Project/Cafeteria_Recommnedation_system/Server/notification_handler.py new file mode 100644 index 0000000..7087513 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/notification_handler.py @@ -0,0 +1,37 @@ +import json +import datetime +class NotificationHandler: + def __init__(self, db_handler): + self.db_handler= db_handler + + def endpointHandler(self, client_socket, request): + endpoint = request.get("endpoint") + if endpoint == "/send-notification": + self.send_notification(client_socket, request) + elif endpoint == "/get-notification": + self.get_notification(client_socket) + + def send_notification(self, client_socket, request): + message = request.get("message") + try: + self.db_handler.send_notification(message) + response = {"status": "success", "message": "Notification sent successfully"} + except Exception as e: + print(f"Error sending notification: {e}") + response = {"status": "failure", "message": "Failed to send notification"} + client_socket.sendall(json.dumps(response).encode()) + + def get_notification(self, client_socket): + try: + notifications = self.db_handler.get_notification() + # Convert date objects to string + notifications = [ + (notification_id, message, date.isoformat() if isinstance(date, datetime.date) else date) + for notification_id, message, date in notifications + ] + response = {"status": "success", "notifications": notifications} + except Exception as e: + print(f"Error fetching notifications: {e}") + response = {"status": "failure", "message": "Failed to fetch notifications"} + client_socket.sendall(json.dumps(response).encode()) + \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/recomendation.py b/Final Project/Cafeteria_Recommnedation_system/Server/recomendation.py new file mode 100644 index 0000000..fe7538c --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/recomendation.py @@ -0,0 +1,103 @@ +from database_handler import DatabaseHandler +import json + +class Recommendation: + def __init__(self, db_handler): + self.db_handler = db_handler + + def endpointHandler(self, client_socket, request): + endpoint = request.get("endpoint") + if endpoint == "/view-recomendation": + self.view_recomendation(client_socket, request) + + def view_recomendation(self, client_socket, request): + role_name = request.get("RoleName") + if role_name == "Chef": + response = self.recommend_food_items() + response = {"status": "success", "recomendations": response} + client_socket.sendall(json.dumps(response).encode()) + + def calculate_sentiment_score(self, comment): + if not comment: + return 0 + positive_words = ["delicious", "fantastic", "excellent", "superb", "enjoyed", "good", "fantastic", + "amazing", "awesome", "great", "wonderful", "tasty", "yummy", "perfect", + "splendid", "fabulous", "pleasant", "terrific", "nice"] + + negative_words = ["bad", "poor", "disappointing", "awful", "not good", "horrible", + "terrible", "disgusting", "displeasing", "gross", "bland", "mediocre", + "unpleasant", "unsatisfactory", "underwhelming", "meh", "subpar"] + + positive_score = sum(comment.lower().count(word) for word in positive_words) + negative_score = sum(comment.lower().count(word) for word in negative_words) + return positive_score - negative_score + + def recommend_food_items(self): + avg_ratings = self.db_handler.calculate_average_ratings() + recommendations = {"Breakfast": [], "Lunch": [], "Dinner": []} + seen_items = {"Breakfast": set(), "Lunch": set(), "Dinner": set()} + + for item in avg_ratings: + menu_item_id = item["MenuItemID"] + menu_item_name = item["MenuItem"] + avg_rating = item["AvgRating"] + comment = item.get("Comment", "") + sentiment_score = self.calculate_sentiment_score(comment) + + combined_score = avg_rating + sentiment_score + + meal_type = item["MealTypeID"] + recommendation = {"MenuItemID": menu_item_id, "MenuItem": menu_item_name, "Score": combined_score} + + category = "" + if meal_type == 1: + category = "Breakfast" + elif meal_type == 2: + category = "Lunch" + elif meal_type == 3: + category = "Dinner" + + if menu_item_id not in seen_items[category]: + recommendations[category].append(recommendation) + seen_items[category].add(menu_item_id) + else: + item_index = None + for index, item in enumerate(recommendations[category]): + if item.get("MenuItemID") == recommendation["MenuItemID"]: + item_index = index + recommendations[category][item_index]["Score"] += combined_score + + + + # Sort recommendations by score in descending order and keep only top 3 recommendations + for category in recommendations: + recommendations[category].sort(key=lambda x: x["Score"], reverse=True) + recommendations[category] = recommendations[category][:3] + + # Extract menu item IDs and names from recommendations + for category in recommendations: + recommendations[category] = [{"ID": rec["MenuItemID"], "Name": rec["MenuItem"]} for rec in recommendations[category]] + + return recommendations + + def find_low_rated_negative_sentiment(self): + print("Fetching average ratings from the database...") + avg_ratings = self.db_handler.calculate_average_ratings() + print(f"Avg Ratings: {avg_ratings}") + low_rated_negative_items = [] + + for item in avg_ratings: + avg_rating = item["AvgRating"] + comment = item.get("Comment", "") + sentiment_score = self.calculate_sentiment_score(comment) + + if avg_rating <= 2 and sentiment_score < 0: + low_rated_negative_items.append({ + "MenuItemID": item["MenuItemID"], + "MenuItem": item["MenuItem"], + "AvgRating": avg_rating, + "SentimentScore": sentiment_score + }) + + return low_rated_negative_items + diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/rollout_menu.py b/Final Project/Cafeteria_Recommnedation_system/Server/rollout_menu.py new file mode 100644 index 0000000..643f966 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/rollout_menu.py @@ -0,0 +1,37 @@ +from database_handler import DatabaseHandler +import json + +class RollOut: + def __init__(self, db_handler): + self.db_handler = db_handler + + def endpointHandler(self, client_socket, request): + endpoint = request.get("endpoint") + if endpoint == "/roll-out": + self.roll_out_menu(client_socket,request) + + def roll_out_menu(self, client_socket, request): + data = request.get("data") + + truncate_result = self.db_handler.truncate_recommended_menu_item_table() + if truncate_result == "failure": + response = {"status": "failure", "message": "Failed to truncate recommendedmenuitem table"} + client_socket.sendall(json.dumps(response).encode()) + return + self.db_handler.reset_form_filled_status_for_all_user() + results = [] + try: + for meal, menu_items in data.items(): + for item in menu_items: + menu_item_id = int(item) + result = self.db_handler.add_recommended_menu_item(menu_item_id, 0) # Initial votes set to 0 + results.append(result) + if all(result == "success" for result in results): + self.db_handler.send_notification("Tomorrow's Menu Rolled Out, Fill your choice(If not).") + response = {"status": "success", "message": "Menu items are rolled out successfully"} + else: + response = {"status": "failure", "message": "An error occurred while adding menu items"} + except Exception as e: + print(f"Error in roll_out_menu: {e}") + response = {"status": "failure", "message": "An error occurred while adding menu items"} + client_socket.sendall(json.dumps(response).encode()) diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/server.py b/Final Project/Cafeteria_Recommnedation_system/Server/server.py new file mode 100644 index 0000000..c6804e0 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/server.py @@ -0,0 +1,96 @@ +import socket +import threading +import json +from database_handler import DatabaseHandler +from login_handler import LoginHandler +from recomendation import Recommendation +from food_menu_handler import FoodMenuHandler +from feedback_handler import FeedbackHandler +from voting_handler import VotingHandler +from moms_recipe_handler import MomsrecipeHandler +from notification_handler import NotificationHandler +from rollout_menu import RollOut +from update_user_profile import UpdateUser + +class Server: + def __init__(self, host, port, db_host, db_user, db_password, db_name): + self.host = host + self.port = port + self.db_handler = DatabaseHandler(db_host, db_user, db_password, db_name) + self.login_handler = LoginHandler(self.db_handler) + self.recomendation_engine = Recommendation(self.db_handler) + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.food_menu_handler = FoodMenuHandler(self.db_handler) + self.feedback_handler = FeedbackHandler(self.db_handler) + self.voting_handler = VotingHandler(self.db_handler) + self.notification_handler = NotificationHandler(self.db_handler) + self.moms_recipe_handler = MomsrecipeHandler(self.db_handler) + self.rollout_menu = RollOut(self.db_handler) + self.update_user = UpdateUser(self.db_handler) + + def start_server(self): + self.db_handler.connect() + if not self.db_handler.conn: + print("Failed to connect to the database. Exiting...") + return + self.server_socket.bind((self.host, self.port)) + self.server_socket.listen(5) + print(f"Server started on {self.host}:{self.port}") + while True: + client_socket, addr = self.server_socket.accept() + print(f"Connection from {addr}") + client_thread = threading.Thread(target=self.handle_client, args=(client_socket,)) + client_thread.start() + + def handle_client(self, client_socket): + try: + data = client_socket.recv(1024).decode() + if not data: + raise ValueError("No data received") + request = json.loads(data) + print(request) + endpoint = request.get("endpoint") + food_menu_endpoints = ["/food_menu", "/delete-menu-item", "/add-menu-item", "/update-menu-item", "/update-availability", "/view-low-rating-items"] + feedback_endpoints = ["/view-feedback", "/give-feedback"] + voting_endpoints = ["/voting-items", "/voting"] + recommendation_endpoints = ["/view-recomendation"] + notification_endpoints = ["/send-notification", "/get-notification"] + moms_recipe_endpoints =["/add-moms-recipe","/view-moms-recipe"] + rollout_endpoints = ["/roll-out"] + userupdate_endpoints = ["/update-user-profile"] + if endpoint == "/login": + self.login_handler.login(request, client_socket) + elif endpoint in food_menu_endpoints: + self.food_menu_handler.endpointHandler(client_socket, request) + elif endpoint in feedback_endpoints: + self.feedback_handler.endpointHandler(client_socket, request) + elif endpoint in voting_endpoints: + self.voting_handler.endpointHandler(client_socket, request) + elif endpoint in moms_recipe_endpoints: + self.moms_recipe_handler.endpointHandler(client_socket, request) + elif endpoint in recommendation_endpoints: + self.recomendation_engine.endpointHandler(client_socket, request) + elif endpoint in notification_endpoints: + self.notification_handler.endpointHandler(client_socket, request) + elif endpoint in rollout_endpoints: + self.rollout_menu.endpointHandler(client_socket, request) + elif endpoint in userupdate_endpoints: + self.update_user.endpointHandler(client_socket, request) + else: + response = {"status": "failure", "message": "Invalid endpoint"} + client_socket.sendall(json.dumps(response).encode()) + except ValueError as ve: + print(f"ValueError: {ve}") + response = {"status": "failure", "message": "Invalid request format or no data received"} + client_socket.sendall(json.dumps(response).encode()) + except Exception as e: + print(f"Error: {e}") + response = {"status": "failure", "message": "An error occurred"} + client_socket.sendall(json.dumps(response).encode()) + finally: + client_socket.close() + + +if __name__ == "__main__": + server = Server('localhost', 12345, 'localhost', 'root', 'root', 'foodrecommendation') + server.start_server() diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/update_user_profile.py b/Final Project/Cafeteria_Recommnedation_system/Server/update_user_profile.py new file mode 100644 index 0000000..fdefc21 --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/update_user_profile.py @@ -0,0 +1,27 @@ +from database_handler import DatabaseHandler +import json + +class UpdateUser: + def __init__(self, db_handler): + self.db_handler = db_handler + + def endpointHandler(self, client_socket, request): + endpoint = request.get("endpoint") + if endpoint == "/update-user-profile": + self.update_user_profile(client_socket, request) + + def update_user_profile(self, client_socket, request): + role_name = request.get("RoleName") + user_id = request.get("UserId") + new_dietpreference = request.get("DietPreference") + new_spicelevel = request.get("SpiceLevel") + new_cuisinepreference = request.get("CuisinePreference") + new_sweettooth = request.get("SweetTooth") + print(request) + if role_name == "Employee": + response = self.db_handler.update_userprofile(user_id, new_dietpreference, new_spicelevel, new_cuisinepreference, new_sweettooth) + if "success" in response: + response = {"status": "success", "message": "Profile successfully Updated"} + else: + response = {"status": "failure", "message": "There is an error"} + client_socket.sendall(json.dumps(response).encode()) \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/utility/__init__.py b/Final Project/Cafeteria_Recommnedation_system/Server/utility/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/utility/__pycache__/__init__.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/utility/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..e96f40f Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/utility/__pycache__/__init__.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/utility/__pycache__/socket_functions.cpython-312.pyc b/Final Project/Cafeteria_Recommnedation_system/Server/utility/__pycache__/socket_functions.cpython-312.pyc new file mode 100644 index 0000000..585eea4 Binary files /dev/null and b/Final Project/Cafeteria_Recommnedation_system/Server/utility/__pycache__/socket_functions.cpython-312.pyc differ diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/utility/socket_functions.py b/Final Project/Cafeteria_Recommnedation_system/Server/utility/socket_functions.py new file mode 100644 index 0000000..b7d6eab --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/utility/socket_functions.py @@ -0,0 +1,13 @@ + +class SocketUtility: + def __init__(self, client_socket): + self.client_socket = client_socket + + def send_to_client(self, msg): + self.client_socket.sendall(msg.encode()) + + def receive_msg_from_client(self): + return self.client_socket.recv(1024).decode() + + def close_connection(self): + self.client_socket.close() \ No newline at end of file diff --git a/Final Project/Cafeteria_Recommnedation_system/Server/voting_handler.py b/Final Project/Cafeteria_Recommnedation_system/Server/voting_handler.py new file mode 100644 index 0000000..4dd360e --- /dev/null +++ b/Final Project/Cafeteria_Recommnedation_system/Server/voting_handler.py @@ -0,0 +1,60 @@ +import json +class VotingHandler: + def __init__(self, db_handler): + self.db_handler= db_handler + + def endpointHandler(self, client_socket, request): + endpoint = request.get("endpoint") + if endpoint == "/voting": + self.vote_for_menu(client_socket, request) + elif endpoint == "/voting-items": + self.view_voting_items(client_socket, request) + + def vote_for_menu(self, client_socket, request): + data = request.get("data") + user_id = request.get("employee_id") + if self.db_handler.check_form_filled_status(user_id): + response = {"status": "failure", "message": "Form already filled"} + client_socket.sendall(json.dumps(response).encode()) + return + if not data: + raise ValueError("No data provided") + try: + + for meal_type, menu_item_id in data.items(): + menu_item_id = int(menu_item_id) + result = self.db_handler.add_vote(menu_item_id) + if result != "success": + response = {"status": "failure", "message": f"Failed to cast vote for {meal_type}"} + client_socket.sendall(json.dumps(response).encode()) + return + self.db_handler.update_form_filled_status(user_id, 1) + response = {"status": "success", "message": "Votes successfully cast"} + except Exception as e: + print(f"Error in vote_for_menu: {e}") + response = {"status": "failure", "message": "An error occurred while casting votes"} + client_socket.sendall(json.dumps(response).encode()) + + def view_voting_items(self, client_socket, request): + user_id = request.get("UserID") + try: + diet_preference = self.db_handler.get_diet_preference(user_id) + voting_items = self.db_handler.get_voting_items(diet_preference) + categorized_items = {"Breakfast": [], "Lunch": [], "Dinner": []} + + for item in voting_items: + meal_type = item[2] + categorized_items[meal_type].append({ + "MenuItemID": item[0], + "MenuItemName": item[1], + "Votes": item[3] + }) + + response = {"status": "success", "data": categorized_items} + client_socket.sendall(json.dumps(response).encode()) + except Exception as e: + print(f"Error in view_voting_items: {e}") + response = {"status": "failure", "message": "An error occurred while fetching voting items"} + client_socket.sendall(json.dumps(response).encode()) + + diff --git a/Final Project/UML/ClassDaigram.png b/Final Project/UML/ClassDaigram.png new file mode 100644 index 0000000..14f4285 Binary files /dev/null and b/Final Project/UML/ClassDaigram.png differ diff --git a/Final Project/UML/ER Daigram.png b/Final Project/UML/ER Daigram.png new file mode 100644 index 0000000..83dcc2b Binary files /dev/null and b/Final Project/UML/ER Daigram.png differ diff --git a/Final Project/UML/UseCase.png b/Final Project/UML/UseCase.png new file mode 100644 index 0000000..7166eae Binary files /dev/null and b/Final Project/UML/UseCase.png differ