yashita13's picture
Upload 17 files
e69d432 verified
# backend/crud.py
from sqlalchemy.orm import Session
import models, schemas, auth
import uuid
# --- User Functions (Unchanged) ---
def get_user(db: Session, user_id: str):
return db.query(models.User).filter(models.User.id == user_id).first()
# def create_user(db: Session, user: schemas.UserCreate):
#
# # --- TEMPORARY FIX TO BYPASS THE BROKEN BCRYPT LIBRARY ---
# # We will store the plain password directly.
# # This is insecure for a real application but will get you unblocked.
# print(f"[SECURITY WARNING] Storing plain text password for user: {user.id}")
#
# if not user.password:
# raise ValueError("Cannot create a user with an empty password.")
#
# # Instead of calling the broken hash function, we just use the password as-is.
# hashed_password = user.password
# # --- END OF TEMPORARY FIX ---
#
# db_user = models.User(
# id=user.id,
# name=user.name,
# department=user.department,
# role=user.role,
# hashed_password=hashed_password # Storing the plain password here for now
# )
# db.add(db_user)
# db.commit()
# db.refresh(db_user)
# return db_user
def create_user(db: Session, user: schemas.UserCreate):
# This now works for ALL users, including 'automation_user' and real users.
hashed_password = auth.get_password_hash(user.password)
db_user = models.User(
id=user.id,
name=user.name,
department=user.department,
role=user.role,
hashed_password=hashed_password
)
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
# --- Document Functions (Unchanged) ---
def get_document_by_id(db: Session, document_id: uuid.UUID):
return db.query(models.Document).filter(models.Document.id == document_id).first()
def get_all_documents(db: Session, skip: int = 0, limit: int = 100):
return db.query(models.Document).offset(skip).limit(limit).all()
def get_documents_by_department(db: Session, department: str, skip: int = 0, limit: int = 100):
# This is now a case-INSENSITIVE comparison. It will match 'HR', 'hr', 'Hr', etc.
return db.query(models.Document).filter(models.Document.department.ilike(department)).offset(skip).limit(limit).all()
def create_document(db: Session, document: schemas.DocumentCreate, file_path: str, user_id: str):
db_document = models.Document(
id=uuid.uuid4(),
title=document.title,
department=document.department,
file_path=file_path,
uploader_id=user_id,
status="processing"
)
db.add(db_document)
db.commit()
db.refresh(db_document)
return db_document
# --- NEW Q&A Functions ---
def create_question(db: Session, document_id: uuid.UUID, user_id: str, question: schemas.QuestionCreate):
"""Saves a new question to the database. The answer will be null initially."""
db_question = models.Question(
document_id=document_id,
user_id=user_id,
question_text=question.question_text
)
db.add(db_question)
db.commit()
db.refresh(db_question)
return db_question
def get_questions_for_document(db: Session, document_id: uuid.UUID):
"""Retrieves all questions and answers for a specific document."""
return db.query(models.Question).filter(models.Question.document_id == document_id).order_by(models.Question.asked_at.asc()).all()
def update_question_with_answer(db: Session, question_id: uuid.UUID, answer_text: str):
"""
Finds a question by its ID and updates its answer_text field.
"""
db_question = db.query(models.Question).filter(models.Question.id == question_id).first()
if db_question:
db_question.answer_text = answer_text
db.commit()
db.refresh(db_question)
return db_question
def update_document_with_ml_results(db: Session, document_id: uuid.UUID, ml_results: dict, highlighted_file_path: str = None):
"""
Updates a document with the results from the ML pipeline.
"""
db_document = db.query(models.Document).filter(models.Document.id == document_id).first()
if db_document:
db_document.department = ml_results.get("department", db_document.department)
db_document.summary = ml_results.get("summary")
db_document.deadlines = ml_results.get("deadlines", [])
db_document.financial_terms = ml_results.get("financials", [])
# --- ADD THIS LINE ---
# This checks if a URL was provided and assigns it to the database object.
if highlighted_file_path:
db_document.highlighted_file_path = highlighted_file_path
db_document.status = "completed"
db.commit()
db.refresh(db_document)
return db_document
def create_notification(db: Session, document_id: uuid.UUID, department: str, message: str):
"""Creates a new notification in the database."""
db_notification = models.Notification(
document_id=document_id,
department=department,
message=message
)
db.add(db_notification)
db.commit()
db.refresh(db_notification)
return db_notification
def get_notifications_for_department(db: Session, department: str):
"""Retrieves all unread notifications for a specific department, case-insensitively."""
return db.query(models.Notification).filter(
models.Notification.department.ilike(department), # <--- THE FIX
models.Notification.is_read == False
).order_by(models.Notification.created_at.desc()).all()