Compare commits

...

59 Commits

Author SHA1 Message Date
27166314af refactor(resolved_tasks):add secrets to the .env 2024-03-27 12:51:11 +05:00
Angelina Tingaeva
d73a2da3e6 refactor(resolved_task): make full search 2023-12-14 14:37:46 +05:00
Angelina Tingaeva
98137f11f2 fix(mapping_close_tasks):may be i have done it 2023-12-13 00:03:35 +05:00
Angelina Tingaeva
992e99b25f refactor(mapping): create status closed for tasks_completed 2023-12-12 16:14:44 +05:00
f3cac73622 fix(close_tasks): improper endpoints and data structure manipulation 2023-12-11 19:45:36 +05:00
Angelina Tingaeva
c36858f891 refactor(resolved_tasks):create logs for control the API-answer 2023-12-11 17:21:38 +05:00
Angelina Tingaeva
e1e199c53f refactor(resolved_tasks):add check for getting answer-issue, try to get tasks in response 2023-12-11 17:05:28 +05:00
Angelina Tingaeva
2edd6fd3df feat(resolved): create func for make tasks with resolved statuses 2023-12-10 21:17:56 +05:00
Angelina Tingaeva
f552c08b33 ауфе 2023-12-10 21:15:45 +05:00
0b668f85c5 refactor(core): general refactor for subtasks and their nested mapping 2023-12-08 17:55:38 +05:00
fe39119518 fix(core): a set of data inconsistencies and minor bugs 2023-12-08 15:04:51 +05:00
Angelina Tingaeva
c7cd5dbd1b refactor(mapping_parent):new param for url to take parent_data 2023-12-07 17:53:18 +05:00
Angelina Tingaeva
de1be5a536 refactor(mappping): set the limit for task creation 2023-12-07 16:44:29 +05:00
Angelina Tingaeva
bb26424787 refactor(mappin_parent): change arg for assign_parent_task -> task, for baseurl take task[id] 2023-12-06 19:25:16 +05:00
Angelina Tingaeva
c76bb23c6d refactor(mapping_parent): one more try ti create parent task 2023-12-06 16:08:36 +05:00
Angelina Tingaeva
2a5778bfe4 fix(mapping): check gid in task 2023-12-06 13:50:09 +05:00
Angelina Tingaeva
10eadc8a95 fix(mapping_parent): fix the way(arr) to call the parent func 2023-12-06 13:14:24 +05:00
Angelina Tingaeva
a6961cb19a refactor(mapping): change attr for get_parent_task_ids to task 2023-12-05 18:34:12 +05:00
Angelina Tingaeva
af2805d793 refactor(parent_mapping): check for gid existing 2023-12-05 18:29:31 +05:00
Angelina Tingaeva
24a409cfcf check for gid existing 2023-12-05 18:26:18 +05:00
Angelina Tingaeva
915be612a3 refactor(mapping): add task_parent not last version 2023-12-05 17:04:11 +05:00
Angelina Tingaeva
52deaacf3a refactor(mapping): refactor logging for updating data_parent 2023-12-05 12:50:02 +05:00
Angelina Tingaeva
b703cfbd7c refactor(mapping): refactor uploading with logging 2023-12-05 11:09:26 +05:00
Angelina Tingaeva
528e76f3ee refactor(mapping): refactor updating data and create messages about updating yandex tracker data with parent task 2023-12-05 02:08:07 +05:00
Angelina Tingaeva
007ca43a43 refactor(mapping)delete unusable strings 2023-12-04 11:30:59 +05:00
Angelina Tingaeva
7613b7da06 refeactor(mapping): make global var for queue 2023-12-04 11:23:30 +05:00
Angelina Tingaeva
ad9621641f refeactor(logging): try to encode logs 2023-12-04 11:04:16 +05:00
98c09a6f9c chore: merge commits 2023-12-01 12:13:34 +05:00
b643ba6271 chore(logging): a bunch of corrections in logging - codepage, setting logger file name e.t.c 2023-12-01 12:06:03 +05:00
Angelina Tingaeva
9f7a57e8aa refactor(mapping): try to create mapping for parent tasks 2023-11-30 20:47:05 +05:00
Angelina Tingaeva
f6a7724f4e refactor(logging): create logs for show request and response after running mapping.py 2023-11-30 12:38:52 +05:00
Angelina Tingaeva
3c6221ad90 refactor(mapping): add task_tatus 2023-11-29 14:08:36 +05:00
Angelina Tingaeva
8546782a22 fix(readme): correct some tags 2023-11-29 12:17:23 +05:00
Angelina Tingaeva
9f662ed620 refactor(readme.md): add new information about functions of the project 2023-11-29 12:14:47 +05:00
Angelina Tingaeva
64c730ad18 refactor(mapping): delete unusable parts of skript (with "#") 2023-11-29 11:53:30 +05:00
Angelina Tingaeva
d528153b0f fix(assignee): change "segavol" to "segavol.dev" 2023-11-29 11:11:46 +05:00
Angelina Tingaeva
957fd6403f fix(mapping): make Asana_ assignee avaliable for YaTracker (except "segavol" - he has a problem) 2023-11-29 10:31:23 +05:00
Angelina Tingaeva
b6016d47b3 fix(mapping): fix domen for createdBy on 96 str 2023-11-28 16:09:48 +05:00
Angelina Tingaeva
3d255b4bfd refactor(mapping): mask assignee in def transform_data(data), change in 90 str "...else "dr.cyrill" 2023-11-28 16:01:00 +05:00
37660a6e31 chore(mapping): changed oAuth token to administrative one and removed mail domain from logins as excessive 2023-11-28 14:44:09 +05:00
Angelina Tingaeva
14605476c8 refactor(mapping): make new token, mask Python client because of OAuth 2023-11-27 23:09:21 +05:00
Angelina Tingaeva
31f2c6b972 refactor(mapping): include .log in .gitignore 2023-11-27 21:34:09 +05:00
Angelina Tingaeva
b354d408b2 refactor(mapping): include logging 2023-11-27 21:22:57 +05:00
db4f1b66e3 chore(mapping): set API endpoint to _import 2023-11-27 17:22:04 +05:00
5c037fe68d fix(mapping): numerous fixes in specs and mappings 2023-11-27 17:18:51 +05:00
Angelina Tingaeva
a1e86ba7bf refactor(mapping_users): making csv users_Dict, try to fill assignee 2023-11-27 12:59:57 +05:00
Angelina Tingaeva
45be4dc36e feat(users): skript form mapping users in assignee for YaTracker 2023-11-27 03:21:10 +05:00
Angelina Tingaeva
8c39c31f43 refactor(mapping):not push 2023-11-24 23:43:27 +05:00
67ced5c4db fix(core): baby one more time - base_url = https://api.tracker.yandex.net/v2/issues 2023-11-24 16:34:54 +05:00
4cbaf1c457 fix(core): incorrect base_url and X-Org-ID values 2023-11-24 14:22:19 +05:00
Angelina Tingaeva
b3175bda4e refactor(mapping): add TESTIMPORT 2023-11-24 13:33:17 +05:00
Angelina Tingaeva
bdd6b2ab67 refactor(mapping): correct host 2023-11-24 13:06:02 +05:00
aa30f555a4 fix(core): base_url and queue params were wrong 2023-11-24 12:50:34 +05:00
Angelina Tingaeva
0d2508c204 refactor(mapping): correct base urland content type 2023-11-24 12:31:40 +05:00
Angelina Tingaeva
4ca5ee7f27 refactor(mapping): correct headers according to Ya_T Documentation 2023-11-24 11:59:05 +05:00
Angelina Tingaeva
de88475e40 refactor(mapping): add uft-8, create new YandexToken, use in transformed_data data["data"], delete main(),refactor open file 2023-11-23 23:41:28 +05:00
Angelina Tingaeva
01a05c045d refactor(mapping): add utf8, шеукф
first iteration on data["data"]/Users/angelinatingaeva/HEADO_1/Mapping_ya_tracker/venv/bin/python /Users/angelinatingaeva/HEADO_1/Mapping_ya_tracker/mapping.py
/-
-.
2023-11-23 21:44:55 +05:00
6cb1f3aae5 chore(mapping): separated csv users map file to conventional directory 2023-11-23 11:28:13 +05:00
f4bf32c223 chore(mapping): added ya.tracker user logins to csv 2023-11-23 11:26:33 +05:00
11 changed files with 1026 additions and 648 deletions

