Update app.py
Browse files
app.py
CHANGED
|
@@ -303,6 +303,8 @@ async def update_user_profile(user_id: str, phone_number: str = None, address: s
|
|
| 303 |
await session.commit()
|
| 304 |
return profile
|
| 305 |
|
|
|
|
|
|
|
| 306 |
def process_order_flow(user_id: str, message: str) -> str:
|
| 307 |
"""
|
| 308 |
Implements an FSM-based order flow with shipping cost calculation.
|
|
@@ -335,7 +337,7 @@ def process_order_flow(user_id: str, message: str) -> str:
|
|
| 335 |
user_state[user_id] = state
|
| 336 |
return "Sure! What dish would you like to order?"
|
| 337 |
|
| 338 |
-
# --- New Logic: Parse Dish and
|
| 339 |
if not state or state.flow != "order":
|
| 340 |
# Check if the message contains a dish and quantity
|
| 341 |
dish_candidates = [item["name"] for item in menu_items]
|
|
@@ -357,7 +359,38 @@ def process_order_flow(user_id: str, message: str) -> str:
|
|
| 357 |
state.data["quantity"] = quantity
|
| 358 |
state.update_last_active()
|
| 359 |
user_state[user_id] = state
|
| 360 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 361 |
|
| 362 |
if state and state.flow == "order":
|
| 363 |
state.update_last_active()
|
|
@@ -563,6 +596,7 @@ def process_order_flow(user_id: str, message: str) -> str:
|
|
| 563 |
return "Order canceled. Let me know if you'd like to try again."
|
| 564 |
|
| 565 |
return ""
|
|
|
|
| 566 |
# --- User Profile Functions ---
|
| 567 |
async def get_or_create_user_profile(user_id: str, phone_number: str = None) -> UserProfile:
|
| 568 |
async with async_session() as session:
|
|
|
|
| 303 |
await session.commit()
|
| 304 |
return profile
|
| 305 |
|
| 306 |
+
# ... (rest of your imports and setup)
|
| 307 |
+
|
| 308 |
def process_order_flow(user_id: str, message: str) -> str:
|
| 309 |
"""
|
| 310 |
Implements an FSM-based order flow with shipping cost calculation.
|
|
|
|
| 337 |
user_state[user_id] = state
|
| 338 |
return "Sure! What dish would you like to order?"
|
| 339 |
|
| 340 |
+
# --- New Logic: Parse Dish, Quantity, Phone Number, and Address in a Single Message ---
|
| 341 |
if not state or state.flow != "order":
|
| 342 |
# Check if the message contains a dish and quantity
|
| 343 |
dish_candidates = [item["name"] for item in menu_items]
|
|
|
|
| 359 |
state.data["quantity"] = quantity
|
| 360 |
state.update_last_active()
|
| 361 |
user_state[user_id] = state
|
| 362 |
+
|
| 363 |
+
# Extract phone number and address from the message
|
| 364 |
+
phone_pattern = r'(\+?\d{10,15})'
|
| 365 |
+
phone_match = re.search(phone_pattern, message)
|
| 366 |
+
address = None
|
| 367 |
+
if phone_match:
|
| 368 |
+
phone_number = phone_match.group(1)
|
| 369 |
+
# Assume the address starts after the phone number
|
| 370 |
+
address_start = phone_match.end()
|
| 371 |
+
address = message[address_start:].strip()
|
| 372 |
+
# Remove any leading/trailing commas or spaces
|
| 373 |
+
address = re.sub(r'^[,\s]+|[,\s]+$', '', address)
|
| 374 |
+
|
| 375 |
+
if phone_match and address:
|
| 376 |
+
state.data["phone_number"] = phone_number
|
| 377 |
+
state.data["address"] = address
|
| 378 |
+
# Save phone number and address to the user's profile
|
| 379 |
+
asyncio.create_task(update_user_profile(user_id, phone_number, address))
|
| 380 |
+
# Calculate shipping cost based on the address
|
| 381 |
+
shipping_cost = calculate_shipping_cost(address)
|
| 382 |
+
state.data["shipping_cost"] = shipping_cost
|
| 383 |
+
state.step = 5
|
| 384 |
+
return (f"Thanks! Your phone number is recorded as: {phone_number}.\n"
|
| 385 |
+
f"Your delivery address is: {address}.\n"
|
| 386 |
+
f"Your delivery cost is N{shipping_cost}. Would you like to add any extras such as sides or drinks? (yes/no)")
|
| 387 |
+
elif phone_match:
|
| 388 |
+
state.data["phone_number"] = phone_match.group(1)
|
| 389 |
+
# Save phone number to the user's profile
|
| 390 |
+
asyncio.create_task(update_user_profile(user_id, phone_number))
|
| 391 |
+
return "Thank you. Please provide your delivery address."
|
| 392 |
+
else:
|
| 393 |
+
return "Please provide both your phone number and delivery address. For example: '09162409591, 1, Iyana Isashi, Isashi, Ojo, Lagos'."
|
| 394 |
|
| 395 |
if state and state.flow == "order":
|
| 396 |
state.update_last_active()
|
|
|
|
| 596 |
return "Order canceled. Let me know if you'd like to try again."
|
| 597 |
|
| 598 |
return ""
|
| 599 |
+
|
| 600 |
# --- User Profile Functions ---
|
| 601 |
async def get_or_create_user_profile(user_id: str, phone_number: str = None) -> UserProfile:
|
| 602 |
async with async_session() as session:
|