lokesh341 commited on
Commit
375539f
·
verified ·
1 Parent(s): d885605

Update menu.py

Browse files
Files changed (1) hide show
  1. menu.py +173 -133
menu.py CHANGED
@@ -1,6 +1,6 @@
1
  from flask import Blueprint, render_template, request, session, jsonify, redirect, url_for
2
- import os
3
  from salesforce import get_salesforce_connection
 
4
 
5
  menu_blueprint = Blueprint('menu', __name__)
6
 
@@ -15,23 +15,31 @@ SECTION_ORDER = ["Best Sellers", "Starters", "Biryanis", "Curries", "Breads", "C
15
 
16
  # Create placeholder video at startup if it doesn't exist
17
  if not os.path.exists(PLACEHOLDER_PATH):
18
- with open(PLACEHOLDER_PATH, 'wb') as f:
19
- f.close()
20
  print(f"Created placeholder video at {PLACEHOLDER_PATH}")
21
 
22
  def get_valid_video_path(item_name, video_url=None):
23
- """Get valid video path for item with placeholder fallback."""
 
 
 
 
24
  if video_url:
 
25
  if video_url.startswith(('http://', 'https://')):
26
  return video_url
 
27
  elif video_url.startswith('/'):
28
  return video_url
 
29
  elif video_url.startswith('069'):
30
- return f"https://biryanihub-dev-ed.develop.my.salesforce.com/sfc/servlet.shepherd/version/download/{video_url}"
 
 
31
  if not os.path.exists(PLACEHOLDER_PATH):
32
- with open(PLACEHOLDER_PATH, 'wb') as f:
33
- f.close()
34
  print(f"Created missing placeholder video at {PLACEHOLDER_PATH}")
 
35
  return f"/static/{PLACEHOLDER_VIDEO}"
36
 
37
  @menu_blueprint.route("/menu", methods=["GET", "POST"])
@@ -39,11 +47,11 @@ def menu():
39
  selected_category = request.args.get("category", "All")
40
  user_email = session.get('user_email')
41
 
42
- # Handle user authentication
43
  if not user_email:
44
  user_email = request.args.get("email")
45
  user_name = request.args.get("name")
46
- if user_email and user_name:
 
47
  session['user_email'] = user_email
48
  session['user_name'] = user_name
49
  else:
@@ -53,95 +61,122 @@ def menu():
53
 
54
  first_letter = user_name[0].upper() if user_name else "A"
55
 
56
- # Fetch user referral and reward points
57
- user_query = f"SELECT Referral__c, Reward_Points__c FROM Customer_Login__c WHERE Email__c = '{user_email}'"
58
- user_result = sf.query(user_query)
59
- if not user_result.get('records'):
60
- return redirect(url_for('login'))
61
-
62
- referral_code = user_result['records'][0].get('Referral__c', 'N/A')
63
- reward_points = user_result['records'][0].get('Reward_Points__c', 0)
64
-
65
- # Get cart item count
66
- cart_query = f"SELECT COUNT() FROM Cart_Item__c WHERE Customer_Email__c = '{user_email}'"
67
- cart_count_result = sf.query(cart_query)
68
- cart_item_count = cart_count_result.get('totalSize', 0)
69
-
70
- # Fetch all Menu_Item__c records with only existing fields
71
- menu_query = """
72
- SELECT Name, Price__c, Description__c, Image1__c, Image2__c,
73
- Veg_NonVeg__c, Section__c, Total_Ordered__c, Video1__c
74
- FROM Menu_Item__c
75
- """
76
- menu_result = sf.query_all(menu_query)
77
- food_items = menu_result.get('records', [])
78
-
79
- # Process menu items
80
- for item in food_items:
81
- item['Total_Ordered__c'] = item.get('Total_Ordered__c', 0) or 0
82
- item['Video1__c'] = get_valid_video_path(item['Name'], item.get('Video1__c'))
83
- item['Section__c'] = item.get('Section__c', "Others")
84
- item['Description__c'] = item.get('Description__c', "No description available")
85
- # Add default values for missing fields
86
- item['IngredientsInfo__c'] = "Not specified"
87
- item['NutritionalInfo__c'] = "Not available"
88
- item['Allergens__c'] = "None listed"
89
-
90
- # Fetch all Custom_Dish__c records with only existing fields
91
- custom_dish_query = """
92
- SELECT Name, Price__c, Description__c, Image1__c, Image2__c,
93
- Veg_NonVeg__c, Section__c, Total_Ordered__c
94
- FROM Custom_Dish__c
95
- WHERE CreatedDate >= LAST_N_DAYS:7
96
- """
97
- custom_dish_result = sf.query_all(custom_dish_query)
98
- custom_dishes = custom_dish_result.get('records', [])
99
-
100
- # Process custom dishes
101
- for item in custom_dishes:
102
- item['Total_Ordered__c'] = item.get('Total_Ordered__c', 0) or 0
103
- item['Video1__c'] = get_valid_video_path(item['Name'])
104
- item['Section__c'] = item.get('Section__c', "Customized dish")
105
- item['Description__c'] = item.get('Description__c', "No description available")
106
- # Add default values for missing fields
107
- item['IngredientsInfo__c'] = "Not specified"
108
- item['NutritionalInfo__c'] = "Not available"
109
- item['Allergens__c'] = "None listed"
110
-
111
- # Merge all items
112
- all_items = food_items + custom_dishes
113
- ordered_menu = {section: [] for section in SECTION_ORDER}
114
-
115
- # Process best sellers
116
- best_sellers = sorted(all_items, key=lambda x: x['Total_Ordered__c'], reverse=True)
117
- if selected_category == "Veg":
118
- best_sellers = [item for item in best_sellers if item.get("Veg_NonVeg__c") in ["Veg", "both"]]
119
- elif selected_category == "Non veg":
120
- best_sellers = [item for item in best_sellers if item.get("Veg_NonVeg__c") in ["Non veg", "both"]]
121
- ordered_menu["Best Sellers"] = best_sellers[:4]
122
-
123
- # Organize items into sections
124
- added_item_names = set()
125
- for item in all_items:
126
- section = item['Section__c']
127
- if section not in ordered_menu:
128
- ordered_menu[section] = []
129
-
130
- if item['Name'] in added_item_names:
131
- continue
132
-
133
- veg_nonveg = item.get("Veg_NonVeg__c", "both")
134
- if selected_category == "Veg" and veg_nonveg not in ["Veg", "both"]:
135
- continue
136
- if selected_category == "Non veg" and veg_nonveg not in ["Non veg", "both"]:
137
- continue
138
-
139
- ordered_menu[section].append(item)
140
- added_item_names.add(item['Name'])
141
-
142
- # Remove empty sections
143
- ordered_menu = {section: items for section, items in ordered_menu.items() if items}
144
- categories = ["All", "Veg", "Non veg"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
 
146
  return render_template(
147
  "menu.html",
@@ -157,8 +192,8 @@ def menu():
157
 
158
  @menu_blueprint.route('/api/addons', methods=['GET'])
159
  def get_addons():
160
- item_name = request.args.get('item_name')
161
- item_section = request.args.get('item_section')
162
 
163
  if not item_name or not item_section:
164
  return jsonify({"success": False, "error": "Item name and section are required."}), 400
@@ -169,7 +204,7 @@ def get_addons():
169
  FROM Customization_Options__c
170
  WHERE Section__c = '{item_section}'
171
  """
172
- result = sf.query_all(query)
173
  addons = result.get('records', [])
174
 
175
  if not addons:
@@ -178,10 +213,14 @@ def get_addons():
178
  formatted_addons = []
179
  for addon in addons:
180
  options = addon.get("Options__c", "")
181
- options = options.split(", ") if options else []
 
 
 
 
182
  formatted_addons.append({
183
- "name": addon.get("Name", ""),
184
- "type": addon.get("Customization_Type__c", ""),
185
  "options": options,
186
  "max_selections": addon.get("Max_Selections__c", 1),
187
  "extra_charge": addon.get("Extra_Charge__c", False),
@@ -199,39 +238,41 @@ def add_to_cart():
199
  try:
200
  data = request.json
201
  item_name = data.get('itemName', '').strip()
202
- item_price = float(data.get('itemPrice', 0))
203
- item_image = data.get('itemImage', '')
204
  addons = data.get('addons', [])
205
  instructions = data.get('instructions', '')
206
- category = data.get('category', '')
207
- section = data.get('section', '')
208
- quantity = int(data.get('quantity', 1))
209
  customer_email = session.get('user_email')
210
 
211
- if not item_name or not item_price or not customer_emailKILL
212
- return jsonify({"success": False, "error": "Item name, price, and user email are required."}), 400
 
 
 
213
 
214
  query = f"""
215
- SELECT Id, Quantity__c, Add_Ons__c, Add_Ons_Price__c, Instructions__c, Price__c
216
  FROM Cart_Item__c
217
  WHERE Customer_Email__c = '{customer_email}' AND Name = '{item_name}'
218
  """
219
  result = sf.query(query)
220
  cart_items = result.get("records", [])
221
 
222
- addons_price = sum(float(addon.get('price', 0)) for addon in addons)
223
- new_addons = "; ".join([f"{addon['name']} (${addon['price']})" for addon in addons]) if addons else "None"
224
 
225
  if cart_items:
226
- cart_item = cart_items[0]
227
- cart_item_id = cart_item['Id']
228
- existing_quantity = int(cart_item.get('Quantity__c', 0))
229
- existing_addons = cart_item.get('Add_Ons__c', "None")
230
- existing_addons_price = float(cart_item.get('Add_Ons_Price__c', 0))
231
- existing_instructions = cart_item.get('Instructions__c', "")
232
 
233
  combined_addons = existing_addons if existing_addons != "None" else ""
234
- if new_addons != "None":
235
  combined_addons = f"{combined_addons}; {new_addons}".strip("; ")
236
 
237
  combined_instructions = existing_instructions
@@ -243,26 +284,29 @@ def add_to_cart():
243
  float(addon.split("($")[1][:-1]) for addon in combined_addons_list if "($" in addon
244
  )
245
 
246
- total_price = (existing_quantity + quantity) * item_price + combined_addons_price
247
-
248
  sf.Cart_Item__c.update(cart_item_id, {
249
  "Quantity__c": existing_quantity + quantity,
250
  "Add_Ons__c": combined_addons,
251
  "Add_Ons_Price__c": combined_addons_price,
252
  "Instructions__c": combined_instructions,
253
- "Price__c": total_price,
254
  "Category__c": category,
255
  "Section__c": section
256
  })
257
  else:
 
 
 
 
258
  total_price = item_price * quantity + addons_price
 
259
  sf.Cart_Item__c.create({
260
  "Name": item_name,
261
  "Price__c": total_price,
262
  "Base_Price__c": item_price,
263
  "Quantity__c": quantity,
264
  "Add_Ons_Price__c": addons_price,
265
- "Add_Ons__c": new_addons,
266
  "Image1__c": item_image,
267
  "Customer_Email__c": customer_email,
268
  "Instructions__c": instructions,
@@ -270,15 +314,11 @@ def add_to_cart():
270
  "Section__c": section
271
  })
272
 
273
- # Fetch updated cart for UI update
274
- cart_query = f"SELECT Name, Quantity__c FROM Cart_Item__c WHERE Customer_Email__c = '{customer_email}'"
275
- cart_result = sf.query_all(cart_query)
276
- cart = [{"itemName": item["Name"], "quantity": item["Quantity__c"]} for item in cart_result.get("records", [])]
277
-
278
- return jsonify({"success": True, "message": "Item added to cart successfully.", "cart": cart})
279
 
280
- except ValueError as e:
281
- return jsonify({"success": False, "error": f"Invalid data format: {str(e)}"}), 400
282
  except Exception as e:
283
  print(f"Error adding item to cart: {str(e)}")
284
  return jsonify({"success": False, "error": "An error occurred while adding the item to the cart."}), 500
 
1
  from flask import Blueprint, render_template, request, session, jsonify, redirect, url_for
 
2
  from salesforce import get_salesforce_connection
3
+ import os
4
 
5
  menu_blueprint = Blueprint('menu', __name__)
6
 
 
15
 
16
  # Create placeholder video at startup if it doesn't exist
17
  if not os.path.exists(PLACEHOLDER_PATH):
18
+ open(PLACEHOLDER_PATH, 'wb').close()
 
19
  print(f"Created placeholder video at {PLACEHOLDER_PATH}")
20
 
21
  def get_valid_video_path(item_name, video_url=None):
22
+ """
23
+ Get valid video path for item with placeholder fallback
24
+ Priority: 1. Video1__c from Salesforce 2. placeholder.mp4
25
+ """
26
+ # First try: Video1__c from Salesforce if provided
27
  if video_url:
28
+ # If it's a complete URL (http/https)
29
  if video_url.startswith(('http://', 'https://')):
30
  return video_url
31
+ # If it's a relative path (/videos/xxx.mp4)
32
  elif video_url.startswith('/'):
33
  return video_url
34
+ # If it's a Salesforce File ID (starts with '069')
35
  elif video_url.startswith('069'):
36
+ return f"https://yourdomain.my.salesforce.com/sfc/servlet.shepherd/version/download/{video_url}"
37
+
38
+ # Final fallback: placeholder.mp4
39
  if not os.path.exists(PLACEHOLDER_PATH):
40
+ open(PLACEHOLDER_PATH, 'wb').close()
 
41
  print(f"Created missing placeholder video at {PLACEHOLDER_PATH}")
42
+
43
  return f"/static/{PLACEHOLDER_VIDEO}"
44
 
45
  @menu_blueprint.route("/menu", methods=["GET", "POST"])
 
47
  selected_category = request.args.get("category", "All")
48
  user_email = session.get('user_email')
49
 
 
50
  if not user_email:
51
  user_email = request.args.get("email")
52
  user_name = request.args.get("name")
53
+
54
+ if user_email:
55
  session['user_email'] = user_email
56
  session['user_name'] = user_name
57
  else:
 
61
 
62
  first_letter = user_name[0].upper() if user_name else "A"
63
 
64
+ try:
65
+ # Fetch user referral and reward points
66
+ user_query = f"SELECT Referral__c, Reward_Points__c FROM Customer_Login__c WHERE Email__c = '{user_email}'"
67
+ user_result = sf.query(user_query)
68
+
69
+ if not user_result['records']:
70
+ return redirect(url_for('login'))
71
+
72
+ referral_code = user_result['records'][0].get('Referral__c', 'N/A')
73
+ reward_points = user_result['records'][0].get('Reward_Points__c', 0)
74
+
75
+ # Get cart item count
76
+ cart_query = f"SELECT COUNT() FROM Cart_Item__c WHERE Customer_Email__c = '{user_email}'"
77
+ cart_count_result = sf.query(cart_query)
78
+ cart_item_count = cart_count_result['totalSize']
79
+
80
+ # First try basic query with essential fields
81
+ base_fields = [
82
+ "Name", "Price__c", "Description__c", "Image1__c", "Image2__c",
83
+ "Veg_NonVeg__c", "Section__c", "Total_Ordered__c", "Video1__c"
84
+ ]
85
+
86
+ # Try to include nutrition fields if they exist
87
+ try:
88
+ describe_result = sf.Menu_Item__c.describe()
89
+ available_fields = [field['name'] for field in describe_result['fields']]
90
+
91
+ nutrition_fields = []
92
+ if 'IngredientsInfo__c' in available_fields:
93
+ nutrition_fields.append('IngredientsInfo__c')
94
+ if 'Nutritional_Info__c' in available_fields:
95
+ nutrition_fields.append('Nutritional_Info__c')
96
+ if 'Allergens__c' in available_fields:
97
+ nutrition_fields.append('Allergens__c')
98
+
99
+ query_fields = base_fields + nutrition_fields
100
+ except Exception as e:
101
+ print(f"Error checking for nutrition fields: {str(e)}")
102
+ query_fields = base_fields
103
+
104
+ # Build and execute the query
105
+ menu_query = f"SELECT {', '.join(query_fields)} FROM Menu_Item__c"
106
+ result = sf.query(menu_query)
107
+ food_items = result['records'] if 'records' in result else []
108
+
109
+ # Process items with fallback values
110
+ for item in food_items:
111
+ # Ensure required fields have values
112
+ item['Total_Ordered__c'] = item.get('Total_Ordered__c', 0)
113
+ item['Video1__c'] = get_valid_video_path(item['Name'], item.get('Video1__c'))
114
+
115
+ # Add fallback values for nutrition fields
116
+ item['IngredientsInfo__c'] = item.get('IngredientsInfo__c', 'Ingredients information not available')
117
+ item['Nutritional_Info__c'] = item.get('Nutritional_Info__c', 'Nutritional information not available')
118
+ item['Allergens__c'] = item.get('Allergens__c', 'Allergen information not available')
119
+
120
+ # Process best sellers
121
+ best_sellers = sorted(food_items, key=lambda x: x.get("Total_Ordered__c", 0), reverse=True)
122
+
123
+ # Apply category filter
124
+ if selected_category == "Veg":
125
+ best_sellers = [item for item in best_sellers if item.get("Veg_NonVeg__c") in ["Veg", "both"]]
126
+ elif selected_category == "Non veg":
127
+ best_sellers = [item for item in best_sellers if item.get("Veg_NonVeg__c") in ["Non veg", "both"]]
128
+
129
+ best_sellers = best_sellers[:4]
130
+ ordered_menu = {section: [] for section in SECTION_ORDER}
131
+
132
+ if best_sellers:
133
+ ordered_menu["Best Sellers"] = best_sellers
134
+
135
+ # Organize items by section
136
+ added_item_names = set()
137
+ for item in food_items:
138
+ section = item.get("Section__c", "Others")
139
+ if section not in ordered_menu:
140
+ ordered_menu[section] = []
141
+
142
+ if item['Name'] in added_item_names:
143
+ continue
144
+
145
+ # Apply category filter to all items
146
+ if selected_category == "Veg" and item.get("Veg_NonVeg__c") not in ["Veg", "both"]:
147
+ continue
148
+ if selected_category == "Non veg" and item.get("Veg_NonVeg__c") not in ["Non veg", "both"]:
149
+ continue
150
+
151
+ ordered_menu[section].append(item)
152
+ added_item_names.add(item['Name'])
153
+
154
+ # Remove empty sections
155
+ ordered_menu = {section: items for section, items in ordered_menu.items() if items}
156
+ categories = ["All", "Veg", "Non veg"]
157
+
158
+ except Exception as e:
159
+ print(f"Error fetching menu data: {str(e)}")
160
+ # Fallback data
161
+ ordered_menu = {section: [] for section in SECTION_ORDER}
162
+ best_sellers = ["Chicken Biryani", "Paneer Butter Masala", "Veg Manchurian", "Prawn Fry"]
163
+ ordered_menu["Best Sellers"] = [{
164
+ "Name": name,
165
+ "Price__c": "12.99",
166
+ "Description__c": f"Popular {name}",
167
+ "Image1__c": "/static/placeholder.jpg",
168
+ "Video1__c": get_valid_video_path(name),
169
+ "Total_Ordered__c": 100,
170
+ "Veg_NonVeg__c": "Veg" if "Paneer" in name or "Veg" in name else "Non veg",
171
+ "IngredientsInfo__c": "Ingredients information not available",
172
+ "Nutritional_Info__c": "Nutritional information not available",
173
+ "Allergens__c": "Allergen information not available"
174
+ } for name in best_sellers]
175
+
176
+ categories = ["All", "Veg", "Non veg"]
177
+ referral_code = 'N/A'
178
+ reward_points = 0
179
+ cart_item_count = 0
180
 
181
  return render_template(
182
  "menu.html",
 
192
 
193
  @menu_blueprint.route('/api/addons', methods=['GET'])
194
  def get_addons():
195
+ item_name = request.args.get('item_name')
196
+ item_section = request.args.get('item_section')
197
 
198
  if not item_name or not item_section:
199
  return jsonify({"success": False, "error": "Item name and section are required."}), 400
 
204
  FROM Customization_Options__c
205
  WHERE Section__c = '{item_section}'
206
  """
207
+ result = sf.query(query)
208
  addons = result.get('records', [])
209
 
210
  if not addons:
 
213
  formatted_addons = []
214
  for addon in addons:
215
  options = addon.get("Options__c", "")
216
+ if options:
217
+ options = options.split(", ")
218
+ else:
219
+ options = []
220
+
221
  formatted_addons.append({
222
+ "name": addon["Name"],
223
+ "type": addon["Customization_Type__c"],
224
  "options": options,
225
  "max_selections": addon.get("Max_Selections__c", 1),
226
  "extra_charge": addon.get("Extra_Charge__c", False),
 
238
  try:
239
  data = request.json
240
  item_name = data.get('itemName', '').strip()
241
+ item_price = data.get('itemPrice')
242
+ item_image = data.get('itemImage')
243
  addons = data.get('addons', [])
244
  instructions = data.get('instructions', '')
245
+ category = data.get('category')
246
+ section = data.get('section')
247
+ quantity = data.get('quantity', 1)
248
  customer_email = session.get('user_email')
249
 
250
+ if not item_name or not item_price:
251
+ return jsonify({"success": False, "error": "Item name and price are required."}), 400
252
+
253
+ if not customer_email:
254
+ return jsonify({"success": False, "error": "User email is required."}), 400
255
 
256
  query = f"""
257
+ SELECT Id, Quantity__c, Add_Ons__c, Add_Ons_Price__c, Instructions__c
258
  FROM Cart_Item__c
259
  WHERE Customer_Email__c = '{customer_email}' AND Name = '{item_name}'
260
  """
261
  result = sf.query(query)
262
  cart_items = result.get("records", [])
263
 
264
+ addons_price = sum(addon['price'] for addon in addons)
265
+ new_addons = "; ".join([f"{addon['name']} (${addon['price']})" for addon in addons])
266
 
267
  if cart_items:
268
+ cart_item_id = cart_items[0]['Id']
269
+ existing_quantity = cart_items[0]['Quantity__c']
270
+ existing_addons = cart_items[0].get('Add_Ons__c', "None")
271
+ existing_addons_price = cart_items[0].get('Add_Ons_Price__c', 0)
272
+ existing_instructions = cart_items[0].get('Instructions__c', "")
 
273
 
274
  combined_addons = existing_addons if existing_addons != "None" else ""
275
+ if new_addons:
276
  combined_addons = f"{combined_addons}; {new_addons}".strip("; ")
277
 
278
  combined_instructions = existing_instructions
 
284
  float(addon.split("($")[1][:-1]) for addon in combined_addons_list if "($" in addon
285
  )
286
 
 
 
287
  sf.Cart_Item__c.update(cart_item_id, {
288
  "Quantity__c": existing_quantity + quantity,
289
  "Add_Ons__c": combined_addons,
290
  "Add_Ons_Price__c": combined_addons_price,
291
  "Instructions__c": combined_instructions,
292
+ "Price__c": (existing_quantity + quantity) * item_price + combined_addons_price,
293
  "Category__c": category,
294
  "Section__c": section
295
  })
296
  else:
297
+ addons_string = "None"
298
+ if addons:
299
+ addons_string = new_addons
300
+
301
  total_price = item_price * quantity + addons_price
302
+
303
  sf.Cart_Item__c.create({
304
  "Name": item_name,
305
  "Price__c": total_price,
306
  "Base_Price__c": item_price,
307
  "Quantity__c": quantity,
308
  "Add_Ons_Price__c": addons_price,
309
+ "Add_Ons__c": addons_string,
310
  "Image1__c": item_image,
311
  "Customer_Email__c": customer_email,
312
  "Instructions__c": instructions,
 
314
  "Section__c": section
315
  })
316
 
317
+ return jsonify({"success": True, "message": "Item added to cart successfully."})
318
+
319
+ except KeyError as e:
320
+ return jsonify({"success": False, "error": f"Missing required field: {str(e)}"}), 400
 
 
321
 
 
 
322
  except Exception as e:
323
  print(f"Error adding item to cart: {str(e)}")
324
  return jsonify({"success": False, "error": "An error occurred while adding the item to the cart."}), 500