pacho_the_python

food_app_retake_exam

Aug 25th, 2022
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.49 KB | None | 0 0
  1. from project.client import Client
  2. from project.meals.dessert import Dessert
  3. from project.meals.main_dish import MainDish
  4. from project.meals.meal import Meal
  5. from project.meals.starter import Starter
  6.  
  7.  
  8. class FoodOrdersApp:
  9.     receipt_id = 0
  10.  
  11.     def __init__(self):
  12.         self.menu = []
  13.         self.clients_list = []
  14.  
  15.     def register_client(self, client_phone_number: str):
  16.         for client in self.clients_list:
  17.             if client.phone_number == client_phone_number:
  18.                 raise Exception("The client has already been registered!")
  19.         new_client = Client(client_phone_number)
  20.         self.clients_list.append(new_client)
  21.         return f"Client {client_phone_number} registered successfully."
  22.  
  23.     def add_meals_to_menu(self, *meals: Meal):
  24.         possible_meals = {"Starter": Starter, "MainDish": MainDish, "Dessert": Dessert}
  25.         for meal in meals:
  26.             if meal.__class__.__name__ in possible_meals:
  27.                 self.menu.append(meal)
  28.  
  29.     def show_menu(self):
  30.         if len(self.menu) < 5:
  31.             raise Exception("The menu is not ready!")
  32.         result = ""
  33.         for meal in self.menu:
  34.             result += meal.details() + "\n"
  35.         return result.strip()
  36.  
  37.     def add_meals_to_shopping_cart(self, client_phone_number: str, **meal_names_and_quantities):
  38.         if len(self.menu) < 5:
  39.             raise Exception("The menu is not ready!")
  40.  
  41.         client = None
  42.         current_client = self.find_client_by_phone_num(client_phone_number)
  43.         if current_client is None:
  44.             new_client = Client(client_phone_number)
  45.             self.clients_list.append(new_client)
  46.             client = new_client
  47.         else:
  48.             client = current_client
  49.  
  50.         meal_types = {"Starter": Starter, "MainDish": MainDish, "Dessert": Dessert}
  51.  
  52.         for meal_name, meal_quantity in meal_names_and_quantities.items():
  53.             meal = self.find_meal_by_name(meal_name)
  54.  
  55.             if meal is None:
  56.                 raise Exception(f"{meal_name} is not on the menu!")
  57.  
  58.             if meal.quantity < meal_quantity:
  59.                 raise Exception(f"Not enough quantity of {meal.__class__.__name__}: {meal_name}!")
  60.  
  61.         for meal_name, meal_quantity in meal_names_and_quantities.items():
  62.             meal = self.find_meal_by_name(meal_name)
  63.             meal_price = meal.price
  64.             meal_to_add = meal_types[meal.__class__.__name__](meal_name, meal_price, meal_quantity)
  65.             client.shopping_cart.append(meal_to_add)
  66.             meal.quantity -= meal_quantity
  67.             client.bill += meal.price * meal_quantity
  68.  
  69.         result = []
  70.         for meal in client.shopping_cart:
  71.             current_name = meal.name
  72.             result.append(current_name)
  73.         return f"Client {client_phone_number} successfully ordered {', '.join(result)} for {client.bill:.2f}lv."
  74.  
  75.     def cancel_order(self, client_phone_number: str):
  76.         client = self.find_client_by_phone_num(client_phone_number)
  77.         if len(client.shopping_cart) == 0:
  78.             raise Exception("There are no ordered meals!")
  79.  
  80.         for meal in client.shopping_cart:
  81.             current_quantity = meal.quantity
  82.             for i in range(len(self.menu)):
  83.                 if meal.name == self.menu[i].name:
  84.                     self.menu[i].quantity += current_quantity
  85.         client.bill = 0
  86.         client.shopping_cart = []
  87.         return f"Client {client_phone_number} successfully canceled his order."
  88.  
  89.     def finish_order(self, client_phone_number: str):
  90.  
  91.         client = self.find_client_by_phone_num(client_phone_number)
  92.         if len(client.shopping_cart) == 0:
  93.             raise Exception("There are no ordered meals!")
  94.         total_paid_money = client.bill
  95.         client.bill = 0
  96.         client.shopping_cart = []
  97.         self.receipt_id += 1
  98.         return f"Receipt #{self.receipt_id} with total amount of {total_paid_money:.2f} was successfully paid for " \
  99.                f"{client_phone_number}."
  100.  
  101.     def __str__(self):
  102.         result = f"Food Orders App has {len(self.menu)} meals on the menu and {len(self.clients_list)} clients."
  103.         return result
  104.  
  105.     def find_client_by_phone_num(self, phone_number):
  106.         for client in self.clients_list:
  107.             if client.phone_number == phone_number:
  108.                 return client
  109.         return None
  110.  
  111.     def find_meal_by_name(self, meal_name):
  112.         for meal in self.menu:
  113.             if meal.name == meal_name:
  114.                 return meal
  115.         return None
  116.  
Advertisement
Add Comment
Please, Sign In to add comment