avtopilot, delet, update
This commit is contained in:
parent
6d9396cafa
commit
e1549118e2
19143
logs/app.log
19143
logs/app.log
File diff suppressed because it is too large
Load Diff
44784
logs/app.log.1
44784
logs/app.log.1
File diff suppressed because it is too large
Load Diff
50152
logs/app.log.2
50152
logs/app.log.2
File diff suppressed because it is too large
Load Diff
|
@ -8,11 +8,15 @@ 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
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
templates = Jinja2Templates(directory="templates")
|
templates = Jinja2Templates(directory="templates")
|
||||||
API_KEY = "4545454"
|
API_KEY = "4545454"
|
||||||
|
@ -149,7 +153,7 @@ async def client_update(data: update, x_api_key: str = Header(...), db: Session
|
||||||
try:
|
try:
|
||||||
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
|
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
|
||||||
|
|
||||||
print(f"Полученные данные: user_id={user_id}")
|
await get_update(db, data)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Ошибка при обработке данных: {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 # Обратите внимание на точку вместо квадратных скобок
|
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
|
||||||
avtopilotss = data.avtopilot # Так как data - это объект Pydantic модели
|
avtopilotss = data.avtopilot # Так как data - это объект Pydantic модели
|
||||||
|
|
||||||
print(f"Полученные данные: user_id={user_id}, avtopilotss={avtopilotss}")
|
await get_avtopilot(db, data)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Ошибка при обработке данных: {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 # Обратите внимание на точку вместо квадратных скобок
|
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
|
||||||
job_id = data.job_id # Так как data - это объект Pydantic модели
|
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:
|
except Exception as e:
|
||||||
print(f"Ошибка при обработке данных: {e}")
|
print(f"Ошибка при обработке данных: {e}")
|
||||||
raise HTTPException(status_code=400, detail="Error processing data")
|
raise HTTPException(status_code=400, detail="Error processing data")
|
||||||
|
|
7538
search_jobes2.json
7538
search_jobes2.json
File diff suppressed because it is too large
Load Diff
117
utils/app.py
117
utils/app.py
|
@ -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 def process_jobs():
|
||||||
async for db in get_async_session(): # Асинхронный генератор сессий
|
async for db in get_async_session(): # Асинхронный генератор сессий
|
||||||
query = select(Job).filter(Job.days_posted == 7)
|
query = select(Job).filter(Job.days_posted == 7)
|
||||||
|
@ -258,21 +248,6 @@ async def process_jobs():
|
||||||
await get_job(db, job.job_id)
|
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():
|
async def main():
|
||||||
geo_list = ['100025096', '101174742', '103644278'] # ON, Canada, USA
|
geo_list = ['100025096', '101174742', '103644278'] # ON, Canada, USA
|
||||||
|
@ -286,95 +261,3 @@ if __name__ == "__main__":
|
||||||
asyncio.run(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())
|
|
148
utils/clients.py
148
utils/clients.py
|
@ -1,13 +1,25 @@
|
||||||
import json
|
import json
|
||||||
import ast
|
import ast
|
||||||
|
import requests
|
||||||
|
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
from sqlalchemy.future import select
|
from sqlalchemy.future import select
|
||||||
from sqlalchemy.orm import joinedload
|
from sqlalchemy.orm import joinedload
|
||||||
|
from sqlalchemy import delete
|
||||||
|
from sqlalchemy import update
|
||||||
from sqlalchemy import or_
|
from sqlalchemy import or_
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
from model.database import Client, AppliedJob, Job
|
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
|
# Создаём записи в AppliedJob
|
||||||
applied_jobs = [
|
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
|
for job in jobs
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -195,3 +207,137 @@ async def client_list(client_id: int, db):
|
||||||
print("NOTTTTTTTTTTTTTTTTTTTTTTTTTTTTT")
|
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")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue