avtopilot, delet, update

This commit is contained in:
Xander 2025-04-07 12:09:48 +03:00
parent 6d9396cafa
commit e1549118e2
7 changed files with 67595 additions and 54300 deletions

19143
logs/app.log

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -8,11 +8,15 @@ from pydantic import BaseModel
from sqlalchemy.orm import Session
import json
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
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
import asyncio
router = APIRouter()
templates = Jinja2Templates(directory="templates")
API_KEY = "4545454"
@ -149,7 +153,7 @@ async def client_update(data: update, x_api_key: str = Header(...), db: Session
try:
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
print(f"Полученные данные: user_id={user_id}")
await get_update(db, data)
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
@ -187,7 +191,7 @@ async def avtopilot(data: avtopilots, x_api_key: str = Header(...), db: Session
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
avtopilotss = data.avtopilot # Так как data - это объект Pydantic модели
print(f"Полученные данные: user_id={user_id}, avtopilotss={avtopilotss}")
await get_avtopilot(db, data)
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
@ -207,8 +211,7 @@ async def jobs_delete(data: jobs_delete, x_api_key: str = Header(...), db: Sessi
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
job_id = data.job_id # Так как data - это объект Pydantic модели
print(f"Полученные данные: 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")

File diff suppressed because it is too large Load Diff

View File

@ -234,19 +234,9 @@ async def get_vakansi():
# geo = '100025096' #ON
# geo = '101174742' #Canada
# geo = '103644278' #USA
# pars_jobs(geo)
# async def main():
# await get_vakansi()
#[]TODO!!!
async def process_jobs():
async for db in get_async_session(): # Асинхронный генератор сессий
query = select(Job).filter(Job.days_posted == 7)
@ -258,21 +248,6 @@ async def process_jobs():
await get_job(db, job.job_id)
# if __name__ == "__main__":
# asyncio.run(main())
# import asyncio
# async def pars_jobs(geo):
# print(f"Parsing jobs for {geo}")
# await asyncio.sleep(1) # Имитация асинхронной операции
# async def get_vakansi():
# print("Fetching vacancies")
# await asyncio.sleep(1) # Имитация асинхронной операции
async def main():
geo_list = ['100025096', '101174742', '103644278'] # ON, Canada, USA
@ -286,95 +261,3 @@ if __name__ == "__main__":
asyncio.run(main())
# from sqlalchemy.orm import sessionmaker, declarative_base
# from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
# DATABASE_URL = os.getenv('DATABASE_URL')
# engine = create_async_engine(DATABASE_URL, echo=True)
# async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
# async_session_maker = sessionmaker(
# engine, class_=AsyncSession, expire_on_commit=False
# )
# async def main():
# await get_vakansi()
# await engine.dispose() # Корректно закрываем соединение перед завершением
# if __name__ == "__main__":
# asyncio.run(main()) # 🚀 Запускаем программу в единственном event loop
# [x] Обмен по времени не удалять main() что бы при старте сразу отрабатывала)
# Запуск функции каждые 5 минут
# schedule.every(5).minutes.do(main)
# Запуск функции каждые день
# schedule.every().day.at("08:30").do(main)
# # Основной цикл выполнения
# while True:
# schedule.run_pending() # Запускает запланированные задачи
# time.sleep(1) # Пауза между проверками
# async def get_or_create_jobs(db: AsyncSession, job_id: int, titles: str):
# """ Проверяет, существует ли запись, если нет — создаёт """
# try:
# query = select(Job).filter(Job.job_id == job_id)
# result = await db.execute(query)
# job = result.scalars().first()
# if not job:
# job = Job(
# job_id=job_id,
# job_title=titles
# )
# db.add(job)
# await db.commit()
# await db.refresh(job)
# return job # Возвращаем объект
# except Exception as e:
# await db.rollback() # Откатываем транзакцию в случае ошибки
# print(f"Ошибка при добавлении вакансии {job_id}: {e}")
# return None
# async def get_vakansi():
# """ Читает данные из JSON и записывает их в БД """
# file_path = "search_jobes2.json"
# try:
# with open(file_path, "r", encoding="utf-8") as json_file:
# data = json.load(json_file)
# except Exception as e:
# print(f"Ошибка чтения JSON: {e}")
# return
# async for session in get_async_session(): # Создаём сессию здесь!
# for d in data:
# title = d.get("title", "")
# job_id = d.get("entityUrn", "")
# if job_id:
# await get_or_create_jobs(session, int(job_id), title) # Сохраняем в БД
# print(f"{title} {job_id}")
# async def main():
# await get_vakansi() # Здесь должен быть await!
# if __name__ == "__main__":
# asyncio.run(main())

View File

@ -1,13 +1,25 @@
import json
import ast
import requests
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from sqlalchemy.orm import joinedload
from sqlalchemy import delete
from sqlalchemy import update
from sqlalchemy import or_
from sqlalchemy.exc import IntegrityError
from model.database import Client, AppliedJob, Job
from dotenv import load_dotenv
import os
# Загружаем переменные окружения
load_dotenv()
url_up = os.getenv('UP_DOMEN')
@ -125,7 +137,7 @@ async def add_jobs(db: AsyncSession, user_id: str):
# Создаём записи в AppliedJob
applied_jobs = [
AppliedJob(client_id=user_id, job_id=job.job_id)
AppliedJob(client_id=user_id, job_id=job.job_id, status="Scheduled")
for job in jobs
]
@ -193,5 +205,139 @@ async def client_list(client_id: int, db):
# Если клиент не найден, возвращаем None или обрабатываем ошибку
# return None
print("NOTTTTTTTTTTTTTTTTTTTTTTTTTTTTT")
async def get_avtopilot(db, data):
try:
client_id = data.user_id # Используем client_id вместо user_id для согласованности
avtopilotss = data.avtopilot
if avtopilotss is True:
# Для асинхронного обновления используем update().where().values()
stmt = (
update(AppliedJob)
.where(
(AppliedJob.client_id == client_id) &
(AppliedJob.status == "Paused")
)
.values(status="Scheduled")
)
await db.execute(stmt)
await db.commit()
return True
elif avtopilotss is False:
stmt = (
update(AppliedJob)
.where(
(AppliedJob.client_id == client_id) &
(AppliedJob.status == "Scheduled")
)
.values(status="Paused")
)
await db.execute(stmt)
await db.commit()
return True
else:
print("error")
return False
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
await db.rollback()
raise HTTPException(status_code=400, detail="Error processing data")
async def get_delite(db, data):
try:
client_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
job_id = data.job_id # Так как data - это объект Pydantic модели
print(f"Полученные данные: user_id={client_id}, avtopilotss={job_id}")
stmt = delete(AppliedJob).where(
(AppliedJob.client_id == client_id) &
(AppliedJob.job_id == job_id)
)
# Выполняем запрос с await
result = await db.execute(stmt)
await db.commit()
# Получаем количество удаленных строк
deleted_count = result.rowcount
print(f"Удалено записей: {deleted_count}")
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
async def get_update(db: AsyncSession, data: update):
up_client = requests.get(f"{url_up}1") # Лучше заменить на httpx.AsyncClient
if up_client.status_code == 200:
datas = up_client.json()
# Проверяем, что 'json_data' есть в ответе
if 'json_data' not in datas:
raise HTTPException(status_code=400, detail="Missing 'json_data' in response")
json_data = datas['json_data']
# Если json_data — строка, парсим её в словарь
if isinstance(json_data, str):
try:
data_dict = json.loads(json_data)
except json.JSONDecodeError:
raise HTTPException(status_code=400, detail="Invalid JSON in 'json_data'")
else:
data_dict = json_data # Если уже словарь, используем как есть
# Проверяем, что data_dict — словарь
if not isinstance(data_dict, dict):
raise HTTPException(status_code=400, detail="'json_data' is not a valid dictionary")
try:
first_name = data_dict['first_name']
last_name = data_dict['last_name']
email_addr = data_dict['email_addr']
user_id = data_dict['user_id']
phone_num = data_dict['phone_num']
# Обновляем или создаём клиента
async with db.begin():
client = await db.get(Client, user_id) # Ищем клиента по ID
if client:
# Обновляем существующего клиента
client.user_nicename = first_name # Исправлено: было user_login
client.phone = phone_num
client.json_data = str(data_dict)
else:
# Создаём нового клиента
client = Client(
id=user_id,
user_login=email_addr, # Или другой логин
user_nicename=f"{first_name} {last_name}",
user_email=email_addr,
phone=phone_num,
json_data=str(data_dict),
)
db.add(client)
await db.commit()
return client
except KeyError as e:
raise HTTPException(status_code=400, detail=f"Missing required field: {e}")
else:
raise HTTPException(status_code=up_client.status_code, detail="Failed to fetch data")