perf: Support WeCom DingTalk FeiShu Lark Slack attribute mapping

This commit is contained in:
feng
2024-07-30 16:33:42 +08:00
committed by Bryan
parent 9825f9fbd2
commit 8d83c953d3
12 changed files with 122 additions and 37 deletions

View File

@@ -2,16 +2,17 @@ import base64
import hmac
import time
from django.conf import settings
from common.sdk.im.mixin import BaseRequest
from common.sdk.im.utils import digest, as_request
from common.utils import get_logger
from users.utils import construct_user_email
from users.utils import construct_user_email, flatten_dict, map_attributes
logger = get_logger(__file__)
def sign(secret, data):
digest = hmac.HMAC(
key=secret.encode('utf8'),
msg=data.encode('utf8'),
@@ -115,6 +116,8 @@ class DingTalkRequests(BaseRequest):
class DingTalk:
attributes = settings.DINGTALK_RENAME_ATTRIBUTES
def __init__(self, appid, appsecret, agentid, timeout=None):
self._appid = appid or ''
self._appsecret = appsecret or ''
@@ -206,17 +209,24 @@ class DingTalk:
data = self._request.post(URL.GET_SEND_MSG_PROGRESS, json=body, with_token=True)
return data
def get_user_detail(self, user_id, **kwargs):
# https://open.dingtalk.com/document/orgapp/query-user-details
body = {'userid': user_id}
data = self._request.post(
URL.GET_USER_INFO_BY_USER_ID, json=body, with_token=True
)
data = data['result']
username = user_id
@staticmethod
def default_user_detail(data):
username = data['user_id']
name = data.get('name', username)
email = data.get('email') or data.get('org_email')
email = construct_user_email(username, email)
return {
'username': username, 'name': name, 'email': email
}
def get_user_detail(self, user_id, **kwargs):
# https://open.dingtalk.com/document/orgapp/query-user-details
data = self._request.post(
URL.GET_USER_INFO_BY_USER_ID, json={'userid': user_id}, with_token=True
)
data = data['result']
data['user_id'] = user_id
info = flatten_dict(data)
default_detail = self.default_user_detail(data)
detail = map_attributes(default_detail, info, self.attributes)
return detail

View File

@@ -6,7 +6,7 @@ from rest_framework.exceptions import APIException
from common.sdk.im.mixin import RequestMixin, BaseRequest
from common.sdk.im.utils import digest
from common.utils.common import get_logger
from users.utils import construct_user_email
from users.utils import construct_user_email, flatten_dict, map_attributes
logger = get_logger(__name__)
@@ -84,7 +84,7 @@ class FeiShu(RequestMixin):
非业务数据导致的错误直接抛异常,说明是系统配置错误,业务代码不用理会
"""
requests_cls = FeishuRequests
attributes = settings.LARK_RENAME_ATTRIBUTES
attributes = settings.FEISHU_RENAME_ATTRIBUTES
def __init__(self, app_id, app_secret, timeout=None):
self._app_id = app_id or ''
@@ -151,11 +151,7 @@ class FeiShu(RequestMixin):
# get_user_id_by_code 已经返回个人信息,这里直接解析
data = kwargs['other_info']
data['user_id'] = user_id
detail = self.default_user_detail(data)
for local_name, remote_name in self.attributes.items():
value = data.get(remote_name)
if not value:
continue
detail[local_name] = value
info = flatten_dict(data)
default_detail = self.default_user_detail(data)
detail = map_attributes(default_detail, info, self.attributes)
return detail

View File

@@ -1,11 +1,12 @@
import mistune
import requests
from django.conf import settings
from django.utils.translation import gettext_lazy as _
from rest_framework.exceptions import APIException
from common.utils.common import get_logger
from jumpserver.utils import get_current_request
from users.utils import construct_user_email
from users.utils import construct_user_email, flatten_dict, map_attributes
logger = get_logger(__name__)
@@ -93,6 +94,8 @@ class SlackRequests:
class Slack:
attributes = settings.SLACK_RENAME_ATTRIBUTES
def __init__(self, client_id=None, client_secret=None, bot_token=None, **kwargs):
self._client = SlackRequests(
client_id=client_id, client_secret=client_secret, bot_token=bot_token
@@ -138,13 +141,22 @@ class Slack:
logger.exception(e)
@staticmethod
def get_user_detail(user_id, **kwargs):
# get_user_id_by_code 已经返回个人信息,这里直接解析
user_info = kwargs['other_info']
username = user_info.get('name') or user_id
name = user_info.get('real_name', username)
email = user_info.get('profile', {}).get('email')
def default_user_detail(data):
username = data['user_id']
username = data.get('name', username)
name = data.get('real_name', username)
email = data.get('profile.email')
email = construct_user_email(username, email)
return {
'username': username, 'name': name, 'email': email
}
def get_user_detail(self, user_id, **kwargs):
# https://api.slack.com/methods/users.info
# get_user_id_by_code 已经返回个人信息,这里直接解析
data = kwargs['other_info']
data['user_id'] = user_id
info = flatten_dict(data)
default_detail = self.default_user_detail(data)
detail = map_attributes(default_detail, info, self.attributes)
return detail

View File

@@ -1,12 +1,13 @@
from typing import Iterable, AnyStr
from django.conf import settings
from django.utils.translation import gettext_lazy as _
from rest_framework.exceptions import APIException
from common.sdk.im.mixin import RequestMixin, BaseRequest
from common.sdk.im.utils import digest, update_values
from common.utils.common import get_logger
from users.utils import construct_user_email
from users.utils import construct_user_email, flatten_dict, map_attributes
logger = get_logger(__name__)
@@ -79,6 +80,7 @@ class WeCom(RequestMixin):
"""
非业务数据导致的错误直接抛异常,说明是系统配置错误,业务代码不用理会
"""
attributes = settings.WECOM_RENAME_ATTRIBUTES
def __init__(self, corpid, corpsecret, agentid, timeout=None):
self._corpid = corpid or ''
@@ -173,10 +175,8 @@ class WeCom(RequestMixin):
logger.error(f'WeCom response 200 but get field from json error: fields=UserId|OpenId')
raise WeComError
def get_user_detail(self, user_id, **kwargs):
# https://open.work.weixin.qq.com/api/doc/90000/90135/90196
params = {'userid': user_id}
data = self._requests.get(URL.GET_USER_DETAIL, params)
@staticmethod
def default_user_detail(data):
username = data.get('userid')
name = data.get('name', username)
email = data.get('email') or data.get('biz_mail')
@@ -184,3 +184,11 @@ class WeCom(RequestMixin):
return {
'username': username, 'name': name, 'email': email
}
def get_user_detail(self, user_id, **kwargs):
# https://open.work.weixin.qq.com/api/doc/90000/90135/90196
data = self._requests.get(URL.GET_USER_DETAIL, {'userid': user_id})
info = flatten_dict(data)
default_detail = self.default_user_detail(data)
detail = map_attributes(default_detail, info, self.attributes)
return detail