253 lines
11 KiB
Python
253 lines
11 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_drive import DriveFilePermission, unmarshal_drive_user_permission
|
||
from utils.feishu.helper import converter_enum
|
||
|
||
if TYPE_CHECKING:
|
||
from utils.feishu.api import OpenLark
|
||
from utils.feishu.dt_drive import DriveFileUserPermission, DriveFileToken, DriveFileUser, \
|
||
DriveFilePublicLinkSharePermission, DriveFileType
|
||
|
||
|
||
class APIDrivePermissionMixin(object):
|
||
def add_drive_file_permission(self, user_access_token, file_token, file_type, members):
|
||
"""增加权限
|
||
|
||
:type self: OpenLark
|
||
:param user_access_token: user_access_token
|
||
:type user_access_token: str
|
||
:param file_token: 文件的 token
|
||
:type file_token: str
|
||
:param file_type: 文件类型
|
||
:type file_type: DriveFileType
|
||
:param members: 要添加的权限的人
|
||
:type members: list[DriveFileUserPermission]
|
||
:rtype: list[DriveFileUserPermission]
|
||
|
||
该接口用于根据 file_token 给用户增加文档的权限
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/uMzNzUjLzczM14yM3MTN
|
||
"""
|
||
url = self._gen_request_url('/open-apis/drive/permission/member/create')
|
||
body = {
|
||
'token': file_token,
|
||
'type': converter_enum(file_type),
|
||
'members': [i.as_dict() for i in members]
|
||
}
|
||
res = self._post(url, body=body, auth_token=user_access_token)
|
||
if res['data'].get('is_all_success', False):
|
||
return []
|
||
|
||
return unmarshal_drive_user_permission(res['data']['fail_members']) # type: List[DriveFileUserPermission]
|
||
|
||
def transfer_drive_file_owner(self, user_access_token, file_token, file_type, owner, remove_old_owner=False,
|
||
notify_old_owner=True):
|
||
"""转移拥有者
|
||
|
||
:type self: OpenLark
|
||
:param user_access_token: user_access_token
|
||
:type user_access_token: str
|
||
:param file_token: 文件的 token
|
||
:type file_token: str
|
||
:param file_type: 文件类型
|
||
:type file_type: DriveFileType
|
||
:param owner: 要转移的人
|
||
:type owner: DriveFileUser
|
||
:param remove_old_owner: 转移后删除旧 owner 的权限,默认为 False
|
||
:type remove_old_owner: bool
|
||
:param notify_old_owner: 通知旧 owner,默认为 True
|
||
:type notify_old_owner: bool
|
||
|
||
该接口用于根据文档信息和用户信息转移文档的所有者。
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/uQzNzUjL0czM14CN3MTN
|
||
"""
|
||
url = self._gen_request_url('/open-apis/drive/permission/member/transfer')
|
||
body = {
|
||
'type': converter_enum(file_type),
|
||
'token': file_token,
|
||
'owner': owner.as_dict(),
|
||
'remove_old_owner': remove_old_owner,
|
||
'cancel_notify': not notify_old_owner
|
||
}
|
||
self._post(url, body=body, auth_token=user_access_token)
|
||
|
||
def update_drive_file_public_permission(self, user_access_token,
|
||
file_token,
|
||
file_type,
|
||
copy_print_export_status=None,
|
||
comment=None,
|
||
tenant_shareable=None,
|
||
link_share_entity=None,
|
||
external_access=None,
|
||
invite_external=None):
|
||
"""更新文档公共设置
|
||
|
||
:type self: OpenLark
|
||
:param user_access_token: user_access_token
|
||
:type user_access_token: str
|
||
:param file_token: 文件的 token
|
||
:type file_token: str
|
||
:param file_type: 文件类型
|
||
:type file_type: DriveFileType
|
||
:param copy_print_export_status: 可创建副本/打印/导出/复制设置(不传则保持原值):
|
||
true - 所有可访问此文档的用户
|
||
false - 有编辑权限的用户
|
||
:type copy_print_export_status: bool
|
||
:param comment: 可评论设置(不传则保持原值):
|
||
true - 所有可访问此文档的用户
|
||
false - 有编辑权限的用户
|
||
:type comment: bool
|
||
:param tenant_shareable: 租户内用户是否有共享权限(不传则保持原值)
|
||
:type tenant_shareable: bool
|
||
:param link_share_entity: 链接共享(不传则保持原值):
|
||
"tenant_readable" - 组织内获得链接的人可阅读
|
||
"tenant_editable" - 组织内获得链接的人可编辑
|
||
"anyone_readable" - 获得链接的任何人可阅读
|
||
"anyone_editable" - 获得链接的任何人可编辑
|
||
:type link_share_entity: DriveFilePublicLinkSharePermission
|
||
:param external_access: 是否允许分享到租户外开关(不传则保持原值)
|
||
:type external_access: bool
|
||
:param invite_external: 非owner是否允许邀请外部人(不传则保持原值)
|
||
:type invite_external: bool
|
||
|
||
该接口用于根据 file_token 更新文档的公共设置
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/ukTM3UjL5EzN14SOxcTN
|
||
"""
|
||
url = self._gen_request_url('/open-apis/drive/permission/public/update')
|
||
body = {
|
||
'token': file_token,
|
||
'type': converter_enum(file_type),
|
||
}
|
||
if copy_print_export_status is not None:
|
||
body['copy_print_export_status'] = copy_print_export_status
|
||
if comment is not None:
|
||
body['comment'] = comment
|
||
if tenant_shareable is not None:
|
||
body['tenant_shareable'] = tenant_shareable
|
||
if link_share_entity is not None:
|
||
body['link_share_entity'] = link_share_entity.value
|
||
if external_access is not None:
|
||
body['external_access'] = external_access
|
||
if invite_external is not None:
|
||
body['invite_external'] = invite_external
|
||
self._post(url, body=body, auth_token=user_access_token)
|
||
|
||
def get_drive_file_permissions(self, user_access_token, file_token, file_type):
|
||
"""获取协作者列表
|
||
|
||
:type self: OpenLark
|
||
:param user_access_token: user_access_token
|
||
:type user_access_token: str
|
||
:param file_token: 文件的 token
|
||
:type file_token: str
|
||
:param file_type: 文件类型
|
||
:type file_type: DriveFileType
|
||
:rtype list[DriveFileUserPermission]
|
||
|
||
该接口用于根据 file_token 查询协作者,目前包括人("user")和群("chat")
|
||
|
||
你能获取到协作者列表的前提是你对该文档有权限
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/uATN3UjLwUzN14CM1cTN
|
||
"""
|
||
url = self._gen_request_url('/open-apis/drive/permission/member/list')
|
||
body = {
|
||
'type': converter_enum(file_type),
|
||
'token': file_token,
|
||
}
|
||
res = self._post(url, body=body, auth_token=user_access_token)
|
||
return unmarshal_drive_user_permission(res['data']['members'],
|
||
open_id_type='user',
|
||
open_id_key='member_open_id',
|
||
chat_id_type='chat',
|
||
chat_id_key='member_open_id') # type: List[DriveFileUserPermission]
|
||
|
||
def delete_drive_file_permission(self, user_access_token, file_token, file_type, member):
|
||
"""移除协作者权限
|
||
|
||
:type self: OpenLark
|
||
:param user_access_token: user_access_token
|
||
:type user_access_token: str
|
||
:param file_token: 文件的 token
|
||
:type file_token: str
|
||
:param file_type: 文件类型
|
||
:type file_type: DriveFileType
|
||
:param member: 成员
|
||
:type member: DriveFileUser
|
||
|
||
该接口用于根据 file_token 移除文档协作者的权限
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/uYTN3UjL2UzN14iN1cTN
|
||
"""
|
||
url = self._gen_request_url('/open-apis/drive/permission/member/delete')
|
||
body = member.as_dict()
|
||
body['token'] = file_token
|
||
body['type'] = converter_enum(file_type)
|
||
self._post(url, body=body, auth_token=user_access_token)
|
||
|
||
def update_drive_file_permission(self, user_access_token,
|
||
file_token, file_type,
|
||
member,
|
||
perm=DriveFilePermission.view,
|
||
is_notify=None):
|
||
"""更新协作者权限
|
||
|
||
:type self: OpenLark
|
||
:param user_access_token: user_access_token
|
||
:type user_access_token: str
|
||
:param file_token: 文件的 token
|
||
:type file_token: str
|
||
:param file_type: 文件类型
|
||
:type file_type: DriveFileType
|
||
:param member: 成员
|
||
:type member: DriveFileUser
|
||
:param perm: 权限
|
||
:type perm: DriveFilePermission
|
||
:param is_notify: 是否通知
|
||
:type is_notify: bool
|
||
|
||
该接口用于根据 file_token 更新文档协作者的权限
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/ucTN3UjL3UzN14yN1cTN
|
||
"""
|
||
url = self._gen_request_url('/open-apis/drive/permission/member/update')
|
||
body = member.as_dict()
|
||
body['token'] = file_token
|
||
body['type'] = converter_enum(file_type)
|
||
body['perm'] = converter_enum(perm)
|
||
if is_notify is not None:
|
||
body['notify_lark'] = is_notify
|
||
self._post(url, body=body, auth_token=user_access_token)
|
||
|
||
def check_drive_file_permission(self, user_access_token, file_token, file_type, perm):
|
||
"""判断协作者是否有某权限
|
||
|
||
:type self: OpenLark
|
||
:param user_access_token: user_access_token
|
||
:type user_access_token: str
|
||
:param file_token: 文件的 token
|
||
:type file_token: str
|
||
:param file_type: 文件类型
|
||
:type file_type: DriveFileType
|
||
:param perm: 权限
|
||
:type perm: DriveFilePermission
|
||
|
||
该接口用于根据 file_token 判断当前登录用户是否具有某权限
|
||
|
||
https://open.feishu.cn/document/ukTMukTMukTM/uYzN3UjL2czN14iN3cTN
|
||
"""
|
||
url = self._gen_request_url('/open-apis/drive/permission/member/permitted')
|
||
body = {
|
||
'token': file_token,
|
||
'type': converter_enum(file_type),
|
||
'perm': converter_enum(perm),
|
||
}
|
||
res = self._post(url, body=body, auth_token=user_access_token)
|
||
return res['data']['is_permitted']
|