Reminder/bot/utils/otask_api.py
2024-10-24 22:19:30 +03:00

105 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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