# Devprom ALM REST API — рабочая шпаргалка Справочник для загрузки Пожеланий, Заявок, Требований и вложений в Devprom ALM через REST API. Имена сущностей сверены с официальной таблицей справочника разработчика: `/pm/all/apidocs/list` (например, [artsaterra.myalm.ru/pm/all/apidocs/list](https://artsaterra.myalm.ru/pm/all/apidocs/list)), где каждая строка — одна сущность с её `ReferenceName` (используется в REST API) и русским именем. Ключевые строки, участвующие в режиме Пожеланий из совещания: | № | ReferenceName | Сущность | |----|------------------|--------------------| | 45 | `issue` | **Пожелание** | | 18 | `request` | Доработка (заявка с типом) | | 81 | `requesttype` | Тип пожелания | | 92 | `requirement` | Требование | | 57 | `attachment` | Приложение (файл) | | 33 | `company` | Компания | | 46 | `user` | Пользователь | Дополнительные эмпирические детали (поведение, которое в публичной документации не раскрыто явно) проверены на инстансе `artsaterra.myalm.ru` и отмечаются в тексте курсивом _(проверено эмпирически)_. Связанные ресурсы: - Публичная документация Devprom: [docs.myalm.ru](https://docs.myalm.ru/) - Раздел про управление пожеланиями: [artsaterra.myalm.ru/docs/8835.html](https://artsaterra.myalm.ru/docs/8835.html) --- ## 0. Базовое - **Хост:** `https:///pm//api/latest` - **Аутентификация:** заголовок `Devprom-Auth-Key: ` (личный API-ключ пользователя) - **Content-Type:** `application/json` - **Ответ:** HTTP 200 всегда, ошибки валидации приходят в теле как `{"error":"…"}` - **PATCH не поддерживается** — HTTP 405. Обновление только через PUT. - **Успешный ответ на создание:** иногда возвращается как объект, иногда — как массив с одним элементом. Учитывать оба случая. ## 1. Пожелания vs Заявки — КРИТИЧНО В официальной схеме Devprom это **две разные сущности** с разными `ReferenceName` (см. таблицу выше): - **`issue` (Пожелание)** — сущность из строки 45. Создаётся без типа, UID с префиксом `U-`. В UI живёт в разделе «Пожелания» (`/module/requirements/issues`). - **`request` (Доработка)** — сущность из строки 18. Создаётся с обязательным типом (Доработка / Ошибка), UID с префиксом `I-`. В UI живёт на доске заявок (`/issues/board`). | Логический класс | Эндпоинт | Префикс UID | Поле Type | UI-раздел | |------------------------------|-------------------|-------------|-----------------|------------------------------------| | **Пожелание** (`issue`) | `/issue/items` | `U-` | пусто | `/module/requirements/issues` | | **Доработка** (`request`) | `/request/items` | `I-` | 397 (Доработка) / 398 (Ошибка) | `/issues/board` | _Проверено эмпирически:_ GET на `/issue/items/{id}` и `/request/items/{id}` возвращает **одну и ту же запись** (разные виды на один ресурс — внутренне это один класс `pm_ChangeRequest`). Разница проявляется при POST — сервер применяет разную логику автозаполнения в зависимости от эндпоинта. ### Почему попасть в «Доску пожеланий» можно только через `/issue/items` _Проверено эмпирически:_ `/request/items` при POST **всегда принудительно проставляет `Type=397`** (Доработка), даже если передать `Type: null`, `Type: {}` или `Type: {"Id":""}`. Все варианты PUT тоже бессильны — сервер восстанавливает 397. Подтверждено на 8 вариантах тела. Поэтому для создания «чистого» Пожелания (с пустым Type и префиксом `U-`) используется эндпоинт именно сущности `issue` — **POST на `/issue/items`**. ## 2. Алгоритм создания Пожелания (рабочий рецепт) Один POST на одно Пожелание. Без PUT, без привязки к требованиям. ```python post_body = { "Caption": "<заголовок>", "Content": "", # по документации; Description тоже принимается "Priority": {"Id": "2"}, # 1=Критично, 2=Высокий, 3=Обычный "Author": {"Id": ""}, "Function": {"Id": ""}, # подсистема (группировка) "Company": {"Id": ""}, # опционально: клиент-источник } # POST {BASE}/issue/items → {UID: "U-xxxx", Id: "xxxx", ...} ``` Поля `Requirement` и `RequirementDocument` в теле **не передаются**: привязка к документу требований — задача пользователя в UI, не API. На этапе создания Пожелания она и не нужна — заказчик подтверждает пожелания, формализует требования и уже потом вручную связывает одно с другим. > **Примечание для других сценариев.** Если всё-таки нужно привязать > Пожелание к существующему требованию из API (например, массовая > миграция из внешней системы), это делается вторым шагом через > `PUT /issue/items/{id}` с тем же телом + `Requirement.Id` > — в одном POST эти поля молча игнорируются. Для режима «Пожелания > из совещания» этот путь не нужен. ### Retry-политика Egress-прокси периодически роняет запросы с HTTP 502/503/504 («DNS cache overflow»). Всегда оборачивать вызов в цикл `retries=3` с `sleep(2..3)`. Это не связано с Devprom — лечится только ретраями. ## 3. Поля Пожелания — полный справочник | Поле | Тип / формат | Обязательность | Комментарий | |-----------------------|------------------------------|----------------|-------------| | `Caption` | string | обязательно | Заголовок пожелания | | `Content` | HTML-string | обязательно | Описание. Разрешены: `