Skip to content

Commit e89db4f

Browse files
committed
update project_update flow and perform_project_modify() (#2109)
1 parent ccd9fae commit e89db4f

File tree

5 files changed

+102
-62
lines changed

5 files changed

+102
-62
lines changed

taskflowbackend/flows/project_create.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from taskflowbackend.flows.base_flow import BaseLinearFlow
55
from taskflowbackend.tasks import irods_tasks
66

7+
78
# SODAR constants
89
PROJECT_ROLE_DELEGATE = SODAR_CONSTANTS['PROJECT_ROLE_DELEGATE']
910

@@ -103,18 +104,6 @@ def build(self, force_fail=False):
103104
inject={'name': owner_group},
104105
)
105106
)
106-
self.add_task(
107-
irods_tasks.SetAccessTask(
108-
name='Set project owner group access',
109-
irods=self.irods,
110-
inject={
111-
'access_name': 'read',
112-
'path': project_path,
113-
'user_name': owner_group,
114-
'irods_backend': self.irods_backend,
115-
},
116-
)
117-
)
118107
self.add_task(
119108
irods_tasks.CreateUserTask(
120109
name='Create user for project owner',

taskflowbackend/flows/project_update.py

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
# Projectroles dependency
2+
from projectroles.models import SODAR_CONSTANTS, ROLE_RANKING
3+
14
from taskflowbackend.flows.base_flow import BaseLinearFlow
25
from taskflowbackend.tasks import irods_tasks
36

47

8+
# SODAR constants
9+
PROJECT_ROLE_DELEGATE = SODAR_CONSTANTS['PROJECT_ROLE_DELEGATE']
10+
11+
512
class Flow(BaseLinearFlow):
6-
"""Flow for updating a project: modifies project metadata and owner"""
13+
"""Flow for updating a project. Modifies project metadata and users."""
714

815
def validate(self):
916
self.required_fields = []
@@ -13,6 +20,8 @@ def validate(self):
1320
def build(self, force_fail=False):
1421
project_path = self.irods_backend.get_path(self.project)
1522
project_group = self.irods_backend.get_user_group_name(self.project)
23+
owner_group = self.irods_backend.get_user_group_name(self.project, True)
24+
min_owner_rank = ROLE_RANKING[PROJECT_ROLE_DELEGATE]
1625

1726
self.add_task(
1827
irods_tasks.SetCollectionMetadataTask(
@@ -52,38 +61,66 @@ def build(self, force_fail=False):
5261
)
5362
)
5463
# Add new inherited roles
55-
for user_name in self.flow_data.get('users_add', []):
64+
for r in self.flow_data.get('roles_add', []):
5665
self.add_task(
5766
irods_tasks.CreateUserTask(
58-
name='Create user "{}" in irods'.format(user_name),
67+
name='Create user "{}" in irods'.format(r['user_name']),
5968
irods=self.irods,
60-
inject={'user_name': user_name, 'user_type': 'rodsuser'},
69+
inject={
70+
'user_name': r['user_name'],
71+
'user_type': 'rodsuser',
72+
},
6173
)
6274
)
63-
for user_name in self.flow_data.get('users_add', []):
75+
for r in self.flow_data.get('roles_add', []):
6476
self.add_task(
6577
irods_tasks.AddUserToGroupTask(
6678
name='Add user "{}" to project user group "{}"'.format(
67-
user_name, project_group
79+
r['user_name'], project_group
6880
),
6981
irods=self.irods,
7082
inject={
7183
'group_name': project_group,
72-
'user_name': user_name,
84+
'user_name': r['user_name'],
7385
},
7486
)
7587
)
88+
if r.get('role_rank') and r['role_rank'] <= min_owner_rank:
89+
self.add_task(
90+
irods_tasks.AddUserToGroupTask(
91+
name='Add user "{}" to project owner group "{}"'.format(
92+
r['user_name'], owner_group
93+
),
94+
irods=self.irods,
95+
inject={
96+
'group_name': owner_group,
97+
'user_name': r['user_name'],
98+
},
99+
)
100+
)
76101
# Delete old inherited roles
77-
for user_name in self.flow_data.get('users_delete', []):
102+
for r in self.flow_data.get('roles_delete', []):
78103
self.add_task(
79104
irods_tasks.RemoveUserFromGroupTask(
80105
name='Remove user "{}" from project user group "{}"'.format(
81-
user_name, project_group
106+
r['user_name'], project_group
82107
),
83108
irods=self.irods,
84109
inject={
85110
'group_name': project_group,
86-
'user_name': user_name,
111+
'user_name': r['user_name'],
87112
},
88113
)
89114
)
115+
if r.get('role_rank') and r['role_rank'] <= min_owner_rank:
116+
self.add_task(
117+
irods_tasks.RemoveUserFromGroupTask(
118+
name='Remove user "{}" from project owner group '
119+
'"{}"'.format(r['user_name'], owner_group),
120+
irods=self.irods,
121+
inject={
122+
'group_name': owner_group,
123+
'user_name': r['user_name'],
124+
},
125+
)
126+
)

taskflowbackend/irods_utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""iRODS utilities for the taskflowbackend app"""
22

33

4+
# TODO: Rename to get_flow_role()
5+
# TODO: Refactor to accept either SODARUser or username string
46
def get_batch_role(project, user_name, role_rank=None):
57
"""
68
Return role dict for use with e.g. the role_update_irods_batch flow.

taskflowbackend/plugins.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,14 @@ def perform_project_modify(
134134
action == PROJECT_ACTION_UPDATE
135135
and old_data['parent'] != project.parent
136136
):
137-
# TODO: Add helper for user data or update get_batch_role()
138137
inh_members = [
139-
{'user_name': a.user.username, 'role_rank': a.role.rank}
138+
get_batch_role(project, a.user.username, a.role.rank)
140139
for a in all_roles
141140
if a.project != project and a.user != owner
142141
]
143142
flow_data['roles_add'] = inh_members
144143
old_inh_members = [
145-
{'user_name': a.user.username, 'role_rank': a.role.rank}
144+
get_batch_role(project, a.user.username, a.role.rank)
146145
for a in old_data['parent'].get_roles()
147146
]
148147
flow_data['roles_delete'] = [
@@ -152,7 +151,7 @@ def perform_project_modify(
152151
]
153152
else: # Create
154153
flow_data['roles_add'] = [
155-
{'user_name': a.user.username, 'role_rank': a.role.rank}
154+
get_batch_role(project, a.user.username, a.role.rank)
156155
for a in all_roles
157156
if a.user != owner
158157
]
@@ -162,6 +161,7 @@ def perform_project_modify(
162161
flow_data=flow_data,
163162
)
164163
# If updating parent in category, add role_update_irods_batch call
164+
# TODO: Do we need a separate call for this with project_update changes?
165165
elif (
166166
action == PROJECT_ACTION_UPDATE
167167
and children

taskflowbackend/tests/test_flows.py

Lines changed: 48 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
IRODS_ACCESS_OWN,
7171
TICKET_STR,
7272
)
73+
from taskflowbackend.irods_utils import get_batch_role
7374

7475

7576
app_settings = AppSettingAPI()
@@ -1374,10 +1375,11 @@ def test_create(self):
13741375
flow_data = {
13751376
'owner': self.user.username,
13761377
'roles_add': [
1377-
{
1378-
'user_name': self.user_owner_cat.username,
1379-
'role_rank': ROLE_RANKING[PROJECT_ROLE_OWNER],
1380-
}
1378+
get_batch_role(
1379+
self.project,
1380+
self.user_owner_cat.username,
1381+
ROLE_RANKING[PROJECT_ROLE_OWNER],
1382+
)
13811383
],
13821384
}
13831385
flow = self.taskflow.get_flow(
@@ -1399,11 +1401,8 @@ def test_create(self):
13991401
self.irods_backend.get_path(self.project),
14001402
self.irods_access_read,
14011403
)
1402-
self.assert_irods_access(
1403-
self.owner_group_name,
1404-
self.irods_backend.get_path(self.project),
1405-
self.irods_access_read,
1406-
)
1404+
# NOTE: Owner group does not need special access here, as owners and
1405+
# delegates are also in the user group and everything is read-only
14071406
self.assertIsInstance(
14081407
self.irods.users.get(self.user.username), iRODSUser
14091408
)
@@ -1434,10 +1433,11 @@ def test_create_inherited_delegate(self):
14341433
flow_data = {
14351434
'owner': self.user.username,
14361435
'roles_add': [
1437-
{
1438-
'user_name': self.user_assign.username,
1439-
'role_rank': ROLE_RANKING[PROJECT_ROLE_DELEGATE],
1440-
}
1436+
get_batch_role(
1437+
self.project,
1438+
self.user_assign.username,
1439+
ROLE_RANKING[PROJECT_ROLE_DELEGATE],
1440+
)
14411441
],
14421442
}
14431443
flow = self.taskflow.get_flow(
@@ -1455,10 +1455,11 @@ def test_create_inherited_contributor(self):
14551455
flow_data = {
14561456
'owner': self.user.username,
14571457
'roles_add': [
1458-
{
1459-
'user_name': self.user_assign.username,
1460-
'role_rank': ROLE_RANKING[PROJECT_ROLE_CONTRIBUTOR],
1461-
}
1458+
get_batch_role(
1459+
self.project,
1460+
self.user_assign.username,
1461+
ROLE_RANKING[PROJECT_ROLE_CONTRIBUTOR],
1462+
)
14621463
],
14631464
}
14641465
flow = self.taskflow.get_flow(
@@ -1472,7 +1473,6 @@ def test_create_inherited_contributor(self):
14721473
self.assert_owner_group_member(self.project, self.user_assign, False)
14731474

14741475

1475-
# TODO: Add tests for owner group
14761476
class TestProjectUpdate(TaskflowbackendFlowTestBase):
14771477
"""Tests for the project_update flow"""
14781478

@@ -1543,14 +1543,14 @@ def test_update_parent(self):
15431543
self.make_assignment_taskflow(
15441544
self.project, user_contributor, self.role_contributor
15451545
)
1546-
self.assert_user_group_member(self.project, self.user, status=True)
1547-
self.assert_user_group_member(
1548-
self.project, self.user_owner_cat, status=True
1549-
)
1550-
self.assert_user_group_member(
1551-
self.project, user_contributor, status=True
1552-
)
1553-
self.assert_user_group_member(self.project, user_cat_new, status=False)
1546+
self.assert_user_group_member(self.project, self.user)
1547+
self.assert_owner_group_member(self.project, self.user)
1548+
self.assert_user_group_member(self.project, self.user_owner_cat)
1549+
self.assert_owner_group_member(self.project, self.user_owner_cat)
1550+
self.assert_user_group_member(self.project, user_contributor)
1551+
self.assert_owner_group_member(self.project, user_contributor, False)
1552+
self.assert_user_group_member(self.project, user_cat_new, False)
1553+
self.assert_owner_group_member(self.project, user_cat_new, False)
15541554
project_coll = self.irods.collections.get(self.project_path)
15551555
self.assertEqual(
15561556
project_coll.metadata.get_one('parent_uuid').value,
@@ -1565,8 +1565,20 @@ def test_update_parent(self):
15651565
self.project.save()
15661566

15671567
flow_data = {
1568-
'users_add': [user_cat_new.username],
1569-
'users_delete': [self.user_owner_cat.username],
1568+
'roles_add': [
1569+
get_batch_role(
1570+
self.project,
1571+
user_cat_new.username,
1572+
ROLE_RANKING[PROJECT_ROLE_CONTRIBUTOR],
1573+
)
1574+
],
1575+
'roles_delete': [
1576+
get_batch_role(
1577+
self.project,
1578+
self.user_owner_cat.username,
1579+
ROLE_RANKING[PROJECT_ROLE_OWNER],
1580+
)
1581+
],
15701582
}
15711583
flow = self.taskflow.get_flow(
15721584
irods_backend=self.irods_backend,
@@ -1576,14 +1588,14 @@ def test_update_parent(self):
15761588
)
15771589
self.build_and_run(flow)
15781590

1579-
self.assert_user_group_member(self.project, self.user, status=True)
1580-
self.assert_user_group_member(
1581-
self.project, self.user_owner_cat, status=False
1582-
)
1583-
self.assert_user_group_member(
1584-
self.project, user_contributor, status=True
1585-
)
1586-
self.assert_user_group_member(self.project, user_cat_new, status=True)
1591+
self.assert_user_group_member(self.project, self.user)
1592+
self.assert_owner_group_member(self.project, self.user)
1593+
self.assert_user_group_member(self.project, self.user_owner_cat, False)
1594+
self.assert_owner_group_member(self.project, self.user_owner_cat, False)
1595+
self.assert_user_group_member(self.project, user_contributor)
1596+
self.assert_owner_group_member(self.project, user_contributor, False)
1597+
self.assert_user_group_member(self.project, user_cat_new)
1598+
self.assert_owner_group_member(self.project, user_cat_new, False)
15871599
project_coll = self.irods.collections.get(self.project_path)
15881600
self.assertEqual(
15891601
project_coll.metadata.get_one('parent_uuid').value,

0 commit comments

Comments
 (0)