вторник, 18 февраля 2020 г.

Redmine: как генерировать задачи прямо в Excel

Простой пример создания задачи


Итак, заходим в редактор vba в Excel, создаем новый модуль и вписываем в него следующее:


' Пользователя Redmine, от имени которого будет создана задача,
' можно не указывать в тексте url, тогда окно с запросом
' логина и пароля будет выведено автоматически
Const REDMINE_URL = "http://redmine_url"
' но можно и жестко задать
'Const REDMINE_URL = "http://user:password@redmine_url

' гиперссылка и номер задачи, которые нам вернет функция PostIssue
' (к сожалению, я не нашел, как вернуть эти значения в одной функции
' без глобальных переменных, не строя дополнительных массивов)
Public issue_url, issue_id As String

Sub Redmine_Create_Issue()
    Dim ReqStatus As Boolean
    Dim PROJECT_ID, TRACKER_ID, ASSIGNED_TO_ID, CATEGORY_ID As Integer
    Dim Subject, Body, DUE_DATE, REDMINE_API_KEY As String

    ' ID должны быть из базы Redmine
    ' Позже я опишу, как их можно вытащить из Redmine
    PROJECT_ID = 32
    TRACKER_ID = 1
    ASSIGNED_TO_ID = 20  'ID пользователя, на которого будет назначена задача

    ' Сюда можно вписать любые данные из нашей таблицы
    Subject = "Тема задачи"
    Body = "Текст задачи"

    ' Плановая дата завершения задачи
    DUE_DATE = Format(ActiveSheet.Cells(ActiveCell.Row, 12), "yyyy-mm-dd")

    'REDMINE_API_KEY = "e11234567891234567891234567891234567bce0" ' если используется API key
    
    ' Запускаем задачу в редмайн при помощи функции
    ReqStatus = PostIssue(PROJECT_ID, TRACKER_ID, ASSIGNED_TO_ID, Subject, Body, DUE_DATE, _
                          REDMINE_API_KEY, CATEGORY_ID)

    ' Проверяем, что задача отправлена
    If ReqStatus <> False Then
        MsgBox "Redmine: Ok, задача отправлена"

        ' Добавим в нашу таблицу во 2й столбец гипперссылку на созданную задачу
        ActiveSheet.Cells(ActiveCell.Row, 2) = issue_id
        ActiveSheet.Hyperlinks.Add Range("B" & ActiveCell.Row), issue_url, "", _
                                                               "Открыть задачу" & issue_url
        ' Дату создания задачи вписываем в 11й столбец на листе)
        ActiveSheet.Cells(ActiveCell.Row, 11) = Date

    Else
        MsgBox "Redmine: Ошибка, обратитесь к администратору"
    End If
End Sub

' Сама функция отправки задачи в формате xml
Function PostIssue(ByVal PROJECT_ID As Integer, ByVal TRACKER_ID As Integer, _
                   ByVal ASSIGNED_TO_ID As Integer, ByVal Subject As String, _
                   ByVal Body As String, ByVal DUE_DATE As String, _
                   ByVal REDMINE_API_KEY As String, ByVal CATEGORY_ID As String)
    Dim xhr
    Dim RequestURL As String
    Dim RequestBody As String

    RequestURL = REDMINE_URL & "/issues.xml?format=xml"
    ' если используется API key
    'RequestURL = REDMINE_URL & "/issues.xml?format=xml&key=" & REDMINE_API_KEY

    Set xhr = CreateObject("Microsoft.XMLHTTP")
    xhr.Open "GET", RequestURL, False
    xhr.SetRequestHeader "Content-Type", "text/xml"

    RequestBody = "<?xml version=" & Chr(34) & "1.0" & Chr(34) & "?>"
    RequestBody = RequestBody & "<issue>"
    RequestBody = RequestBody & "<project_id>" & PROJECT_ID & "</project_id>"
    RequestBody = RequestBody & "<tracker_id>" & TRACKER_ID & "</tracker_id>"
    RequestBody = RequestBody & "<assigned_to_id>" & ASSIGNED_TO_ID & "</assigned_to_id>"
    RequestBody = RequestBody & "<subject>" & Subject & "</subject>"
    RequestBody = RequestBody & "<description>" & Body & "</description>"
    RequestBody = RequestBody & "<due_date>" & DUE_DATE & "</due_date>"
    RequestBody = RequestBody & "</issue>"

    ' Проверяем, что задача отправлена
    xhr.Send (RequestBody)
    If xhr.Status = 201 Then
        PostIssue = True
    Else
        PostIssue = False
    End If

    ' гиперссылка и номер задачи
    issue_url = xhr.getResponseHeader("location")
    issue_id = Right(issue_url, Len(issue_url) - InStrRev(issue_url, "/"))
End Function

Примечание: для авторизации в Redmine можно использовать логин и пароль, или ключ API, который можно посмотреть в профиле. В примере выше используется логин-пароль, строки с ключом закомментированы.

Всё хорошо, но как быть с параметрами, которые мы можем узнать только из базы данных Redmine? Я имею в виду ID для проекта, трекера, и на кого назначена задача.

В моем случае все эти параметры связаны с данными из таблицы (проект, его статус, ответственный отдел), поэтому я поступил просто, хоть и неправильно с точки зрения универсальности. Я подсмотрел ID в базе Redmine через phpMyAdmin и создал на отдельном листе табличку настроек, где прописал эти ID для нужных мне параметров из основной таблицы. Как результат, пользователю нужно только выбрать нужную строку в таблице и нажать кнопку отправки задачи, никаких дополнительных диалоговых окон.

Источник: https://habr.com/ru/post/318198/

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

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