воскресенье, 14 апреля 2019 г.

SIL confluence. Как узнать родителя страницы и собирать информацию об изменениях.

Для Confluence существует знакомый нам инструмент SIL на базе БЕСПЛАТНОГО (пока еще (!) ) аддона: Power Scripts for Confluence
На этом языке можно так же делать различные плюшки, получая информацию из вашего Confluence. 
Так же этот аддон несет с собой 4 макроса для вывода информации. 
Один из таких макросов я буду использовать для следующей задачи: 

Мне необходимо определить местоположение страницы, относительно ее родителей, в конкретном спейсе. Например, для получения статистики работы с этой страницей. 

На примере структуры моего тестового пространства, рассмотрим детально задачу.


Это Space Test 1
из которого я хочу получать статистику по работе со страницами. Но меня интересует только Дерево 1. Все, что происходит в остальных деревьях - я хочу игнорировать. 
Информация нам нужна в виде сводной таблицы, в которой будет видно. Кто изменил, что изменил и когда изменил. (возможно захочется что-то еще, но это опционально)
Таблица будет выглядеть примерно так: 
Имя страницы
Ссылка
Автор изменений
Дата изменений




В силу того, что данная таблица мне нужна с актуальными данными - нам необходимо сделать так, чтобы она пополнялась по мере каких-либо действий. 
А значит, нам потребуется Event Listener. И событие Page Update. Но им мы заморочимся в последнюю очередь. А пока прикинем что нам потребуется. 
  • Скрипт, который будет коллекционировать эти данные
  • Файл csv, в который мы будем складывать полученные данные
  • Макрос SIL table, с помощью которого мы выведем информацию из файла на какую-либо страничку
Для файлов я создал вот такую структуру:
Начнем с написания скрипта. Который в последствии будем использовать в Listener. 
Т.к. эвент будет слушать все события обновления, всех страниц - мне необходимо ограничить его действие, в первую очередь, конкретным пространством ST1
1
2
3
4
if(space == "ST1")
    {
         
    }
т.к. в последствии нам будет необходимо перебирать страницы и искать их родителей, чтобы исключить не нужные деревья в спейсе - я сразу объявлю несколько переменных. 
1
2
3
4
5
6
7
8
number cpid = id; //current page id
number cppid = cpid.parent; //current page parent id
string mark = "0"//признак необходимого выхода из цикла. 0 - это не нужное значение. 1 - это признак нужной страницы. 2 - это признак не нужной страницы другого дерева
 
if(space == "ST1")
    {
         
    }
Сразу определимся, что нам нужно исключить корневую (домашнюю) страницу пространства. Т.к. за ней мы следить не собираемся. Нас интересует только Дерево 1 и все, что происходит внутри него.
Поэтому нам необходимо узнать ID этой домашней страницы. 
Переходим на страницу. Выбираем в меню Информация о странице
и получаем ее id 1409027 из адресной строки
Теперь сразу ограничим область действия скрипта, на основе этой страницы
1
2
3
4
5
6
7
8
9
10
11
number cpid = id; //current page id
number cppid = cpid.parent; //current page parent id
string mark = "0"//признак необходимого выхода из цикла. 0 - это не нужное значение. 1 - это признак нужной страницы. 2 - это признак не нужной страницы другого дерева
 
if(space == "ST1")
    {
        if(id != "1409027")
            {
                 
            }
    }
А теперь нам необходимо запустить цикл проверки нужного нам дерева, в котором мы вернем необходимый признак "mark" (который я объявил ранее).
Конечно, более правильно вынести этот цикл проверки в отдельную функцию и пользоваться им в последствии, для других операций. Но в данном примере я не буду заморачиваться и покажу принцип работы.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
number cpid = id; //current page id
number cppid = cpid.parent; //current page parent id
string mark = "0"//признак необходимого выхода из цикла. 0 - это не нужное значение. 1 - это признак нужной страницы. 2 - это признак не нужной страницы другого дерева
 
