| import psycopg2
|
| import json
|
| from datetime import datetime, timedelta
|
|
|
|
|
|
|
| hostname = "13.201.135.196"
|
| database = "saral_ai"
|
| username = "saral_user"
|
| pwd = "8k$ScgT97y9£>D"
|
| port_id = 5432
|
|
|
|
|
|
|
| conn = None
|
| cur = None
|
|
|
|
|
| def get_connection():
|
| return psycopg2.connect(
|
| host=hostname,
|
| dbname=database,
|
| user=username,
|
| password=pwd,
|
| port=port_id
|
| )
|
|
|
| def check_completeness(cur, name, location, linkedin_url, headline, skills, experience):
|
| is_complete = True
|
| message = "this data is complete"
|
|
|
| required_fields = [name, location, linkedin_url]
|
| for field in required_fields:
|
| if field in [None, "", []]:
|
| is_complete = False
|
| message = "missing required fields"
|
| break
|
|
|
| cur.execute("SELECT id FROM saral_data WHERE linkedin_url = %s", (linkedin_url,))
|
| existing = cur.fetchone()
|
| if existing:
|
| return False, "this data is duplicate", False
|
|
|
| optional_fields = [headline, skills, experience]
|
| for field in optional_fields:
|
| if field in [None, "", []]:
|
| is_complete = False
|
| message = "some optional fields missing"
|
| break
|
|
|
| return True, message, is_complete
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| def data_input(json_data):
|
| insert_script = '''
|
| INSERT INTO saral_data
|
| (name, location, email, linkedin_url, headline, skills, about, experience, profile_pic, is_complete, created_at)
|
| VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
|
| '''
|
| with conn.cursor() as cur:
|
| for d in json_data:
|
| name = d.get("fullName")
|
| location = d.get("addressWithCountry")
|
| email = d.get("email")
|
| linkedin_url = d.get("linkedinUrl")
|
| headline = d.get("headline")
|
| profile_pic = d.get("profilePic")
|
|
|
|
|
| skills_raw = d.get("skills", [])
|
| if isinstance(skills_raw, str):
|
| try:
|
| skills_raw = json.loads(skills_raw)
|
| except:
|
| skills_raw = []
|
| skills_list = [s.get("title") for s in skills_raw if isinstance(s, dict)]
|
| skills = json.dumps(skills_list)
|
|
|
|
|
| experience_raw = d.get("experiences", [])
|
| if isinstance(experience_raw, str):
|
| try:
|
| experience_raw = json.loads(experience_raw)
|
| except:
|
| experience_raw = []
|
| experience = json.dumps(experience_raw)
|
|
|
| about = d.get("about")
|
|
|
| success, message, is_complete = check_completeness(
|
| cur, name, location, linkedin_url, headline, skills_list, experience_raw
|
| )
|
| print(message)
|
|
|
| if not is_complete:
|
| continue
|
|
|
| created_at = datetime.now()
|
| cur.execute(
|
| insert_script,
|
| (
|
| name, location, email, linkedin_url, headline,
|
| skills, about, experience, profile_pic, is_complete, created_at
|
| )
|
| )
|
|
|
| conn.commit()
|
|
|
|
|
|
|
| def fetch_from_saral_data(serp_data, conn):
|
| if not serp_data or not isinstance(serp_data, dict):
|
| print("⚠️ fetch_from_saral_data: serp_data is None or not a dict")
|
| return [], []
|
|
|
| results = []
|
| remaining = []
|
| one_month_ago = datetime.now() - timedelta(days=30)
|
|
|
| serp_json = {}
|
| for idx, result in enumerate(serp_data.get("organic_results", []), start=1):
|
| link = result.get("link")
|
| if link and ("linkedin.com/in/" in link or "in.linkedin.com/in/" in link):
|
| clean_link = link.replace("in.linkedin.com", "linkedin.com")
|
| serp_json[idx] = clean_link
|
|
|
|
|
| with conn.cursor() as cur:
|
| for link in serp_json.values():
|
| cur.execute("""
|
| SELECT name, location, email, linkedin_url, headline, skills, about, experience, profile_pic, is_complete, created_at
|
| FROM saral_data
|
| WHERE linkedin_url = %s AND created_at >= %s
|
|
|
| """, (link, one_month_ago))
|
|
|
| row = cur.fetchone()
|
| if row:
|
| results.append({
|
| "fullName": row[0] if row[0] else "Unknown",
|
| "addressWithCountry": row[1] if row[1] else "Unknown",
|
| "email": row[2] if row[2] else "-",
|
| "linkedinUrl": row[3] if row[3] else "-",
|
| "headline": row[4] if row[4] else "-",
|
| "skills": row[5] if row[5] else [],
|
| "about": row[6] if row[6] else "",
|
| "experiences": row[7] if row[7] else [],
|
| "profilePic": row[8] if row[8] else None,
|
| "is_complete": row[9],
|
| "created_at": row[10]
|
| })
|
|
|
|
|
| else:
|
| remaining.append(link)
|
|
|
| return results, remaining
|
|
|
|
|
| def store_prompt(conn, prompt: str, parsed_json: dict):
|
| job_title = parsed_json.get("job_title")
|
| skills = parsed_json.get("skills", [])
|
| experience = parsed_json.get("experience")
|
| location = parsed_json.get("location", [])
|
| work_preference = parsed_json.get("work_preference")
|
| job_type = parsed_json.get("job_type")
|
| is_indian = parsed_json.get("is_indian")
|
|
|
| try:
|
| with conn.cursor() as cur:
|
| cur.execute("""
|
| INSERT INTO saral_prompts
|
| (prompt, job_title, skills, experience, location, work_preference, job_type, created_at,is_indian)
|
| VALUES (%s, %s, %s, %s, %s, %s, %s, %s,%s)
|
| """, (
|
| prompt,
|
| job_title,
|
| json.dumps(skills) if skills else None,
|
| experience,
|
| location if location else None,
|
| work_preference,
|
| job_type,
|
| datetime.now(),
|
| is_indian
|
| ))
|
| conn.commit()
|
| except Exception as e:
|
| print("Error inserting prompt:", e)
|
| conn.rollback()
|
|
|
|
|
|
|
|
|
| try:
|
| conn = psycopg2.connect(
|
| host=hostname, dbname=database, user=username, password=pwd, port=port_id
|
| )
|
|
|
| cur = conn.cursor()
|
|
|
| create_script = """
|
| CREATE TABLE IF NOT EXISTS saral_data (
|
| id SERIAL PRIMARY KEY,
|
| name TEXT,
|
| location TEXT,
|
| email TEXT,
|
| linkedin_url TEXT,
|
| headline TEXT,
|
| skills JSONB,
|
| about TEXT,
|
| experience JSONB,
|
| profile_pic TEXT,
|
| is_complete BOOLEAN,
|
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
| );
|
| """
|
|
|
|
|
|
|
|
|
|
|
|
|
| conn.commit()
|
|
|
|
|
|
|
|
|
| except Exception as error:
|
| print(error)
|
|
|
|
|
| finally:
|
|
|
|
|
|
|
|
|
| pass
|
|
|
|
|
|
|
|
|
|
|
|
|