Source code for annofabapi.project_member_repository

from collections.abc import Callable

import more_itertools

from annofabapi import Resource
from annofabapi.models import ProjectMember


[docs] class ProjectMemberRepository: """プロジェクトメンバ情報を取得するRepository。""" def __init__(self, resource: Resource) -> None: self.resource = resource self._members_by_project_id: dict[str, list[ProjectMember]] = {} def _get_project_member_with_predicate(self, project_id: str, predicate: Callable[[ProjectMember], bool]) -> ProjectMember | None: """条件に一致するプロジェクトメンバを取得する。 プロジェクトメンバの一覧をプロジェクトIDごとにキャッシュする。 Args: project_id: プロジェクトID predicate: プロジェクトメンバの検索条件 Returns: 条件に一致するプロジェクトメンバ。見つからない場合はNone。 """ project_member_list = self._members_by_project_id.get(project_id) if project_member_list is None: project_member_list = self.resource.wrapper.get_all_project_members(project_id, query_params={"include_inactive_member": True}) self._members_by_project_id[project_id] = project_member_list return more_itertools.first_true(project_member_list, pred=predicate)
[docs] def get_project_member_from_account_id(self, project_id: str, account_id: str) -> ProjectMember: """account_idからプロジェクトメンバを取得する。 Args: project_id: プロジェクトID account_id: アカウントID Returns: 指定したaccount_idのプロジェクトメンバ。 Raises: ValueError: 指定したaccount_idのプロジェクトメンバが見つからない場合。 """ member = self._get_project_member_with_predicate(project_id, predicate=lambda e: e["account_id"] == account_id) if member is None: raise ValueError(f"project_member is not found. project_id='{project_id}', account_id='{account_id}'") return member
[docs] def get_project_member_from_user_id(self, project_id: str, user_id: str) -> ProjectMember: """user_idからプロジェクトメンバを取得する。 Args: project_id: プロジェクトID user_id: ユーザーID Returns: 指定したuser_idのプロジェクトメンバ。 Raises: ValueError: 指定したuser_idのプロジェクトメンバが見つからない場合。 """ member = self._get_project_member_with_predicate(project_id, predicate=lambda e: e["user_id"] == user_id) if member is None: raise ValueError(f"project_member is not found. project_id='{project_id}', user_id='{user_id}'") return member
[docs] def get_user_id_from_account_id(self, project_id: str, account_id: str) -> str: """account_idからuser_idを取得する。 Args: project_id: プロジェクトID account_id: アカウントID Returns: 指定したaccount_idに対応するユーザーID。 Raises: ValueError: 指定したaccount_idのプロジェクトメンバが見つからない場合。 """ return self.get_project_member_from_account_id(project_id, account_id)["user_id"]
[docs] def get_account_id_from_user_id(self, project_id: str, user_id: str) -> str: """user_idからaccount_idを取得する。 Args: project_id: プロジェクトID user_id: ユーザーID Returns: 指定したuser_idに対応するアカウントID。 Raises: ValueError: 指定したuser_idのプロジェクトメンバが見つからない場合。 """ return self.get_project_member_from_user_id(project_id, user_id)["account_id"]