Уведомления о задачах redmine в telegram

Материал из Mindsellers
Перейти к: навигация, поиск

Python


После установки редмайна и настройки почты, Установка_Redmine_под_Ubuntu_16.04, возникает резонный вопрос: как узнавать о новых заявках, которые еще не были никому назначены. В этих ваших интернетах целый вагон платных и бесплатных плагинов для интеграции redmine с telegram, но все они тяжеловесны, и как я недавно обнаружил с помощью моего коллеги, бездумная установка плагинов ведет к падению redmine чуть чаще, чем всегда.

Поэтому, не будем использовать плагины, но воспользуемся питоном. Для начала, создадим в redmine пользователя с админскими правами(да, можно и без них, но с ними веселее), допустим, bot, а также в Настройках включим API. После этого приступаем к питоно-коду. Чуть ранее я писал о том, как легко отсылать уведомления в телегу через бота: Простой_бот_для_отправки_сообщений_в_каналы. Не буду повторяться, но приведу листинг чуть модернизированного скрипта

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import telebot
from telebot import apihelper

def messagesend(id, message):
	apihelper.proxy={'https':'socks5h://proxy-user:proxy-pass@domain.ltd:[port]'}
	token = '1037455712:XXXXXXXXXXXXXXX'
	bot=telebot.TeleBot(token)
	bot.send_message(id, message)


if __name__=='__main__':
	try:
        	id,message=sys.argv[1:]
	except:
        	print('Необходимо 2 аргумента - id и сообщение')
        	exit(1)
	messagesend(id,message)

Всего-то я вынес отправку в функцию и написал классический __name__=='__main__': для тестирования.

Теперь поставим очень удобную и простую либу:

pip3 install python-redmine

и напишем элементарный скрипт. Отметим, что скрипт выше называется у меня telegram_send.py и лежит в одном каталоге с нижеследующим.

#!/usr/bin/python3

from redminelib import Redmine
from telegram_send import messagesend
redmine = Redmine('https://redmine.domain.ltd/', username='bot', password='BOTPASS')

CHATID='-100XXXXXXXXXXXX'

count=0
for issue in  redmine.issue.filter(status_id=1):  #status_id==1 Обычно соответствует новой задаче
#но вы можете воспользоваться отладочными строками ниже для определения своего id


# Строчки ниже могут пригодиться для отладки и проверки скрипта
#	print(str(issue.id)+' '+str(issue))
#	print(str(issue.status.id)+' '+str(issue.status))
#	print(getattr(issue, 'assigned_to', None))
	if getattr(issue, 'assigned_to', None)==None: #проверяем, что задача никому не назначена
		count+=1 #считаем неназначенные
		message=message+str(issue)+' в проекте '+str(issue.project)+': http://redmine.domain.ltd/issues/'+str(issue.id)+'\n'


if count>=1:
        message='Новых неназначенных задач '+str(count)+'. Вы можете посмотреть их список ниже: \n'
	print(message)
	messagesend(CHATID, message)

Написанному скрипту даем права на исполнение и запихиваем в cron по вкусу.

В результате получаем следующее: как только скрипт запускается, он находит все задачи с status_id==1, что по дефолту соответствует новой задаче, и пробегая по всем задачам, обнаруживает те, у кого нет исполнителя: getattr(issue, 'assigned_to', None). Если вам необходимо посмотреть вообще все задачи, то начало цикла примет вид

for issue in  redmine.issue.all():

и он переберет все задачи в принципе. Полезно попробовать так сделать, используя закомментированные выше print. Относительно полный список методов, функций и объектов либы можно найти на сайте ее разработчиков, который элементарно гуглится.