From fe391195184a15558f06e7092c857222617bf419 Mon Sep 17 00:00:00 2001 From: cyrill Date: Fri, 8 Dec 2023 15:04:51 +0500 Subject: [PATCH] fix(core): a set of data inconsistencies and minor bugs --- data/data_asana.json | 1146 +++++++++++++++++++++--------------------- mapping.py | 11 +- 2 files changed, 582 insertions(+), 575 deletions(-) diff --git a/data/data_asana.json b/data/data_asana.json index 8d55891..9df8508 100644 --- a/data/data_asana.json +++ b/data/data_asana.json @@ -1,5 +1,577 @@ { - "data" : [ { + "data" : [ + { + "gid" : "457376420809493", + "actual_time_minutes" : null, + "assignee" : null, + "assignee_status" : "upcoming", + "completed" : true, + "completed_at" : "2022-05-06T05:16:29.979Z", + "created_at" : "2017-10-19T06:20:28.338Z", + "due_at" : null, + "due_on" : null, + "followers" : [ { + "gid" : "547756841476", + "name" : "Cyrill Gafarov", + "resource_type" : "user" + } ], + "hearted" : false, + "hearts" : [ ], + "liked" : false, + "likes" : [ ], + "memberships" : [ { + "project" : { + "gid" : "201687425733831", + "name" : "Client Apps & Mobile", + "resource_type" : "project" + }, + "section" : { + "gid" : "1140785061810538", + "name" : "IOS", + "resource_type" : "section" + } + } ], + "modified_at" : "2022-05-06T05:16:30.211Z", + "name" : "Проект \"Тикеты\" ", + "notes" : "- Статусы сообщений\n- Микроформы в сообщениях\n- Отсылка действий по микроформам", + "num_hearts" : 0, + "num_likes" : 0, + "parent" : null, + "permalink_url" : "https://app.asana.com/0/201687425733831/457376420809493", + "projects" : [ { + "gid" : "201687425733831", + "name" : "Client Apps & Mobile", + "resource_type" : "project" + } ], + "resource_type" : "task", + "start_at" : null, + "start_on" : null, + "subtasks" : [ { + "gid" : "457377095930132", + "actual_time_minutes" : null, + "assignee" : { + "gid" : "547756841476", + "name" : "Cyrill Gafarov", + "resource_type" : "user" + }, + "assignee_status" : "inbox", + "assignee_section" : { + "gid" : "1200306169594716", + "name" : "Recently assigned", + "resource_type" : "section" + }, + "completed" : false, + "completed_at" : null, + "created_at" : "2017-10-19T06:21:24.168Z", + "due_at" : null, + "due_on" : null, + "followers" : [ { + "gid" : "547756841476", + "name" : "Cyrill Gafarov", + "resource_type" : "user" + }, { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, { + "gid" : "2495641457856", + "name" : "Никита", + "resource_type" : "user" + } ], + "hearted" : false, + "hearts" : [ ], + "liked" : false, + "likes" : [ ], + "memberships" : [ ], + "modified_at" : "2017-12-11T19:09:50.991Z", + "name" : "Отсылка статуса \"Сообщение принято\"", + "notes" : "- По факту принятия: messageReceived ( $msgId )\n\n#UPD.1.\n- Добавил в пейлоад пуша msgId - это уникальный идентификатор сообщения, поэтому надо передавать его в messageReceived() вместо id, который увязан с chatId.", + "num_hearts" : 0, + "num_likes" : 0, + "parent" : { + "gid" : "457376420809493", + "name" : "Проект \"Тикеты\" ", + "resource_type" : "task", + "resource_subtype" : "default_task" + }, + "permalink_url" : "https://app.asana.com/0/457377095930132/457377095930132", + "projects" : [ ], + "resource_type" : "task", + "start_at" : null, + "start_on" : null, + "subtasks" : [ ], + "tags" : [ { + "gid" : "7403887251262", + "name" : "mobile", + "resource_type" : "tag" + }, { + "gid" : "302272184133465", + "name" : "ios", + "resource_type" : "tag" + } ], + "resource_subtype" : "default_task", + "workspace" : { + "gid" : "547756841482", + "name" : "Atomic munkeys", + "resource_type" : "workspace" + } + }, { + "gid" : "496230370096158", + "actual_time_minutes" : null, + "assignee" : { + "gid" : "547756841476", + "name" : "Cyrill Gafarov", + "resource_type" : "user" + }, + "assignee_status" : "inbox", + "assignee_section" : { + "gid" : "1200306169594716", + "name" : "Recently assigned", + "resource_type" : "section" + }, + "completed" : false, + "completed_at" : null, + "created_at" : "2017-12-06T05:37:20.063Z", + "due_at" : null, + "due_on" : null, + "followers" : [ { + "gid" : "547756841476", + "name" : "Cyrill Gafarov", + "resource_type" : "user" + }, { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, { + "gid" : "2495641457856", + "name" : "Никита", + "resource_type" : "user" + } ], + "hearted" : false, + "hearts" : [ ], + "liked" : false, + "likes" : [ ], + "memberships" : [ ], + "modified_at" : "2017-12-15T22:07:17.885Z", + "name" : "Микроформы в сообщениях и действия", + "notes" : "- Чаты вперёд!\n- Вместе с прошлой моделью сообщений в них chat() начали приходить дополнительные поля\n-- msgid (глобальный идентификатор сообщения BIGINT)\n-- actions (доступный набор действий для сообщения)\n---  Пример: \"actions\": [ \n {\n                        \"id\": \"accept\", /* Идентификатор действия */ \n                            \"title\": \"Принять\", /* Заголовок кнопки действия */\n                            \"enabed\": false, /* Статус кнопки - доступна к нажатию или нет */\n                            \"selected\": true /* Признак выбранного действия */ \n                        },\n                        {\n \"id\": \"reject\",\n                            \"title\": \"Нет на складе\",\n                            \"eventId\": 21, /* Опциональный идентификатор события по действию - пока резервед */\n                            \"enabed\": false,\n                            \"selected\": false\n                        }\n                    },\n-- Интерфейс микроформы https://xd.adobe.com/view/8934b09e-ad69-4385-9425-a23a9ea95366/\n--- Предусматриваемое кол-во действий : 1-3\n-- При нажатии на кнопку вызываем pAPI.messageAction( msgid, action )\n--- msgid = chat.message.msgid\n--- action = chat.message.actions => ключ действия нажатой кнопки\n--- метод вернёт модель сообщения как в chat().messages, то бишь обновляем состояния кнопок", + "num_hearts" : 0, + "num_likes" : 0, + "parent" : { + "gid" : "457376420809493", + "name" : "Проект \"Тикеты\" ", + "resource_type" : "task", + "resource_subtype" : "default_task" + }, + "permalink_url" : "https://app.asana.com/0/496230370096158/496230370096158", + "projects" : [ ], + "resource_type" : "task", + "start_at" : null, + "start_on" : null, + "subtasks" : [ ], + "tags" : [ { + "gid" : "302272184133465", + "name" : "ios", + "resource_type" : "tag" + } ], + "resource_subtype" : "default_task", + "workspace" : { + "gid" : "547756841482", + "name" : "Atomic munkeys", + "resource_type" : "workspace" + } + } ], + "tags" : [ ], + "resource_subtype" : "default_task", + "workspace" : { + "gid" : "547756841482", + "name" : "Atomic munkeys", + "resource_type" : "workspace" + } + }, { + "gid" : "744094396222300", + "actual_time_minutes" : null, + "assignee" : null, + "assignee_status" : "upcoming", + "completed" : true, + "completed_at" : "2022-05-06T05:16:31.991Z", + "created_at" : "2018-07-16T04:13:31.023Z", + "due_at" : null, + "due_on" : null, + "followers" : [ { + "gid" : "547756841476", + "name" : "Cyrill Gafarov", + "resource_type" : "user" + } ], + "hearted" : false, + "hearts" : [ ], + "liked" : false, + "likes" : [ ], + "memberships" : [ { + "project" : { + "gid" : "201687425733831", + "name" : "Client Apps & Mobile", + "resource_type" : "project" + }, + "section" : { + "gid" : "1140785061810538", + "name" : "IOS", + "resource_type" : "section" + } + } ], + "modified_at" : "2022-05-06T05:16:32.153Z", + "name" : "Проект \"Задачи\" / Газон", + "notes" : "- Новый интерфейс таск-менеджера ", + "num_hearts" : 0, + "num_likes" : 0, + "parent" : null, + "permalink_url" : "https://app.asana.com/0/201687425733831/744094396222300", + "projects" : [ { + "gid" : "201687425733831", + "name" : "Client Apps & Mobile", + "resource_type" : "project" + } ], + "resource_type" : "task", + "start_at" : null, + "start_on" : null, + "subtasks" : [ { + "gid" : "744094396222304", + "actual_time_minutes" : null, + "assignee" : { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, + "assignee_status" : "inbox", + "completed" : true, + "completed_at" : "2018-08-10T08:44:56.071Z", + "created_at" : "2018-07-16T04:13:31.286Z", + "due_at" : null, + "due_on" : null, + "followers" : [ { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, { + "gid" : "547756841476", + "name" : "Cyrill Gafarov", + "resource_type" : "user" + } ], + "hearted" : false, + "hearts" : [ ], + "liked" : false, + "likes" : [ ], + "memberships" : [ ], + "modified_at" : "2018-08-10T08:44:56.950Z", + "name" : "Общие реформы проекта \"Задачи\"", + "notes" : "- В меню https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A456&scaling=min-zoom\n-- Переносим пункт \"Контакты\" - в контекстное меню в Чаты\n-- Появляется пункт \"Задачи\" - каунтеры из ticketSummary() за сегодня events[].done/events[].failed\n\n", + "num_hearts" : 0, + "num_likes" : 0, + "parent" : { + "gid" : "744094396222300", + "name" : "Проект \"Задачи\" / Газон", + "resource_type" : "task", + "resource_subtype" : "default_task" + }, + "permalink_url" : "https://app.asana.com/0/744094396222304/744094396222304", + "projects" : [ ], + "resource_type" : "task", + "start_at" : null, + "start_on" : null, + "subtasks" : [ ], + "tags" : [ { + "gid" : "302272184133465", + "name" : "ios", + "resource_type" : "tag" + } ], + "resource_subtype" : "default_task", + "workspace" : { + "gid" : "547756841482", + "name" : "Atomic munkeys", + "resource_type" : "workspace" + } + }, { + "gid" : "744094396222306", + "actual_time_minutes" : null, + "assignee" : { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, + "assignee_status" : "inbox", + "completed" : true, + "completed_at" : "2018-08-20T20:31:20.607Z", + "created_at" : "2018-07-16T04:13:31.464Z", + "due_at" : null, + "due_on" : null, + "followers" : [ { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, { + "gid" : "547756841476", + "name" : "Cyrill Gafarov", + "resource_type" : "user" + } ], + "hearted" : false, + "hearts" : [ ], + "liked" : false, + "likes" : [ ], + "memberships" : [ ], + "modified_at" : "2018-08-20T20:31:20.828Z", + "name" : "Задачи (Инбокс)", + "notes" : "- https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A376&scaling=min-zoom\n- https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A282&scaling=min-zoom\n- В Инбкосе отображается сгруппированная по хронологии и видам задач количественная информация о задачах\n-- В каунтерах инбокса пишем /\n-- если есть priority == true, то рисуем иконку алерта\n-- По умолчанию отображаем саммари на сегодня\n-- С помощью нижнего плейсхолдера идём по истории по неделям\n-- Фильтр - дейтпикер, позволяет выбрать произвольный период\n- pAPI.ticketSummary(filters) \n- IN.filters: { \"dateFrom\": ,\"dateTo\": },\n- OUT: {\n- \"items\": [ // Раскладка по хронологии (по дням) и по доступным видам задач\n     { \n\t   \"day\": ,\n\t   \"events\": [\n\t      {\n\t\t    \"eventId\": ,\n\t\t\t\"title\": <Название>,\n \"priority\": ,\n\t\t\t\"failed\": ,\n\t\t\t\"done\": ,\n\t\t\t\"inprocess\": \n\t\t  },..\n\t   }\n\t   \n\t }\n  ]\n- \"total\": {\n   \"failed\": ,\n   \"done\" : ,\n   \"inprocess\": \n }\n}\n\n#UPD.1.\n- См. мокапы: добавлен общий каунтер (в скобках у названия) для каждого раздела = inprocess+done+failed\n\n#UPD.2\n- См. мокапы - появилась \"пустая\" страничка", + "num_hearts" : 0, + "num_likes" : 0, + "parent" : { + "gid" : "744094396222300", + "name" : "Проект \"Задачи\" / Газон", + "resource_type" : "task", + "resource_subtype" : "default_task" + }, + "permalink_url" : "https://app.asana.com/0/744094396222306/744094396222306", + "projects" : [ ], + "resource_type" : "task", + "start_at" : null, + "start_on" : null, + "subtasks" : [ ], + "tags" : [ { + "gid" : "302272184133465", + "name" : "ios", + "resource_type" : "tag" + } ], + "resource_subtype" : "default_task", + "workspace" : { + "gid" : "547756841482", + "name" : "Atomic munkeys", + "resource_type" : "workspace" + } + }, { + "gid" : "744094396222308", + "actual_time_minutes" : null, + "assignee" : { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, + "assignee_status" : "inbox", + "completed" : true, + "completed_at" : "2018-08-23T20:19:33.696Z", + "created_at" : "2018-07-16T04:13:32.088Z", + "due_at" : null, + "due_on" : null, + "followers" : [ { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, { + "gid" : "547756841476", + "name" : "Cyrill Gafarov", + "resource_type" : "user" + } ], + "hearted" : false, + "hearts" : [ ], + "liked" : false, + "likes" : [ ], + "memberships" : [ ], + "modified_at" : "2022-12-03T07:26:16.038Z", + "name" : "Интерфейс работы с Тикет-пакетами", + "notes" : "- https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A529&scaling=min-zoom\n- Тикет-пакет - это список задач, объединённый по признаку общих: Вида задачи, Торговой точки, Даты выполнения и Исполнителя\n-- Поэтому шапка максимаьно общая, в списке самих задач только статусы и их брифы в сокращённом виде (<= 3 задачи с возможностю развернуть)\n-- При клике на шапку пакета переходим в детальный интерфейс тикет-пакета https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A660&scaling=min-zoom\n--- Здесь запросов не делаем, т.к. модель уже получена\n-- При удержании на элементе списка - интерфейс переключается в выделение элементов списка https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A824&scaling=min-zoom\n--- Это работает как для общего списка Тикет-пакетов, так и для детального интерфейса просмотра Тикет-пакета\n--- в контекстном меню выбора - список доступных действий по пакету, выполняется для всех выбранных\n-- Можно вызвать контекстное меню на отдельный задачу - те же действия из actions\n-- При клике на Задачу переходим в интерфейс детальной информации по Задаче\n- pAPI.ticketBatches(filters)\n- Получает данные для выбора вида и хронологии из Инбокса\n- IN.filters: { \"eventId\" : , \"dateFrom\": }\n- OUT: [\n  {\n<#UPD.3> id: \n    \"created\": ,\n\t\"address\": ,\n\t\"assignee\": { \n\t    \"id\" : ,\n\t    \"name\": ,\n\t\t\"role\": \n\t},\t\n\t\"duedate\": ,\n\t\"karma\": ,\n\t\"priority\": ,\n\t\"tickets\" : [\n\t   {\n          \"id\": ,\n\t\t  \"text\": ,\n\t\t  \"status_id\": ,\n<#UPD.5>\n\t\"actions\": [\n\t  {\n\t   \"id\" : ,\n\t   \"title\": ,\n\t  }\n\t]\n\n\t   },..\n\t]\n  },..\n]\n\n- Действие с Задачами:\n-- Сервер определяет легитимность действия для каждой задачи и может просто не применить действие на задаче, на котором это действие уже невозможно, поэтому здесь никаких проверок не делаем.\n-- pAPI.ticketAction(ticketsId, actionId [, params = false])\n-- IN.ticketsId = [,...]\n-- IN.actionId = \n-- IN.params (опционально) = <Объект FFU>\n-- OUT:  {\n--- \"tickets\": [ { // Обновлённое состояние зацепленных задач\n----    \"id\": ,\n----\t\"text\" : ,\n----\t\"status_id\" : \n  } ],...\n}\n\n- Кодировка статусов:\n-- const STATUS_PREPARING = 0;\n-- const STATUS_SENT = 5;\n-- const STATUS_DELIVERED = 10;\n-- const STATUS_REMIND_LATER = 15;\n-- const STATUS_SEEN = 20;\n<#UPD.4>\n-- const STATUS_ALERTED = 21\n\n-- const STATUS_REJECTED = 25;\n-- const STATUS_ESCALATED = 30;\n-- const STATUS_FAILED = 40;\n-- const STATUS_USER_RESOLVED = 50;\n-- const STATUS_RESOLVED = 100;\n-- const STATUS_DELETED = 150;\n\n\n\n\n#UPD.1.\n- status >> status_id\n\n#UPD.2. \n- Мап status_id в иконки. В датасетах будут приходить только эти статусы на данном этапе\n-- const STATUS_SENT => sent_icon\n-- const STATUS_DELIVERED => delivered_icon\n-- const STATUS_REMIND_LATER => prorogued_icon\n-- const STATUS_SEEN = seen_icon\n-- const STATUS_REJECTED => declined_icon;\n-- const STATUS_ESCALATED => escalated_icon;\n-- const STATUS_FAILED => undone_icon;\n-- const STATUS_USER_RESOLVED => done_icon;\n-- const STATUS_RESOLVED => done_icon;\n-- const STATUS_DELETED = deleted_icon;\n\n#UPD.3.\n- batch теперь получил id\n- Появился метод ticketBatch($batchId) - модель элемента идентична\n-- Переход на детальный экран батча по заголовку пакета из списка или по \"Показать ещё N элементов\"\n\n#UPD.4\n-- Добавлен доп-статус STATUS_ALERTED (21) - ему надо поставить в соответствие иконку алерта (треугольник с восклицательным знаком)\n\n#UPD.5.\n- actions перенесены из батчевой модели в модель тикета\n-- При мультиселекте брать экшоны из первого выбранного тикета.", + "num_hearts" : 0, + "num_likes" : 0, + "parent" : { + "gid" : "744094396222300", + "name" : "Проект \"Задачи\" / Газон", + "resource_type" : "task", + "resource_subtype" : "default_task" + }, + "permalink_url" : "https://app.asana.com/0/744094396222308/744094396222308", + "projects" : [ ], + "resource_type" : "task", + "start_at" : null, + "start_on" : null, + "subtasks" : [ ], + "tags" : [ { + "gid" : "302272184133465", + "name" : "ios", + "resource_type" : "tag" + } ], + "resource_subtype" : "default_task", + "workspace" : { + "gid" : "547756841482", + "name" : "Atomic munkeys", + "resource_type" : "workspace" + } + }, { + "gid" : "744094396222310", + "actual_time_minutes" : null, + "assignee" : { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, + "assignee_status" : "inbox", + "completed" : true, + "completed_at" : "2018-08-10T08:44:56.071Z", + "created_at" : "2018-07-16T04:13:32.257Z", + "due_at" : null, + "due_on" : null, + "followers" : [ { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, { + "gid" : "547756841476", + "name" : "Cyrill Gafarov", + "resource_type" : "user" + } ], + "hearted" : false, + "hearts" : [ ], + "liked" : false, + "likes" : [ ], + "memberships" : [ ], + "modified_at" : "2018-08-10T08:44:56.237Z", + "name" : "Детальная информация по Задаче", + "notes" : "- Карточка задачи\n- pAPI.ticket(ticketId)\n- IN.ticketId: \n- OUT: {\n    \"id\": ,\n \"title\" : ,\n    \"text\": ,\n    \"created\": ,\n\t\"address\": ,\n\t\"assignee\": { \n\t    \"id\" : ,\n\t    \"name\": ,\n\t\t\"role\": \n\t},\t\n\t\"duedate\": ,\n\t\"karma\": ,\n\t\"priority\": ,\n\t\"status\": {\n \"id\" : ,\n \"title\" : ,\n \"datetime\": ,\n }\n\t],\n\t\"actions\": [\n\t  {\n\t   \"id\" : ,\n\t   \"title\": ,\n\t  }\n\t]\n}\n\n#UPD.1. \n- Добавил statusdate для даты текущего статуса - пускай будет\n#UPD.2.\n- Первели status в модель вообще.", + "num_hearts" : 0, + "num_likes" : 0, + "parent" : { + "gid" : "744094396222300", + "name" : "Проект \"Задачи\" / Газон", + "resource_type" : "task", + "resource_subtype" : "default_task" + }, + "permalink_url" : "https://app.asana.com/0/744094396222310/744094396222310", + "projects" : [ ], + "resource_type" : "task", + "start_at" : null, + "start_on" : null, + "subtasks" : [ ], + "tags" : [ { + "gid" : "302272184133465", + "name" : "ios", + "resource_type" : "tag" + } ], + "resource_subtype" : "default_task", + "workspace" : { + "gid" : "547756841482", + "name" : "Atomic munkeys", + "resource_type" : "workspace" + } + }, { + "gid" : "744094396222312", + "actual_time_minutes" : null, + "assignee" : { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, + "assignee_status" : "inbox", + "completed" : true, + "completed_at" : "2018-08-10T08:44:53.400Z", + "created_at" : "2018-07-16T04:13:32.420Z", + "due_at" : null, + "due_on" : null, + "followers" : [ { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + } ], + "hearted" : false, + "hearts" : [ ], + "liked" : false, + "likes" : [ ], + "memberships" : [ ], + "modified_at" : "2018-08-10T08:44:53.525Z", + "name" : "История задачи", + "notes" : "- Тут всё просто - список вешек\n- https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A192&scaling=min-zoom\n- pAPI.ticketHistory(ticketId)\n-- IN.ticketId = \n-- OUT: [ {\n--- \"id\": \n--- \"title\" : ,\n--- \"user\" : {\n---- \"id\" : ,\n---- \"name\" : ,\n---- \"role\" : \n--- },\n--- \"datetime\" : ,\n--- \"current\" : \n } ]", + "num_hearts" : 0, + "num_likes" : 0, + "parent" : { + "gid" : "744094396222300", + "name" : "Проект \"Задачи\" / Газон", + "resource_type" : "task", + "resource_subtype" : "default_task" + }, + "permalink_url" : "https://app.asana.com/0/744094396222312/744094396222312", + "projects" : [ ], + "resource_type" : "task", + "start_at" : null, + "start_on" : null, + "subtasks" : [ ], + "tags" : [ { + "gid" : "302272184133465", + "name" : "ios", + "resource_type" : "tag" + } ], + "resource_subtype" : "default_task", + "workspace" : { + "gid" : "547756841482", + "name" : "Atomic munkeys", + "resource_type" : "workspace" + } + }, { + "gid" : "782006182531534", + "actual_time_minutes" : null, + "assignee" : { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + }, + "assignee_status" : "inbox", + "completed" : true, + "completed_at" : "2018-08-28T17:12:13.376Z", + "created_at" : "2018-08-17T04:34:09.506Z", + "due_at" : null, + "due_on" : null, + "followers" : [ { + "gid" : "547756841476", + "name" : "Cyrill Gafarov", + "resource_type" : "user" + }, { + "gid" : "2495641457848", + "name" : "Илья", + "resource_type" : "user" + } ], + "hearted" : false, + "hearts" : [ ], + "liked" : false, + "likes" : [ ], + "memberships" : [ ], + "modified_at" : "2018-08-28T17:12:13.641Z", + "name" : "Кастомные пуши по задачам", + "notes" : "- в data у нас есть event, который по умолчанию \"message\" - это чатовый пуш, так уж повелось, но появились новые event:\n-- ticketbatch\n--- Наряду с ним в data приходит ticketBatchId (bigint)\n--- Если получаем, то пишем mbody и отсылаем в экран ticektBatch(ticketBatchId)\n-- ticket\n--- Наряду с ним в data приходит ticketId (bigint)\n--- Если получаем, то пишем mbody и отсылаем в экран ticekt(ticketId)\n\n#UPD.1\n- В ticketbatch и ticket добавил msgId (они всё равно приходят в чаты)\n-- Соответственно, на эти пуши тоже надо слать соответствующий messageReceived(msgId)\n\n", + "num_hearts" : 0, + "num_likes" : 0, + "parent" : { + "gid" : "744094396222300", + "name" : "Проект \"Задачи\" / Газон", + "resource_type" : "task", + "resource_subtype" : "default_task" + }, + "permalink_url" : "https://app.asana.com/0/782006182531534/782006182531534", + "projects" : [ ], + "resource_type" : "task", + "start_at" : null, + "start_on" : null, + "subtasks" : [ ], + "tags" : [ { + "gid" : "1159486457487", + "name" : "PARTNERS", + "resource_type" : "tag" + }, { + "gid" : "302272184133465", + "name" : "ios", + "resource_type" : "tag" + } ], + "resource_subtype" : "default_task", + "workspace" : { + "gid" : "547756841482", + "name" : "Atomic munkeys", + "resource_type" : "workspace" + } + }, + { "gid" : "1185035033109793", "actual_time_minutes" : null, "assignee" : { @@ -2162,577 +2734,7 @@ "name" : "Atomic munkeys", "resource_type" : "workspace" } - }, { - "gid" : "457376420809493", - "actual_time_minutes" : null, - "assignee" : null, - "assignee_status" : "upcoming", - "completed" : true, - "completed_at" : "2022-05-06T05:16:29.979Z", - "created_at" : "2017-10-19T06:20:28.338Z", - "due_at" : null, - "due_on" : null, - "followers" : [ { - "gid" : "547756841476", - "name" : "Cyrill Gafarov", - "resource_type" : "user" - } ], - "hearted" : false, - "hearts" : [ ], - "liked" : false, - "likes" : [ ], - "memberships" : [ { - "project" : { - "gid" : "201687425733831", - "name" : "Client Apps & Mobile", - "resource_type" : "project" - }, - "section" : { - "gid" : "1140785061810538", - "name" : "IOS", - "resource_type" : "section" - } - } ], - "modified_at" : "2022-05-06T05:16:30.211Z", - "name" : "Проект \"Тикеты\" ", - "notes" : "- Статусы сообщений\n- Микроформы в сообщениях\n- Отсылка действий по микроформам", - "num_hearts" : 0, - "num_likes" : 0, - "parent" : null, - "permalink_url" : "https://app.asana.com/0/201687425733831/457376420809493", - "projects" : [ { - "gid" : "201687425733831", - "name" : "Client Apps & Mobile", - "resource_type" : "project" - } ], - "resource_type" : "task", - "start_at" : null, - "start_on" : null, - "subtasks" : [ { - "gid" : "457377095930132", - "actual_time_minutes" : null, - "assignee" : { - "gid" : "547756841476", - "name" : "Cyrill Gafarov", - "resource_type" : "user" - }, - "assignee_status" : "inbox", - "assignee_section" : { - "gid" : "1200306169594716", - "name" : "Recently assigned", - "resource_type" : "section" - }, - "completed" : false, - "completed_at" : null, - "created_at" : "2017-10-19T06:21:24.168Z", - "due_at" : null, - "due_on" : null, - "followers" : [ { - "gid" : "547756841476", - "name" : "Cyrill Gafarov", - "resource_type" : "user" - }, { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, { - "gid" : "2495641457856", - "name" : "Никита", - "resource_type" : "user" - } ], - "hearted" : false, - "hearts" : [ ], - "liked" : false, - "likes" : [ ], - "memberships" : [ ], - "modified_at" : "2017-12-11T19:09:50.991Z", - "name" : "Отсылка статуса \"Сообщение принято\"", - "notes" : "- По факту принятия: messageReceived ( $msgId )\n\n#UPD.1.\n- Добавил в пейлоад пуша msgId - это уникальный идентификатор сообщения, поэтому надо передавать его в messageReceived() вместо id, который увязан с chatId.", - "num_hearts" : 0, - "num_likes" : 0, - "parent" : { - "gid" : "457376420809493", - "name" : "Проект \"Тикеты\" ", - "resource_type" : "task", - "resource_subtype" : "default_task" - }, - "permalink_url" : "https://app.asana.com/0/457377095930132/457377095930132", - "projects" : [ ], - "resource_type" : "task", - "start_at" : null, - "start_on" : null, - "subtasks" : [ ], - "tags" : [ { - "gid" : "7403887251262", - "name" : "mobile", - "resource_type" : "tag" - }, { - "gid" : "302272184133465", - "name" : "ios", - "resource_type" : "tag" - } ], - "resource_subtype" : "default_task", - "workspace" : { - "gid" : "547756841482", - "name" : "Atomic munkeys", - "resource_type" : "workspace" - } - }, { - "gid" : "496230370096158", - "actual_time_minutes" : null, - "assignee" : { - "gid" : "547756841476", - "name" : "Cyrill Gafarov", - "resource_type" : "user" - }, - "assignee_status" : "inbox", - "assignee_section" : { - "gid" : "1200306169594716", - "name" : "Recently assigned", - "resource_type" : "section" - }, - "completed" : false, - "completed_at" : null, - "created_at" : "2017-12-06T05:37:20.063Z", - "due_at" : null, - "due_on" : null, - "followers" : [ { - "gid" : "547756841476", - "name" : "Cyrill Gafarov", - "resource_type" : "user" - }, { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, { - "gid" : "2495641457856", - "name" : "Никита", - "resource_type" : "user" - } ], - "hearted" : false, - "hearts" : [ ], - "liked" : false, - "likes" : [ ], - "memberships" : [ ], - "modified_at" : "2017-12-15T22:07:17.885Z", - "name" : "Микроформы в сообщениях и действия", - "notes" : "- Чаты вперёд!\n- Вместе с прошлой моделью сообщений в них chat() начали приходить дополнительные поля\n-- msgid (глобальный идентификатор сообщения BIGINT)\n-- actions (доступный набор действий для сообщения)\n---  Пример: \"actions\": [ \n {\n                        \"id\": \"accept\", /* Идентификатор действия */ \n                            \"title\": \"Принять\", /* Заголовок кнопки действия */\n                            \"enabed\": false, /* Статус кнопки - доступна к нажатию или нет */\n                            \"selected\": true /* Признак выбранного действия */ \n                        },\n                        {\n \"id\": \"reject\",\n                            \"title\": \"Нет на складе\",\n                            \"eventId\": 21, /* Опциональный идентификатор события по действию - пока резервед */\n                            \"enabed\": false,\n                            \"selected\": false\n                        }\n                    },\n-- Интерфейс микроформы https://xd.adobe.com/view/8934b09e-ad69-4385-9425-a23a9ea95366/\n--- Предусматриваемое кол-во действий : 1-3\n-- При нажатии на кнопку вызываем pAPI.messageAction( msgid, action )\n--- msgid = chat.message.msgid\n--- action = chat.message.actions => ключ действия нажатой кнопки\n--- метод вернёт модель сообщения как в chat().messages, то бишь обновляем состояния кнопок", - "num_hearts" : 0, - "num_likes" : 0, - "parent" : { - "gid" : "457376420809493", - "name" : "Проект \"Тикеты\" ", - "resource_type" : "task", - "resource_subtype" : "default_task" - }, - "permalink_url" : "https://app.asana.com/0/496230370096158/496230370096158", - "projects" : [ ], - "resource_type" : "task", - "start_at" : null, - "start_on" : null, - "subtasks" : [ ], - "tags" : [ { - "gid" : "302272184133465", - "name" : "ios", - "resource_type" : "tag" - } ], - "resource_subtype" : "default_task", - "workspace" : { - "gid" : "547756841482", - "name" : "Atomic munkeys", - "resource_type" : "workspace" - } - } ], - "tags" : [ ], - "resource_subtype" : "default_task", - "workspace" : { - "gid" : "547756841482", - "name" : "Atomic munkeys", - "resource_type" : "workspace" - } - }, { - "gid" : "744094396222300", - "actual_time_minutes" : null, - "assignee" : null, - "assignee_status" : "upcoming", - "completed" : true, - "completed_at" : "2022-05-06T05:16:31.991Z", - "created_at" : "2018-07-16T04:13:31.023Z", - "due_at" : null, - "due_on" : null, - "followers" : [ { - "gid" : "547756841476", - "name" : "Cyrill Gafarov", - "resource_type" : "user" - } ], - "hearted" : false, - "hearts" : [ ], - "liked" : false, - "likes" : [ ], - "memberships" : [ { - "project" : { - "gid" : "201687425733831", - "name" : "Client Apps & Mobile", - "resource_type" : "project" - }, - "section" : { - "gid" : "1140785061810538", - "name" : "IOS", - "resource_type" : "section" - } - } ], - "modified_at" : "2022-05-06T05:16:32.153Z", - "name" : "Проект \"Задачи\" / Газон", - "notes" : "- Новый интерфейс таск-менеджера ", - "num_hearts" : 0, - "num_likes" : 0, - "parent" : null, - "permalink_url" : "https://app.asana.com/0/201687425733831/744094396222300", - "projects" : [ { - "gid" : "201687425733831", - "name" : "Client Apps & Mobile", - "resource_type" : "project" - } ], - "resource_type" : "task", - "start_at" : null, - "start_on" : null, - "subtasks" : [ { - "gid" : "744094396222304", - "actual_time_minutes" : null, - "assignee" : { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, - "assignee_status" : "inbox", - "completed" : true, - "completed_at" : "2018-08-10T08:44:56.071Z", - "created_at" : "2018-07-16T04:13:31.286Z", - "due_at" : null, - "due_on" : null, - "followers" : [ { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, { - "gid" : "547756841476", - "name" : "Cyrill Gafarov", - "resource_type" : "user" - } ], - "hearted" : false, - "hearts" : [ ], - "liked" : false, - "likes" : [ ], - "memberships" : [ ], - "modified_at" : "2018-08-10T08:44:56.950Z", - "name" : "Общие реформы проекта \"Задачи\"", - "notes" : "- В меню https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A456&scaling=min-zoom\n-- Переносим пункт \"Контакты\" - в контекстное меню в Чаты\n-- Появляется пункт \"Задачи\" - каунтеры из ticketSummary() за сегодня events[].done/events[].failed\n\n", - "num_hearts" : 0, - "num_likes" : 0, - "parent" : { - "gid" : "744094396222300", - "name" : "Проект \"Задачи\" / Газон", - "resource_type" : "task", - "resource_subtype" : "default_task" - }, - "permalink_url" : "https://app.asana.com/0/744094396222304/744094396222304", - "projects" : [ ], - "resource_type" : "task", - "start_at" : null, - "start_on" : null, - "subtasks" : [ ], - "tags" : [ { - "gid" : "302272184133465", - "name" : "ios", - "resource_type" : "tag" - } ], - "resource_subtype" : "default_task", - "workspace" : { - "gid" : "547756841482", - "name" : "Atomic munkeys", - "resource_type" : "workspace" - } - }, { - "gid" : "744094396222306", - "actual_time_minutes" : null, - "assignee" : { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, - "assignee_status" : "inbox", - "completed" : true, - "completed_at" : "2018-08-20T20:31:20.607Z", - "created_at" : "2018-07-16T04:13:31.464Z", - "due_at" : null, - "due_on" : null, - "followers" : [ { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, { - "gid" : "547756841476", - "name" : "Cyrill Gafarov", - "resource_type" : "user" - } ], - "hearted" : false, - "hearts" : [ ], - "liked" : false, - "likes" : [ ], - "memberships" : [ ], - "modified_at" : "2018-08-20T20:31:20.828Z", - "name" : "Задачи (Инбокс)", - "notes" : "- https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A376&scaling=min-zoom\n- https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A282&scaling=min-zoom\n- В Инбкосе отображается сгруппированная по хронологии и видам задач количественная информация о задачах\n-- В каунтерах инбокса пишем /\n-- если есть priority == true, то рисуем иконку алерта\n-- По умолчанию отображаем саммари на сегодня\n-- С помощью нижнего плейсхолдера идём по истории по неделям\n-- Фильтр - дейтпикер, позволяет выбрать произвольный период\n- pAPI.ticketSummary(filters) \n- IN.filters: { \"dateFrom\": ,\"dateTo\": },\n- OUT: {\n- \"items\": [ // Раскладка по хронологии (по дням) и по доступным видам задач\n     { \n\t   \"day\": ,\n\t   \"events\": [\n\t      {\n\t\t    \"eventId\": ,\n\t\t\t\"title\": <Название>,\n \"priority\": ,\n\t\t\t\"failed\": ,\n\t\t\t\"done\": ,\n\t\t\t\"inprocess\": \n\t\t  },..\n\t   }\n\t   \n\t }\n  ]\n- \"total\": {\n   \"failed\": ,\n   \"done\" : ,\n   \"inprocess\": \n }\n}\n\n#UPD.1.\n- См. мокапы: добавлен общий каунтер (в скобках у названия) для каждого раздела = inprocess+done+failed\n\n#UPD.2\n- См. мокапы - появилась \"пустая\" страничка", - "num_hearts" : 0, - "num_likes" : 0, - "parent" : { - "gid" : "744094396222300", - "name" : "Проект \"Задачи\" / Газон", - "resource_type" : "task", - "resource_subtype" : "default_task" - }, - "permalink_url" : "https://app.asana.com/0/744094396222306/744094396222306", - "projects" : [ ], - "resource_type" : "task", - "start_at" : null, - "start_on" : null, - "subtasks" : [ ], - "tags" : [ { - "gid" : "302272184133465", - "name" : "ios", - "resource_type" : "tag" - } ], - "resource_subtype" : "default_task", - "workspace" : { - "gid" : "547756841482", - "name" : "Atomic munkeys", - "resource_type" : "workspace" - } - }, { - "gid" : "744094396222308", - "actual_time_minutes" : null, - "assignee" : { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, - "assignee_status" : "inbox", - "completed" : true, - "completed_at" : "2018-08-23T20:19:33.696Z", - "created_at" : "2018-07-16T04:13:32.088Z", - "due_at" : null, - "due_on" : null, - "followers" : [ { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, { - "gid" : "547756841476", - "name" : "Cyrill Gafarov", - "resource_type" : "user" - } ], - "hearted" : false, - "hearts" : [ ], - "liked" : false, - "likes" : [ ], - "memberships" : [ ], - "modified_at" : "2022-12-03T07:26:16.038Z", - "name" : "Интерфейс работы с Тикет-пакетами", - "notes" : "- https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A529&scaling=min-zoom\n- Тикет-пакет - это список задач, объединённый по признаку общих: Вида задачи, Торговой точки, Даты выполнения и Исполнителя\n-- Поэтому шапка максимаьно общая, в списке самих задач только статусы и их брифы в сокращённом виде (<= 3 задачи с возможностю развернуть)\n-- При клике на шапку пакета переходим в детальный интерфейс тикет-пакета https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A660&scaling=min-zoom\n--- Здесь запросов не делаем, т.к. модель уже получена\n-- При удержании на элементе списка - интерфейс переключается в выделение элементов списка https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A824&scaling=min-zoom\n--- Это работает как для общего списка Тикет-пакетов, так и для детального интерфейса просмотра Тикет-пакета\n--- в контекстном меню выбора - список доступных действий по пакету, выполняется для всех выбранных\n-- Можно вызвать контекстное меню на отдельный задачу - те же действия из actions\n-- При клике на Задачу переходим в интерфейс детальной информации по Задаче\n- pAPI.ticketBatches(filters)\n- Получает данные для выбора вида и хронологии из Инбокса\n- IN.filters: { \"eventId\" : , \"dateFrom\": }\n- OUT: [\n  {\n<#UPD.3> id: \n    \"created\": ,\n\t\"address\": ,\n\t\"assignee\": { \n\t    \"id\" : ,\n\t    \"name\": ,\n\t\t\"role\": \n\t},\t\n\t\"duedate\": ,\n\t\"karma\": ,\n\t\"priority\": ,\n\t\"tickets\" : [\n\t   {\n          \"id\": ,\n\t\t  \"text\": ,\n\t\t  \"status_id\": ,\n<#UPD.5>\n\t\"actions\": [\n\t  {\n\t   \"id\" : ,\n\t   \"title\": ,\n\t  }\n\t]\n\n\t   },..\n\t]\n  },..\n]\n\n- Действие с Задачами:\n-- Сервер определяет легитимность действия для каждой задачи и может просто не применить действие на задаче, на котором это действие уже невозможно, поэтому здесь никаких проверок не делаем.\n-- pAPI.ticketAction(ticketsId, actionId [, params = false])\n-- IN.ticketsId = [,...]\n-- IN.actionId = \n-- IN.params (опционально) = <Объект FFU>\n-- OUT:  {\n--- \"tickets\": [ { // Обновлённое состояние зацепленных задач\n----    \"id\": ,\n----\t\"text\" : ,\n----\t\"status_id\" : \n  } ],...\n}\n\n- Кодировка статусов:\n-- const STATUS_PREPARING = 0;\n-- const STATUS_SENT = 5;\n-- const STATUS_DELIVERED = 10;\n-- const STATUS_REMIND_LATER = 15;\n-- const STATUS_SEEN = 20;\n<#UPD.4>\n-- const STATUS_ALERTED = 21\n\n-- const STATUS_REJECTED = 25;\n-- const STATUS_ESCALATED = 30;\n-- const STATUS_FAILED = 40;\n-- const STATUS_USER_RESOLVED = 50;\n-- const STATUS_RESOLVED = 100;\n-- const STATUS_DELETED = 150;\n\n\n\n\n#UPD.1.\n- status >> status_id\n\n#UPD.2. \n- Мап status_id в иконки. В датасетах будут приходить только эти статусы на данном этапе\n-- const STATUS_SENT => sent_icon\n-- const STATUS_DELIVERED => delivered_icon\n-- const STATUS_REMIND_LATER => prorogued_icon\n-- const STATUS_SEEN = seen_icon\n-- const STATUS_REJECTED => declined_icon;\n-- const STATUS_ESCALATED => escalated_icon;\n-- const STATUS_FAILED => undone_icon;\n-- const STATUS_USER_RESOLVED => done_icon;\n-- const STATUS_RESOLVED => done_icon;\n-- const STATUS_DELETED = deleted_icon;\n\n#UPD.3.\n- batch теперь получил id\n- Появился метод ticketBatch($batchId) - модель элемента идентична\n-- Переход на детальный экран батча по заголовку пакета из списка или по \"Показать ещё N элементов\"\n\n#UPD.4\n-- Добавлен доп-статус STATUS_ALERTED (21) - ему надо поставить в соответствие иконку алерта (треугольник с восклицательным знаком)\n\n#UPD.5.\n- actions перенесены из батчевой модели в модель тикета\n-- При мультиселекте брать экшоны из первого выбранного тикета.", - "num_hearts" : 0, - "num_likes" : 0, - "parent" : { - "gid" : "744094396222300", - "name" : "Проект \"Задачи\" / Газон", - "resource_type" : "task", - "resource_subtype" : "default_task" - }, - "permalink_url" : "https://app.asana.com/0/744094396222308/744094396222308", - "projects" : [ ], - "resource_type" : "task", - "start_at" : null, - "start_on" : null, - "subtasks" : [ ], - "tags" : [ { - "gid" : "302272184133465", - "name" : "ios", - "resource_type" : "tag" - } ], - "resource_subtype" : "default_task", - "workspace" : { - "gid" : "547756841482", - "name" : "Atomic munkeys", - "resource_type" : "workspace" - } - }, { - "gid" : "744094396222310", - "actual_time_minutes" : null, - "assignee" : { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, - "assignee_status" : "inbox", - "completed" : true, - "completed_at" : "2018-08-10T08:44:56.071Z", - "created_at" : "2018-07-16T04:13:32.257Z", - "due_at" : null, - "due_on" : null, - "followers" : [ { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, { - "gid" : "547756841476", - "name" : "Cyrill Gafarov", - "resource_type" : "user" - } ], - "hearted" : false, - "hearts" : [ ], - "liked" : false, - "likes" : [ ], - "memberships" : [ ], - "modified_at" : "2018-08-10T08:44:56.237Z", - "name" : "Детальная информация по Задаче", - "notes" : "- Карточка задачи\n- pAPI.ticket(ticketId)\n- IN.ticketId: \n- OUT: {\n    \"id\": ,\n \"title\" : ,\n    \"text\": ,\n    \"created\": ,\n\t\"address\": ,\n\t\"assignee\": { \n\t    \"id\" : ,\n\t    \"name\": ,\n\t\t\"role\": \n\t},\t\n\t\"duedate\": ,\n\t\"karma\": ,\n\t\"priority\": ,\n\t\"status\": {\n \"id\" : ,\n \"title\" : ,\n \"datetime\": ,\n }\n\t],\n\t\"actions\": [\n\t  {\n\t   \"id\" : ,\n\t   \"title\": ,\n\t  }\n\t]\n}\n\n#UPD.1. \n- Добавил statusdate для даты текущего статуса - пускай будет\n#UPD.2.\n- Первели status в модель вообще.", - "num_hearts" : 0, - "num_likes" : 0, - "parent" : { - "gid" : "744094396222300", - "name" : "Проект \"Задачи\" / Газон", - "resource_type" : "task", - "resource_subtype" : "default_task" - }, - "permalink_url" : "https://app.asana.com/0/744094396222310/744094396222310", - "projects" : [ ], - "resource_type" : "task", - "start_at" : null, - "start_on" : null, - "subtasks" : [ ], - "tags" : [ { - "gid" : "302272184133465", - "name" : "ios", - "resource_type" : "tag" - } ], - "resource_subtype" : "default_task", - "workspace" : { - "gid" : "547756841482", - "name" : "Atomic munkeys", - "resource_type" : "workspace" - } - }, { - "gid" : "744094396222312", - "actual_time_minutes" : null, - "assignee" : { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, - "assignee_status" : "inbox", - "completed" : true, - "completed_at" : "2018-08-10T08:44:53.400Z", - "created_at" : "2018-07-16T04:13:32.420Z", - "due_at" : null, - "due_on" : null, - "followers" : [ { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - } ], - "hearted" : false, - "hearts" : [ ], - "liked" : false, - "likes" : [ ], - "memberships" : [ ], - "modified_at" : "2018-08-10T08:44:53.525Z", - "name" : "История задачи", - "notes" : "- Тут всё просто - список вешек\n- https://www.figma.com/proto/fz22CSD1NDYhxvy04lUc4rCu/Tasks_iOs?node-id=362%3A192&scaling=min-zoom\n- pAPI.ticketHistory(ticketId)\n-- IN.ticketId = \n-- OUT: [ {\n--- \"id\": \n--- \"title\" : ,\n--- \"user\" : {\n---- \"id\" : ,\n---- \"name\" : ,\n---- \"role\" : \n--- },\n--- \"datetime\" : ,\n--- \"current\" : \n } ]", - "num_hearts" : 0, - "num_likes" : 0, - "parent" : { - "gid" : "744094396222300", - "name" : "Проект \"Задачи\" / Газон", - "resource_type" : "task", - "resource_subtype" : "default_task" - }, - "permalink_url" : "https://app.asana.com/0/744094396222312/744094396222312", - "projects" : [ ], - "resource_type" : "task", - "start_at" : null, - "start_on" : null, - "subtasks" : [ ], - "tags" : [ { - "gid" : "302272184133465", - "name" : "ios", - "resource_type" : "tag" - } ], - "resource_subtype" : "default_task", - "workspace" : { - "gid" : "547756841482", - "name" : "Atomic munkeys", - "resource_type" : "workspace" - } - }, { - "gid" : "782006182531534", - "actual_time_minutes" : null, - "assignee" : { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - }, - "assignee_status" : "inbox", - "completed" : true, - "completed_at" : "2018-08-28T17:12:13.376Z", - "created_at" : "2018-08-17T04:34:09.506Z", - "due_at" : null, - "due_on" : null, - "followers" : [ { - "gid" : "547756841476", - "name" : "Cyrill Gafarov", - "resource_type" : "user" - }, { - "gid" : "2495641457848", - "name" : "Илья", - "resource_type" : "user" - } ], - "hearted" : false, - "hearts" : [ ], - "liked" : false, - "likes" : [ ], - "memberships" : [ ], - "modified_at" : "2018-08-28T17:12:13.641Z", - "name" : "Кастомные пуши по задачам", - "notes" : "- в data у нас есть event, который по умолчанию \"message\" - это чатовый пуш, так уж повелось, но появились новые event:\n-- ticketbatch\n--- Наряду с ним в data приходит ticketBatchId (bigint)\n--- Если получаем, то пишем mbody и отсылаем в экран ticektBatch(ticketBatchId)\n-- ticket\n--- Наряду с ним в data приходит ticketId (bigint)\n--- Если получаем, то пишем mbody и отсылаем в экран ticekt(ticketId)\n\n#UPD.1\n- В ticketbatch и ticket добавил msgId (они всё равно приходят в чаты)\n-- Соответственно, на эти пуши тоже надо слать соответствующий messageReceived(msgId)\n\n", - "num_hearts" : 0, - "num_likes" : 0, - "parent" : { - "gid" : "744094396222300", - "name" : "Проект \"Задачи\" / Газон", - "resource_type" : "task", - "resource_subtype" : "default_task" - }, - "permalink_url" : "https://app.asana.com/0/782006182531534/782006182531534", - "projects" : [ ], - "resource_type" : "task", - "start_at" : null, - "start_on" : null, - "subtasks" : [ ], - "tags" : [ { - "gid" : "1159486457487", - "name" : "PARTNERS", - "resource_type" : "tag" - }, { - "gid" : "302272184133465", - "name" : "ios", - "resource_type" : "tag" - } ], - "resource_subtype" : "default_task", - "workspace" : { - "gid" : "547756841482", - "name" : "Atomic munkeys", - "resource_type" : "workspace" - } - }, { + }, { "gid" : "786087020075967", "actual_time_minutes" : null, "assignee" : { diff --git a/mapping.py b/mapping.py index 037d0bd..b69686f 100644 --- a/mapping.py +++ b/mapping.py @@ -74,6 +74,7 @@ def transform_data(data): for task in data["data"]: status, completed_at = get_task_status(task) transformed_task = { + 'gid':task['gid'], 'summary': task['name'], 'description': task['notes'], 'createdAt': task['created_at'], @@ -98,7 +99,7 @@ def create_tasks_in_tracker(data, limit=10): 'X-Org-ID': '7095769', 'Content-Type': 'appication/json', } - datalen = min(limit, len(data)) + datalen = (len(data) if limit==-1 else min(limit, len(data))) logger.info('Import started. Task count: %d', datalen) # этот датасет тоже для parent добавлен @@ -136,9 +137,13 @@ def create_tasks_in_tracker(data, limit=10): print('Задача успешно создана в ЯндексТрекер') # здесь добавлено про родительскую задачу + if 'gid' in task: ya_imported_task_response[task['gid']] = response.json()['id'] - assign_parent_task(response.json()['id'], task['parent']['gid']) + logger.info('Got respnse for asana task gid = %s: ya.task.id = %s',task['gid'],ya_imported_task_response[task['gid']]) + + if task['parent'] is not None: + assign_parent_task(ya_imported_task_response[task['gid']], task['parent']['gid']) else: print( @@ -194,4 +199,4 @@ file = open(asana_data_json, "r", encoding="utf8") json_data = json.loads(file.read()) yandex_tracker_data = transform_data(json_data) -create_tasks_in_tracker(yandex_tracker_data, limit=10) +create_tasks_in_tracker(yandex_tracker_data, limit=3)