if(space == "ST1")
    {
        if(id != "1409027")
            {
                while(mark == "0")
                    {
                         
                    }
            }
    }
Теперь нам необходимо принадлежность текущей странице к нашему дереву и ее родителей. 
Для этого, получим нужный ID дерева таким же образом, как мы смотрели ID у домашней страницы.
Внимание!!!
Иногда, в больших инстансах, id страницы возвращается значением со степенью. например 1.3678496E7
Для того, чтобы узнать наверняка, что вернется в скрипт - используйте Run Configuration с необходимой страницей и с помощью runnerLog(); выводите значение. 
Делать это конечно нужно в отдельном файле. Чтобы случайно что-то не натворить (выполнить) в том скрипте, который вы пишете. 
Поэтому,
  • Cоздайте отдельный файл
  • Определите id интересуемой страницы
  • Вбейте ее в Run Configuration 
  • Пропишите в скрипте вывод требуемых переменных id и parent
Мой ID страницы "Дерево 1" = 1409029
А так я проверю что будет возвращаться в скрипт: 
Итак, требуемые id известны. Теперь продолжим цикл, в котором нам надо изменить признак, для выхода из цикла. Чтобы все это к чертям не зависло 😭
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//1409027 - Домашняя страница пространства
//1409029 - Дерево 1
 
number cpid = id; //current page id
number cppid = cpid.parent; //current page parent id
string mark = "0"//признак необходимого выхода из цикла. 0 - это не нужное значение. 1 - это признак нужной страницы. 2 - это признак не нужной страницы другого дерева
 
if(space == "ST1")
    {
        if(id != "1409027")
            {
                while(mark == "0")
                    {
                        if(cpid == "1409029" || cppid == "1409029")
                            {
                                mark = "1";
                            }
                        else if(cppid == "1409027" && cpid != "1409029")
                            {
                                mark = "2";
                            }
                        else   
                            {
                                cpid = cppid;
                                cppid = cpid.parent;
                                mark = "0";
                            }
                    }
            }
    }
Разберем логику того, что я тут накалякал внутри цикла while
Первый if: если наш текущий ID страницы равен Дереву 1 ИЛИ родитель текущей страницы равен Дереву 1 - то мы присвоим признаку выхода из цикла = 1 (и на этом цикл завершится). Значит эта страница или Дерево1, за которым мы следим. Или дочерняя страничка Дерева 1, что тоже нам подходит.
Второй else if: если наш Родитель является Домашней страницей пространства И текущий cpid НЕ равен Дереву 1 - значит присвоим признаку выхода из цикла = 2 (и на этом цикл тоже завершится). Это означает, что это какое-то другое Дерево. НЕ Дерево 1. 
и else: т.к. нас ничего не устроило, то по всей видимости, это не Дерево 1 и даже не его ветка, раз мы не смогли определить это в предыдущих условиях. А значит это какая-то вложенность. 2,3 или 4 (итд) страница, внутри дерева. Поэтому, нам надо поменять переменные для проверки. 
Мы присвоим cpid (текущему ID) = номер родителя (cppid)
А cppid теперь присвоим уже на основе нового значения cpid: cppid = cpid.parent
Ну и чтобы наверняка проставим mark (признак выхода) = 0. Чтобы наш цикл продолжал крутиться. 
Таким образом, как только цикл докрутит до нужного родителя и убедится к кому все же принадлежит наша вложенная страница - он проставит 1 или 2 и выйдет из цикла. 
Проверка цикла
Вы можете добавить runnerLog(); внутри цикла или за его пределами, чтобы посмотреть что будет выводить в том или ином случае. Посмотреть и изучить как работает цикл в тех или иных условиях. 
После того, как добавите нужный вам runnerLog(); - измените контекст выполнения скрипта на какую-нибудь дочернюю задачу (Run Configuration) и запустите скрипт прямо из консоли. 
Всё, теперь мы научились определять, к какому дереву принадлежит родитель. Следующая задача:

Внести данные об изменениях на странице

