From ad05c448cd2508905ab857f6467f99308af393ce Mon Sep 17 00:00:00 2001 From: dandds Date: Mon, 18 Feb 2019 09:20:23 -0500 Subject: [PATCH] DD-254 domain class and method for checking if DD-254 is complete --- atst/domain/task_orders.py | 13 +++++++++++++ atst/forms/data.py | 9 +++++++++ tests/domain/test_task_orders.py | 11 ++++++++++- tests/factories.py | 14 ++++++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/atst/domain/task_orders.py b/atst/domain/task_orders.py index 37bfcc81..e2baecd0 100644 --- a/atst/domain/task_orders.py +++ b/atst/domain/task_orders.py @@ -4,6 +4,7 @@ from flask import current_app as app from atst.database import db from atst.models.task_order import TaskOrder from atst.models.permissions import Permissions +from atst.models.dd_254 import DD254 from atst.domain.portfolios import Portfolios from atst.domain.authz import Authorization from .exceptions import NotFoundError @@ -171,3 +172,15 @@ class TaskOrders(object): raise TaskOrderError( "{} is not an officer role on task orders".format(officer_type) ) + + +class DD254s: + # TODO: standin implementation until we have a real download, + # sign, and verify process for the DD 254 PDF + @classmethod + def complete(cls, dd254): + for col in DD254.__table__.columns: + if getattr(dd254, col.name) is None: + return False + + return True diff --git a/atst/forms/data.py b/atst/forms/data.py index b7b8469c..23b1d0d4 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -213,3 +213,12 @@ TEAM_EXPERIENCE = [ PERIOD_OF_PERFORMANCE_LENGTH = [ (str(x + 1), translate_duration(x + 1)) for x in range(24) ] + +REQUIRED_DISTRIBUTIONS = [ + ("contractor", "Contractor"), + ("subcontractor", "Subcontractor"), + ("cognizant_so", "Cognizant Security Office for Prime and Subcontractor"), + ("overseas", "U.S. Activity Responsible for Overseas Security Administration"), + ("administrative_ko", "Administrative Contracting Officer"), + ("other", "Other as necessary"), +] diff --git a/tests/domain/test_task_orders.py b/tests/domain/test_task_orders.py index d62a8634..d6458da1 100644 --- a/tests/domain/test_task_orders.py +++ b/tests/domain/test_task_orders.py @@ -1,6 +1,6 @@ import pytest -from atst.domain.task_orders import TaskOrders, TaskOrderError +from atst.domain.task_orders import TaskOrders, TaskOrderError, DD254s from atst.domain.exceptions import UnauthorizedError from atst.models.attachment import Attachment @@ -9,6 +9,7 @@ from tests.factories import ( UserFactory, PortfolioRoleFactory, PortfolioFactory, + DD254Factory, ) @@ -113,3 +114,11 @@ def test_task_order_access(): "add_officer", [task_order, "contracting_officer", rando.to_dictionary()], ) + + +def test_dd254_complete(): + finished = DD254Factory.create() + unfinished = DD254Factory.create(certifying_official=None) + + assert DD254s.complete(finished) + assert not DD254s.complete(unfinished) diff --git a/tests/factories.py b/tests/factories.py index 274ed171..079741c3 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -24,6 +24,7 @@ from atst.domain.roles import Roles, PORTFOLIO_ROLES from atst.models.portfolio_role import PortfolioRole, Status as PortfolioRoleStatus from atst.models.environment_role import EnvironmentRole from atst.models.invitation import Invitation, Status as InvitationStatus +from atst.models.dd_254 import DD254 from atst.domain.invitations import Invitations @@ -427,3 +428,16 @@ class TaskOrderFactory(Base): so_email = factory.Faker("email") so_phone_number = factory.LazyFunction(random_phone_number) so_dod_id = factory.LazyFunction(random_dod_id) + + +class DD254Factory(Base): + class Meta: + model = DD254 + + certifying_official = factory.Faker("name") + co_title = factory.Faker("job") + co_address = factory.Faker("address") + co_phone = factory.LazyFunction(random_phone_number) + required_distribution = factory.LazyFunction( + lambda: [random_choice(data.REQUIRED_DISTRIBUTIONS)] + )