geethareddy commited on
Commit
1fd693d
·
verified ·
1 Parent(s): 1d905a0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +267 -37
app.py CHANGED
@@ -1,61 +1,291 @@
 
 
 
 
1
  import os
2
- from flask import Flask, render_template, request, redirect
3
- from simple_salesforce import Salesforce
4
 
5
- # Initialize Flask app
 
6
  app = Flask(__name__)
 
7
 
8
- # Securely store the secret key
9
- app.secret_key = os.environ.get('FLASK_SECRET_KEY', 'your_secret_key')
10
-
11
- # Fetch Salesforce credentials correctly (QUOTED STRINGS!)
12
- SF_USERNAME = os.environ.get("SF_USERNAME", "[email protected]")
13
- SF_PASSWORD = os.environ.get("SF_PASSWORD", "Sati@1020")
14
- SF_SECURITY_TOKEN = os.environ.get("SF_SECURITY_TOKEN", "sSSjyhInIsUohKpG8sHzty2q")
15
-
16
- # Debugging: Print credentials safely
17
- print(f"Using Salesforce Username: {SF_USERNAME}")
18
-
19
- # Establish Salesforce connection
20
- try:
21
- sf = Salesforce(
22
- username=SF_USERNAME,
23
- password=SF_PASSWORD,
24
- security_token=SF_SECURITY_TOKEN
25
- )
26
- print("✅ Salesforce connection established successfully.")
27
- except Exception as e:
28
- print(f"❌ ERROR: Failed to connect to Salesforce: {str(e)}")
29
- exit(1)
30
 
31
  @app.route("/")
32
  def home():
33
- return redirect("/menu") # Redirect home page to menu page
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
 
 
 
35
  @app.route("/menu")
36
  def menu():
37
  selected_category = request.args.get("category", "All")
 
38
  try:
39
- # Salesforce SOQL Query
40
  query = "SELECT Name, Price__c, Image1__c, Category__c, Description__c FROM Menu_Item__c"
41
  result = sf.query(query)
42
-
43
- # Extract menu items
44
- food_items = result.get('records', [])
45
-
46
- # Extract unique categories
47
  categories = {item['Category__c'] for item in food_items if 'Category__c' in item}
48
-
49
- # Filter by category if selected
50
  if selected_category != "All":
51
  food_items = [item for item in food_items if item.get("Category__c") == selected_category]
52
-
53
  except Exception as e:
54
  food_items = []
55
  categories = []
56
- print(f" ERROR: Fetching data from Salesforce failed: {e}")
57
 
58
  return render_template("menu.html", food_items=food_items, categories=categories, selected_category=selected_category)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  if __name__ == "__main__":
61
- app.run(host="0.0.0.0", port=7860, debug=True)
 
 
1
+ from flask import Flask, render_template, request, jsonify, redirect, url_for, session
2
+ from flask_session import Session # Import the Session class
3
+ from flask.sessions import SecureCookieSessionInterface # Import the class
4
+ from salesforce import get_salesforce_connection
5
  import os
 
 
6
 
7
+ # Initialize Flask app and Salesforce connection
8
+ print("Starting app...")
9
  app = Flask(__name__)
10
+ print("Flask app initialized.")
11
 
12
+ # Add debug logs in Salesforce connection setup
13
+ sf = get_salesforce_connection()
14
+ print("Salesforce connection established.")
15
+
16
+ # Set the secret key to handle sessions securely
17
+ app.secret_key = os.getenv("SECRET_KEY", "sSSjyhInIsUohKpG8sHzty2q") # Replace with a secure key
18
+
19
+ # Configure the session type
20
+ app.config["SESSION_TYPE"] = "filesystem" # Use filesystem for session storage
21
+ #app.config["SESSION_COOKIE_NAME"] = "my_session" # Optional: Change session cookie name
22
+ app.config["SESSION_COOKIE_SECURE"] = True # Ensure cookies are sent over HTTPS
23
+ app.config["SESSION_COOKIE_SAMESITE"] = "None" # Allow cross-site cookies
24
+
25
+ # Initialize the session
26
+ Session(app) # Correctly initialize the Session object
27
+ print("Session interface configured.")
28
+
29
+ # Ensure secure session handling for environments like Hugging Face
30
+ app.session_interface = SecureCookieSessionInterface()
31
+ print("Session interface configured.")
 
 
32
 