2
.gitignore vendored
View File

@@ -122,6 +122,8 @@ celerybeat.pid
# Environments
.env
.log
.logs
.venv
env/
venv/

View File

@@ -7,21 +7,36 @@
| поля json Asana | поля json Яндекс Трекер | Описание поля |
| ------ | ------ | ------ |
| "gid" | "id" | "Идентификатор" |
| "name" | "name" | "Наименование" |
| "name" | "summary" | "Наименование" |
| "notes" | "descriptions" | "Описание задачи" |
| "created_at" | "createdAt" | "Дата создания задачи" |
| "due_on" | "deadline" | "Срок завершения задачи- дэдлайн" |
| "assignee" | "assignee" | "Логин или идентификатор исполнителя" |
| "section" | "milestone" | "Категория" |
| "memberships" | "memberships" | "Участники задачи" |
| " - " | "parent" | "Связка с родительской задачей" |
| "completed" | "status" | "Степень завершения" |
## Бонусом - можно получить ключевую информацию об участниках задач в Asana
- ✨ Name ✨
- ✨ ID (GID - по версии Asana) ✨
## Созданные файлы:
## Созданный файл:
| ✨ output.csv ✨ | выгруженные данные по участникам задач в Asana |
| ✨ users.mapping.asana2ya.csv ✨ | выгруженные данные по участникам задач в Asana |
> файл нужен для подгрузки в поле assignee.
## Для подгрузки задач в Яндекс Трекер используются:
- ```bash
base_url: 'https://api.tracker.yandex.net/v2/issues/_import'
```
- headers:
- ✨ 'Host': 'api.tracker.yandex.net' ✨
- ✨ 'Authorization': 'OAuth <token>' ✨
- ✨ 'X-Org-ID': <ID>
- ✨ 'Content-Type': 'appication/json' ✨
## Возможные ответы на запросы:
- ✨ при статусе 201 - 'Задача успешно создана в ЯндексТрекер' ✨
- ✨ в ином случае (при ошибке) - 'Ошибка при создании задачи в ЯндексТрекер:' ✨

