Update app.py
Browse files
app.py
CHANGED
|
@@ -21,9 +21,10 @@ from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
|
| 21 |
from sqlalchemy.orm import sessionmaker, declarative_base
|
| 22 |
from sqlalchemy import Column, Integer, String, DateTime, Text, Float
|
| 23 |
|
|
|
|
| 24 |
SPOONACULAR_API_KEY = os.getenv("SPOONACULAR_API_KEY", "default_fallback_value")
|
| 25 |
PAYSTACK_SECRET_KEY = os.getenv("PAYSTACK_SECRET_KEY", "default_fallback_value")
|
| 26 |
-
DATABASE_URL = os.getenv("DATABASE_URL", "
|
| 27 |
NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY", "default_fallback_value")
|
| 28 |
openai.api_key = os.getenv("OPENAI_API_KEY", "default_fallback_value")
|
| 29 |
|
|
@@ -74,6 +75,16 @@ class SentimentLog(Base):
|
|
| 74 |
sentiment_score = Column(Float)
|
| 75 |
message = Column(Text)
|
| 76 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
engine = create_async_engine(DATABASE_URL, echo=True)
|
| 78 |
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
|
| 79 |
|
|
@@ -232,6 +243,17 @@ def stream_image_completion(image_b64: str):
|
|
| 232 |
if line:
|
| 233 |
yield line.decode("utf-8") + "\n"
|
| 234 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 235 |
# --- Advanced Internal Flow: Order Processing & Payment Integration ---
|
| 236 |
def process_order_flow(user_id: str, message: str) -> str:
|
| 237 |
"""
|
|
@@ -384,6 +406,9 @@ def process_order_flow(user_id: str, message: str) -> str:
|
|
| 384 |
await session.commit()
|
| 385 |
asyncio.create_task(save_order())
|
| 386 |
|
|
|
|
|
|
|
|
|
|
| 387 |
# Notify management of the new order via WhatsApp
|
| 388 |
async def notify_management_order(order_details: dict):
|
| 389 |
message_body = (
|
|
@@ -692,6 +717,8 @@ async def payment_callback(request: Request):
|
|
| 692 |
await session.commit()
|
| 693 |
else:
|
| 694 |
raise HTTPException(status_code=404, detail="Order not found.")
|
|
|
|
|
|
|
| 695 |
# Notify management via WhatsApp about the payment update
|
| 696 |
await asyncio.to_thread(send_whatsapp_message, MANAGEMENT_WHATSAPP_NUMBER,
|
| 697 |
f"Payment Update:\nOrder ID: {order_id} is now {status}."
|
|
@@ -714,6 +741,7 @@ async def payment_callback(request: Request):
|
|
| 714 |
if order:
|
| 715 |
order.status = new_status
|
| 716 |
await session.commit()
|
|
|
|
| 717 |
await asyncio.to_thread(send_whatsapp_message, MANAGEMENT_WHATSAPP_NUMBER,
|
| 718 |
f"Payment Update:\nOrder ID: {order_id} is now {new_status}."
|
| 719 |
)
|
|
@@ -721,6 +749,21 @@ async def payment_callback(request: Request):
|
|
| 721 |
else:
|
| 722 |
raise HTTPException(status_code=404, detail="Order not found.")
|
| 723 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 724 |
if __name__ == "__main__":
|
| 725 |
import uvicorn
|
| 726 |
uvicorn.run(app, host="0.0.0.0", port=8000)
|
|
|
|
| 21 |
from sqlalchemy.orm import sessionmaker, declarative_base
|
| 22 |
from sqlalchemy import Column, Integer, String, DateTime, Text, Float
|
| 23 |
|
| 24 |
+
# --- Environment Variables and API Keys ---
|
| 25 |
SPOONACULAR_API_KEY = os.getenv("SPOONACULAR_API_KEY", "default_fallback_value")
|
| 26 |
PAYSTACK_SECRET_KEY = os.getenv("PAYSTACK_SECRET_KEY", "default_fallback_value")
|
| 27 |
+
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite+aiosqlite:///./test.db") # Example using SQLite
|
| 28 |
NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY", "default_fallback_value")
|
| 29 |
openai.api_key = os.getenv("OPENAI_API_KEY", "default_fallback_value")
|
| 30 |
|
|
|
|
| 75 |
sentiment_score = Column(Float)
|
| 76 |
message = Column(Text)
|
| 77 |
|
| 78 |
+
# --- New Model: Order Tracking ---
|
| 79 |
+
class OrderTracking(Base):
|
| 80 |
+
__tablename__ = "order_tracking"
|
| 81 |
+
id = Column(Integer, primary_key=True, index=True)
|
| 82 |
+
order_id = Column(String, index=True)
|
| 83 |
+
status = Column(String) # e.g., "Order Placed", "Payment Confirmed", etc.
|
| 84 |
+
message = Column(Text, nullable=True) # Optional additional details
|
| 85 |
+
timestamp = Column(DateTime, default=datetime.utcnow)
|
| 86 |
+
|
| 87 |
+
# --- Create Engine and Session ---
|
| 88 |
engine = create_async_engine(DATABASE_URL, echo=True)
|
| 89 |
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
|
| 90 |
|
|
|
|
| 243 |
if line:
|
| 244 |
yield line.decode("utf-8") + "\n"
|
| 245 |
|
| 246 |
+
# --- Helper Function for Order Tracking ---
|
| 247 |
+
async def log_order_tracking(order_id: str, status: str, message: str = None):
|
| 248 |
+
async with async_session() as session:
|
| 249 |
+
tracking_entry = OrderTracking(
|
| 250 |
+
order_id=order_id,
|
| 251 |
+
status=status,
|
| 252 |
+
message=message
|
| 253 |
+
)
|
| 254 |
+
session.add(tracking_entry)
|
| 255 |
+
await session.commit()
|
| 256 |
+
|
| 257 |
# --- Advanced Internal Flow: Order Processing & Payment Integration ---
|
| 258 |
def process_order_flow(user_id: str, message: str) -> str:
|
| 259 |
"""
|
|
|
|
| 406 |
await session.commit()
|
| 407 |
asyncio.create_task(save_order())
|
| 408 |
|
| 409 |
+
# Record the initial tracking update: Order Placed
|
| 410 |
+
asyncio.create_task(log_order_tracking(order_id, "Order Placed", "Order placed and awaiting payment."))
|
| 411 |
+
|
| 412 |
# Notify management of the new order via WhatsApp
|
| 413 |
async def notify_management_order(order_details: dict):
|
| 414 |
message_body = (
|
|
|
|
| 717 |
await session.commit()
|
| 718 |
else:
|
| 719 |
raise HTTPException(status_code=404, detail="Order not found.")
|
| 720 |
+
# Record payment confirmation tracking update
|
| 721 |
+
await log_order_tracking(order_id, "Payment Confirmed", f"Payment status updated to {status}.")
|
| 722 |
# Notify management via WhatsApp about the payment update
|
| 723 |
await asyncio.to_thread(send_whatsapp_message, MANAGEMENT_WHATSAPP_NUMBER,
|
| 724 |
f"Payment Update:\nOrder ID: {order_id} is now {status}."
|
|
|
|
| 741 |
if order:
|
| 742 |
order.status = new_status
|
| 743 |
await session.commit()
|
| 744 |
+
await log_order_tracking(order_id, "Payment Confirmed", f"Payment status updated to {new_status}.")
|
| 745 |
await asyncio.to_thread(send_whatsapp_message, MANAGEMENT_WHATSAPP_NUMBER,
|
| 746 |
f"Payment Update:\nOrder ID: {order_id} is now {new_status}."
|
| 747 |
)
|
|
|
|
| 749 |
else:
|
| 750 |
raise HTTPException(status_code=404, detail="Order not found.")
|
| 751 |
|
| 752 |
+
# --- New Endpoint: Order Tracking ---
|
| 753 |
+
@app.get("/track_order/{order_id}")
|
| 754 |
+
async def track_order(order_id: str):
|
| 755 |
+
async with async_session() as session:
|
| 756 |
+
result = await session.execute(
|
| 757 |
+
OrderTracking.__table__.select()
|
| 758 |
+
.where(OrderTracking.order_id == order_id)
|
| 759 |
+
.order_by(OrderTracking.timestamp)
|
| 760 |
+
)
|
| 761 |
+
tracking_updates = result.fetchall()
|
| 762 |
+
if tracking_updates:
|
| 763 |
+
return [dict(row) for row in tracking_updates]
|
| 764 |
+
else:
|
| 765 |
+
raise HTTPException(status_code=404, detail="No tracking information found for this order.")
|
| 766 |
+
|
| 767 |
if __name__ == "__main__":
|
| 768 |
import uvicorn
|
| 769 |
uvicorn.run(app, host="0.0.0.0", port=8000)
|