From 95e7adfcf3a04b364a682bdbd009f1cd0ffcc101 Mon Sep 17 00:00:00 2001 From: dandds Date: Tue, 8 Jan 2019 14:36:32 -0500 Subject: [PATCH] single workspace role for task order officers --- atst/domain/roles.py | 20 +++---------- atst/domain/task_orders.py | 30 ++++++++++++++----- atst/forms/data.py | 8 +---- atst/models/permissions.py | 3 -- tests/domain/test_task_orders.py | 12 ++++++++ .../routes/task_orders/test_new_task_order.py | 4 +-- 6 files changed, 41 insertions(+), 36 deletions(-) diff --git a/atst/domain/roles.py b/atst/domain/roles.py index ff31a36a..91137cbc 100644 --- a/atst/domain/roles.py +++ b/atst/domain/roles.py @@ -141,22 +141,10 @@ WORKSPACE_ROLES = [ ], }, { - "name": "contracting_officer", - "description": "Can approve funding for a task order. Has view and edit permissions for task orders in a workspace.", - "display_name": "Contracting Officer", - "permissions": [Permissions.VIEW_WORKSPACE, Permissions.KO_SIGN_TASK_ORDER], - }, - { - "name": "contracting_officer_representative", - "description": "Assists in submitting task order documents. Can update Task Order.", - "display_name": "Contracting Officer Representative", - "permissions": [Permissions.VIEW_WORKSPACE], - }, - { - "name": "security_officer", - "description": "Can edit security questions for a task order.", - "display_name": "Security Officer", - "permissions": [Permissions.VIEW_WORKSPACE, Permissions.SO_SIGN_TASK_ORDER], + "name": "officer", + "description": "Officer involved with setting up a Task Order", + "display_name": "Task Order Officer", + "permissions": [], }, ] diff --git a/atst/domain/task_orders.py b/atst/domain/task_orders.py index 68e53885..ce600fba 100644 --- a/atst/domain/task_orders.py +++ b/atst/domain/task_orders.py @@ -102,18 +102,34 @@ class TaskOrders(object): ] @classmethod - def add_officer(cls, user, task_order, role, officer_data): - if role in TaskOrders.OFFICERS: - member = Workspaces.create_member( - user, task_order.workspace, {**officer_data, "workspace_role": role} + def add_officer(cls, user, task_order, officer_type, officer_data): + if officer_type in TaskOrders.OFFICERS: + workspace = task_order.workspace + + existing_member = next( + ( + member + for member in workspace.members + if member.user.dod_id is officer_data["dod_id"] + ), + None, ) - setattr(task_order, role, member.user) + + if existing_member: + user = existing_member.user + else: + member = Workspaces.create_member( + user, workspace, {**officer_data, "workspace_role": "officer"} + ) + user = member.user + + setattr(task_order, officer_type, user) db.session.add(task_order) db.session.commit() - return member.user + return user else: raise TaskOrderError( - "{} is not an officer role on task orders".format(role) + "{} is not an officer role on task orders".format(officer_type) ) diff --git a/atst/forms/data.py b/atst/forms/data.py index ebcd3b20..957dd911 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -105,16 +105,10 @@ COMPLETION_DATE_RANGES = [ ("Above 12 months", "Above 12 months"), ] -NONDISPLAY_ROLES = [ - "contracting_officer", - "contracting_officer_representative", - "security_officer", -] - WORKSPACE_ROLES = [ (role["name"], {"name": role["display_name"], "description": role["description"]}) for role in WORKSPACE_ROLE_DEFINITIONS - if role["name"] not in NONDISPLAY_ROLES + if role["name"] is not "officer" ] ENVIRONMENT_ROLES = [ diff --git a/atst/models/permissions.py b/atst/models/permissions.py index 112517a3..f7adc406 100644 --- a/atst/models/permissions.py +++ b/atst/models/permissions.py @@ -42,6 +42,3 @@ class Permissions(object): ADD_TAG_TO_WORKSPACE = "add_tag_to_workspace" REMOVE_TAG_FROM_WORKSPACE = "remove_tag_from_workspace" - - KO_SIGN_TASK_ORDER = "ko_sign_task_order" - SO_SIGN_TASK_ORDER = "so_sign_task_order" diff --git a/tests/domain/test_task_orders.py b/tests/domain/test_task_orders.py index f558207b..8966d59b 100644 --- a/tests/domain/test_task_orders.py +++ b/tests/domain/test_task_orders.py @@ -48,3 +48,15 @@ def test_add_officer_with_nonexistent_role(): owner = task_order.workspace.owner with pytest.raises(TaskOrderError): TaskOrders.add_officer(owner, task_order, "pilot", ko.to_dictionary()) + + +def test_add_officer_who_is_already_workspace_member(): + task_order = TaskOrderFactory.create() + owner = task_order.workspace.owner + TaskOrders.add_officer( + owner, task_order, "contracting_officer", owner.to_dictionary() + ) + + assert task_order.contracting_officer == owner + member = task_order.workspace.members[0] + assert member.user == owner and member.role_name == "owner" diff --git a/tests/routes/task_orders/test_new_task_order.py b/tests/routes/task_orders/test_new_task_order.py index fa7f30f4..462fabea 100644 --- a/tests/routes/task_orders/test_new_task_order.py +++ b/tests/routes/task_orders/test_new_task_order.py @@ -150,9 +150,7 @@ def test_invite_officers_to_task_order(queue): assert len(workspace.members) == 4 roles = [member.role.name for member in workspace.members] # officers exist in roles - assert "contracting_officer" in roles - assert "contracting_officer_representative" in roles - assert "security_officer" in roles + assert roles.count("officer") == 3 # email invitations are enqueued assert len(queue.get_queue()) == 3 # task order has relationship to user for each officer role