View File

@@ -3,7 +3,6 @@ import json
import os
import sys
base_dir = os.path.dirname(os.path.realpath(__file__))
asana_data_json = os.path.join(base_dir, './data/data_asana.json')
@@ -33,7 +32,7 @@ def extract_unique_names_and_ids(data):
def export_to_csv(unique_names, unique_ids):
with open("output.csv", "w", newline="") as csvfile:
with open("users.mapping.asana2ya.csv", "w", newline="") as csvfile:
writer = csv.writer(csvfile, delimiter=",")
writer.writerow(["Name", "ID"])

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,9 @@
Name,ID,ya_login
Сергей Анисов,2495641457848,sergey.dev
Diza,2495641457856,irina.ux
Никита,547756841476,nikita
Cyrill Gafarov,2934206415688,dr.cyrill
Илья,1203071663735925,dr.cyrill
Sergey Volodin,1202859655765863,segavol.dev
Malkova,698025068994499,malkova.content
IrinaOs,1204278463134045,irina.ux
1 Name ID ya_login
2 Сергей Анисов 2495641457848 sergey.dev
3 Diza 2495641457856 irina.ux
4 Никита 547756841476 nikita
5 Cyrill Gafarov 2934206415688 dr.cyrill
6 Илья 1203071663735925 dr.cyrill
7 Sergey Volodin 1202859655765863 segavol.dev
8 Malkova 698025068994499 malkova.content
9 IrinaOs 1204278463134045 irina.ux

