mirror of
				https://github.com/veops/cmdb.git
				synced 2025-10-31 19:39:24 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding:utf-8 -*-
 | |
| 
 | |
| import json
 | |
| 
 | |
| import requests
 | |
| import six
 | |
| from flask import current_app
 | |
| from jinja2 import Template
 | |
| from markdownify import markdownify as md
 | |
| 
 | |
| from api.lib.common_setting.notice_config import NoticeConfigCRUD
 | |
| from api.lib.mail import send_mail
 | |
| 
 | |
| 
 | |
| def _request_messenger(subject, body, tos, sender, payload):
 | |
|     params = dict(sender=sender, title=subject,
 | |
|                   tos=[to[sender] for to in tos if to.get(sender)])
 | |
| 
 | |
|     if not params['tos']:
 | |
|         raise Exception("no receivers")
 | |
| 
 | |
|     flat_tos = []
 | |
|     for i in params['tos']:
 | |
|         if i.strip():
 | |
|             to = Template(i).render(payload)
 | |
|             if isinstance(to, list):
 | |
|                 flat_tos.extend(to)
 | |
|             elif isinstance(to, six.string_types):
 | |
|                 flat_tos.append(to)
 | |
|     params['tos'] = flat_tos
 | |
| 
 | |
|     if sender == "email":
 | |
|         params['msgtype'] = 'text/html'
 | |
|         params['content'] = body
 | |
|     else:
 | |
|         params['msgtype'] = 'markdown'
 | |
|         try:
 | |
|             content = md("{}\n{}".format(subject or '', body or ''))
 | |
|         except Exception as e:
 | |
|             current_app.logger.warning("html2markdown failed: {}".format(e))
 | |
|             content = "{}\n{}".format(subject or '', body or '')
 | |
| 
 | |
|         params['content'] = json.dumps(dict(content=content))
 | |
| 
 | |
|     url = current_app.config.get('MESSENGER_URL') or NoticeConfigCRUD.get_messenger_url()
 | |
|     if not url:
 | |
|         raise Exception("no messenger url")
 | |
| 
 | |
|     if not url.endswith("message"):
 | |
|         url = "{}/v1/message".format(url)
 | |
| 
 | |
|     resp = requests.post(url, json=params)
 | |
|     if resp.status_code != 200:
 | |
|         raise Exception(resp.text)
 | |
| 
 | |
|     return resp.text
 | |
| 
 | |
| 
 | |
| def notify_send(subject, body, methods, tos, payload=None):
 | |
|     payload = payload or {}
 | |
|     payload = {k: v or '' for k, v in payload.items()}
 | |
|     subject = Template(subject).render(payload)
 | |
|     body = Template(body).render(payload)
 | |
| 
 | |
|     res = ''
 | |
|     for method in methods:
 | |
|         if method == "email" and not current_app.config.get('USE_MESSENGER', True):
 | |
|             send_mail(None, [Template(to.get('email')).render(payload) for to in tos], subject, body)
 | |
| 
 | |
|         res += (_request_messenger(subject, body, tos, method, payload) + "\n")
 | |
| 
 | |
|     return res
 |