Skip to content

Commit 5dff9cf

Browse files
authored
Merge pull request #761 from CitrineInformatics/PLA-9736-list-parent-team-members-for-projects-v3
Pla 9736 list parent team members for projects v3
2 parents 68aac09 + 2031082 commit 5dff9cf

File tree

5 files changed

+65
-16
lines changed

5 files changed

+65
-16
lines changed

docs/source/FAQ/team_management_migration.rst

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,23 @@ The ``Team`` equivalent:
103103

104104
.. code-block:: python
105105
106-
team.add_user(user_uid)
107-
team.remove_user(user_uid)
108-
team.update_user_action(user_uid=user_uid, actions=[WRITE, READ, SHARE])
109-
team.list_members()
106+
# adding a user to a team
107+
team.add_user(user_uid)
108+
109+
# removing a user from a team
110+
team.remove_user(user_uid)
111+
112+
# overwriting a user's permissions on a team
113+
team.update_user_action(user_id=user_uid, actions=[WRITE, READ, SHARE])
114+
115+
# listing user's and their permissions on a team
116+
team.list_members()
110117
111118
As shown above, with the introduction of teams, roles are replaced by specifying a user's actions
112119
as any combination of ``READ``, ``WRITE``, and ``SHARE``.
120+
121+
User permissions should be modified using the ``Team`` object, but for backward compatibility
122+
purposes, listing project members via ``project.list_members()`` will simply list members of
123+
the project's parent team.
124+
125+

src/citrine/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '1.32.1'
1+
__version__ = '1.33.0'

src/citrine/resources/project.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -504,19 +504,29 @@ def owned_table_config_ids(self) -> List[str]:
504504
result = self.session.get_resource(f"{self._path()}/table_definition_ids")
505505
return result["table_definition_ids"]
506506

507-
@use_teams("team.list_members")
508-
def list_members(self) -> List[ProjectMember]:
507+
def list_members(self) -> Union[List[ProjectMember], List["TeamMember"]]:
509508
"""
510509
List all of the members in the current project.
511510
512511
Returns
513512
-------
514-
List[ProjectMember]
515-
The members of the current project
513+
List[ProjectMember] | List[TeamMember]
514+
The members of the current project, or the members of the team
515+
containing the project if teams have been released.
516516
517517
"""
518-
members = self.session.get_resource(f"{self._path()}/users")["users"]
519-
return [ProjectMember(user=User.build(m), project=self, role=m["role"]) for m in members]
518+
from citrine.resources.team import TeamCollection
519+
520+
if self.session._accounts_service_v3:
521+
team_collection = TeamCollection(self.session)
522+
parent_team = team_collection.get(self.team_id)
523+
return parent_team.list_members()
524+
else:
525+
members = self.session.get_resource(f"{self._path()}/users")["users"]
526+
return [ProjectMember(user=User.build(m),
527+
project=self,
528+
role=m["role"])
529+
for m in members]
520530

521531
@use_teams("team.update_user_action")
522532
def update_user_role(self, *, user_uid: Union[str, UUID], role: ROLES, actions: ACTIONS = []):

src/citrine/resources/team.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def add_user(self, user_id: Union[str, UUID], *,
149149
def update_user_action(self, user_id: Union[str, UUID], *,
150150
actions: List[TEAM_ACTIONS]) -> bool:
151151
"""
152-
Update a User's action permissions in the Team.
152+
Overwrites a User's action permissions in the Team.
153153
154154
Parameters
155155
----------

tests/resources/test_project.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
from citrine.resources.project import Project, ProjectCollection
1515
from citrine.resources.project_member import ProjectMember
1616
from citrine.resources.project_roles import MEMBER, LEAD, WRITE
17-
from tests.utils.factories import ProjectDataFactory, UserDataFactory
17+
from tests.utils.factories import ProjectDataFactory, UserDataFactory, TeamDataFactory
1818
from tests.utils.session import FakeSession, FakeCall, FakePaginatedSession, FakeRequestResponse
19+
from citrine.resources.team import READ, TeamMember
1920

2021
logger = getLogger(__name__)
2122

@@ -814,9 +815,34 @@ def test_update_project(collection: ProjectCollection, project):
814815
collection.update(project)
815816

816817

817-
def test_list_members_v3(project_v3):
818-
with pytest.raises(NotImplementedError):
819-
project_v3.list_members()
818+
def test_list_members_v3(project_v3, session_v3):
819+
# Given
820+
user = UserDataFactory()
821+
user["actions"] = READ
822+
user.pop("position")
823+
824+
team_data = TeamDataFactory(
825+
id=str(project_v3.team_id),
826+
)
827+
828+
session_v3.set_responses(
829+
{'team': team_data},
830+
{'users': [user]}
831+
)
832+
833+
# When
834+
members = project_v3.list_members()
835+
836+
# Then
837+
assert 2 == session_v3.num_calls
838+
expect_call_1 = FakeCall(
839+
method='GET',
840+
path='/teams/{}'.format(team_data['id']),
841+
)
842+
expect_call_2 = FakeCall(method='GET', path='/teams/{}/users'.format(project_v3.team_id))
843+
assert expect_call_1 == session_v3.calls[0]
844+
assert expect_call_2 == session_v3.calls[1]
845+
assert isinstance(members[0], TeamMember)
820846

821847

822848
def test_list_members(project, session):

0 commit comments

Comments
 (0)