Недавно я искал подходящий трекер для своих нужд и сравнил несколько инструментов, включая Jira, Trello, Asana и Redmine. Вы можете прочитать об этом здесь .
Redmine был почти достаточно хорош, но я хотел иметь возможность быстро добавлять и редактировать задачи. Установка плагинов для Redmine кажется болезненной, поэтому я использовал Redmine API вместо этого. По сути, я могу запустить отдельное веб-приложение, которое взаимодействует с моей установкой Redmine.
Код доступен на GitHub: https://github.com/ftomassetti/redmine-reactive
Использование Redmine API для взаимодействия с установкой Redmine
Я хочу использовать API Redmine для создания новой HTML-страницы, где я могу показать отображение данных, которые у меня есть в Redmine. Redmine предлагает REST API через XML и JSONP.
Теперь, если вы хотите просто прочитать информацию из установки Redmine, вы можете сделать это через JavaScript, даже если ваш JavaScript обслуживается в другом домене. Таким образом, вы можете иметь простой HTML-файл с некоторым JavaScript и открыть этот локальный файл, чтобы получить настраиваемое представление установки Redmine, установленной в другом месте, например на вашем сервере.
Если вы хотите вместо этого записать изменения в Redmine, вам нужно выполнить вызовы PUT и POST. Вы не можете сделать их через JavaScript из другого домена. Поэтому обходной путь заключается в создании крошечного веб-приложения Python, которое выполняет вызовы PUT и POST для вашего приложения Redmine. Ваше локальное приложение будет звонить с локального веб-сервера Python и отправлять запрос в Redmine. Это звучит глупо для меня, но это является следствием механизма, предотвращающего междоменные сценарии.
Первое: получение списка проектов
Первым делом мне нужно получить список проектов от Redmine. Для этого нам нужно всего несколько строк Javascript в нашем API Key. Ключ API можно найти в вашем профиле. Код JS отображается ниже
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
$.ajax({ url: window.base_url + "/projects.json?key=" + api_key, type: 'GET', crossDomain: true, dataType: 'jsonp', success: function (data) { $.each(data.projects, function (index, project) { if (project.status === 1) { $("select").append('<option value="' + project.id + '">' + project.name + '</option>'); } ; }); }, error: function () { alert('Failed!'); }, }); |
Мы отображаем список проектов в выпадающем списке, вот так:
Второе: получение списка вопросов
Теперь каждый раз, когда кто-то выбирает проект, мы хотим загрузить список соответствующих проблем в таблицу. Итак, мы добавим этот код:
|
1
2
3
4
|
$("select").change(function () { var projectId = $("select option:selected").attr('value'); loadIssues(projectId); }); |
И это код для загрузки проблем:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
var loadIssues = function(projectId) { $.ajax({ url: window.base_url + "/issues.json?key=" + window.api_key + "&project_id=" + projectId, type: 'GET', crossDomain: true, dataType: 'jsonp', success: function (data) { $("tbody#issues").empty(); $.each(data.issues, function (index, issue) { $("tbody#issues").append("<tr issueId='" + issue.id + "'><td class='project'>" + issue.project.name + "</td><td class='idCell'>" + issue.id + "</td><td class='subject'>" + issue.subject + "</td><td class='action'><button class='delete'><img src='/static/images/delete.png' width='20' height='20' /></button></td></tr>"); }); $(".delete").click(function () { var issueId = $(this).parent().parent().attr('issueId'); deleteIssue(issueId); }); }, error: function () { alert('Failed!'); }, }); }; |
Хорошо, вот и все, теперь вы можете увидеть проблемы вашего проекта на отдельной странице!
Вот как это выглядит. Мы не видели, как добавить приоритет, но код доступен на GitHub.
Добавление вопросов
В начале мы увидели, что нам нужно пройти через сервер, чтобы выполнить запросы на запись в Redmine. Для этого я создал очень простое приложение для колб на Python. Я также воспользовался библиотекой Python Redmine.
Для создания новой проблемы нам нужен этот код на сервере:
|
1
2
3
4
5
6
7
8
9
|
@app.route("/commands/create_issue", methods=["POST"])def create_issue(): redmine = Redmine(app.base_url, key=app.api_key) data = request.json issue = redmine.issue.new() issue.project_id = data['project_id'] issue.subject = data['subject'] issue.save() return "OK" |
И нам нужно позвонить из JS, когда мы нажмем кнопку «Добавить вопрос»:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
$("#create").click(function () { var projectId = $("select option:selected").attr('value'); createIssue(projectId, 'New issue'); }); var createIssue = function (projectId, subject) { $.ajax({ url: "/commands/create_issue", type: 'POST', data: JSON.stringify({project_id: projectId, subject: subject}), headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, success: function (data) { loadIssues(projectId); }, error: function () { alert('Failed!'); }, }); }; |
Довольно легко, не правда ли?
Выводы
После этого я добавил возможность редактировать тему вопросов и назначать приоритет из списка.
На практике я могу использовать это так.
Поэтому, если вы не можете найти идеальный инструмент управления проектами, не отчаивайтесь: вы можете улучшить существующие, добавив нужные вам представления.