33
  @app.route("/")
34
  def home():
35
+ #return "Welcome to Biryani Hub!"
36
+ return render_template("index.html")
37
+
38
+ @app.route("/signup", methods=["GET", "POST"])
39
+ def signup():
40
+ if request.method == "POST":
41
+ name = request.form.get("name")
42
+ phone = request.form.get("phone")
43
+ email = request.form.get("email")
44
+ password = request.form.get("password")
45
+ try:
46
+ sf.Customer_Login__c.create({
47
+ "Name": name,
48
+ "Phone_Number__c": phone,
49
+ "Email__c": email,
50
+ "Password__c": password
51
+ })
52
+ return redirect(url_for("login"))
53
+ except Exception as e:
54
+ return render_template("signup.html", error=f"Error: {str(e)}")
55
+ return render_template("signup.html")
56
+
57
+ @app.route("/login", methods=["GET", "POST"])
58
+ def login():
59
+ if request.method == "POST":
60
+ email = request.form.get("email")
61
+ password = request.form.get("password")
62
+ try:
63
+ query = f"SELECT Id, Name, Email__c FROM Customer_Login__c WHERE Email__c='{email}' AND Password__c='{password}'"
64
+ result = sf.query(query)
65
+ if result["records"]:
66
+ session['user_id'] = result["records"][0]['Id']
67
+ session['user_email'] = email
68
+ return redirect(url_for("menu"))
69
+ else:
70
+ return render_template("login.html", error="Invalid credentials!")
71
+ except Exception as e:
72
+ return render_template("login.html", error=f"Error: {str(e)}")
73
+ return render_template("login.html")
74
+
75
+ @app.route("/logout", methods=["POST"])
76
+ def logout():
77
+ session.clear() # Clears the session to log the user out
78
+ return redirect(url_for('login')) # Redirect to the login page
79
 
80
+ @app.route("/menu", methods=["GET", "POST"])
81
+ @app.route("/menu")
82
  @app.route("/menu")
83
  def menu():
84
  selected_category = request.args.get("category", "All")
85
+
86
  try:
 
87
  query = "SELECT Name, Price__c, Image1__c, Category__c, Description__c FROM Menu_Item__c"
88
  result = sf.query(query)
89
+ food_items = result['records'] if 'records' in result else []
 
 
 
 
90
  categories = {item['Category__c'] for item in food_items if 'Category__c' in item}
91
+
 
92
  if selected_category != "All":
93
  food_items = [item for item in food_items if item.get("Category__c") == selected_category]
 
94
  except Exception as e:
95
  food_items = []
96
  categories = []
97
+ print(f"Error fetching data: {e}")
98
 
99
  return render_template("menu.html", food_items=food_items, categories=categories, selected_category=selected_category)
