Spaces:
Sleeping
Sleeping
File size: 3,984 Bytes
a2f1a4d 71978cc d8893de 71978cc 4be2e38 c32c1af 4be2e38 71978cc d8893de 71978cc d8893de 71978cc d8893de 71978cc d8893de 71978cc d8893de 71978cc d8893de 71978cc d8893de 71978cc a2f1a4d 4be2e38 c32c1af 4be2e38 a2f1a4d d8893de 71978cc d8893de 71978cc a2f1a4d d8893de a2f1a4d d8893de a2f1a4d d8893de a2f1a4d 71978cc a2f1a4d d8893de a2f1a4d d8893de a2f1a4d 4be2e38 |
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 |
from flask import Flask, render_template, send_from_directory, request, jsonify
import requests
from dotenv import load_dotenv
import os
import time
# Load environment variables from .env file
load_dotenv()
app = Flask(__name__, template_folder='templates', static_folder='static')
# Salesforce credentials from environment variables
SFDC_USERNAME = os.getenv('SFDC_USERNAME')
SFDC_PASSWORD = os.getenv('SFDC_PASSWORD')
SFDC_SECURITY_TOKEN = os.getenv('SFDC_SECURITY_TOKEN')
SFDC_INSTANCE_URL = os.getenv('SFDC_INSTANCE_URL', 'https://login.salesforce.com')
CLIENT_ID = os.getenv('SFDC_CLIENT_ID') # Add to .env
CLIENT_SECRET = os.getenv('SFDC_CLIENT_SECRET') # Add to .env
# Cache the access token and its expiration
access_token = None
token_expiry = 0
# Function to get Salesforce access token
def get_salesforce_access_token():
global access_token, token_expiry
if time.time() < token_expiry - 300: # Use cached token if valid (with 5-minute buffer)
return access_token
auth_url = f"{SFDC_INSTANCE_URL}/services/oauth2/token"
data = {
'grant_type': 'password',
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET,
'username': SFDC_USERNAME,
'password': f"{SFDC_PASSWORD}{SFDC_SECURITY_TOKEN}"
}
try:
response = requests.post(auth_url, data=data, timeout=10)
response.raise_for_status()
token_data = response.json()
access_token = token_data['access_token']
token_expiry = time.time() + int(token_data.get('expires_in', 3600)) # Default 1 hour
print(f"New access token retrieved, expires at {time.ctime(token_expiry)}")
return access_token
except requests.exceptions.RequestException as e:
print(f"Authentication error: {e.response.text if 'response' in e.__dict__ else str(e)}")
return None
# Get initial token
access_token = get_salesforce_access_token()
@app.route('/')
def index():
return render_template('index.html')
@app.route('/static/<path:filename>')
def serve_static(filename):
return send_from_directory('static', filename)
@app.route('/get_ingredients', methods=['POST'])
def get_ingredients():
global access_token
if not access_token:
access_token = get_salesforce_access_token()
if not access_token:
return jsonify({"error": "Failed to authenticate with Salesforce"}), 500
dietary_preference = request.json.get('dietary_preference', '').lower()
# Salesforce SOQL query based on dietary preference
if dietary_preference == 'veg':
soql = "SELECT Sector_Detail_Name__c FROM Sector_Detail__c WHERE Category__c IN ('Veg', 'Both') LIMIT 200"
elif dietary_preference == 'non-vegetarian':
soql = "SELECT Sector_Detail_Name__c FROM Sector_Detail__c WHERE Category__c IN ('Non-Veg', 'Both') LIMIT 200"
else:
soql = "SELECT Sector_Detail_Name__c FROM Sector_Detail__c LIMIT 200" # Increased limit for 50+ ingredients
headers = {
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json"
}
url = f"{SFDC_INSTANCE_URL}/services/data/v57.0/query/?q={soql}"
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
data = response.json()
ingredients = [record['Sector_Detail_Name__c'] for record in data['records'] if 'Sector_Detail_Name__c' in record]
return jsonify({"ingredients": ingredients})
except requests.exceptions.RequestException as e:
error_msg = str(e)
if e.response and e.response.status_code == 401: # Unauthorized, try refreshing token
access_token = get_salesforce_access_token()
if access_token:
return get_ingredients() # Retry the request
return jsonify({"error": f"Failed to fetch ingredients: {error_msg}"}), 500
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=7860) |