Обновить routers/client.py

This commit is contained in:
Alex55 2025-04-23 13:59:49 +03:00
parent 32d070d8ce
commit 675eca167b
1 changed files with 322 additions and 317 deletions

View File

@ -1,317 +1,322 @@
from fastapi import FastAPI, HTTPException, APIRouter, Request, Header, Depends from fastapi import FastAPI, HTTPException, APIRouter, Request, Header, Depends
from fastapi import BackgroundTasks from fastapi import BackgroundTasks
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
import json import json
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from sqlalchemy.ext.asyncio import async_sessionmaker from sqlalchemy.ext.asyncio import async_sessionmaker
from typing import Dict from typing import Dict
from pydantic import BaseModel from pydantic import BaseModel
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
import json import json
from model.database import get_async_session, Client from model.database import get_async_session, Client
from utils.clients import upsert_client, del_jobs, add_jobs, get_applied_jobs, get_filtered_jobs, client_list, get_avtopilot, get_delite, get_update from utils.clients import upsert_client, del_jobs, add_jobs, get_applied_jobs, get_filtered_jobs, client_list, get_avtopilot, get_delite, get_update
from typing import Union from typing import Union
import asyncio import asyncio
from types import SimpleNamespace
router = APIRouter()
templates = Jinja2Templates(directory="templates")
API_KEY = "4545454" router = APIRouter()
templates = Jinja2Templates(directory="templates")
API_KEY = "4545454"
def get_filtered_values(category, data):
values = data.get(category, {})
def get_filtered_values(category, data):
if isinstance(values, dict): values = data.get(category, {})
# Фильтруем словарь, оставляем только значения, отличные от None
return [key for key, value in values.items() if value is not None] if isinstance(values, dict):
elif isinstance(values, str) and values: # Фильтруем словарь, оставляем только значения, отличные от None
# Если это строка, добавляем её как есть (если она не пустая) return [key for key, value in values.items() if value is not None]
return [values] elif isinstance(values, str) and values:
return [] # Если это строка, добавляем её как есть (если она не пустая)
return [values]
# Пример данных return []
clients = {
1: {"username": "John Doe", "email": "john@example.com", "phone": "+123456781"}, # Пример данных
44: {"username": "Jane Smith", "email": "jane@example.com", "phone": "+987654321"}
} @router.get("/get_client/{client_id}", include_in_schema=False)
@router.get("/get_client/{client_id}", include_in_schema=False) async def get_client_modal(client_id: int, db: Session = Depends(get_async_session)):
async def get_client_modal(client_id: int, db: Session = Depends(get_async_session)): data = SimpleNamespace(user_id=client_id)
# client = clients.get(client_id) # Используй clients вместо clients_db print(data)
# print(f"==============================={type(client)}") await get_update(db, data)
client = await client_list(client_id, db)
client = await client_list(client_id, db)
if not client:
raise HTTPException(status_code=404, detail="Client not found") # print(client)
return JSONResponse(content=client)
class JsonData(BaseModel):
json_data: Union[dict, str] if not client:
raise HTTPException(status_code=404, detail="Client not found")
return JSONResponse(content=client)
class jobs_delete(BaseModel):
user_id: int class JsonData(BaseModel):
job_id:int json_data: Union[dict, str]
class avtopilots(BaseModel): class jobs_delete(BaseModel):
user_id: int user_id: int
avtopilot:bool job_id:int
class update(BaseModel):
user_id: int class avtopilots(BaseModel):
user_id: int
avtopilot:bool
async def process_client_data(
db: Session, class update(BaseModel):
data: JsonData, user_id: int
user_id: str,
first_name: str,
last_name: str, async def process_client_data(
email_addr: str, db: Session,
phone_num: str data: JsonData,
): user_id: str,
"""Функция для обработки данных в фоне""" first_name: str,
print(f"Получены данные для {first_name} {last_name} с email {email_addr}") last_name: str,
email_addr: str,
async_session_maker = async_sessionmaker(bind=db.bind, expire_on_commit=False) phone_num: str
async with async_session_maker() as db1, async_session_maker() as db2: ):
print("Запускаем задачи для обновления и удаления") """Функция для обработки данных в фоне"""
client_task = upsert_client(db1, user_id, first_name, last_name, email_addr, phone_num, str(data.json_data)) print(f"Получены данные для {first_name} {last_name} с email {email_addr}")
del_task = del_jobs(db2, user_id)
async_session_maker = async_sessionmaker(bind=db.bind, expire_on_commit=False)
client, _ = await asyncio.gather(client_task, del_task) async with async_session_maker() as db1, async_session_maker() as db2:
print("Запускаем задачи для обновления и удаления")
job_level_values = get_filtered_values('job_level', data.json_data) client_task = upsert_client(db1, user_id, first_name, last_name, email_addr, phone_num, str(data.json_data))
job_type_values = get_filtered_values('job_type', data.json_data) del_task = del_jobs(db2, user_id)
location_type_values = get_filtered_values('location_type', data.json_data)
client, _ = await asyncio.gather(client_task, del_task)
print("Job Level:", ", ".join(job_level_values))
print("Job Type:", ", ".join(job_type_values)) job_level_values = get_filtered_values('job_level', data.json_data)
print("Location Type:", ", ".join(location_type_values)) job_type_values = get_filtered_values('job_type', data.json_data)
location_type_values = get_filtered_values('location_type', data.json_data)
jobs = await get_filtered_jobs(
db, print("Job Level:", ", ".join(job_level_values))
user_job_titles=["Electronics Engineer", "Hardware Engineer"], print("Job Type:", ", ".join(job_type_values))
minimum_annual_salary=None, print("Location Type:", ", ".join(location_type_values))
salary_currency=None,
user_location_type=None, jobs = await get_filtered_jobs(
user_locations=["Burnaby, Canada", "Vancouver, Canada", "Toronto, Canada"], db,
user_levels=["Mid", "Senior", "Manager"], user_job_titles=["3D Modeler,3D Printing Technician,3D Visualizer"],
user_job_types=["Full-time", "Permanent"] minimum_annual_salary=None,
) salary_currency=None,
user_location_type=None,
for job in jobs: user_locations=["Burnaby, Canada", "Vancouver, Canada", "Toronto, Canada"],
print(job.job_title, job.location, job.job_level, job.job_type) user_levels=["Mid", "Senior", "Manager"],
user_job_types=["Part-Time", "Permanent"]
ads = await add_jobs(db, user_id) )
get_jobs = await get_applied_jobs(db, user_id)
for job in jobs:
# [ ]: NOTE Рабоиа в фоне BackgroundTasks process_client_data() print(job.job_title, job.location, job.job_level, job.job_type)
@router.post("/client/", summary="Обновления json_data и переобновление вакансий",
description="Этот эндпоинт обновляет json_data, удаляет все вакансии со статусом Scheduled и создаёт по полученным данным новые вакансии") ads = await add_jobs(db, user_id)
async def client( get_jobs = await get_applied_jobs(db, user_id)
data: JsonData,
x_api_key: str = Header(...), # [ ]: NOTE Рабоиа в фоне BackgroundTasks process_client_data()
db: Session = Depends(get_async_session), @router.post("/client/", summary="Обновления json_data и переобновление вакансий",
background_tasks: BackgroundTasks = BackgroundTasks() description="Этот эндпоинт обновляет json_data, удаляет все вакансии со статусом Scheduled и создаёт по полученным данным новые вакансии")
): async def client(
if x_api_key != "4545454": data: JsonData,
raise HTTPException(status_code=403, detail="Invalid API Key") x_api_key: str = Header(...),
db: Session = Depends(get_async_session),
# Если json_data строка, декодируем её в словарь background_tasks: BackgroundTasks = BackgroundTasks()
if isinstance(data.json_data, str): ):
try: if x_api_key != "4545454":
data.json_data = json.loads(data.json_data) raise HTTPException(status_code=403, detail="Invalid API Key")
except json.JSONDecodeError:
raise HTTPException(status_code=400, detail="Invalid JSON format") # Если json_data строка, декодируем её в словарь
if isinstance(data.json_data, str):
# Проверяем что данные в нужном формате try:
if not isinstance(data.json_data, dict): data.json_data = json.loads(data.json_data)
raise HTTPException(status_code=400, detail="Invalid data format") except json.JSONDecodeError:
raise HTTPException(status_code=400, detail="Invalid JSON format")
try:
# Извлекаем основные данные # Проверяем что данные в нужном формате
first_name = data.json_data['first_name'] if not isinstance(data.json_data, dict):
last_name = data.json_data['last_name'] raise HTTPException(status_code=400, detail="Invalid data format")
email_addr = data.json_data['email_addr']
user_id = data.json_data['user_id'] try:
phone_num = data.json_data['phone_num'] # Извлекаем основные данные
first_name = data.json_data['first_name']
# Добавляем фоновые задачи last_name = data.json_data['last_name']
background_tasks.add_task( email_addr = data.json_data['email_addr']
process_client_data, user_id = data.json_data['user_id']
db=db, phone_num = data.json_data['phone_num']
data=data,
user_id=user_id, # Добавляем фоновые задачи
first_name=first_name, # background_tasks.add_task(
last_name=last_name, # process_client_data,
email_addr=email_addr, # db=db,
phone_num=phone_num # data=data,
) # user_id=user_id,
# first_name=first_name,
except KeyError as e: # last_name=last_name,
raise HTTPException(status_code=400, detail=f"Missing required field: {e}") # email_addr=email_addr,
# phone_num=phone_num
return {"status": "ok", "message": "Request received and is being processed"} # )
except KeyError as e:
# @router.post("/client/") raise HTTPException(status_code=400, detail=f"Missing required field: {e}")
# async def client(data: JsonData, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
# if x_api_key != "4545454": return {"status": "ok", "message": "Request received and is being processed"}
# raise HTTPException(status_code=403, detail="Invalid API Key")
# @router.post("/client/")
# # Если json_data строка, декодируем её в словарь # async def client(data: JsonData, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
# if isinstance(data.json_data, str): # if x_api_key != "4545454":
# try: # raise HTTPException(status_code=403, detail="Invalid API Key")
# data.json_data = json.loads(data.json_data) # Декодируем строку в словарь
# except json.JSONDecodeError:
# raise HTTPException(status_code=400, detail="Invalid JSON format") # # Если json_data строка, декодируем её в словарь
# if isinstance(data.json_data, str):
# # Если json_data строка — декодируем # try:
# # Теперь data.json_data гарантированно является словарем # data.json_data = json.loads(data.json_data) # Декодируем строку в словарь
# if isinstance(data.json_data, dict): # except json.JSONDecodeError:
# try: # raise HTTPException(status_code=400, detail="Invalid JSON format")
# first_name = data.json_data['first_name']
# last_name = data.json_data['last_name'] # # Если json_data строка — декодируем
# email_addr = data.json_data['email_addr'] # # Теперь data.json_data гарантированно является словарем
# user_id = data.json_data['user_id'] # if isinstance(data.json_data, dict):
# phone_num = data.json_data['phone_num'] # try:
# first_name = data.json_data['first_name']
# print(f"Получены данные для {first_name} {last_name} с email {email_addr}") # last_name = data.json_data['last_name']
# email_addr = data.json_data['email_addr']
# async_session_maker = async_sessionmaker(bind=db.bind, expire_on_commit=False) # user_id = data.json_data['user_id']
# async with async_session_maker() as db1, async_session_maker() as db2: # phone_num = data.json_data['phone_num']
# print("Запускаем задачи для обновления и удаления")
# client_task = upsert_client(db1, user_id, first_name, last_name, email_addr, phone_num, str(data.json_data)) # print(f"Получены данные для {first_name} {last_name} с email {email_addr}")
# del_task = del_jobs(db2, user_id)
# async_session_maker = async_sessionmaker(bind=db.bind, expire_on_commit=False)
# client, _ = await asyncio.gather(client_task, del_task) # async with async_session_maker() as db1, async_session_maker() as db2:
# print("Запускаем задачи для обновления и удаления")
# job_level_values = get_filtered_values('job_level', data.json_data) # client_task = upsert_client(db1, user_id, first_name, last_name, email_addr, phone_num, str(data.json_data))
# job_type_values = get_filtered_values('job_type', data.json_data) # del_task = del_jobs(db2, user_id)
# location_type_values = get_filtered_values('location_type', data.json_data)
# client, _ = await asyncio.gather(client_task, del_task)
# #Результат
# print("Job Level:", ", ".join(job_level_values)) # job_level_values = get_filtered_values('job_level', data.json_data)
# print("Job Type:", ", ".join(job_type_values)) # job_type_values = get_filtered_values('job_type', data.json_data)
# print("Location Type:", ", ".join(location_type_values)) # location_type_values = get_filtered_values('location_type', data.json_data)
# # Пример использования функции # #Результат
# jobs = await get_filtered_jobs( # print("Job Level:", ", ".join(job_level_values))
# db, # print("Job Type:", ", ".join(job_type_values))
# user_job_titles=["Electronics Engineer", "Hardware Engineer"], # print("Location Type:", ", ".join(location_type_values))
# minimum_annual_salary=None,
# salary_currency=None, # # Пример использования функции
# user_location_type=None, # jobs = await get_filtered_jobs(
# user_locations=["Burnaby, Canada", "Vancouver, Canada", "Toronto, Canada"], # db,
# user_levels=["Mid", "Senior", "Manager"], # user_job_titles=["Electronics Engineer", "Hardware Engineer"],
# user_job_types=["Full-time", "Permanent"] # minimum_annual_salary=None,
# ) # salary_currency=None,
# user_location_type=None,
# user_locations=["Burnaby, Canada", "Vancouver, Canada", "Toronto, Canada"],
# # Выводим вакансии # user_levels=["Mid", "Senior", "Manager"],
# for job in jobs: # user_job_types=["Full-time", "Permanent"]
# print(job.job_title, job.location, job.job_level, job.job_type) # )
# ads = await add_jobs(db, user_id) # # Выводим вакансии
# get_jobs = await get_applied_jobs(db, user_id) # for job in jobs:
# # print(f"Полученные заявки: {get_jobs}") # print(job.job_title, job.location, job.job_level, job.job_type)
# except KeyError as e:
# print(f"Ошибка при извлечении данных: {e}") # ads = await add_jobs(db, user_id)
# raise HTTPException(status_code=400, detail="Missing required field in json_data") # get_jobs = await get_applied_jobs(db, user_id)
# # print(f"Полученные заявки: {get_jobs}")
# else:
# # print(f"Неверный формат данных: {type(data.json_data)}") # except KeyError as e:
# raise HTTPException(status_code=400, detail="Invalid data format") # print(f"Ошибка при извлечении данных: {e}")
# raise HTTPException(status_code=400, detail="Missing required field in json_data")
# return {"status": "ok", "message": "JSON получен"}
# else:
# # print(f"Неверный формат данных: {type(data.json_data)}")
@router.post("/client_update", summary="Обновления клиента", # raise HTTPException(status_code=400, detail="Invalid data format")
description="Этот эндпоинт получает ID пользователя, переходит по ссылки что бы получить json_data")
async def client_update(data: update, x_api_key: str = Header(...), db: Session = Depends(get_async_session)): # return {"status": "ok", "message": "JSON получен"}
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key") @router.post("/client_update", summary="Обновления клиента",
description="Этот эндпоинт получает ID пользователя, переходит по ссылки что бы получить json_data")
try: async def client_update(data: update, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
if x_api_key != "4545454":
await get_update(db, data) raise HTTPException(status_code=403, detail="Invalid API Key")
try:
except Exception as e: user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data") await get_update(db, data)
return {"status": "ok", "message": "Data received", "user_id": user_id, }
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
@router.post("/client_jobs/", summary="Получить список работ по клиенту",
description="Этот эндпоинт получает ID пользователя, в ответ отдаёт список вакансий") return {"status": "ok", "message": "Data received", "user_id": user_id, }
async def client_jobs(data: update, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
@router.post("/client_jobs/", summary="Получить список работ по клиенту",
try: description="Этот эндпоинт получает ID пользователя, в ответ отдаёт список вакансий")
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок async def client_jobs(data: update, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
get_jobs = await get_applied_jobs(db, user_id) if x_api_key != "4545454":
print(f"Полученные данные: user_id={user_id}") raise HTTPException(status_code=403, detail="Invalid API Key")
except Exception as e: try:
print(f"Ошибка при обработке данных: {e}") user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
raise HTTPException(status_code=400, detail="Error processing data") get_jobs = await get_applied_jobs(db, user_id)
print(f"Полученные данные: user_id={user_id}")
return {"status": "ok", "message": "Data received", "get_jobs": get_jobs}
# return {"message": "JSON получен", "data": get_jobs} except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
@router.post("/avtopilot", summary="Автопилот вкл, выкл",
description="Этот эндпоинт получает ID пользователя, включает или отключает автопилот. При false все вакансии со статусом Scheduled становятся Paused при true наоборот!") return {"status": "ok", "message": "Data received", "get_jobs": get_jobs}
async def avtopilot(data: avtopilots, x_api_key: str = Header(...), db: Session = Depends(get_async_session)): # return {"message": "JSON получен", "data": get_jobs}
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key") @router.post("/avtopilot", summary="Автопилот вкл, выкл",
description="Этот эндпоинт получает ID пользователя, включает или отключает автопилот. При false все вакансии со статусом Scheduled становятся Paused при true наоборот!")
try: async def avtopilot(data: avtopilots, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
avtopilotss = data.avtopilot # Так как data - это объект Pydantic модели if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
await get_avtopilot(db, data)
try:
except Exception as e: user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
print(f"Ошибка при обработке данных: {e}") avtopilotss = data.avtopilot # Так как data - это объект Pydantic модели
raise HTTPException(status_code=400, detail="Error processing data")
await get_avtopilot(db, data)
return {"status": "ok", "message": "Data received", "user_id": user_id, "avtopilotss": avtopilotss}
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
@router.post("/jobs_delete", summary="Удаление вакансии", return {"status": "ok", "message": "Data received", "user_id": user_id, "avtopilotss": avtopilotss}
description="Этот эндпоинт получает ID пользователя и ID вакансии, Удаляет у пользователя вакансию")
async def jobs_delete(data: jobs_delete, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
@router.post("/jobs_delete", summary="Удаление вакансии",
try: description="Этот эндпоинт получает ID пользователя и ID вакансии, Удаляет у пользователя вакансию")
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок async def jobs_delete(data: jobs_delete, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
job_id = data.job_id # Так как data - это объект Pydantic модели if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
await get_delite(db, data)
except Exception as e: try:
print(f"Ошибка при обработке данных: {e}") user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
raise HTTPException(status_code=400, detail="Error processing data") job_id = data.job_id # Так как data - это объект Pydantic модели
return {"status": "ok", "message": "Data received", "user_id": user_id, "job_id": job_id} await get_delite(db, data)
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
return {"status": "ok", "message": "Data received", "user_id": user_id, "job_id": job_id}