100
+ def cart():
101
+ email = session.get('user_email') # Get logged-in user's email
102
+ if not email:
103
+ return redirect(url_for("login")) # Redirect to login if not logged in
104
+ try:
105
+ result = sf.query(f"""
106
+ SELECT Name, Price__c, Quantity__c, Add_Ons__c, Image1__c
107
+ FROM Cart_Item__c
108
+ WHERE Customer_Email__c = '{email}'
109
+ """)
110
+ cart_items = result.get("records", [])
111
+ subtotal = sum(item['Quantity__c'] * item['Price__c'] for item in cart_items)
112
+ except Exception as e:
113
+ print(f"Error fetching cart items: {e}")
114
+ cart_items = []
115
+ subtotal = 0
116
+
117
+ return render_template("cart.html", cart_items=cart_items, subtotal=subtotal)
118
+
119
+
120
+
121
+ @app.route('/cart/add', methods=['POST'])
122
+ def add_to_cart():
123
+ data = request.json
124
+ item_name = data.get('itemName')
125
+ item_price = data.get('itemPrice')
126
+ item_image = data.get('itemImage')
127
+ addons = data.get('addons', [])
128
+ customer_email = session.get('user_email')
129
+
130
+ if not customer_email:
131
+ return jsonify({"success": False, "error": "User not logged in."}), 401
132
+
133
+ try:
134
+ query = f"SELECT Id, Quantity__c FROM Cart_Item__c WHERE Customer_Email__c = '{customer_email}' AND Name = '{item_name}'"
135
+ result = sf.query(query)
136
+
137
+ if result['totalSize'] > 0:
138
+ # Update existing item quantity
139
+ cart_item = result['records'][0]
140
+ sf.Cart_Item__c.update(cart_item['Id'], {
141
+ "Quantity__c": cart_item['Quantity__c'] + 1
142
+ })
143
+ else:
144
+ # Add new item to the cart
145
+ sf.Cart_Item__c.create({
146
+ "Name": item_name,
147
+ "Price__c": item_price,
148
+ "Quantity__c": 1,
149
+ "Add_Ons__c": ";".join(addons) if addons else None,
150
+ "Image1__c": item_image,
151
+ "Customer_Email__c": customer_email,
152
+ })
153
+ return jsonify({"success": True, "message": "Item added to cart."})
154
+ except Exception as e:
155
+ return jsonify({"success": False, "error": str(e)}), 500
156
+
157
+ @app.route("/cart/add_item", methods=["POST"])
158
+ def add_item_to_cart():
159
+ data = request.json # Extract JSON data from the request
160
+ email = data.get('email') # Customer email
161
+ item_name = data.get('item_name') # Item name
162
+ quantity = data.get('quantity', 0) # Quantity to add (default is 1) // default value is 1
163
+
164
+ try:
165
+ # Check if the item already exists in the cart for this customer
166
+ cart_items = sf.query(
167
+ f"SELECT Id, Quantity__c FROM Cart_Item__c WHERE Customer_Email__c = '{email}' AND Item_Name__c = '{item_name}'"
168
+ )['records']
169
+
170
+ if cart_items:
171
+ # If the item already exists, update its quantity
172
+ cart_item = cart_items[0]
173
+ new_quantity = cart_item['Quantity__c'] + quantity
174
+ sf.Cart_Item__c.update(cart_item['Id'], {"Quantity__c": new_quantity})
175
+ return jsonify({"success": True, "message": "Item quantity updated successfully."})
176
+ else:
177
+ # If the item does not exist, add it to the cart
178
+ sf.Cart_Item__c.create({
179
+ "Customer_Email__c": email,
180
+ "Item_Name__c": item_name,
181
+ "Quantity__c": quantity
182
+ })
183
+
184
+ return jsonify({"success": True, "message": "Item added/updated successfully.", "redirect": "/menu"})
185
+ except Exception as e:
186
+ return jsonify({"success": False, "error": str(e)}), 500
187
+
188
+
189
+ @app.route('/cart/remove/<item_name>', methods=['POST'])
190
+ def remove_cart_item(item_name):
191
+ try:
192
+ customer_email = session.get('user_email')
193
+ if not customer_email:
194
+ return jsonify({'success': False, 'message': 'User email not found. Please log in again.'}), 400
195
+ query = f"""
196
+ SELECT Id FROM Cart_Item__c
197
+ WHERE Customer_Email__c = '{customer_email}' AND Name = '{item_name}'
198
+ """
199
+ result = sf.query(query)
200
+ if result['totalSize'] == 0:
201
+ return jsonify({'success': False, 'message': 'Item not found in cart.'}), 400
202
+ cart_item_id = result['records'][0]['Id']
203
+ sf.Cart_Item__c.delete(cart_item_id)
204
+ return jsonify({'success': True, 'message': f"'{item_name}' removed successfully!"}), 200
205
+ except Exception as e:
206
+ print(f"Error: {str(e)}")
207
+ return jsonify({'success': False, 'message': f"An error occurred: {str(e)}"}), 500
208
+
209
+ @app.route('/api/addons', methods=['GET'])
210
+ def get_addons():
211
+ item_name = request.args.get('item_name')
212
+ if not item_name:
213
+ return jsonify({"success": False, "error": "Item name is required."})
214
+
215
+ try:
216
+ # Salesforce query to get the add-ons related to the item name
217
+ query = f"SELECT Name, Price__c FROM Add_Ons__c"
218
+ addons = sf.query(query)['records']# Get records of add-ons
219
+ return jsonify({"success": True, "addons": addons})
220
+ except Exception as e:
221
+ print(f"Error fetching add-ons: {e}")
222
+ return jsonify({"success": False, "error": "Unable to fetch add-ons. Please try again later."})
223
 
