Fred808 commited on
Commit
c1f81a7
·
verified ·
1 Parent(s): 34b29bd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -1
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", "default_fallback_value")
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)