# models/address_verification.py import requests import time from geopy.geocoders import Nominatim from .logging_config import logger geocoder = Nominatim(user_agent="indian_property_verifier", timeout=10) def verify_address(data): try: address_results = { 'address_exists': False, 'pincode_valid': False, 'city_state_match': False, 'coordinates_match': False, 'confidence': 0.0, 'issues': [], 'verification_score': 0.0 } if data['zip']: try: response = requests.get(f"https://api.postalpincode.in/pincode/{data['zip']}", timeout=5) if response.status_code == 200: pin_data = response.json() if pin_data[0]['Status'] == 'Success': address_results['pincode_valid'] = True post_offices = pin_data[0]['PostOffice'] cities = {po['Name'].lower() for po in post_offices} states = {po['State'].lower() for po in post_offices} if data['city'].lower() in cities or data['state'].lower() in states: address_results['city_state_match'] = True else: address_results['issues'].append("City/state may not match pincode") else: address_results['issues'].append(f"Invalid pincode: {data['zip']}") else: address_results['issues'].append("Pincode API error") except Exception as e: logger.error(f"Pincode API error: {str(e)}") address_results['issues'].append("Pincode validation failed") full_address = ', '.join(filter(None, [data['address'], data['city'], data['state'], data['country'], data['zip']])) for attempt in range(3): try: location = geocoder.geocode(full_address) if location: address_results['address_exists'] = True address_results['confidence'] = 0.9 if data['latitude'] and data['longitude']: try: provided_coords = (float(data['latitude']), float(data['longitude'])) geocoded_coords = (location.latitude, location.longitude) from geopy.distance import distance dist = distance(provided_coords, geocoded_coords).km address_results['coordinates_match'] = dist < 1.0 if not address_results['coordinates_match']: address_results['issues'].append(f"Coordinates {dist:.2f}km off") except: address_results['issues'].append("Invalid coordinates") break time.sleep(1) except Exception as e: logger.error(f"Geocoding error on attempt {attempt + 1}: {str(e)}") time.sleep(1) else: address_results['issues'].append("Address geocoding failed") verification_points = ( address_results['address_exists'] * 0.4 + address_results['pincode_valid'] * 0.3 + address_results['city_state_match'] * 0.2 + address_results['coordinates_match'] * 0.1 ) address_results['verification_score'] = verification_points return address_results except Exception as e: logger.error(f"Error verifying address: {str(e)}") address_results['issues'].append(str(e)) return address_results