Spaces:
Sleeping
Sleeping
import json | |
import os | |
import logging | |
import shutil | |
from fastapi import FastAPI, File, Query,Form, Request, HTTPException, UploadFile | |
from fastapi.responses import JSONResponse, RedirectResponse | |
from fastapi.staticfiles import StaticFiles | |
from fastapi.templating import Jinja2Templates | |
from fastapi.middleware.cors import CORSMiddleware | |
from dotenv import load_dotenv | |
import mysql.connector | |
from typing import List | |
# Load environment variables | |
load_dotenv() | |
# Configure logging | |
logging.basicConfig( | |
level=logging.INFO, | |
format='%(asctime)s - %(levelname)s - %(message)s', | |
handlers=[ | |
logging.FileHandler("redmindgen.log"), | |
logging.StreamHandler() # This ensures logging to console | |
] | |
) | |
logging.info("Application startup") | |
# Create the FastAPI app | |
app = FastAPI(title="RedmindGen", description="Chat with your Data", version="1.0.0") | |
# Mount static files | |
app.mount("/static", StaticFiles(directory="static"), name="static") | |
# Jinja2 templates | |
templates = Jinja2Templates(directory="templates") | |
# Configure CORS | |
origins = [ | |
"http://localhost:8000", | |
"http://127.0.0.1:8000", | |
"http://167.71.75.10:8003/" | |
] | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=origins, | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
async def read_root(request: Request): | |
return templates.TemplateResponse("index.html", {"request": request}) | |
def verify_user(username: str, password: str): | |
try: | |
# Connect to MySQL database | |
cnx = mysql.connector.connect(user='u852023448_redmindgpt', password='redmindGpt@123', | |
host='217.21.88.10', | |
database='u852023448_redmindgpt') | |
#cnx = mysql.connector.connect(user='root', password='', host='localhost', database='redmind_gpt') | |
cursor = cnx.cursor() | |
query = "SELECT * FROM user_detail WHERE username = %s AND password = %s" | |
values = (username, password) | |
cursor.execute(query, values) | |
result = cursor.fetchone() | |
cursor.close() | |
cnx.close() | |
if result is not None: | |
logging.info(f"User {username} logged in successfully") | |
return "success" | |
else: | |
logging.info(f"User {username} login failed") | |
return "failure" | |
except mysql.connector.Error as err: | |
logging.error(f"Database error: {err}") | |
return "failure" | |
async def validate_user(request: Request, username: str = Form(...), password: str = Form(...)): | |
status = verify_user(username, password) | |
if status == 'success': | |
return templates.TemplateResponse("dashboard.html", {"request": request, "username": username}) | |
else: | |
return templates.TemplateResponse("index.html", {"request": request}) | |
async def submit_company_profile(request: Request, | |
company_name: str = Form(...), | |
company_code: str = Form(...), | |
domain: str = Form(...), | |
llm_tools: List[str] = Form(...)): | |
logging.info("Received form submission for company profile") | |
logging.info(f"Form data - company_name: {company_name}, company_code: {company_code}, domain: {domain}, llm_tools: {llm_tools}") | |
try: | |
# Connect to MySQL database | |
cnx = mysql.connector.connect(user='u852023448_redmindgpt', password='redmindGpt@123', | |
host='217.21.88.10', | |
database='u852023448_redmindgpt') | |
#cnx = mysql.connector.connect(user='root', password='', host='localhost', database='redmind_gpt') | |
cursor = cnx.cursor() | |
query = "INSERT INTO company_detail (company_name, company_code, domain, llm_tools) VALUES (%s, %s, %s, %s)" | |
values = (company_name, company_code, domain, ",".join(llm_tools)) | |
logging.info(f"Executing query: {query} with values: {values}") | |
cursor.execute(query, values) | |
cnx.commit() | |
logging.info(f"Query executed successfully, {cursor.rowcount} row(s) affected") | |
cursor.close() | |
cnx.close() | |
logging.info(f"Company profile for {company_name} inserted successfully") | |
RedirectResponse(url="/company_profile?message=Data saved successfully", status_code=302) | |
except mysql.connector.Error as err: | |
logging.error(f"Database error: {err}") | |
raise HTTPException(status_code=500, detail="Internal Server Error") | |
async def get_companies(): | |
try: | |
cnx = mysql.connector.connect(user='u852023448_redmindgpt', password='redmindGpt@123', | |
host='217.21.88.10', | |
database='u852023448_redmindgpt') | |
#cnx = mysql.connector.connect(user='root', password='', host='localhost', database='redmind_gpt') | |
cursor = cnx.cursor() | |
query = "SELECT company_name FROM company_detail " | |
cursor.execute(query) | |
companies = cursor.fetchall() | |
cursor.close() | |
cnx.close() | |
return {"companies": [{"name": company[0]} for company in companies]} | |
except mysql.connector.Error as err: | |
logging.error(f"Database error: {err}") | |
raise HTTPException(status_code=500, detail="Internal Server Error") | |
async def company_profile(request: Request): | |
return templates.TemplateResponse("company_profile.html", {"request": request}) | |
async def get_company_id(company_name: str): | |
print(f"Received company_name: {company_name}") # Debug statement | |
logging.info(f"Received request for company name: {company_name}") | |
try: | |
cnx = mysql.connector.connect(user='u852023448_redmindgpt', password='redmindGpt@123', | |
host='217.21.88.10', | |
database='u852023448_redmindgpt') | |
#cnx = mysql.connector.connect(user='root', password='', host='localhost', database='redmind_gpt') | |
cursor = cnx.cursor() | |
query = "SELECT company_id FROM company_detail WHERE company_name = %s" | |
cursor.execute(query, (company_name,)) | |
result = cursor.fetchone() | |
cursor.close() | |
cnx.close() | |
if result: | |
return {"company_id": result[0]} | |
else: | |
logging.error(f"Company not found for name: {company_name}") | |
raise HTTPException(status_code=404, detail="Company not found") | |
except mysql.connector.Error as err: | |
logging.error(f"Database error: {err}") | |
raise HTTPException(status_code=500, detail="Internal Server Error") | |
async def knowledgebase(request: Request): | |
return templates.TemplateResponse("knowledgebase.html", {"request": request}) | |
async def upload_document( | |
request: Request, | |
company_id:str=Form(...), | |
uploadFile: UploadFile = File(...), | |
documentName: str = Form(...), | |
documentDescription: str = Form(...), | |
department: str = Form(...), | |
version: str = Form(...), | |
lastUpdated: str = Form(...) | |
): | |
try: | |
# Save the uploaded file | |
upload_folder = "uploads/" | |
os.makedirs(upload_folder, exist_ok=True) | |
file_path = os.path.join(upload_folder, uploadFile.filename) | |
with open(file_path, "wb") as buffer: | |
shutil.copyfileobj(uploadFile.file, buffer) | |
# Save the details to the database | |
cnx = mysql.connector.connect(user='u852023448_redmindgpt', password='redmindGpt@123', | |
host='217.21.88.10', | |
database='u852023448_redmindgpt') | |
#cnx = mysql.connector.connect(user='root', password='', host='localhost', database='redmind_gpt') | |
cursor = cnx.cursor() | |
query = """ | |
INSERT INTO knowledge_base (company_id,file_path, document_name, document_desc, department, version, last_updated) | |
VALUES (%s,%s, %s, %s, %s, %s, %s) | |
""" | |
values = (company_id,file_path, documentName, documentDescription, department, version, lastUpdated) | |
cursor.execute(query, values) | |
cnx.commit() | |
cursor.close() | |
cnx.close() | |
logging.info(f"Document {documentName} uploaded successfully") | |
return RedirectResponse(url="/", status_code=302) | |
except mysql.connector.Error as err: | |
logging.error(f"Database error: {err}") | |
raise HTTPException(status_code=500, detail="Internal Server Error") | |
async def get_document(company_id: str = Query(...), company_name: str = Query(...)): | |
print(f"Received companyId and name: {company_id},{company_name}") # Log rec | |
#async def get_data_connectors(company_id: str, company_name: str): | |
logging.info(f"Received request for company_id and company_id: {company_id},{company_name}") | |
try: | |
#cnx = mysql.connector.connect(user='root', password='', host='localhost', database='redmind_gpt') | |
cnx = mysql.connector.connect(user='u852023448_redmindgpt', password='redmindGpt@123', | |
host='217.21.88.10', | |
database='u852023448_redmindgpt') | |
cursor = cnx.cursor() | |
query = """ | |
SELECT kb.company_id, kb.file_path, kb.document_name, kb.document_desc,kb.department,kb.version,kb.last_updated | |
FROM u852023448_redmindgpt.knowledge_base kb | |
JOIN u852023448_redmindgpt.company_detail cd ON kb.company_id = cd.company_id | |
WHERE kb.company_id = %s and cd.company_name=%s | |
""" | |
logging.info(f"Executing query: {query} with company_id: {company_id}") | |
params = (company_id,company_name) | |
logging.info(f"Query parameters: {params}") | |
print(f"Query parameters: {params}") | |
cursor.execute(query, params) # Pa | |
result = cursor.fetchone() | |
logging.info(f"Query result: {result}") | |
cursor.close | |
cnx.close() | |
if result: | |
logging.info(f"Document found for company_id: {company_id}") | |
return { | |
"company_id": result[0], | |
# "file_path":result[1], | |
"document_name": result[2], | |
"document_desc": result[3], | |
"department": result[4], | |
"version": result[5], | |
"last_updated": result[6] | |
} | |
else: | |
logging.warning(f"No document found for company_id: {company_id}") | |
raise HTTPException(status_code=404, detail="Data document not found") | |
except mysql.connector.Error as err: | |
logging.error(f"Database error: {err}") | |
raise HTTPException(status_code=500, detail="Internal Server Error") | |
async def data_connectors(request: Request): | |
return templates.TemplateResponse("data_connectors.html", {"request": request}) | |
async def save_data_connectors( request: Request, | |
company_id: int = Form(...), | |
database: List[str] = Form(...), | |
server: str = Form(...), | |
port: str = Form(...), | |
databaseName: List[str] = Form(...), | |
username: str=Form(...), | |
password: str=Form(...), | |
tables: List[str] = Form(...)): | |
logging.info(f"Received form submission for database_connectors") | |
try: | |
cnx = mysql.connector.connect(user='u852023448_redmindgpt', password='redmindGpt@123', | |
host='217.21.88.10', | |
database='u852023448_redmindgpt') | |
#cnx = mysql.connector.connect(user='root', password='', host='localhost', database='redmind_gpt') | |
cursor = cnx.cursor() | |
#databasetype_json=json.dumps(database) | |
query = "INSERT INTO data_connectors(company_id,databasetype, serverip, port, database_name,username,password,dbtablename) VALUES (%s,%s, %s, %s, %s,%s,%s,%s)" | |
values = (company_id, ",".join(database), server, port, ",".join(databaseName),username,password, ",".join(tables)) | |
logging.info(f"Executing query: {query} with values: {values}") | |
cursor.execute(query, values) | |
cnx.commit() | |
logging.info(f"Query executed successfully, {cursor.rowcount} row(s) affected") | |
cursor.close() | |
cnx.close() | |
logging.info(f"Data_connectors for {database} inserted successfully") | |
return RedirectResponse(url="/data_connectors", status_code=302) | |
except mysql.connector.Error as err: | |
logging.error(f"Database error: {err}") | |
raise HTTPException(status_code=500, detail="Internal Server Error") | |
async def get_data_connectors(company_id: str = Query(...), company_name: str = Query(...)): | |
print(f"Received companyId and name: {company_id},{company_name}") # Log rec | |
#async def get_data_connectors(company_id: str, company_name: str): | |
logging.info(f"Received request for company_id and company_id: {company_id},{company_name}") | |
try: | |
cnx = mysql.connector.connect(user='u852023448_redmindgpt', password='redmindGpt@123', | |
host='217.21.88.10', | |
database='u852023448_redmindgpt') | |
#cnx = mysql.connector.connect(user='root', password='', host='localhost', database='redmind_gpt') | |
cursor = cnx.cursor() | |
query = """ | |
SELECT dc.company_id, dc.databasetype, dc.serverip, dc.port,dc.database_name, dc.username, dc.password ,dc.dbtablename | |
FROM u852023448_redmindgpt.data_connectors dc | |
JOIN u852023448_redmindgpt.company_detail cd ON dc.company_id = cd.company_id | |
WHERE dc.company_id = %s and cd.company_name=%s | |
""" | |
logging.info(f"Executing query: {query} with company_id: {company_id}") | |
params = (company_id,company_name) | |
logging.info(f"Query parameters: {params}") | |
print(f"Query parameters: {params}") | |
cursor.execute(query, params) # Pa | |
result = cursor.fetchone() | |
logging.info(f"Query result: {result}") | |
cursor.close() | |
cnx.close() | |
if result: | |
logging.info(f"Data found for company_id: {company_id}") | |
return { | |
"company_id": result[0], | |
"databasetype":result[1], | |
"serverip": result[2], | |
"port": result[3], | |
"database_name": result[4], | |
"username": result[5], | |
"password": result[6], | |
"dbtablename": result[7] | |
} | |
else: | |
logging.warning(f"No data found for company_id: {company_id}") | |
raise HTTPException(status_code=404, detail="Data connector not found") | |
except mysql.connector.Error as err: | |
logging.error(f"Database error: {err}") | |
raise HTTPException(status_code=500, detail="Internal Server Error") | |
async def API_connectors(request: Request): | |
return templates.TemplateResponse("API_connectors.html", {"request": request}) | |
async def prompt_template(request: Request): | |
return templates.TemplateResponse("prompt_template.html", {"request": request}) | |
async def chatbot(request: Request): | |
return templates.TemplateResponse("chatbot.html", {"request": request}) | |