diff --git a/atst/models/workspace.py b/atst/models/workspace.py index d02acd19..126b6fd8 100644 --- a/atst/models/workspace.py +++ b/atst/models/workspace.py @@ -63,3 +63,21 @@ class Workspace(Base, mixins.TimestampsMixin, mixins.AuditableMixin): return "".format( self.name, self.request_id, self.user_count, self.id ) + + def _find_by_role(self, role): + try: + return [member for member in self.members if member.role.name == role] + except StopIteration: + return None + + @property + def contracting_officer(self): + return self._find_by_role("contracting_officer") + + @property + def contracting_officer_representative(self): + return self._find_by_role("contracting_officer_representative") + + @property + def security_officer(self): + return self._find_by_role("security_officer") diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index bf6b3c3f..ea996b29 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -112,6 +112,11 @@ class UpdateTaskOrderWorkflow(ShowTaskOrderWorkflow): def form(self): return self._section["form"](self.form_data) + @property + def workspace(self): + if self.task_order: + return self.task_order.workspace + def validate(self): return self.form.validate() @@ -152,7 +157,11 @@ class UpdateTaskOrderWorkflow(ShowTaskOrderWorkflow): def _update_invitations(self): for officer_type in self.OFFICER_INVITATIONS: field = officer_type["field"] - if hasattr(self.form, field) and self.form[field].data: + if ( + hasattr(self.form, field) + and self.form[field].data + and not getattr(self.workspace, officer_type["role"]) + ): prefix = officer_type["prefix"] officer_data = { field: getattr(self.task_order, prefix + "_" + field) diff --git a/tests/routes/task_orders/test_new_task_order.py b/tests/routes/task_orders/test_new_task_order.py index c364a0b5..a6404853 100644 --- a/tests/routes/task_orders/test_new_task_order.py +++ b/tests/routes/task_orders/test_new_task_order.py @@ -152,3 +152,23 @@ def test_invite_officers_to_task_order(queue): assert "contracting_officer_representative" in roles assert "security_officer" in roles assert len(queue.get_queue()) == 3 + + +def test_update_does_not_resend_invitation(): + user = UserFactory.create() + contracting_officer = UserFactory.create() + workspace = WorkspaceFactory.create(owner=user) + task_order = TaskOrderFactory.create( + creator=user, + workspace=workspace, + ko_first_name=contracting_officer.first_name, + ko_last_name=contracting_officer.last_name, + ko_dod_id=contracting_officer.dod_id, + ) + to_data = {**task_order.to_dictionary(), "ko_invite": True} + workflow = UpdateTaskOrderWorkflow( + to_data, user, screen=3, task_order_id=task_order.id + ) + for i in range(2): + workflow.update() + assert len(contracting_officer.invitations) == 1