property_verification_bot / models /address_verification.py
sksameermujahid's picture
Upload 45 files
14cb7ae verified
# 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