from enum import IntEnum
from tdw_catalog.entity import Entity, Property, EntityBase
from tdw_catalog.relations import _OrganizationRelation
from tdw_catalog.utils import LegacyFilter
from tdw_catalog.errors import _convert_error, _raise_error
from datetime import datetime
from typing import TYPE_CHECKING, List, Optional
from tdw_catalog import Catalog
import tdw_catalog.team_member as team_member
if TYPE_CHECKING:
import tdw_catalog.organization as organization
[docs]class TeamMemberPermissionLevel(IntEnum):
VIEW = 1
MANAGE = 2
[docs]@Entity([
Property("id", str, serialize=True),
Property("organization_id",
str,
relation="tdw_catalog.organization.Organization",
serialize=True),
Property("title", str, writable=True),
Property("created_at", datetime),
Property("updated_at", datetime)
])
class Team(EntityBase, _OrganizationRelation):
"""
Teams are sets of OrganizationMembers, with which
Datasets can be shared.
Attributes
----------
id : str
The unique ID of this Team
organization : organization.Organization
The :class:`.Organization`that relates to the `organization_id` on the model
organization_id : str
The unique ID of the :class:`.Organization` to which this Team belongs
title : str
The name of this Team
created_at : datetime
The datetime at which this Team was created
updated_at : datetime
The datetime at which this Team was last updated
"""
_client: 'Catalog'
id: str
organization: 'organization.Organization'
organization_id: str
title: str
created_at: datetime
updated_at: datetime
def __str__(self) -> str:
return f"<Team id={self.id} title={self.title}>"
[docs] @classmethod
def get(cls, client: 'Catalog', organization_id: str, id: str):
"""
Retrieve an :class:`.Team` belonging to this :class:`.Organization`
Parameters
----------
client : Catalog
A :class:`.Catalog` client
organization_id : str
The unique ID of the :class:`.Organization`
id : str
The unique ID of the :class:`.Team`
Returns
-------
Team
The :class:`.Team` associated with the given ID
Raises
------
CatalogInternalException
If call to the :class:`.Catalog` server fails
CatalogNotFoundException
If no :class:`.Team` is found matching the provided ID
CatalogPermissionDeniedException
If the caller is not allowed to retrieve this :class:`.Team`
"""
try:
res = client._get_group(organization_id=organization_id, id=id)
return Team(client, **res)
except Exception as e:
err = _raise_error(e, "Unable to fetch Team {}".format(id))
[docs] def save(self) -> None:
"""
Update this Team, saving any changes to its title
Parameters
----------
None
Returns
-------
None
Raises
------
CatalogPermissionDeniedException
If the caller is not allowed to update this Team
CatalogException
If call to the :class:`.Catalog` server fails
"""
try:
res = self._client._update_group(group=self.serialize())
self.deserialize(res)
except Exception as e:
raise _convert_error(e)
[docs] def delete(self) -> None:
"""
Delete this Team. This Team object should not be
used after `delete()` has successfully returned
Parameters
----------
None
Returns
-------
None
Raises
------
CatalogPermissionDeniedException
If the caller is not allowed to delete this Team
CatalogException
If call to the :class:`.Catalog` server fails
"""
try:
self._client._delete_group(group=self.serialize())
except Exception as e:
raise _convert_error(e)
[docs] def get_member(self, user_id: str) -> 'team_member.TeamMember':
"""
Retrieve a specific member (User) of this Team
Parameters
----------
user_id : str
The unique :class:`.User` ID of the :class:`.TeamMember`
Returns
-------
TeamMember
The :class:`.TeamMember` with the given :class:`.User` ID
Raises
------
CatalogPermissionDeniedException
If the caller is not allowed to fetch Team members
CatalogNotFoundException
If the given :class:`.User` ID does not exist or is not a member of this Team
CatalogInvalidArgumentException
If the given :class:`.User` ID is malformed
CatalogException
If call to the :class:`.Catalog` server fails
"""
# TeamMember's constructor will fill in permission automatically
return team_member.TeamMember.get(self._client, self.id, user_id)
[docs] def add_member(
self, user_id: str,
permission: TeamMemberPermissionLevel) -> 'team_member.TeamMember':
"""
Add a :class:`.User` to the :class:`.Team` as a TeamMember. The :class:`.User` in question must
already be a member of the containing Organization.
Parameters
----------
user_id : str
The unique :class:`.User` ID of the invitee
Returns
-------
TeamMember
The newly created TeamMember
Raises
------
CatalogPermissionDeniedException
If the caller is not allowed to invite Team members
CatalogAlreadyExistsException
If the caller is inviting a :class:`.User` who is already a TeamMember of this Team
CatalogInvalidArgumentException
If the given :class:`.User` ID does not exist
CatalogException
If call to the :class:`.Catalog` server fails
"""
try:
member = team_member.TeamMember(self._client,
user_id=user_id,
group_id=self.id,
permission=permission)
res = self._client._add_group_member(member=member.serialize())
member.deserialize(res)
return member
except Exception as e:
raise _convert_error(e)
[docs] def list_members(
self,
filter: Optional[LegacyFilter] = None
) -> List['team_member.TeamMember']:
"""
Retrieve all TeamMembers of this Team
Parameters
----------
None
Returns
-------
list[TeamMembers]
The :class:`.TeamMember`\\ s which are a member of this Team
Raises
------
CatalogPermissionDeniedException
If the caller is not allowed to list TeamMembers
CatalogException
If call to the :class:`.Catalog` server fails
"""
try:
team_members = self._client._list_group_members(group_id=self.id,
filter=filter)
return [
team_member.TeamMember(self._client, **m) for m in team_members
]
except Exception as e:
raise _convert_error(e)
def _get_organization(self):
import tdw_catalog.organization as organization
return organization.Organization.get(self._client,
self.organization_id)