223 lines
10 KiB
Python
223 lines
10 KiB
Python
# coding: utf-8
|
||
|
||
from __future__ import absolute_import, division, print_function, unicode_literals
|
||
|
||
from typing import TYPE_CHECKING, List
|
||
|
||
from utils.feishu.dt_application import App
|
||
from utils.feishu.dt_code import SimpleUser
|
||
from utils.feishu.dt_enum import I18NType
|
||
from utils.feishu.dt_help import make_datatype
|
||
from utils.feishu.exception import LarkInvalidArguments
|
||
from utils.feishu.helper import converter_enum
|
||
|
||
if TYPE_CHECKING:
|
||
from utils.feishu.api import OpenLark
|
||
|
||
|
||
class APIApplicationMixin(object):
|
||
def is_user_admin(self, open_id=None, employee_id=None):
|
||
"""获取应用管理权限
|
||
|
||
:type self: OpenLark
|
||
:param open_id: 用户 open_id
|
||
:type open_id: str
|
||
:param employee_id: 用户租户 ID
|
||
:type employee_id: str
|
||
:return: 是否是应用管理员
|
||
:rtype: bool
|
||
|
||
该接口用于查询用户是否为应用管理员。
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/uITN1EjLyUTNx4iM1UTM
|
||
"""
|
||
if open_id:
|
||
url = '/open-apis/application/v3/is_user_admin?open_id={}'.format(open_id)
|
||
elif employee_id:
|
||
url = '/open-apis/application/v3/is_user_admin?employee_id={}'.format(employee_id)
|
||
else:
|
||
raise LarkInvalidArguments(msg='[is_user_admin] empty open_id and employee_id')
|
||
|
||
url = self._gen_request_url(url)
|
||
res = self._get(url, with_tenant_token=True)
|
||
|
||
data = res['data']
|
||
return data['is_app_admin'] # type: bool
|
||
|
||
def get_app_visibility(self, app_id, user_page_token='', user_page_size=20):
|
||
"""获取应用在企业内的可用范围
|
||
|
||
:type self: OpenLark
|
||
:param app_id: 目标应用的 ID
|
||
:type app_id: str
|
||
:param user_page_token: 分页拉取用户列表起始位置标示,不填表示从头开始
|
||
:type user_page_token: str
|
||
:param user_page_size: 本次拉取用户列表最大个数(最大值 1000 ,0 自动最大个数 )
|
||
:type user_page_size: int
|
||
:return: (部门列表, 可见的用户列表,是否全员可见,是否还有更多用户,用户翻页token,
|
||
所有可见用户数量(仅包含单独设置的用户,可用部门中的用户不计算在内)
|
||
:rtype: (list[str], list[SimpleUser], bool, bool, str, int)
|
||
|
||
该接口用于查询应用在该企业内可以被使用的范围,只能被企业自建应用调用且需要“获取应用信息”权限。
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/uIjM3UjLyIzN14iMycTN
|
||
"""
|
||
url = self._gen_request_url('/open-apis/application/v1/app/visibility?app_id={}'.format(app_id))
|
||
if user_page_token:
|
||
url = '{}&user_page_token={}'.format(url, user_page_token)
|
||
if user_page_size:
|
||
url = '{}&user_page_size={}'.format(url, user_page_size)
|
||
res = self._get(url, with_tenant_token=True)
|
||
|
||
data = res['data']
|
||
department_ids = [i.get('id') for i in data.get('departments', [])] # type: List[str]
|
||
users = [make_datatype(SimpleUser, i) for i in data.get('users', [])] # type: List[SimpleUser]
|
||
is_visible_to_all = bool(data.get('is_visible_to_all', False)) # type: bool
|
||
has_more_users = bool(data.get('has_more_users', False)) # type: bool
|
||
user_page_token = data.get('user_page_token') # type: str
|
||
total_user_count = data.get('total_user_count') # type: int
|
||
|
||
return department_ids, users, is_visible_to_all, has_more_users, user_page_token, total_user_count
|
||
|
||
def get_visible_apps(self, user_id=None, open_id=None, page_size=20, page_token='', lang=I18NType.zh_cn):
|
||
"""获取应用在企业内的可用范围
|
||
|
||
:type self: OpenLark
|
||
:param user_id: 目标用户 user_id,与 open_id 至少给其中之一,user_id 优先于 open_id
|
||
:type user_id: str
|
||
:param open_id: 目标用户 open_id
|
||
:type open_id: str
|
||
:param page_size: 本次拉取用户列表最大个数(最大值 1000 ,0 自动最大个数 )
|
||
:type page_size: int
|
||
:param page_token: 分页拉取用户列表起始位置标示,不填表示从头开始
|
||
:type page_token: str
|
||
:param lang: 优先展示的应用信息的语言版本(zh_cn:中文,en_us:英文,ja_jp:日文)
|
||
:type lang: I18NType
|
||
:return: 是否还有更多, page_token, page_size, 总数, 语言, 应用列表
|
||
:rtype: (bool, str, int, int, I18NType, list[App])
|
||
|
||
该接口用于查询应用在该企业内可以被使用的范围,只能被企业自建应用调用且需要“获取应用信息”权限。
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/uIjM3UjLyIzN14iMycTN
|
||
"""
|
||
url = self._gen_request_url('/open-apis/application/v1/user/visible_apps?')
|
||
if user_id:
|
||
url = '{}&user_id={}'.format(url, user_id)
|
||
elif open_id:
|
||
url = '{}&open_id={}'.format(url, open_id)
|
||
else:
|
||
raise LarkInvalidArguments(msg='empty user_id and open_id')
|
||
if page_token:
|
||
url = '{}&page_token={}'.format(url, page_token)
|
||
if page_size:
|
||
url = '{}&page_size={}'.format(url, page_size)
|
||
if lang:
|
||
url = '{}&lang={}'.format(url, converter_enum(lang))
|
||
|
||
res = self._get(url, with_tenant_token=True)
|
||
data = res['data']
|
||
|
||
apps = [make_datatype(App, i) for i in data.get('app_list', [])] # type: List[App]
|
||
|
||
has_more = bool(data.get('has_more', False)) # type: bool
|
||
lang = I18NType(data.get('lang', 'zh_cn')) # type: I18NType
|
||
page_size = data.get('page_size') # type: int
|
||
page_token = data.get('page_token') # type: str
|
||
total_count = data.get('total_count') # type: int
|
||
return has_more, page_token, page_size, total_count, lang, apps
|
||
|
||
def get_installed_apps(self, page_size=20, page_token='', lang=I18NType.zh_cn, status=-1):
|
||
"""获取企业安装的应用
|
||
|
||
:type self: OpenLark
|
||
:param page_size: 本次拉取用户列表最大个数(最大值 1000 ,0 自动最大个数 )
|
||
:type page_size: int
|
||
:param page_token: 分页拉取用户列表起始位置标示,不填表示从头开始
|
||
:type page_token: str
|
||
:param lang: 优先展示的应用信息的语言版本(zh_cn:中文,en_us:英文,ja_jp:日文)
|
||
:type lang: I18NType
|
||
:param status: 要返回的应用的状态,0:停用;1:启用;-1:全部
|
||
:type status: int
|
||
:return: 是否还有更多, page_token, page_size, 总数, 语言, 应用列表
|
||
:rtype: (bool, str, int, int, I18NType, list[App])
|
||
|
||
该接口用于查询企业安装的应用列表,只能被企业自建应用调用且需要“获取应用信息”权限。
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/uYDN3UjL2QzN14iN0cTN
|
||
"""
|
||
url = self._gen_request_url('/open-apis/application/v3/app/list?')
|
||
if page_token:
|
||
url = '{}&page_token={}'.format(url, page_token)
|
||
if page_size:
|
||
url = '{}&page_size={}'.format(url, page_size)
|
||
if lang:
|
||
url = '{}&lang={}'.format(url, converter_enum(lang))
|
||
if status in [0, 1, -1]:
|
||
url = '{}&status={}'.format(url, status)
|
||
|
||
res = self._get(url, with_tenant_token=True)
|
||
data = res['data']
|
||
|
||
apps = [make_datatype(App, i) for i in data.get('app_list', [])] # type: List[App]
|
||
|
||
has_more = bool(data.get('has_more', False)) # type: bool
|
||
lang = I18NType(data.get('lang', 'zh_cn')) # type: I18NType
|
||
page_size = data.get('page_size') # type: int
|
||
page_token = data.get('page_token') # type: str
|
||
total_count = data.get('total_count') # type: int
|
||
return has_more, page_token, page_size, total_count, lang, apps
|
||
|
||
def update_app_visibility(self, app_id, add_users=None, del_users=None, add_departments=None, del_departments=None,
|
||
is_visiable_to_all=None):
|
||
"""更新应用可用范围
|
||
|
||
:type self: OpenLark
|
||
:param app_id: 应用 ID
|
||
:type app_id: str
|
||
:param add_users: 增加的用户列表,元素个数不超过500,先增加后删除
|
||
:type add_users: list[SimpleUser]
|
||
:param del_users: 删除的用户列表,元素个数不超过 500,先增加后删除
|
||
:type del_users: list[SimpleUser]
|
||
:param add_departments: 添加的部门列表,元素个数不超过 500,先增加后删除
|
||
:type add_departments: list[str]
|
||
:param del_departments: 删除的部门列表,元素个数不超过 500,先增加后删除
|
||
:type del_departments: list[str]
|
||
:param is_visiable_to_all: 是否全员可见,不填:继续当前状态不改变
|
||
:type is_visiable_to_all: bool
|
||
|
||
该接口用于增加或者删除指定应用被哪些人可用,只能被企业自建应用调用且需要“管理应用”权限。
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/ucDN3UjL3QzN14yN0cTN
|
||
"""
|
||
url = self._gen_request_url('/open-apis/application/v3/app/update_visibility')
|
||
|
||
_add_users = []
|
||
for i in (add_users or []):
|
||
if i.user_id:
|
||
_add_users.append({'user_id': i.user_id})
|
||
elif i.open_id:
|
||
_add_users.append({'open_id': i.open_id})
|
||
else:
|
||
raise LarkInvalidArguments(msg='empty user_id and open_id')
|
||
|
||
_del_users = []
|
||
for i in (del_users or []):
|
||
if i.user_id:
|
||
_del_users.append({'user_id': i.user_id})
|
||
elif i.open_id:
|
||
_del_users.append({'open_id': i.open_id})
|
||
else:
|
||
raise LarkInvalidArguments(msg='empty user_id and open_id')
|
||
|
||
body = {
|
||
'app_id': app_id,
|
||
'add_users': _add_users,
|
||
'del_users': _del_users,
|
||
'add_departments': add_departments or [],
|
||
'del_departments': del_departments or []
|
||
}
|
||
|
||
if is_visiable_to_all is not None:
|
||
body['is_visiable_to_all'] = int(is_visiable_to_all)
|
||
self._post(url, body=body, with_tenant_token=True)
|