Spaces:
Sleeping
Sleeping
File size: 12,937 Bytes
a7abf85 d3245ed 36d2eb6 b12f5e4 444fe60 a7abf85 01b8424 a7abf85 01b8424 a7abf85 01b8424 a7abf85 098997e d3245ed 3dc3601 8697d42 d3245ed a69087c d3245ed 8dec0d6 13d210d 3ad292c a7abf85 b9ae446 444fe60 a7abf85 444fe60 a7abf85 96ffdf1 098997e a7abf85 098997e a7abf85 a3ace3a 3dc3601 a7abf85 96ffdf1 a7abf85 96ffdf1 a7abf85 098997e a7abf85 dab4dc4 a7abf85 dab4dc4 96ffdf1 a7abf85 098997e a7abf85 c053032 a7abf85 e433df0 a7abf85 61b8aca a7abf85 444fe60 61b8aca a7abf85 61b8aca 444fe60 61b8aca a7abf85 61b8aca a7abf85 61b8aca a7abf85 61b8aca a7abf85 61b8aca a7abf85 61b8aca a7abf85 61b8aca a7abf85 5291fb9 a7abf85 e433df0 a7abf85 e433df0 a7abf85 01b8424 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 |
from flask import Flask, render_template, request, jsonify, redirect, url_for, session
from flask_session import Session # Import the Session class
from flask.sessions import SecureCookieSessionInterface # Import the class
from salesforce import get_salesforce_connection
import os
# Initialize Flask app and Salesforce connection
print("Starting app...")
app = Flask(__name__)
print("Flask app initialized.")
# Add debug logs in Salesforce connection setup
sf = get_salesforce_connection()
print("Salesforce connection established.")
# Set the secret key to handle sessions securely
app.secret_key = os.getenv("SECRET_KEY", "sSSjyhInIsUohKpG8sHzty2q") # Replace with a secure key
# Configure the session type
app.config["SESSION_TYPE"] = "filesystem" # Use filesystem for session storage
#app.config["SESSION_COOKIE_NAME"] = "my_session" # Optional: Change session cookie name
app.config["SESSION_COOKIE_SECURE"] = True # Ensure cookies are sent over HTTPS
app.config["SESSION_COOKIE_SAMESITE"] = "None" # Allow cross-site cookies
# Initialize the session
Session(app) # Correctly initialize the Session object
print("Session interface configured.")
# Ensure secure session handling for environments like Hugging Face
app.session_interface = SecureCookieSessionInterface()
print("Session interface configured.")
@app.route("/")
def home():
return render_template("index.html")
@app.route("/signup", methods=["GET", "POST"])
def signup():
if request.method == "POST":
name = request.form.get("name")
phone = request.form.get("phone")
email = request.form.get("email")
password = request.form.get("password")
try:
sf.Customer_Login__c.create({
"Name": name,
"Phone_Number__c": phone,
"Email__c": email,
"Password__c": password
})
return redirect(url_for("login"))
except Exception as e:
return render_template("signup.html", error=f"Error: {str(e)}")
return render_template("signup.html")
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
email = request.form.get("email")
password = request.form.get("password")
print(f"Login attempt with email: {email}") # Debug log
try:
query = f"SELECT Id, Name, Email__c FROM Customer_Login__c WHERE Email__c='{email}' AND Password__c='{password}'"
result = sf.query(query)
if result["records"]:
session['user_id'] = result["records"][0]['Id']
session['user_email'] = email
print(f"Session variables set: user_id={session['user_id']}, user_email={session['user_email']}")
#print(f"Session cookie: {request.cookies.get(app.session_cookie_name)}") # Check session cookie
return redirect(url_for("menu"))
else:
print("Invalid credentials!")
return render_template("login.html", error="Invalid credentials!")
except Exception as e:
print(f"Error during login: {str(e)}")
return render_template("login.html", error=f"Error: {str(e)}")
return render_template("login.html")
@app.route("/menu", methods=["GET", "POST"])
def menu():
selected_category = request.args.get("category", "All")
user_id = session.get('user_id')
print(f"Cookies on /menu: {request.cookies}")
print(f"Session check in /menu: user_id={user_id}")
# Get the selected category from the query parameter, default is "All"
selected_category = request.args.get("category", "All")
print(f"Selected category: {selected_category}")
if not user_id:
print("Session missing, redirecting to login.")
return redirect(url_for('login'))
try:
query = """
SELECT Name, Price__c, Description__c, Image1__c, Image2__c, Veg_NonVeg__c, Section__c
FROM Menu_Item__c
"""
# Query to fetch menu items
result = sf.query(query)
# Fetch all food items from the query result
food_items = result['records'] if 'records' in result else []
# Dynamically determine categories based on the fetched data
categories = {item.get("Veg_NonVeg__c").capitalize() for item in food_items if item.get("Veg_NonVeg__c")}
categories = {"Veg", "Non-Veg"} # Explicitly overwrite to ensure valid categories only
# Filter food items based on the selected category
if selected_category == "Veg":
food_items = [item for item in food_items if item.get("Veg_NonVeg__c") in ["Veg", "both"]]
elif selected_category == "Non-Veg":
food_items = [item for item in food_items if item.get("Veg_NonVeg__c") in ["Non veg", "both"]]
except Exception as e:
print(f"Error fetching menu data: {str(e)}")
food_items = []
categories = {"All", "Veg", "Non-Veg"} # Default categories on error
# Render the menu page with the filtered data
return render_template(
"menu.html",
food_items=food_items,
categories=sorted(categories), # Sort categories alphabetically if needed
selected_category=selected_category,
)
@app.route("/cart", methods=["GET"])
def cart():
email = session.get('user_email') # Get logged-in user's email
if not email:
return redirect(url_for("login")) # Redirect to login if not logged in
try:
result = sf.query(f"""
SELECT Name, Price__c, Quantity__c, Add_Ons__c, Image1__c
FROM Cart_Item__c
WHERE Customer_Email__c = '{email}'
""")
cart_items = result.get("records", [])
for item in cart_items:
item['Add_Ons__c'] = item.get('Add_Ons__c', "None")
subtotal = sum(item['Quantity__c'] * item['Price__c'] for item in cart_items)
except Exception as e:
print(f"Error fetching cart items: {e}")
cart_items = []
subtotal = 0
return render_template("cart.html", cart_items=cart_items, subtotal=subtotal)
@app.route('/cart/add', methods=['POST'])
def add_to_cart():
data = request.json
item_name = data.get('itemName').strip()
item_price = data.get('itemPrice')
item_image = data.get('itemImage')
addons = data.get('addons', [])
customer_email = session.get('user_email') # Get logged-in user's email from session
# Validate the required fields
if not item_name or not item_price:
return jsonify({"success": False, "error": "Item name and price are required."})
try:
# Add a new item to the cart with the provided details
sf.Cart_Item__c.create({
"Name": item_name, # Item name
"Price__c": item_price, # Item price
"Quantity__c": 1, # Always add as a new entry with quantity 1
"Add_Ons__c": ";".join(addons) if addons and isinstance(addons, list) else "None", # Convert add-ons to a string
"Image1__c": item_image, # Item image
"Customer_Email__c": customer_email, # Associate with the logged-in user
})
return jsonify({"success": True, "message": "Item added to cart successfully."})
except Exception as e:
print(f"Error adding item to cart: {str(e)}") # Log the error for debugging
return jsonify({"success": False, "error": str(e)})
@app.route("/cart/add_item", methods=["POST"])
def add_item_to_cart():
data = request.json # Extract JSON data from the request
email = data.get('email') # Customer email
item_name = data.get('item_name') # Item name
quantity = data.get('quantity', 1) # Quantity to add (default is 1)
addons = data.get('addons', []) # Add-ons for the item (optional)
# Validate inputs
if not email or not item_name:
return jsonify({"success": False, "error": "Email and item name are required."}), 400
try:
# Add a new item to the cart with the provided details
sf.Cart_Item__c.create({
"Customer_Email__c": email, # Associate the cart item with the customer's email
"Item_Name__c": item_name, # Item name
"Quantity__c": quantity, # Quantity to add
"Add_Ons__c": ";".join(addons) if addons and isinstance(addons, list) else "None" # Add-ons (if any)
})
return jsonify({"success": True, "message": "Item added to cart successfully."})
except Exception as e:
print(f"Error adding item to cart: {str(e)}") # Log the error for debugging
return jsonify({"success": False, "error": str(e)}), 500
@app.route('/cart/remove/<item_name>', methods=['POST'])
def remove_cart_item(item_name):
try:
customer_email = session.get('user_email')
if not customer_email:
return jsonify({'success': False, 'message': 'User email not found. Please log in again.'}), 400
query = f"""
SELECT Id FROM Cart_Item__c
WHERE Customer_Email__c = '{customer_email}' AND Name = '{item_name}'
"""
result = sf.query(query)
if result['totalSize'] == 0:
return jsonify({'success': False, 'message': 'Item not found in cart.'}), 400
cart_item_id = result['records'][0]['Id']
sf.Cart_Item__c.delete(cart_item_id)
return jsonify({'success': True, 'message': f"'{item_name}' removed successfully!"}), 200
except Exception as e:
print(f"Error: {str(e)}")
return jsonify({'success': False, 'message': f"An error occurred: {str(e)}"}), 500
@app.route('/api/addons', methods=['GET'])
def get_addons():
item_name = request.args.get('item_name')
if not item_name:
return jsonify({"success": False, "error": "Item name is required."})
try:
query = f"SELECT Name, Price__c FROM Add_Ons__c"
addons = sf.query(query)['records']
return jsonify({"success": True, "addons": addons})
except Exception as e:
print(f"Error fetching add-ons: {e}")
return jsonify({"success": False, "error": "Unable to fetch add-ons. Please try again later."})
@app.route("/cart/update_quantity", methods=["POST"])
def update_quantity():
data = request.json # Extract JSON data from the request
email = data.get('email') # Customer email
item_name = data.get('item_name') # Item name (Cart Item Name in Salesforce)
quantity = data.get('quantity') # New quantity
# Validate inputs
if not email or not item_name:
return jsonify({"success": False, "error": "Email and item name are required."}), 400
try:
# Query the cart item using the correct field names
cart_items = sf.query(
f"SELECT Id, Quantity__c FROM Cart_Item__c WHERE Customer_Email__c = '{email}' AND Name__c = '{item_name}'"
)['records']
if not cart_items:
return jsonify({"success": False, "error": "Cart item not found."}), 404
# Get the first matching record ID
cart_item_id = cart_items[0]['Id']
# Update the quantity in Salesforce
sf.Cart_Item__c.update(cart_item_id, {"Quantity__c": quantity})
return jsonify({"success": True, "new_quantity": quantity})
except Exception as e:
return jsonify({"success": False, "error": str(e)}), 500
@app.route("/checkout", methods=["POST"])
def checkout():
email = session.get('user_email')
user_id = session.get('user_id')
if not email or not user_id:
return jsonify({"success": False, "message": "User not logged in"})
try:
result = sf.query(f"""
SELECT Id, Name, Price__c, Quantity__c, Add_Ons__c
FROM Cart_Item__c
WHERE Customer_Email__c = '{email}'
""")
cart_items = result["records"]
if not cart_items:
return jsonify({"success": False, "message": "Cart is empty"})
total_price = sum(item['Quantity__c'] * item['Price__c'] for item in cart_items)
order_data = {
"Customer_Name__c": user_id,
"Customer_Email__c": email,
"Total_Amount__c": total_price,
"Order_Status__c": "Pending",
"Order_Items__c": "\n".join(
[f"{item['Name']} (Qty: {item['Quantity__c']})" for item in cart_items]
),
"Add_Ons__c": "\n".join(
[item['Add_Ons__c'] if item.get('Add_Ons__c') else "None" for item in cart_items]
),
}
sf.Order__c.create(order_data)
for item in cart_items:
sf.Cart_Item__c.delete(item["Id"])
return jsonify({"success": True, "message": "Order placed successfully!"})
except Exception as e:
return jsonify({"success": False, "error": str(e)})
if __name__ == "__main__":
app.run(debug=False, host="0.0.0.0", port=7860) |