Spaces:
Sleeping
Sleeping
File size: 7,808 Bytes
b64de39 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 | """
Seed Data Script
This script provides utilities for seeding additional test data
into the database. Useful for testing and development.
"""
import sys
import logging
from pathlib import Path
from datetime import datetime, timedelta
from random import uniform, choice
# Add parent directory to path
sys.path.insert(0, str(Path(__file__).parent))
from app.database import get_db_context
from app.models import DiseaseTreatment, MandiPrice
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def seed_additional_diseases():
"""Add additional test diseases"""
additional_diseases = [
{
"disease_name": "Test Disease 1",
"disease_name_hindi": "परीक्षण रोग 1",
"crop_type": "Paddy",
"symptoms": "Test symptoms for testing purposes. This is a sample disease entry for development and testing.",
"treatment_chemical": "Test chemical treatment",
"treatment_organic": "Test organic treatment",
"dosage": "Test dosage",
"cost_per_acre": 400.0,
"prevention_tips": "Test prevention tips",
"affected_stages": "Tillering, Flowering"
},
{
"disease_name": "Test Disease 2",
"disease_name_hindi": "परीक्षण रोग 2",
"crop_type": "Wheat",
"symptoms": "Test symptoms for testing purposes. This is a sample disease entry for development and testing.",
"treatment_chemical": "Test chemical treatment",
"treatment_organic": "Test organic treatment",
"dosage": "Test dosage",
"cost_per_acre": 450.0,
"prevention_tips": "Test prevention tips",
"affected_stages": "Booting, Heading"
}
]
try:
with get_db_context() as db:
inserted = 0
for disease in additional_diseases:
# Check if already exists
existing = db.query(DiseaseTreatment).filter(
DiseaseTreatment.disease_name == disease["disease_name"]
).first()
if existing:
logger.info(f"Disease '{disease['disease_name']}' already exists, skipping")
continue
disease_obj = DiseaseTreatment(**disease)
db.add(disease_obj)
inserted += 1
db.commit()
logger.info(f"Inserted {inserted} additional disease records")
return inserted
except Exception as e:
logger.error(f"Error seeding additional diseases: {str(e)}")
return 0
def seed_additional_mandi_prices():
"""Add additional test mandi prices with recent dates"""
commodities = ["Wheat", "Rice", "Cotton", "Sugarcane", "Onion", "Tomato", "Potato"]
states = ["Punjab", "Haryana", "Uttar Pradesh", "Maharashtra", "Gujarat"]
districts = {
"Punjab": ["Ludhiana", "Amritsar", "Jalandhar", "Bathinda"],
"Haryana": ["Karnal", "Sonipat", "Rohtak", "Hisar"],
"Uttar Pradesh": ["Meerut", "Aligarh", "Agra", "Kanpur"],
"Maharashtra": ["Pune", "Nashik", "Ahmednagar", "Kolhapur"],
"Gujarat": ["Ahmedabad", "Surat", "Rajkot", "Vadodara"]
}
try:
with get_db_context() as db:
inserted = 0
base_date = datetime.now()
for i in range(10): # Add 10 additional price records
commodity = choice(commodities)
state = choice(states)
district = choice(districts[state])
# Generate realistic prices based on commodity
base_prices = {
"Wheat": 2200,
"Rice": 1850,
"Cotton": 7200,
"Sugarcane": 315,
"Onion": 2800,
"Tomato": 1200,
"Potato": 800
}
base_price = base_prices[commodity]
price_per_quintal = round(uniform(base_price * 0.95, base_price * 1.05), 2)
min_price = round(price_per_quintal * 0.95, 2)
max_price = round(price_per_quintal * 1.05, 2)
modal_price = round(price_per_quintal, 2)
price_data = {
"commodity": commodity,
"mandi_name": f"{district} Test Mandi",
"state": state,
"district": district,
"price_per_quintal": price_per_quintal,
"arrival_date": base_date - timedelta(days=i),
"min_price": min_price,
"max_price": max_price,
"modal_price": modal_price
}
price_obj = MandiPrice(**price_data)
db.add(price_obj)
inserted += 1
db.commit()
logger.info(f"Inserted {inserted} additional mandi price records")
return inserted
except Exception as e:
logger.error(f"Error seeding additional mandi prices: {str(e)}")
return 0
def clear_test_data():
"""Remove test data (diseases and prices with 'Test' in name)"""
try:
with get_db_context() as db:
# Remove test diseases
test_diseases = db.query(DiseaseTreatment).filter(
DiseaseTreatment.disease_name.like("%Test%")
).all()
disease_count = len(test_diseases)
for disease in test_diseases:
db.delete(disease)
# Remove test mandi prices
test_prices = db.query(MandiPrice).filter(
MandiPrice.mandi_name.like("%Test%")
).all()
price_count = len(test_prices)
for price in test_prices:
db.delete(price)
db.commit()
logger.info(f"Removed {disease_count} test diseases and {price_count} test prices")
return disease_count, price_count
except Exception as e:
logger.error(f"Error clearing test data: {str(e)}")
return 0, 0
def main():
"""Main seeding function"""
import argparse
parser = argparse.ArgumentParser(description="Seed additional test data")
parser.add_argument(
"--diseases",
action="store_true",
help="Seed additional diseases"
)
parser.add_argument(
"--prices",
action="store_true",
help="Seed additional mandi prices"
)
parser.add_argument(
"--all",
action="store_true",
help="Seed all additional data"
)
parser.add_argument(
"--clear",
action="store_true",
help="Clear test data"
)
args = parser.parse_args()
if args.clear:
logger.info("Clearing test data...")
clear_test_data()
return
if args.all:
args.diseases = True
args.prices = True
if not args.diseases and not args.prices:
parser.print_help()
return
logger.info("=" * 60)
logger.info("Farm Help - Seed Additional Data")
logger.info("=" * 60)
if args.diseases:
logger.info("Seeding additional diseases...")
seed_additional_diseases()
if args.prices:
logger.info("Seeding additional mandi prices...")
seed_additional_mandi_prices()
logger.info("=" * 60)
logger.info("Seeding completed!")
if __name__ == "__main__":
main()
|