224
+ @app.route("/cart/update_quantity", methods=["POST"])
225
+ def update_quantity():
226
+ data = request.json # Extract JSON data from the request
227
+ email = data.get('email') # Customer email
228
+ item_name = data.get('item_name') # Item name (Cart Item Name in Salesforce)
229
+ quantity = data.get('quantity') # New quantity
230
+
231
+ # Validate inputs
232
+ if not email or not item_name:
233
+ return jsonify({"success": False, "error": "Email and item name are required."}), 400
234
+
235
+ try:
236
+ # Query the cart item using the correct field names
237
+ cart_items = sf.query(
238
+ f"SELECT Id, Quantity__c FROM Cart_Item__c WHERE Customer_Email__c = '{email}' AND Name__c = '{item_name}'"
239
+ )['records']
240
+
241
+ if not cart_items:
242
+ return jsonify({"success": False, "error": "Cart item not found."}), 404
243
+
244
+ # Get the first matching record ID
245
+ cart_item_id = cart_items[0]['Id']
246
+
247
+ # Update the quantity in Salesforce
248
+ sf.Cart_Item__c.update(cart_item_id, {"Quantity__c": quantity})
249
+
250
+ return jsonify({"success": True, "new_quantity": quantity})
251
+ except Exception as e:
252
+ return jsonify({"success": False, "error": str(e)}), 500
253
+
254
+ @app.route("/checkout", methods=["POST"])
255
+ def checkout():
256
+ email = session.get('user_email')
257
+ user_id = session.get('user_id')
258
+ if not email or not user_id:
259
+ return jsonify({"success": False, "message": "User not logged in"})
260
+ try:
261
+ result = sf.query(f"""
262
+ SELECT Id, Name, Price__c, Quantity__c, Add_Ons__c
263
+ FROM Cart_Item__c
264
+ WHERE Customer_Email__c = '{email}'
265
+ """)
266
+ cart_items = result["records"]
267
+ if not cart_items:
268
+ return jsonify({"success": False, "message": "Cart is empty"})
269
+ total_price = sum(item['Quantity__c'] * item['Price__c'] for item in cart_items)
270
+ order_data = {
271
+ "Customer_Name__c": user_id,
272
+ "Customer_Email__c": email,
273
+ "Total_Amount__c": total_price,
274
+ "Order_Status__c": "Pending",
275
+ "Order_Items__c": "\n".join(
276
+ [f"{item['Name']} (Qty: {item['Quantity__c']})" for item in cart_items]
277
+ ),
278
+ "Add_Ons__c": "\n".join(
279
+ [f"{item['Add_Ons__c']}" if item['Add_Ons__c'] else "None" for item in cart_items]
280
+ ),
281
+ }
282
+ sf.Order__c.create(order_data)
283
+ for item in cart_items:
284
+ sf.Cart_Item__c.delete(item["Id"])
285
+ return jsonify({"success": True, "message": "Order placed successfully!"})
286
+ except Exception as e:
287
+ return jsonify({"success": False, "error": str(e)})
288
+
289
  if __name__ == "__main__":
290
+ app.run(host='0.0.0.0', port=7860, debug=False)
291
+