Прежде, чем мы начнем вносить данные в наш CSV файл - нам необходимо его подготовить. Ранее мы уже создали файл, а теперь определим заголовки столбцов. 
Для этого, необходимо перейти в файл и прописать его структуру. 
Для этого, прямо в SIL Manager - перейдем в файл csv и пропишем первую строку: title,url,EditBy,dateEdit
Обязательно!
Обязательно, после ввода title,url,EditBy,dateEdit - переведите каретку на следующую строку (нажмите Enter) и сохраните файл. Иначе первая добавленная строка "склеится" с этой строкой
А теперь допишем наш скрипт. Который будет вносить новые строки с данными в наш файл, если страница пренадлежит Дереву 1. (т.е. mark == "1")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//1409027 - Домашняя страница пространства
//1409029 - Дерево 1
 
number cpid = id; //current page id
number cppid = cpid.parent; //current page parent id
string mark = "0"//признак необходимого выхода из цикла. 0 - это не нужное значение. 1 - это признак нужной страницы. 2 - это признак не нужной страницы другого дерева
 
if(space == "ST1")
    {
        if(id != "1409027")
            {
                while(mark == "0")
                    {
                        if(cpid == "1409029" || cppid == "1409029")
                            {
                                mark = "1";
                            }
                        else if(cppid == "1409027" && cpid != "1409029")
                            {
                                mark = "2";
                            }
                        else   
                            {
                                cpid = cppid;
                                cppid = cpid.parent;
                                mark = "0";
                            }
                    }
                if(mark == "1")
                    {
                        printInFile("CSV/ST1_tree1_editPage.csv", title + "," + getPageURL(id) + "," + currentUserFullName() + "," + currentDate());
                    }
            }
    }
Всё уже готово, для того, чтобы подключить SIL Listener для эвента.

Проверка работы Listener

Для проверки работы нашего слушателя - отредактируем любую страницу внутри требуемого дерева и отредактируем внутри НЕ требуемого дерева. 
 
А теперь идем в SIL Manager. Обязательно сделаем Refresh структуры (иначе изменений не увидите)  и перейдем в файл CSV, чтобы посмотреть, что там находится. 
Как вы можете видеть - там единственная, нужная строчка, с информацией об изменении в отслеживаемом дереве. Апдейт из второго дерева - сюда не попал. 
Можно считать, что все у нас работает отлично. 
Следующий шаг:

Вывод данных в таблицу из файла

Создаем SIL файл со структурой вывода, если вы это не сделали ранее. У меня это: ST1_outLog_editPage.sil
В котором пропишем структуру данных: 
1
2
3
4
5
6
7
8
9
struct Emp {
    string title;
    string url;
    string EditBy;
    string editDate;
}
 
Emp [] fileContent = readFromCSVFile("CSV/ST1_tree1_editPage.csv"true);
return fileContent;
Сохраняем файл. И переходим (создаем) страницу, на которой будем отображать данные
Для этого я выбрал абсолютно другое пространство и создал новую страничку
И добавляем макрос SIL table. 
В котором указываем имя нашего скрипта структуры. Оставляем разделитель - запятую (если ваши имена страниц содержат запятые - используйте другой разделитель, в т.ч. в csv файле) и прописываем имена столбцов. Нажав на кнопку обновления предварительного просмотра - можете убедиться в корректности отображения. 
Наш макрос готов. Можете опубликовать страницу и посмотреть как это выглядит. 
Для теста - я попробую еще изменить страницу внутри дерева 1. А затем обновлю текущую страницу: 
Как видите - страница заполняется данными автоматически. Всё готово 😊
Этот же способ можно использовать для создания \ удаления страниц. Но про удаление и особенность этого эвента - я расскажу в другой статье. 

Задача для вас
Будет здорово, если кто-то сделает так, чтобы ссылка во втором столбце была URLом. Если у вас получится - пишите в комментарий, как это удалось! Добавлю в статью и буду благодарен 😏

Комментариев нет:

Отправить комментарий