Download ops/logistic_flutter/streamlit/utils/helpers.py from MouleeswaranM/FairRelay: direct link, hf CLI and curl.
- Browser
- Download file 6.84 kB
-
https://huggingface.co/MouleeswaranM/FairRelay/resolve/refs%2Fpr%2F21/ops/logistic_flutter/streamlit/utils/helpers.py
- Command line
-
hf download hf://MouleeswaranM/FairRelay@refs/pr/21/ops/logistic_flutter/streamlit/utils/helpers.py
-
curl -L -o helpers.py https://huggingface.co/MouleeswaranM/FairRelay/resolve/refs%2Fpr%2F21/ops/logistic_flutter/streamlit/utils/helpers.py
6.84 kB
| import streamlit as st | |
| from datetime import datetime, timedelta | |
| import os | |
| import time | |
| from openai import OpenAI | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| # Initialize OpenAI client | |
| client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) | |
| def format_date(date_obj): | |
| """Format datetime object to readable string""" | |
| if isinstance(date_obj, str): | |
| return date_obj | |
| return date_obj.strftime("%B %d, %Y") | |
| def time_ago(date_obj): | |
| """Convert datetime to 'time ago' format""" | |
| if not date_obj: | |
| return "" | |
| now = datetime.now() | |
| # Ensure dt is offset-naive if now is offset-naive | |
| if date_obj.tzinfo is None and now.tzinfo is None: | |
| pass # Both naive, do nothing | |
| elif date_obj.tzinfo and now.tzinfo: | |
| pass # Both aware, do nothing | |
| else: | |
| # Mix of naive and aware - remove tz info for simplicity | |
| date_obj = date_obj.replace(tzinfo=None) | |
| now = now.replace(tzinfo=None) | |
| diff = now - date_obj | |
| if diff.days > 365: | |
| return f"{diff.days // 365} year{'s' if diff.days // 365 > 1 else ''} ago" | |
| elif diff.days > 30: | |
| return f"{diff.days // 30} month{'s' if diff.days // 30 > 1 else ''} ago" | |
| elif diff.days > 0: | |
| return f"{diff.days} day{'s' if diff.days > 1 else ''} ago" | |
| elif diff.seconds > 3600: | |
| return f"{diff.seconds // 3600} hour{'s' if diff.seconds // 3600 > 1 else ''} ago" | |
| elif diff.seconds > 60: | |
| return f"{diff.seconds // 60} minute{'s' if diff.seconds // 60 > 1 else ''} ago" | |
| else: | |
| return "Just now" | |
| def validate_email(email): | |
| """Validate email format""" | |
| import re | |
| pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' | |
| return re.match(pattern, email) is not None | |
| def validate_phone(phone): | |
| """Validate phone number format""" | |
| import re | |
| pattern = r'^[\d\s\+\-\(\)]{10,}$' | |
| return re.match(pattern, phone) is not None | |
| def show_success_message(message, duration=3): | |
| """Display success message with animation""" | |
| placeholder = st.empty() | |
| placeholder.markdown(f""" | |
| <div class="success-box"> | |
| <h3>✅ Success!</h3> | |
| <p>{message}</p> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| time.sleep(duration) | |
| placeholder.empty() | |
| def show_error_message(message): | |
| """Display error message with animation""" | |
| st.markdown(f""" | |
| <div class="warning-box"> | |
| <h3>⚠️ Error</h3> | |
| <p>{message}</p> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| def show_info_message(message): | |
| """Display info message with animation""" | |
| st.markdown(f""" | |
| <div class="info-box"> | |
| <h3>ℹ️ Info</h3> | |
| <p>{message}</p> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| def chatbot_response(user_message, context="women empowerment"): | |
| """Get AI-powered chatbot response with Fallback for Demo Mode""" | |
| try: | |
| response = client.chat.completions.create( | |
| model="gpt-3.5-turbo", | |
| messages=[ | |
| { | |
| "role": "system", | |
| "content": f"You are a helpful assistant for a women empowerment platform. Context: {context}" | |
| }, | |
| { | |
| "role": "user", | |
| "content": user_message | |
| } | |
| ], | |
| max_tokens=300, | |
| temperature=0.7 | |
| ) | |
| return response.choices[0].message.content | |
| except Exception as e: | |
| # FALLBACK RESPONSE FOR DEMO (Handles Quota Exceeded / Network Issues) | |
| error_str = str(e).lower() | |
| if 'insufficient_quota' in error_str or '429' in error_str: | |
| return ( | |
| "💡 **Demo Mode Response:** \n\n" | |
| "It seems the AI service is currently busy (Quota Exceeded). Here is some general advice:\n\n" | |
| "**Health:** Focus on a balanced diet rich in iron (spinach, lentils) and calcium. Stay hydrated and aim for 30 mins of exercise daily.\n" | |
| "**Career:** Upskill regularly, network with peers, and don't hesitate to negotiate for your worth.\n\n" | |
| "*(Please check your OpenAI billing to enable real-time AI responses)*" | |
| ) | |
| return f"I'm having trouble connecting right now. Please try again later. Error: {str(e)}" | |
| def generate_job_recommendation(user_skills, user_experience): | |
| """Generate personalized job recommendations with Fallback""" | |
| try: | |
| prompt = f"Suggest 3 jobs for Skills: {user_skills}, Exp: {user_experience}" | |
| response = client.chat.completions.create( | |
| model="gpt-3.5-turbo", | |
| messages=[{"role": "user", "content": prompt}], | |
| max_tokens=200 | |
| ) | |
| return response.choices[0].message.content | |
| except Exception: | |
| return ( | |
| "✨ **Recommended Roles (Demo):**\n" | |
| "1. **Frontend Developer** - Matches your technical skills.\n" | |
| "2. **Data Analyst** - Great for your analytical background.\n" | |
| "3. **Product Manager** - Leverages your experience." | |
| ) | |
| def generate_course_recommendation(interests, current_level): | |
| """Generate personalized course recommendations with Fallback""" | |
| try: | |
| prompt = f"Suggest 3 courses for Interests: {interests}, Level: {current_level}" | |
| response = client.chat.completions.create( | |
| model="gpt-3.5-turbo", | |
| messages=[{"role": "user", "content": prompt}], | |
| max_tokens=200 | |
| ) | |
| return response.choices[0].message.content | |
| except Exception: | |
| return ( | |
| "📚 **Recommended Path (Demo):**\n" | |
| "1. **Python for Beginners** (Udemy) - Great starting point.\n" | |
| "2. **Google Data Analytics Cert** (Coursera) - Align with your interests.\n" | |
| "3. **Intro to Web Dev** (freeCodeCamp)." | |
| ) | |
| def search_filter(items, query, search_fields): | |
| """Filter items based on search query""" | |
| if not query: | |
| return items | |
| query = query.lower() | |
| filtered = [] | |
| for item in items: | |
| for field in search_fields: | |
| if field in item and query in str(item[field]).lower(): | |
| filtered.append(item) | |
| break | |
| return filtered | |
| def paginate(items, page=1, items_per_page=10): | |
| """Paginate a list of items""" | |
| start = (page - 1) * items_per_page | |
| end = start + items_per_page | |
| return items[start:end], len(items) | |
| def get_sample_data_if_none(data, sample_data): | |
| """Return sample data if database data is empty or None""" | |
| if data and len(data) > 0: | |
| return data | |
| return sample_data | |
| def format_currency(amount, currency="₹"): | |
| """Format currency value""" | |
| if amount is None: | |
| return f"{currency}0" | |
| return f"{currency}{amount:,.2f}" | |