52
logging_config.py Normal file
View File

@@ -0,0 +1,52 @@
import logging
import logging.handlers
import sys
sys.stdin.reconfigure(encoding='utf-8')
sys.stdout.reconfigure(encoding='utf-8')
def setup_logging(name):
""" Создание логгера """
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
""" Создание обработчика для записи логов в файл """
file_handler = logging.FileHandler(
filename=f"{name}.log",
mode='w',
encoding='utf-8',
delay=True
)
file_handler.setLevel(logging.DEBUG)
""" Создание обработчика для вывода логов на консоль """
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
""" Форматтер для вывода в файл """
file_formatter = logging.Formatter(
'%(asctime)s [%(levelname)s] [%(name)s] - %(message)s'
)
""" Форматтер для вывода на консоль """
console_formatter = logging.Formatter(
'%(asctime)s [%(levelname)s] [%(name)s] - %(message)s'
)
""" Добавление форматтеров в обработчики """
file_handler.setFormatter(file_formatter)
console_handler.setFormatter(console_formatter)
""" Добавление обработчиков в логгер """
logger.addHandler(file_handler)
logger.addHandler(console_handler)
return logger

View File

@@ -1,33 +1,77 @@
import csv
import json
import os
import sys
import time
import requests
from yandex_tracker_client import TrackerClient
client = TrackerClient(
token='YANDEX_TRACKER_TOKEN',
org_id='ORG_ID'
)
YANDEX_TRACKER_TOKEN = 'y0_AgAEA7qkfTFqAArTqQAAAADyduv806rRKh8MS6GOg01ZdwPE-F4ZHuQ'
ORG_ID = '35d164dcf81e48f2b6a532f4badddd33'
from logging_config import setup_logging
from urllib.parse import urlencode
logger = setup_logging(__name__)
base_dir = os.path.dirname(os.path.realpath(__file__))
asana_data_json = os.path.join(base_dir, './data/data_asana.json')
users_data = os.path.join(base_dir, './data/users.mapping.asana2ya.csv')
sys.stdin.reconfigure(encoding='utf-8')
sys.stdout.reconfigure(encoding='utf-8')
# ниже функция для случаев, когда не будет готового файла для импорта
# def get_data_from_asana():
# """ Получение данных из Asana """
QUEUE_NAME = 'TESTIMPORT'
# headers = {
# 'Authorization': 'ASANA_TOKEN',
# }
# response = requests.get('https://api.asana.com/projects/PROJECT_ID/tasks', headers=headers)
# data = response.json()
# return data
headers = {
'Host': 'api.tracker.yandex.net',
'Authorization': 'OAuth y0_AgAEA7qkB3KjAArkXwAAAADzMlP9oR1lwMzBS2e94jHzdnII8Laxi7k',
'X-Org-ID': '7095769',
'Content-Type': 'appication/json',
}
def get_assignee_data():
""" Получение данных для поля assignee """
mapping = {}
with open(users_data, 'r', encoding="utf8") as csv_file:
reader = csv.DictReader(csv_file)
for row in reader:
asana_id = row['ID']
ya_login = row['ya_login']
mapping[asana_id] = ya_login
return mapping
assignee = get_assignee_data()
def get_task_status(task):
""" Получение данных о статусе задачи """
if task.get('completed') is True:
status = 'resolved'
completed_at = task.get('completed_at', '')
else:
status = 'open'
completed_at = ''
return status, completed_at
# здесь функция для дальнейшей работы с parent
def get_parent_task_ids(task, ya_imported_task_response):
""" Получение соответствий между идентификаторами подзадач в Асане и Яндекс Трекере """
parent_task_ids = {}
if task.get('parent') and 'gid' in task['parent']:
parent_gid = task['parent']['gid']
if parent_gid in ya_imported_task_response:
parent_id = ya_imported_task_response[parent_gid]
parent_task_ids[task['gid']] = parent_id
return parent_task_ids
def transform_data(data):
@@ -35,64 +79,167 @@ def transform_data(data):
transformed_data = []
for task in data:
status, completed_at = get_task_status(task)
transformed_task = {
'gid': task['gid'],
'summary': task['name'],
'description': task['notes'],
'createdAt': task['created_at'],
'deadline': task['due_on'],
'assignee': task['assignee'],
'milestone': task['section'],
# 'memberships': task['memberships'],
# 'parent': task[''],
'status': task['completed'],
'status': status,
'completedAt': completed_at,
'parent': task['parent'],
'subtasks': transform_data(task['subtasks'])
}
transformed_data.append(transformed_task)
return transformed_data
def create_tasks_in_tracker(data):
def create_task(task):
base_url = 'https://api.tracker.yandex.net/v2/issues/_import'
print(task)
if task.get('assignee') and 'gid' in task['assignee']:
ya_assignee = assignee.get(task['assignee']['gid'], 'dr.cyrill')
else:
ya_assignee = 'dr.cyrill'
payload = {
'queue': QUEUE_NAME,
'summary': task['summary'],
'description': task['description'],
'createdAt': task['createdAt'],
'createdBy': 'dr.cyrill',
'deadline': task['deadline'],
'assignee': ya_assignee,
'status': task['status'],
}
logger.debug('Request: %s', json.dumps(payload))
response = requests.post(
base_url,
headers=headers,
data=json.dumps(payload),
params=urlencode({'parent': task['parent']}) # добавила параметр для parent в url-запрос
)
if response.status_code == 201:
print('Задача успешно создана в ЯндексТрекер')
# здесь добавлено про родительскую задачу
return response.json()['id']
else:
print(
'Ошибка при создании задачи в ЯндексТрекер:',
response.content,
)
logger.debug('Response: %s', response.content)
def create_tasks_in_tracker(data, limit=10):
""" Создание задач в ЯндексТрекер """
base_url = 'https://api.tracker.yandex.net/v2/issues'
datalen = (len(data) if limit==-1 else min(limit, len(data)))
logger.info('Import started. Task count: %d', datalen)
# этот датасет тоже для parent добавлен
ya_imported_task_response = {}
for i in range(datalen):
task = data[i]
task_id = create_task(task)
logger.info('Created task id = %s',task_id)
for subtask in task['subtasks']:
logger.info('Found subtask gid = %s for id = %s',subtask['gid'], task_id)
subtask_id = create_task(subtask)
assign_parent_task(subtask_id, task_id)
# и эта функция для родительской задачи написана
def assign_parent_task(task_id, parent_id):
""" Назначение родительской задачи """
base_url = f'https://api.tracker.yandex.net/v2/issues/{task_id}'
headers = {
'Authorization': 'YANDEX_TRACKER_TOKEN',
'Content-Type': 'asana_data_json',
'Host': 'api.tracker.yandex.net',
'Authorization': 'OAuth y0_AgAEA7qkB3KjAArkXwAAAADzMlP9oR1lwMzBS2e94jHzdnII8Laxi7k',
'X-Org-ID': '7095769',
'Content-Type': 'application/json',
}
for task in data:
payload = {
'summary': task['summary'],
'description': task['description'],
'createdAt': task['createdAt'],
'deadline': task['deadline'],
'assignee': task['assignee'],
'milestone': task['milestone'],
# 'memberships': task['memberships'],
# 'parent': task['parent'],
'status': task['status'],
payload = {
'parent': parent_id,
}
logger.debug('Request: %s', json.dumps(payload))
response = requests.patch(
base_url,
headers=headers,
data=json.dumps(payload),
)
if response.status_code == 200:
print('Родительская задача успешно назначена')
logger.info('Task %s successfully assigned a parent',task_id)
else:
print('Ошибка при назначении родительской задачи:', response.content)
logger.debug('Response: %s', response.content)
time.sleep(1) # добавляем задержку перед следующим запросом к API
# здесь я закончила добавлять про родительскую задачу с большой надеждой
# пробую закрыть задачи уже в Трекере
def close_tasks_for_completedAt(queue_name):
base_url = 'https://api.tracker.yandex.net/v2/issues/_search'
payload = {
"filter": {
"queue": queue_name,
"status": "resolved" # Фильтр для задач cо статусом closed
}
response = requests.post(
base_url,
headers=headers,
data=json.dumps(payload),
)
if response.status_code == 201:
print('Задача успешно создана в ЯндексТрекер')
else:
print(
'Ошибка при создании задачи в ЯндексТрекер:',
response.content,
}
response = requests.post(
base_url,
headers=headers,
data=json.dumps(payload)
)
if response.status_code == 200:
logger.debug('Response: %s', response.content)
tasks = response.json()
for task in tasks:
task_id = task['id']
close_payload = {
'resolution': 'fixed'
}
close_url = f'https://api.tracker.yandex.net/v2/issues/{task_id}/transitions/close/_execute'
print(close_url)
print(headers)
close_response = requests.post(
close_url,
headers=headers,
data=json.dumps(close_payload)
)
if close_response.status_code == 200:
print(f'Задача {task_id} закрыта успешно')
else:
print(f'Ошибка при закрытии задачи {task_id}: {close_response.content}')
else:
print(f'Ошибка при получении задач для очереди {queue_name}: {response.content}')
def main():
""" Основная функция для переноса данных """
# asana_data = get_data_from_asana()
with open(asana_data_json, 'r') as file:
asana_data = json.load(file)
# return asana_data
yandex_tracker_data = transform_data(asana_data)
create_tasks_in_tracker(yandex_tracker_data)
file = open(asana_data_json, "r", encoding="utf8")
json_data = json.loads(file.read())
# Запуск основной функции
main()
yandex_tracker_data = transform_data(json_data['data'])
create_tasks_in_tracker(yandex_tracker_data, limit=3)
close_tasks_for_completedAt('TESTIMPORT')

82
mapping_logging.bak Normal file
View File

@@ -0,0 +1,82 @@
import logging
import requests
import textwrap
class HttpFormatter(logging.Formatter):
def _formatHeaders(self, d):
return '\n'.join(f'{k}: {v}' for k, v in d.items())
def formatMessage(self, record):
result = super().formatMessage(record)
if record.name == 'httplogger':
result += textwrap.dedent('''
---------------- request ----------------
{req.method} {req.url}
{reqhdrs}
{req.body}
---------------- response ----------------
{res.status_code} {res.reason} {res.url}
{reshdrs}
{res.text}
''').format(
req=record.req,
res=record.res,
reqhdrs=self._formatHeaders(record.req.headers),
reshdrs=self._formatHeaders(record.res.headers),
)
return result
formatter = HttpFormatter('{asctime} {levelname} {name} {message}', style='{')
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logging.basicConfig(level=logging.DEBUG, handlers=[handler])
logger = logging.getLogger('httplogger')
def logRoundtrip(response, *args, **kwargs):
extra = {'req': response.request, 'res': response}
logger.debug('HTTP roundtrip', extra=extra)
session = requests.Session()
session.hooks['response'].append(logRoundtrip)
session.get('http://secariolabs.com')
# ya_imported_task_response = response.json()
# if task.get('parent'):
# parent_task_gid = task['parent']['gid']
# if parent_task_gid in ya_imported_task_response:
# parent_task_id = ya_imported_task_response[parent_task_gid]['id']
# logger.debug(f'В задаче {task["summary"]} есть связка "parent"', ensure_ascii=False)
# update_parent_task(
# base_url,
# headers,
# ya_imported_task_response['id'],
# parent_task_id,
# )
# def update_parent_task(base_url, headers, task_id, parent_task_id):
# """ Обновление данных родительской задачи в ЯндексТрекере"""
# data = {
# 'parent': parent_task_id
# }
# payload = json.dumps(data)
# update_url = f"{base_url}/{task_id}"
# response = requests.post(update_url, headers=headers, data=payload)
# result = json.loads(response.text)
# logger.warning(json.dumps(result, ensure_ascii=False))
# if response.status_code == 200:
# logger.info('Данные о связи с задачей "parent" успешно обновлены')
# else:
# logger.error(
# 'Ошибка при обновлении данных о связи с задачей "parent": %s',
# response.content,
# )

View File

@@ -1,9 +0,0 @@
Name,ID
Сергей Анисов,2495641457848
Diza,2495641457856
Никита,547756841476
Cyrill Gafarov,2934206415688
Илья,1203071663735925
Sergey Volodin,1202859655765863
Malkova,698025068994499
IrinaOs,1204278463134045
1 Name ID
2 Сергей Анисов 2495641457848
3 Diza 2495641457856
4 Никита 547756841476
5 Cyrill Gafarov 2934206415688
6 Илья 1203071663735925
7 Sergey Volodin 1202859655765863
8 Malkova 698025068994499
9 IrinaOs 1204278463134045

View File

@@ -1,6 +1,7 @@
certifi==2023.11.17
charset-normalizer==3.3.2
idna==3.4
dotenv==1.0.1
requests==2.31.0
setuptools==69.0.0
six==1.16.0

78
resolved_task.py Normal file
View File

@@ -0,0 +1,78 @@
import json
import os
import sys
import requests
from dotenv import load_dotenv
from logging_config import setup_logging
load_dotenv()
logger = setup_logging(__name__)
base_dir = os.path.dirname(os.path.realpath(__file__))
asana_data_json = os.path.join(base_dir, './data/data_asana.json')
users_data = os.path.join(base_dir, './data/users.mapping.asana2ya.csv')
sys.stdin.reconfigure(encoding='utf-8')
sys.stdout.reconfigure(encoding='utf-8')
QUEUE_NAME = 'TESTIMPORT'
TOKEN = os.getenv('TOKEN')
def close_tasks_in_queue(queue_name):
base_url = 'https://api.tracker.yandex.net/v2/issues/_search'
# base_url = 'https://api.tracker.yandex.net/v2/issues/_search?expand=transitions'
headers = {
'Host': 'api.tracker.yandex.net',
'Authorization': TOKEN,
'X-Org-ID': '7095769',
'Content-Type': 'application/json',
}
payload = {
"filter": {
"queue": queue_name,
"status": "open" # Фильтр для открытых задач в указанной очереди
}
}
while True:
response = requests.post(
base_url,
headers=headers,
data=json.dumps(payload)
)
if response.status_code == 200:
logger.debug('Response: %s', response.content)
tasks = response.json()
for task in tasks:
task_id = task['id']
close_payload = {
'resolution': 'fixed'
}
close_url = f'https://api.tracker.yandex.net/v2/issues/{task_id}/transitions/close/_execute'
print(close_url)
print(headers)
close_response = requests.post(
close_url,
headers=headers,
data=json.dumps(close_payload)
)
if close_response.status_code == 200:
print(f'Задача {task_id} закрыта успешно')
else:
print(f'Ошибка при закрытии задачи {task_id}: {close_response.content}')
else:
print(f'Ошибка при получении задач для очереди {queue_name}: {response.content}')
# Вызов функции для закрытия задач в очереди 'TESTIMPORT'
close_tasks_in_queue('TESTIMPORT')