문서로 건너뛰기
Python

멤버

`members.list`, `list_all`, `iterate`, `get`, `add`, `update`, `remove`, `grant_address`, `revoke_address`, 그리고 옆의 초대 메서드.

모든 메서드

members.py
from openemail import openemail roles = openemail.roles.list_all()support = next(role for role in roles if role['name'] == 'Support')viewer = next(role for role in roles if role['builtin'] == 'viewer') invitation = openemail.members.add({    'email': '[email protected]',    'roleId': support['id'],    'addressIds': ['2b81de07-…'],    'access': 'member',}) people = openemail.members.list_all()sam = next(person for person in people if person['email'] == '[email protected]')member = openemail.members.get(sam['userId']) openemail.members.update(sam['userId'], {'roleId': viewer['id']}) openemail.members.grant_address(sam['userId'], {    'addressId': 'c40a95f2-…',    'access': 'viewer',})openemail.members.revoke_address(sam['userId'], 'c40a95f2-…') openemail.members.remove(sam['userId'])

한 사람에게는 두 가지 권한이 주어지며, 이 둘을 하나로 합쳐서는 안 됩니다. role은 무엇을 해도 되는지이고, addresses는 그것을 어떤 대상에 할 수 있는지입니다. 둘 다 허용해야 합니다. emails:send를 가진 역할을 갖고 있으면서 invoices@에 대해서는 'access': 'viewer'인 사람은, 메일을 보낼 수는 있지만 그 주소에서는 보낼 수 없는 사람입니다. 예외는 addresses:all을 가진 역할로, addresses에 무엇이 나열되든 모든 주소에 닿습니다. 그 배열에는 직접 받은 부여만 들어 있으므로, 그것을 그 사람이 닿는 범위 전체로 읽기 전에 permissions를 확인하십시오.

모든 메서드는 이메일이 아니라 userId를 받습니다. add만 예외인데, 이 호출은 주소를 초대하기 때문입니다. 그 사람은 초대를 수락한 뒤에야 userId를 가지며, 그때까지는 list_invitations가 초대를 추적합니다.

'implied': True는 아무도 역할을 고르지 않았다는 뜻입니다. 주소 권한만 있고 역할 행은 없어서, 가진 권한 중 가장 넓은 것에서 역할을 추론한 것입니다. “아직 정해지지 않음”으로 취급하십시오. 추론을 결정으로 바꾸는 것은 update입니다. 그전까지는 주소 접근 권한을 넓히면 그 사람이 할 수 있는 일도 조용히 함께 넓어집니다.

워크스페이스 소유자는 첫 번째 행이며 'isOwner': True로 표시되고, add, update, remove는 여전히 member_is_owner로 소유자를 거부합니다. 공유되지 않은 워크스페이스도 멤버가 없다고 보고하지 않고 한 명으로 보고하므로, 좌석 수를 셀 때는 isOwner를 제외하십시오.

remove는 두 축을 모두 가져갑니다. 역할과 이 워크스페이스의 모든 주소 권한을 함께 회수하고 addressesRevoked를 보고합니다. revoke_address는 좁은 쪽으로, 회사를 떠난 사람이 아니라 팀을 옮긴 사람을 위한 호출입니다.

매개변수

