200 lines
7.6 KiB
Python
200 lines
7.6 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Script to clean up all test data from the Grocery Tracker application.
|
|
This will delete all shopping events, groceries, and shops.
|
|
"""
|
|
|
|
import requests
|
|
import json
|
|
from typing import List, Dict, Any
|
|
|
|
BASE_URL = "http://localhost:8000"
|
|
|
|
def delete_all_shopping_events() -> int:
|
|
"""Delete all shopping events and return the count of deleted events."""
|
|
print("🛒 Deleting all shopping events...")
|
|
|
|
try:
|
|
# Get all shopping events
|
|
response = requests.get(f"{BASE_URL}/shopping-events/")
|
|
if response.status_code != 200:
|
|
print(f" ❌ Failed to fetch shopping events: {response.status_code}")
|
|
return 0
|
|
|
|
events = response.json()
|
|
deleted_count = 0
|
|
|
|
for event in events:
|
|
try:
|
|
delete_response = requests.delete(f"{BASE_URL}/shopping-events/{event['id']}")
|
|
if delete_response.status_code == 200:
|
|
deleted_count += 1
|
|
print(f" ✅ Deleted event #{event['id']} from {event['shop']['name']}")
|
|
else:
|
|
print(f" ❌ Failed to delete event #{event['id']}: {delete_response.status_code}")
|
|
except Exception as e:
|
|
print(f" ❌ Error deleting event #{event['id']}: {e}")
|
|
|
|
print(f" 📊 Deleted {deleted_count} shopping events total\n")
|
|
return deleted_count
|
|
|
|
except Exception as e:
|
|
print(f" ❌ Error fetching shopping events: {e}")
|
|
return 0
|
|
|
|
def delete_all_groceries() -> int:
|
|
"""Delete all groceries and return the count of deleted groceries."""
|
|
print("🥬 Deleting all groceries...")
|
|
|
|
try:
|
|
# Get all groceries
|
|
response = requests.get(f"{BASE_URL}/groceries/")
|
|
if response.status_code != 200:
|
|
print(f" ❌ Failed to fetch groceries: {response.status_code}")
|
|
return 0
|
|
|
|
groceries = response.json()
|
|
deleted_count = 0
|
|
|
|
for grocery in groceries:
|
|
try:
|
|
delete_response = requests.delete(f"{BASE_URL}/groceries/{grocery['id']}")
|
|
if delete_response.status_code == 200:
|
|
deleted_count += 1
|
|
organic_label = "🌱" if grocery['organic'] else "🌾"
|
|
print(f" ✅ Deleted grocery: {organic_label} {grocery['name']}")
|
|
else:
|
|
print(f" ❌ Failed to delete grocery {grocery['name']}: {delete_response.status_code}")
|
|
except Exception as e:
|
|
print(f" ❌ Error deleting grocery {grocery['name']}: {e}")
|
|
|
|
print(f" 📊 Deleted {deleted_count} groceries total\n")
|
|
return deleted_count
|
|
|
|
except Exception as e:
|
|
print(f" ❌ Error fetching groceries: {e}")
|
|
return 0
|
|
|
|
def delete_all_shops() -> int:
|
|
"""Delete all shops and return the count of deleted shops."""
|
|
print("🏪 Deleting all shops...")
|
|
|
|
try:
|
|
# Get all shops
|
|
response = requests.get(f"{BASE_URL}/shops/")
|
|
if response.status_code != 200:
|
|
print(f" ❌ Failed to fetch shops: {response.status_code}")
|
|
return 0
|
|
|
|
shops = response.json()
|
|
deleted_count = 0
|
|
|
|
for shop in shops:
|
|
try:
|
|
delete_response = requests.delete(f"{BASE_URL}/shops/{shop['id']}")
|
|
if delete_response.status_code == 200:
|
|
deleted_count += 1
|
|
print(f" ✅ Deleted shop: {shop['name']} ({shop['city']})")
|
|
else:
|
|
print(f" ❌ Failed to delete shop {shop['name']}: {delete_response.status_code}")
|
|
except Exception as e:
|
|
print(f" ❌ Error deleting shop {shop['name']}: {e}")
|
|
|
|
print(f" 📊 Deleted {deleted_count} shops total\n")
|
|
return deleted_count
|
|
|
|
except Exception as e:
|
|
print(f" ❌ Error fetching shops: {e}")
|
|
return 0
|
|
|
|
def get_current_data_summary():
|
|
"""Get a summary of current data in the database."""
|
|
print("📊 CURRENT DATA SUMMARY")
|
|
print("=" * 30)
|
|
|
|
try:
|
|
# Get counts
|
|
shops_response = requests.get(f"{BASE_URL}/shops/")
|
|
groceries_response = requests.get(f"{BASE_URL}/groceries/")
|
|
events_response = requests.get(f"{BASE_URL}/shopping-events/")
|
|
|
|
shops_count = len(shops_response.json()) if shops_response.status_code == 200 else 0
|
|
groceries_count = len(groceries_response.json()) if groceries_response.status_code == 200 else 0
|
|
events_count = len(events_response.json()) if events_response.status_code == 200 else 0
|
|
|
|
print(f"🏪 Shops: {shops_count}")
|
|
print(f"🥬 Groceries: {groceries_count}")
|
|
print(f"🛒 Shopping Events: {events_count}")
|
|
|
|
if events_count > 0 and events_response.status_code == 200:
|
|
events = events_response.json()
|
|
total_spent = sum(event.get('total_amount', 0) for event in events)
|
|
print(f"💰 Total spent: ${total_spent:.2f}")
|
|
|
|
print()
|
|
return shops_count, groceries_count, events_count
|
|
|
|
except Exception as e:
|
|
print(f"❌ Error getting data summary: {e}")
|
|
return 0, 0, 0
|
|
|
|
def main():
|
|
"""Main function to clean up all test data."""
|
|
print("🧹 GROCERY TRACKER DATA CLEANUP")
|
|
print("=" * 40)
|
|
print("This script will delete ALL data from the Grocery Tracker app.")
|
|
print("Make sure the backend server is running on http://localhost:8000\n")
|
|
|
|
try:
|
|
# Test connection
|
|
response = requests.get(f"{BASE_URL}/")
|
|
if response.status_code != 200:
|
|
print("❌ Cannot connect to the API server. Make sure it's running!")
|
|
return
|
|
|
|
print("✅ Connected to API server\n")
|
|
|
|
# Show current data
|
|
shops_count, groceries_count, events_count = get_current_data_summary()
|
|
|
|
if shops_count == 0 and groceries_count == 0 and events_count == 0:
|
|
print("✅ Database is already empty. Nothing to clean up!")
|
|
return
|
|
|
|
# Confirm deletion
|
|
print("⚠️ WARNING: This will permanently delete all data!")
|
|
confirmation = input("Type 'DELETE' to confirm: ")
|
|
|
|
if confirmation != 'DELETE':
|
|
print("❌ Cleanup cancelled.")
|
|
return
|
|
|
|
print("\n🧹 Starting cleanup process...\n")
|
|
|
|
# Delete in order: events -> groceries -> shops
|
|
# (due to foreign key constraints)
|
|
deleted_events = delete_all_shopping_events()
|
|
deleted_groceries = delete_all_groceries()
|
|
deleted_shops = delete_all_shops()
|
|
|
|
# Final summary
|
|
print("📋 CLEANUP SUMMARY")
|
|
print("=" * 30)
|
|
print(f"🛒 Shopping Events deleted: {deleted_events}")
|
|
print(f"🥬 Groceries deleted: {deleted_groceries}")
|
|
print(f"🏪 Shops deleted: {deleted_shops}")
|
|
print(f"📊 Total items deleted: {deleted_events + deleted_groceries + deleted_shops}")
|
|
|
|
print("\n🎉 Cleanup completed successfully!")
|
|
print("The database is now empty and ready for fresh data.")
|
|
|
|
except requests.exceptions.ConnectionError:
|
|
print("❌ Could not connect to the API server.")
|
|
print(" Make sure the backend server is running on http://localhost:8000")
|
|
except KeyboardInterrupt:
|
|
print("\n❌ Cleanup cancelled by user.")
|
|
except Exception as e:
|
|
print(f"❌ Unexpected error: {e}")
|
|
|
|
if __name__ == "__main__":
|
|
main() |