September 11, 2024

Убираем префикс [XXX-XX] для задач, импортированных в weeek из Jira

Ниже python3 скрипт, который помогает решить эту задачу.

Нужно указать свой токен в API_TOKEN, вот инструкция, где его взять https://weeek.net/ru/help/workspace/integracii/api

Если в задачах нет ничего остро конфиденциального, то выполнить код можно в облачном сервисе выполнения кода (на свой страх и риск), в этом случае стоит сразу после выполнения кода удалить использованный токен из weeek. Полностью безопасный способ – запустить скрипт непосредственно со своего компьютера.

import re
import requests

# Ваш Bearer токен для авторизации в API Weeek
API_TOKEN = ""
BASE_URL = "https://api.weeek.net/public/v1/tm"

def get_headers():
    """Возвращает заголовки с авторизацией."""
    return {
        "Authorization": f"Bearer {API_TOKEN}",
        "Content-Type": "application/json"
    }
    
def get_projects():
    """Получает список проектов."""
    response = requests.get(f"{BASE_URL}/projects", headers=get_headers())
    if response.status_code == 200:
        return response.json().get("projects", [])
    else:
        print(f"Ошибка получения проектов: {response.status_code}")
        return []
        
def get_tasks(project_id):
    """Получает список всех задач для указанного проекта с поддержкой пагинации."""
    tasks = []
    per_page = 100  # количество задач на страницу
    offset = 0
    while True:
        params = {
            "projectId": project_id,
            "perPage": per_page,
            "offset": offset,
            "all": 1
        }
        response = requests.get(f"{BASE_URL}/tasks", headers=get_headers(), params=params)
        print(response.url)
        # Логируем ответ для диагностики
        print(f"Ответ API для проекта {project_id}: {response.status_code}, {response.text}")
        if response.status_code == 200:
            data = response.json()
            tasks_batch = data.get("tasks", [])
            tasks.extend(tasks_batch)
            # если задач меньше, чем per_page, значит мы получили все задачи
            if len(tasks_batch) < per_page:
                break
            offset += per_page  # увеличиваем смещение для следующей страницы
        else:
            print(f"Ошибка получения задач для проекта {project_id}: {response.status_code}")
            break
    return tasks
    
def update_task(task_id, new_title):
    """Обновляет задачу с новым названием."""
    url = f"{BASE_URL}/tasks/{task_id}"
    data = {"title": new_title}
    response = requests.put(url, headers=get_headers(), json=data)
    if response.status_code == 200:
        print(f"Задача {task_id} успешно обновлена")
    else:
        print(f"Ошибка обновления задачи {task_id}: {response.status_code}")
        
def clean_task_title(title):
    """Удаляет подстроку в квадратных скобках из названия задачи."""
    return re.sub(r"\[.*?\]\s*", "", title)
    
def process_tasks_in_project(project_id):
    """Обрабатывает задачи в указанном проекте."""
    print(f"Обрабатываю проект с ID: {project_id}")
    tasks = get_tasks(project_id)
    for task in tasks:
        old_title = task.get("title", "")
        new_title = clean_task_title(old_title)
        if old_title != new_title:
            update_task(task["id"], new_title)
            
def main():
    projects = get_projects()
    for project in projects:
        print(f"Обработка проекта: {project['title']} (ID: {project['id']})")
        process_tasks_in_project(project["id"])
        
if __name__ == "__main__":
    main()