четверг, 28 февраля 2019 г.

Jira: Ошибка "Unexpected server error" в "Rich Filter Controller" при открытии рабочего стола

Описание проблемы:
у некоторых пользователей при открытии рабочего стола Jira видна ошибка "Unexpected server error.", кнопка "Show details" открывает подробности:
REQUEST URL:
/rest/qoti-rich-filters/latest/gadgets/controller/load-quick-filters
REQUEST TYPE:
POST
REQUEST DATA:
{"richFilterId":8,"wantedFilters":"20-26-s25-d168-d105-d107-d111-d110-d123-d125-d126-d127-d128-d121-d167","activeFilters":{"dynamic":{"customfield_26713":["34920"]}}}
STATUS CODE:
500
STACK TRACE:
java.lang.NullPointerException
at java.util.LinkedHashSet.(LinkedHashSet.java:168)
at com.google.common.collect.Maps$7.transformEntry(Maps.java:1812)
at com.google.common.collect.Maps$10.getValue(Maps.java:1857)
at com.google.common.collect.ImmutableMap.copyOf(ImmutableMap.java:292)
...


Причина:
В структуре метаданных задач кто-то изменил поле, идентификатор которого виден в стеке ошибки (выделено красным), в данном случае было изменено наименование поля: было "Продукт (РЕО)" стало "Продукт (РЕО) old".
Увидев приписку "old" я удалил поле из списка "Dynamic Filters" (динамических фильтров) рич-фильтра проблемного рабочего стола.
Но т.к. по этому динам.фильтру у некоторых пользователей была включена фильтрация, то сервер для таких пользователей выдал указанную ошибку.

Как идентифицировать проблемное поле:
Определить поле можно либо, спросив у поддержки, либо использовать его идентификатор в поле для JQL-запросов, обращение к полю указывать в таком виде:
cf[26713] = ...
по выпадающим значениям после знака "=" можно понять, что за поле скрывается под идентификатором 26713.
После идентификации вернул поле в список "Dynamic Filters" рич-фильтра.

Что делать, чтобы избежать повторения:
Пока что решил вместо изменения старого рабочего стола создавать копию и в ее актуализировать, а старую версию удалять спустя какое-то время.

вторник, 26 февраля 2019 г.

SortTable: сортировка таблицы по колонке с чекбоксом

Чтобы с помощью "sorttable" можно было сортировать таблицу по колонке, в которой отражается чекбокс, можно добавить "hidden span" со значением состояния чекбокса (включен или отключен), например
<span hidden>${my_checkbox==1?'1':'0'}</span>
Тогда сортировка будет работать, визуально якобы, по чекбоксам:

понедельник, 25 февраля 2019 г.

Google Chrome: Uncaught ReferenceError: <JS function name> is not defined

Иногда после обновления веб-приложения (в котором используются JS) на стороне пользователя в интернет-браузере Google Chrome некоторые JS не работают, при этом в консоли видна ошибка:
Uncaught ReferenceError: <JS function name> is not defined
at HTMLAnchorElement.onclick (index.jsp:40)

Решение:
при обнаружении проблемы обновить кеш браузера с помощью Ctrl+F5.

пятница, 15 февраля 2019 г.

JiraSD: поиск подстроки в поле, для которого не работает тильда

Для некоторых полей не поддерживается оператор тильда "~" (CONTAINS), выражается это в появлении сообщения при попытке выполнения JQL:
Оператор '~' не поддерживается 'Бюджет проекта ПУ' полем.
или
The operator '~' is not supported by the 'Бюджет проекта ПУ' field.

Решение:
Пример поиска подстроки "Сопр" (с игнорированием регистра букв) в поле, которое не поддерживает оператор тильда "~" (CONTAINS):
issueFunction in issueFieldMatch("project = FIN AND issuetype in (Доработка) AND statusCategory != Done AND status not in (Сделан) AND \"Бюджет проекта ПУ\" is not null and statusCategory != Done", "Бюджет проекта ПУ", "(?i)Сопр")

Примечание:
возможно, для таких полей можно включить поддержку оператора тильда "~" (CONTAINS) - уверен, выяснится со временем, "сейчас для этого нет ресурса".

четверг, 14 февраля 2019 г.

JiraSD: регулярные выражения

Поставлена такая задача:
отфильтровать записи в JiraSD, у которых в текстовом поле (к которому допустимо применять оператор "~") стоит одно значение "+" из трёх допустимых ("+", "-" или "null" (когда поле не задано)).

Найденное решение:
регулярные выражения и функция, которая позволяет их применять:
issueFieldMatch(subQuery, fieldname, regexp)

где, fieldname = "Зафиксирован срок выдачи".

Но эта функция очень ресурсозатратная, чем меньше количество записей, которое возвращает подзапрос "subQuery", тем быстрее отрабатывает весь JQL-запрос.
issueFunction in issueFieldMatch("project = FIN AND issuetype in (Доработка) AND statusCategory != Done AND status not in (Сделан)", "Зафиксирован срок выдачи", "^\\u002b$")

Самым быстрым вариантом оказался с проверкой наличия поля (is not null):
issueFunction in issueFieldMatch("project = FIN AND issuetype in (Доработка) AND statusCategory != Done AND status not in (Сделан) AND \"Зафиксирован срок выдачи\" is not null", "Зафиксирован срок выдачи", "^\\u002b$")

Примечание:
"быстрым" его можно назвать, лишь, относительно: 850 записей он обрабатывает за ~3,5 секунды :-(

среда, 13 февраля 2019 г.

JiraSD: еще про JQL

Выражение
labels not in (Ошибка_БЛ)
то же самое что и
labels != Ошибка_БЛ

Вместо
labels != Ошибка_БЛ
нужно применять
(labels != Ошибка_БЛ or labels is null)

вторник, 5 февраля 2019 г.

JiraSD: выявление задач без трудозатрат

Задачи проекта "SP", у которых:
- "Ответственный L2" = текущий пользователь
- дата создания в текущем месяце
- в журнале работ по текущему пользователю ни одной записи:
project = SP AND "Ответственный L2" = currentUser() AND created >= startOfMonth() AND created < endOfMonth() AND issueFunction not in worklogged("after startOfMonth() before endOfMonth() by currentUser()")

Архив