emailstr필수
초대할 대상이며, 앞뒤 공백을 제거하고 소문자로 변환합니다. 아직 계정이 없어도 됩니다. 누구든 초대할 수 있고, 역할과 권한은 초대를 수락할 때 적용됩니다. 이미 워크스페이스에 있는 사람은 `member_is_owner`(422)입니다.
roleIdstr필수
그 사람이 가질 역할이며 1자에서 128자입니다. 이 워크스페이스에 존재하는 역할이어야 하며, 알 수 없는 id는 `role_not_found`(404)입니다. 소유자 역할은 넘겨줄 수 없어 `role_immutable`(409)로 돌아옵니다. 누군가를 소유자로 만드는 것은 워크스페이스 양도이고, 여기에는 그런 호출이 없기 때문입니다.
addressIdslist[str]
초대에 담기는 주소이며, 각각 1자에서 128자인 id를 최대 64개까지 지정할 수 있고, 초대가 수락될 때 부여됩니다. 무엇이든 기록되기 전에 모든 id를 검사하므로, 이 워크스페이스의 주소가 아닌 id가 하나라도 있으면 호출 전체가 422 `member_not_found`로 거부되고 아무것도 발송되지 않습니다. 같은 주소를 10분 안에 다시 초대하면 409 `invitation_too_soon`입니다.
accessLiteral['member', 'viewer']
`addressIds`에 담긴 모든 id에 대해 무엇을 할 수 있는지입니다. `member`는 주소를 읽고 그 주소로 보낼 수 있으며, `viewer`는 읽기만 합니다. 기본값은 `member`로, 콘솔과 기존 공유 경로가 늘 사용해 온 수준입니다. 덕분에 스크립트에서든 화면에서든 같은 호출이 같은 의미를 갖습니다. 서로 다른 수준을 섞으려면 예외로 둘 주소에 대해 나중에 `grant_address`를 호출하십시오.

응답

objectLiteral['member']
항상 `member`입니다. 삭제 호출도 같은 값과 함께 해당 사용자의 `userId`, `'deleted': True`, `addressesRevoked`만 돌려주고, 아래의 다른 필드는 돌려주지 않습니다.
userIdstr
그 사람의 계정 id이며, 다른 모든 멤버 호출이 경로에서 받는 값입니다. get, update, remove와 두 주소 호출이 모두 이 값을 씁니다. 동료를 추가하는 호출만 대신 이메일로 동작하는데, 동료를 추가하는 사람은 상대의 주소는 알아도 id는 모르기 때문입니다.
emailstr
그 사람 계정에 등록된 이메일이며, 해당 행에 저장된 그대로 돌려줍니다. 이 리소스는 이 값을 기록하지 않으며, `add`에서의 소문자 변환은 조회를 위해 보낸 주소에 적용될 뿐 돌아오는 값에 적용되는 것이 아닙니다. 멤버 목록은 소유자 다음부터 가입 시점이 아니라 이 값을 기준으로 정렬됩니다. 이 목록은 무엇이 바뀌었는지 보려고가 아니라 특정 한 사람을 찾으려고 읽기 때문입니다.
namestr | None
그 사람 계정에서 가져온 표시 이름이며, 해당 컬럼은 NOT NULL입니다. 타입에 있는 `None`은 방어적인 것일 뿐 이 API에서 실제로 관측된 상태는 아닙니다. 이 값은 워크스페이스가 아니라 그 사람에게 속하므로, 이 리소스로는 아무것도 설정할 수 없습니다.
imagestr | None
그 사람 계정에서 가져온 아바타이며, 설정하지 않았으면 null입니다.
role.idstr | None
그 사람이 가진 역할의 id이며, 아무도 고르지 않았으면 null입니다. `implied`를 참고하십시오. 여기가 null인 경우가, `role`이 누군가의 결정이 아니라 추론을 보고하는 유일한 경우입니다.
role.namestr
역할의 이름입니다. 추론된 멤버의 경우 이 워크스페이스의 행이 아니라, 그 사람의 접근 권한이 해석된 내장 템플릿의 이름입니다.
role.builtinLiteral['owner', 'admin', 'member', 'viewer', 'developer', 'billing'] | None
이 역할이 어떤 내장 역할인지이며, 사용자 정의 역할이면 null입니다. `owner`는 소유자 본인의 행에만 `'isOwner': True`와 함께 나타나며, 그 역할을 누군가에게 부여하려 하면 `role_immutable`(409)로 거부됩니다.
isOwnerbool
정확히 한 행에서만 true이며, 워크스페이스가 귀속된 계정입니다. 역할 행이 무엇이라고 하든 모든 권한을 가지며, 정렬 시 가장 앞에 오고, `add`, `update`, `remove`는 모두 `member_is_owner`로 거부합니다. 좌석 수를 셀 때는 제외하십시오.
impliedbool
주소 권한은 있는데 멤버 행이 없어 역할이 선택된 것이 아니라 추론된 경우 true입니다. `member` 권한이 하나라도 있으면 내장 Member로, 그렇지 않으면 Viewer로 해석됩니다. 소유자에게는 절대 true가 되지 않습니다. “접근 권한에서 추론됨”으로 표시하십시오. PATCH로 추론을 결정으로 바꾸기 전까지는, 주소 접근 권한을 넓히면 그 사람이 할 수 있는 일도 조용히 함께 넓어집니다.
permissionslist[Permission]
역할의 권한을 멤버에 펼쳐 놓은 것으로, 역할을 따로 조회하지 않고도 한 번의 읽기로 “이 사람이 해도 되는가?”에 답할 수 있습니다. 추론된 멤버의 경우 이 워크스페이스의 역할 행이 아니라 내장 TEMPLATE에서 가져오므로, 내장 Member 역할을 수정해도 추론된 멤버가 가진 권한은 달라지지 않습니다.
addresseslist[MemberAddressResource]
그 사람에게 부여된 주소이며 주소 기준으로 정렬되고, 각각 자체 접근 수준을 갖습니다. 역할만 있고 권한이 없는 사람은 비어 있습니다. 주소가 부여되기 전의 새 멤버가 바로 그 모습이며, 무엇을 보여 줄지 아직 정하는 중이라면 그것이 올바른 상태입니다.
addresses[].addressIdstr
주소의 id이며, `grant_address`와 `revoke_address`가 받는 값입니다. 이 워크스페이스의 주소가 아닌 id는 두 호출 모두에서 거부되며, 일어나지도 않은 회수를 보고하는 일은 없습니다.
addresses[].addressstr
로컬 파트와 도메인을 다시 조합한 전체 주소이며, 소문자로 표기됩니다.
addresses[].accessLiteral['member', 'viewer']
이 주소 하나에 대해 무엇을 할 수 있는지입니다. `member`는 읽고 그 주소로 보낼 수 있으며, `viewer`는 읽기만 합니다. 발송이 일어나려면 이 값과 역할이 모두 허용해야 하므로, `emails:send`를 가진 역할이라도 `viewer` 권한 위에서는 어떤 주소로도 보내지 못합니다. 저장된 컬럼 이름은 `role`이지만, 한 객체가 서로 다른 어휘에서 온 `role`을 두 개 들고 있지 않도록 여기서는 이름을 바꿨습니다.
createdAtstr | None
멤버 행이 기록된 시각이며 ISO-8601입니다. 멤버 행이 아예 없으면 null입니다. 이 null은 `'implied': True`와 같은 집단을 가리킵니다. 역할 제도가 생기기 전부터 주소 권한을 갖고 있었고 그 뒤로 아무도 역할을 주지 않은 사람들입니다.

