Spaces:
Sleeping
Sleeping
| import sqlite3 | |
| import pandas as pd | |
| from datetime import datetime | |
| from database import query_db, DB_NAME | |
| # UPDATED: Changed from sentiment2 to sentiment | |
| from sentiment import analyze_sentiment, client | |
| def get_products_by_category(category): | |
| results = query_db("SELECT name FROM products WHERE category = ?", (category,), fetch=True) | |
| return [row[0] for row in results] | |
| def save_review(product_name, rating, review_text): | |
| """ | |
| Validates the input, runs sentiment analysis, and saves to SQLite. | |
| """ | |
| # 1. Validation: No empty strings | |
| if not review_text or not review_text.strip(): | |
| return "⚠️ Error: Review text cannot be empty!" | |
| # 2. Validation: Minimum 3 words (Matches UI logic) | |
| word_count = len(review_text.strip().split()) | |
| if word_count < 3: | |
| return "⚠️ Error: Please write at least 3 words." | |
| # 3. Database lookup for product ID | |
| result = query_db("SELECT id FROM products WHERE name = ?", (product_name,), fetch=True) | |
| if result: | |
| product_id = result[0][0] | |
| # 4. Sentiment Analysis (using logic from sentiment.py) | |
| sentiment = analyze_sentiment(review_text, rating=int(rating)) | |
| # 5. Save to Database | |
| date_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S") | |
| query_db("""INSERT INTO reviews (product_id, rating, review_text, sentiment, date) | |
| VALUES (?, ?, ?, ?, ?)""", | |
| (product_id, int(rating), review_text, sentiment, date_str)) | |
| return f"✅ Saved! Sentiment detected: {sentiment}" | |
| return "❌ Error: Product not found." | |
| def generate_business_report(): | |
| """Fetches all reviews and sends them to Groq for a summary report.""" | |
| conn = sqlite3.connect(DB_NAME) | |
| query = """ | |
| SELECT p.name, r.rating, r.sentiment, r.review_text | |
| FROM products p JOIN reviews r ON p.id = r.product_id | |
| """ | |
| df = pd.read_sql_query(query, conn) | |
| conn.close() | |
| if df.empty: | |
| return "No data found. Collect some reviews first!" | |
| # Create a string of all reviews for the AI to read | |
| review_summary = "" | |
| for _, row in df.iterrows(): | |
| review_summary += f"- {row['name']} ({row['rating']} stars, {row['sentiment']}): {row['review_text']}\n" | |
| prompt = f"Analyze these clothing reviews and provide a summary of satisfaction, top issues, and an action plan:\n\n{review_summary}" | |
| try: | |
| # Uses the client imported from sentiment.py | |
| completion = client.chat.completions.create( | |
| messages=[ | |
| {"role": "system", "content": "You are a concise business consultant."}, | |
| {"role": "user", "content": prompt} | |
| ], | |
| model="llama-3.1-8b-instant", | |
| temperature=0.5, | |
| max_tokens=500 | |
| ) | |
| return completion.choices[0].message.content | |
| except Exception as e: | |
| return f"Error: {str(e)}" | |
| def get_all_reviews(): | |
| """Returns a DataFrame for the Owner's table.""" | |
| conn = sqlite3.connect(DB_NAME) | |
| try: | |
| query = """ | |
| SELECT p.category, p.name as product_name, r.rating, r.sentiment, r.review_text, r.date | |
| FROM products p | |
| JOIN reviews r ON p.id = r.product_id | |
| ORDER BY r.date DESC | |
| """ | |
| return pd.read_sql_query(query, conn) | |
| finally: | |
| conn.close() |