Reminder/bot/utils/otask_api.py

105 lines
4.6 KiB
Python
Raw Normal View History

2024-10-24 19:19:30 +00:00
from datetime import datetime
import aiohttp # Для выполнения HTTP-запросов
from loguru import logger
async def get_user_teams(token):
url = "https://api.otask.ru/api/v1/teams"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
"Accept": "application/json"
}
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers) as response:
if response.status == 200:
teams = await response.json()
# logger.info(teams)
slugs = []
for group in teams['data']['teams']:
# logger.info(group)
# logger.info(group['slug'])
slugs.append(group['slug'])
logger.info(slugs)
return slugs
else:
print(f"Failed to get teams. Status code: {response.status}")
return None
async def get_client_name(token, ws_slug, client_id):
"""Получаем имя клиента по его идентификатору (client_id)."""
url = f"https://api.otask.ru/api/v1/ws/{ws_slug}/clients"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
"Accept": "application/json",
}
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers) as response:
if response.status == 200:
data = await response.json()
clients = data.get('data', {}).get('clients', [])
# Ищем клиента по client_id в списке клиентов
for client in clients:
if client.get('id') == client_id:
return client
else:
logger.error(f"Failed to get client info for workspace {ws_slug}. Status code: {response.status}")
return None
async def get_regular_projects(token):
slugs = await get_user_teams(token) # Получаем все слуги команд пользователя
regular_projects = [] # Список для хранения регулярных проектов
for slug in slugs:
url = f"https://api.otask.ru/api/v1/ws/{slug}/panel/projects"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
"Accept": "application/json",
}
params = {
"is_regular": "true"
}
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers, params=params) as response:
if response.status == 200:
data = await response.json() # Получаем все проекты
# Извлекаем проекты из ответа
projects = data.get('data', {}).get('projects', []).get('data', [])
for p in projects:
if p['end_at'] is not None:
end_at = datetime.fromisoformat(p['end_at'].replace("Z", "+00:00"))
difference_in_days = end_at.date().day - datetime.utcnow().date().day
if difference_in_days == 0: # Наступила дата платежа
project_info = {
'name': p.get('name', 'Неизвестный проект'),
'amount': p.get('amount', 'Неизвестная сумма')}
client_id = p.get('client_id','')
if client_id:
client = await get_client_name(token, slug, client_id)
project_info['first_name'] = client.get('first_name', 'Неизвестный клиент')
project_info["description"] = ''
if client['description']:
project_info["description"] = client["description"]
regular_projects.append(project_info)
else:
pass # логика для регулярного проекта в котором нет даты платежа
# Фильтруем регулярные проекты
else:
logger.error(f"Failed to get projects for workspace {slug}. Status code: {response.status}")
return regular_projects