초대

invitations.py
from openemail import openemail waiting = openemail.members.list_all_invitations() for invitation in waiting:    if invitation['expired']:        openemail.members.resend_invitation(invitation['id']) openemail.members.revoke_invitation('winv_6bb640f5b99e47deb758f1f5')

add는 초대로 답하며, 이어지는 호출은 다음과 같습니다. list_invitations, list_all_invitations, iterate_invitations는 아직 아무도 수락하지 않은 초대를 읽고, resend_invitation은 새 링크와 14일의 추가 기간으로 다시 보내며, revoke_invitation은 철회합니다. 대기 중인 초대는 수락될 때까지 아무것도 부여하지 않습니다.

resend_invitation은 같은 주소를 10분 안에 두 번째로 보내려 하면 409 invitation_too_soon으로 거부하고, revoke_invitation은 먼저 수락된 초대를 409 invitation_accepted로 거부합니다.

인증 코드

add, update, remove, grant_address, revoke_address는 무엇이든 바꾸기 전에 OAuth 액세스 토큰에 인증 코드를 요구하며, resend_invitation과 revoke_invitation은 요구하지 않습니다. 호출은 is_step_up_required가 True인 OpenEmailApiError를 발생시킵니다. security.begin_step_up()으로 코드를 요청하고, 사용자가 준 코드를 security.verify_step_up({'code': ...})로 확인한 뒤 다시 호출하십시오. 한 번의 인증은 60분 동안 유효하며, API 키는 요구받지 않습니다.

레퍼런스