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)
|