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
 | 
			
		||||
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")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										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 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())
 | 
			
		||||
							
								
								
									
										148
									
								
								utils/clients.py
								
								
								
								
							
							
						
						
									
										148
									
								
								utils/clients.py
								
								
								
								
							| 
						 | 
				
			
			@ -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")
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue