Source code for pykechain.models.team

from typing import Dict, List, Optional, Union

import requests

from pykechain.enums import ScopeStatus, TeamRoles
from pykechain.exceptions import APIError
from pykechain.models.user import User

from ..utils import Empty, clean_empty_values, empty
from .base import Base
from .input_checks import check_enum, check_text, check_type, check_user


[docs] class Team(Base): """A virtual object representing a KE-chain Team. :ivar name: team name :ivar id: uuid of the team """ def __init__(self, json, **kwargs): """Construct a team from provided json data.""" super().__init__(json, **kwargs) self.ref = json.get("ref") self.description = json.get("description") self.options = json.get("options") self.is_hidden = json.get("is_hidden") def _update(self, resource, update_dict=None, params=None, **kwargs): """Update the team in-place.""" url = self._client._build_url(resource, **kwargs) response = self._client._request("PUT", url, json=update_dict, params=params) if response.status_code != requests.codes.ok: # pragma: no cover raise APIError(f"Could not update Team {self}", response=response) self.refresh(json=response.json().get("results")[0])
[docs] def edit( self, name: Optional[Union[str, Empty]] = empty, description: Optional[Union[str, Empty]] = empty, options: Optional[Union[Dict, Empty]] = empty, is_hidden: Optional[Union[bool, Empty]] = empty, **kwargs, ) -> None: """ Edit the attributes of the Team. :param name: (o) name of the Team :type name: str :param description: (o) description of the Team :type description: str :param options: (o) options dictionary to set attributes such as `landingPage`. :type options: dict :param is_hidden: flag to hide the Team :type is_hidden: bool :return: None :raises IllegalArgumentError whenever inputs are not of the correct type """ update_dict = { "id": self.id, "name": check_text(name, "name") or self.name, "description": check_text(description, "description"), "options": check_type(options, dict, "options"), "is_hidden": check_type(is_hidden, bool, "is_hidden"), } if kwargs: # pragma: no cover update_dict.update(kwargs) update_dict = clean_empty_values(update_dict=update_dict) self._update(resource="team", team_id=self.id, update_dict=update_dict)
[docs] def delete(self) -> None: """ Delete the team. Members of the team remain intact. :return: None """ url = self._client._build_url(resource="team", team_id=self.id) response = self._client._request("DELETE", url=url) if response.status_code != requests.codes.no_content: # pragma: no cover raise APIError(f"Could not delete Team {self}", response=response)
[docs] def members(self, role: Optional[Union[TeamRoles, str]] = None) -> List[Dict]: """Members of the team. You may provide the role in the team, to retrieve only the team member with that role. Normally there is a single owner, that has administration rights of the team. Normal team members do not have any rights to administer the team itself such as altering the team name, team image and team members. Administrators do have the right to administer the the team members. :param role: (optional) member belonging to a role :class:`pykechain.enums.TeamRoles` to return. :type role: basestring or None :raises IllegalArgumentError: when providing incorrect roles :return: list of dictionaries with members (pk, username, role, email) Example ------- >>> my_team = client.team(name='My own team') >>> my_team.members() [{"pk":1, "username"="first user", "role"="OWNER", "email":"email@address.com"}, ...] """ check_enum(role, TeamRoles, "role") member_list = list(self._json_data.get("members")) if role: return [ teammember for teammember in member_list if teammember.get("role") == role ] else: return member_list
[docs] def add_members( self, users: Optional[List[Union[User, str]]] = None, role: Optional[Union[TeamRoles, str]] = TeamRoles.MEMBER, ) -> None: """Members to add to a team. :param users: list of members, either `User` objects or usernames :type users: List of `User` or List of pk :param role: (optional) role of the users to add (default `TeamRoles.MEMBER`) :type role: basestring :raises IllegalArgumentError: when providing incorrect user information Example ------- >>> my_team = client.team(name='My own team') >>> other_user = client.users(name='That other person') >>> myself = client.users(name='myself') >>> my_team.add_members([myself], role=TeamRoles.MANAGER) >>> my_team.add_members([other_user], role=TeamRoles.MEMBER) """ update_dict = { "role": check_enum(role, TeamRoles, "role"), "users": [check_user(user, User, "users") for user in users], } self._update("team_add_members", team_id=self.id, update_dict=update_dict)
[docs] def remove_members(self, users: Optional[List[Union[User, str]]] = None) -> None: """ Remove members from the team. :param users: list of members, either `User` objects or usernames :type users: List of `User` or List of pk :raises IllegalArgumentError: when providing incorrect user information Example ------- >>> my_team = client.team(name='My own team') >>> other_user = client.users(name='That other person') >>> my_team.remove_members([other_user]) """ update_dict = {"users": [check_user(user, User, "users") for user in users]} self._update("team_remove_members", update_dict=update_dict, team_id=self.id)
[docs] def scopes(self, status: Optional[ScopeStatus] = None, **kwargs) -> List["Scope"]: """Scopes associated to the team.""" return self._client.scopes(team=self.id, status=status, **kwargs)