Skip to content

Commit

Permalink
update perform_role_modify(), add tests, refactor (#1617)
Browse files Browse the repository at this point in the history
  • Loading branch information
mikkonie committed May 5, 2023
1 parent 002af12 commit a3bc44d
Show file tree
Hide file tree
Showing 2 changed files with 238 additions and 44 deletions.
82 changes: 56 additions & 26 deletions taskflowbackend/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,21 @@ def perform_project_modify(
logger.debug('Skipping: Nothing to modify')
return

timeline = get_backend_api('timeline_backend')
taskflow = self.get_api()
timeline = get_backend_api('timeline_backend')
owner = project.get_owner().user
all_roles = [
a
for a in project.get_roles()
if a.role.rank < ROLE_RANKING[PROJECT_ROLE_FINDER]
]
all_members = [a.user.username for a in all_roles]
children = [
p
for p in project.get_children(flat=True)
if p.type == PROJECT_TYPE_PROJECT
]

tl_event = None
if timeline:
tl_event = timeline.add_event(
Expand Down Expand Up @@ -135,6 +141,7 @@ def perform_project_modify(
# If updating parent in category, add role_update_irods_batch call
elif (
action == PROJECT_ACTION_UPDATE
and children
and old_data['parent'] != project.parent
):
flow_data = {'roles_add': [], 'roles_delete': []}
Expand All @@ -143,11 +150,6 @@ def perform_project_modify(
if old_data['parent'] # Old parent may be None
else []
)
children = [
p
for p in project.get_children(flat=True)
if p.type == PROJECT_TYPE_PROJECT
]
for c in children:
for u in all_members:
flow_data['roles_add'].append(
Expand Down Expand Up @@ -231,40 +233,68 @@ def perform_role_modify(self, role_as, action, old_role=None, request=None):
:param old_role: Role object for previous role in case of an update
:param request: Request object or None
"""
# TODO: If creating for category, add iRODS access for category children
# Skip for categories
if role_as.project.type != PROJECT_TYPE_PROJECT:
logger.debug('Skipping: {}'.format(IRODS_CAT_SKIP_MSG))
return
# Skip for update (no action needed)
if action == PROJECT_ACTION_UPDATE:
# Skip for update (no action needed unless updating to/from finder)
if (
action == PROJECT_ACTION_UPDATE
and role_as.role.rank < ROLE_RANKING[PROJECT_ROLE_FINDER]
and old_role.rank < ROLE_RANKING[PROJECT_ROLE_FINDER]
):
logger.debug('Skipping: User already has iRODS access')
return

taskflow = self.get_api()
timeline = get_backend_api('timeline_backend')
project = role_as.project
user = role_as.user
children = [
p
for p in project.get_children(flat=True)
if p.type == PROJECT_TYPE_PROJECT
]

tl_event = None
if timeline:
tl_event = timeline.add_event(
project=role_as.project,
project=project,
app_name=APP_NAME,
plugin_name='taskflow',
user=request.user if request else None,
event_name='role_update',
description='update project iRODS access for user {user}',
)
tl_event.add_object(
obj=role_as.user, label='user', name=role_as.user.username
description='update {} iRODS access for user {{{}}}'.format(
project.type.lower(), 'user'
),
)
tl_event.add_object(obj=user, label='user', name=user.username)
tl_event.set_status('SUBMIT', TL_SUBMIT_DESC)

taskflow = self.get_api()
flow_data = {'username': role_as.user.username}
taskflow.submit(
project=role_as.project,
flow_name='role_update',
flow_data=flow_data,
tl_event=tl_event,
)
if project.type == PROJECT_TYPE_PROJECT:
flow_data = {'username': user.username}
taskflow.submit(
project=project,
flow_name='role_update',
flow_data=flow_data,
tl_event=tl_event,
)
elif children: # Category children
flow_data = {'roles_add': [], 'roles_delete': []}
for c in children:
k = (
'roles_delete'
if role_as.role.rank >= ROLE_RANKING[PROJECT_ROLE_FINDER]
and not c.get_role(user) # Finder not returned for project
else 'roles_add'
)
flow_data[k].append(
{
'project_uuid': str(c.sodar_uuid),
'user_name': user.username,
}
)
taskflow.submit(
project=project,
flow_name='role_update_irods_batch',
flow_data=flow_data,
)
if tl_event:
tl_event.set_status('OK')

Expand Down

0 comments on commit a3bc44d

Please sign in to comment.