Nattyboi's picture
updated codebase to make it faster
bbd997e
from bson import ObjectId
from pymongo import MongoClient
from typing import Dict, Optional
from datetime import datetime
import requests
from pymongo import MongoClient
from gamification.logic import create_points_func
from gamification.objects import PlatformEngagement, Points
from controller.password import *
from controller.streaksManagement import streaks_manager
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(max_workers=5)
def google_search(query, api_key, cx):
url = f"https://www.googleapis.com/customsearch/v1?q={query}&key={api_key}&cx={cx}"
response = requests.get(url)
if response.status_code == 200:
search_results = response.json()
print(search_results)
return search_results
else:
print(f"Error: {response.status_code}")
return None
def generate_embedding_for_user_resume(data,user_id):
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("nomic-ai/nomic-embed-text-v1", trust_remote_code=True)
def get_embedding(data, precision="float32"):
return model.encode(data, precision=precision)
from pinecone import Vector
def create_docs_with_vector_embeddings(bson_float32, data):
docs = []
for i, (bson_f32_emb, text) in enumerate(zip(bson_float32, data)):
doc =Vector(
id=f"{i}",
values= bson_f32_emb.tolist(),
metadata={"text":text,"user_id":user_id},
)
docs.append(doc)
return docs
float32_embeddings = get_embedding(data, "float32")
docs = create_docs_with_vector_embeddings(float32_embeddings, data)
return docs
def insert_embeddings_into_pinecone_database(doc,api_key,name_space):
from pinecone import Pinecone
pc = Pinecone(api_key=api_key)
index_name = "resumes"
index = pc.Index(index_name)
upsert_response = index.upsert(namespace=name_space,vectors=doc)
return upsert_response
def query_vector_database(query,api_key,name_space):
from pinecone import Pinecone
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("nomic-ai/nomic-embed-text-v1", trust_remote_code=True)
ret=[]
pc = Pinecone(api_key=api_key)
index_name = "resumes"
index = pc.Index(index_name)
# Define a function to generate embeddings in multiple precisions
def get_embedding(data, precision="float32"):
return model.encode(data, precision=precision)
query_embedding = get_embedding(query, precision="float32")
response = index.query(
namespace=name_space,
vector=query_embedding.tolist(),
top_k=5,
include_metadata=True
)
for doc in response['matches']:
ret.append(doc['metadata']['text'])
return ret
def delete_vector_namespace(name_space,api_key):
from pinecone import Pinecone
pc = Pinecone(api_key=api_key)
index_name = "resumes"
index = pc.Index(index_name)
response = index.delete(delete_all=True,namespace=name_space)
return response
def split_text_into_chunks(text, chunk_size=400):
# Split the text into words using whitespace.
words = text.split()
# Group the words into chunks of size 'chunk_size'.
chunks = [' '.join(words[i:i + chunk_size]) for i in range(0, len(words), chunk_size)]
return chunks
def create_user(db_uri: str, db_name: str, collection_name: str, document: dict) -> str:
"""
Inserts a new document into the specified MongoDB collection.
Parameters:
db_uri (str): MongoDB connection URI.
db_name (str): Name of the database.
collection_name (str): Name of the collection.
document (dict): The document to insert.
Returns:
str: The ID of the inserted document.
"""
# Connect to MongoDB
client = MongoClient(db_uri)
db = client[db_name]
collection = db[collection_name]
# Insert the document
s = collection.find_one({"email":document.get('email')})
password = hash_password(document.get('password'))
document['password']= password
document['date_Joined'] = datetime.now()
if s==None:
result = collection.insert_one(document)
streaks_doc={}
streaks_doc['user_id'] = str(result.inserted_id)
# executor.submit(streaks_manager,db_uri=db_uri,document=streaks_doc)
streaks_manager(db_uri=db_uri,document=streaks_doc)
return str(result.inserted_id)
else:
client.close()
return False
# Close the connection
def create_questionaire(db_uri: str, db_name: str, collection_name: str, document: dict) -> str:
"""
Inserts a new document into the specified MongoDB collection.
Parameters:
db_uri (str): MongoDB connection URI.
db_name (str): Name of the database.
collection_name (str): Name of the collection.
document (dict): The document to insert.
Returns:
str: The ID of the inserted document.
"""
# Connect to MongoDB
client = MongoClient(db_uri)
db = client[db_name]
collection = db[collection_name]
# Insert the document
result= collection.find_one_and_replace(filter={"userId":document.get("userId")},replacement=document)
print(result)
if result==None:
# give points for the completness of a profile
completProfilePoints= Points(userId=document.get('userId'),platformEngagement=PlatformEngagement(profile_completion=50))
wasCreated= create_points_func(document=completProfilePoints)
result = collection.insert_one(document)
print(result)
return str(result.inserted_id)
client.close()
return str(result)
# Close the connection
def login_user(db_uri: str, db_name: str, collection_name: str, document: dict) -> str:
streaks_doc={}
"""
Inserts a new document into the specified MongoDB collection.
Parameters:
db_uri (str): MongoDB connection URI.
db_name (str): Name of the database.
collection_name (str): Name of the collection.
document (dict): The document to insert.
Returns:
str: The ID of the inserted document.
"""
# Connect to MongoDB
client = MongoClient(db_uri)
db = client[db_name]
collection = db[collection_name]
# Insert the document
s = collection.find_one({"email":document["email"]})
print(s)
print(document.get('email'))
if s==None:
return False
else:
if check_password(password=document['password'],hashed_password=s['password']):
streaks_doc['user_id'] = str(s["_id"])
# executor.submit(streaks_manager,db_uri=db_uri,document=streaks_doc)
streaks_manager(db_uri=db_uri,document=streaks_doc)
return str(s['_id'])
else:
return False
# Close the connection
def user_details_func(db_uri: str, document: Dict) -> Optional[Dict]:
"""
Retrieve and process user details from MongoDB collections.
Args:
db_uri (str): MongoDB connection URI
document (dict): Document containing user_id
Returns:
dict: Processed user details or None if user not found
"""
streaks_doc = {}
# Connect to MongoDB
client = MongoClient(db_uri)
db = client["crayonics"]
# Define collections
users_collection = db["users"]
streaks_collection = db["Streaks"]
questionaire_collection = db["Questionaire"]
# Find user document
user_id = document.get("user_id")
user_doc = users_collection.find_one({"_id": ObjectId(user_id)})
if not user_doc:
return None
# Prepare base user document
user_doc['userId'] = str(user_doc['_id'])
user_doc.pop('_id')
user_doc.pop('password', None) # Use default None in case password doesn't exist
# Get streaks data
streaks_collection_doc = streaks_collection.find_one({"user_id": user_id})
streaks_doc['user_id'] = user_id
# Call streaks_manager (assuming this function exists elsewhere)
# executor.submit(streaks_manager,db_uri=db_uri,document=streaks_doc)
streaks_manager(db_uri=db_uri, document=streaks_doc)
if streaks_collection_doc:
streaks_collection_doc.pop("_id", None)
streaks_collection_doc.pop("user_id", None)
user_doc['streak_dates'] = streaks_collection_doc.get('streak_dates', [])
# Try to get questionnaire data
questionaire_doc = questionaire_collection.find_one({"userId": user_id})
if questionaire_doc:
print(f"in questionaire retrieval:")
try:
questionaire_doc.pop("_id", None)
questionaire_doc.pop("userId", None)
user_doc['career_questions'] = questionaire_doc
except Exception as e:
# If questionnaire fails, continue with what we have
print(f"Error in questionaire retrieval: {str(e)}")
print(questionaire_doc)
pass
client.close()
return user_doc