add request review

This commit is contained in:
dandds 2018-09-06 15:43:14 -04:00
parent d295798d75
commit 8e000e3e77
7 changed files with 101 additions and 3 deletions

View File

@ -0,0 +1,42 @@
"""add request review table
Revision ID: 7bdb2055d7c7
Revises: 06aa23166ca9
Create Date: 2018-09-06 15:15:40.666840
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '7bdb2055d7c7'
down_revision = '06aa23166ca9'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('request_reviews',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('comments', sa.String(), nullable=True),
sa.Column('fname_mao', sa.String(), nullable=True),
sa.Column('lname_mao', sa.String(), nullable=True),
sa.Column('email_mao', sa.String(), nullable=True),
sa.Column('phone_mao', sa.String(), nullable=True),
sa.Column('fname_ccpo', sa.String(), nullable=True),
sa.Column('lname_ccpo', sa.String(), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.add_column('request_status_events', sa.Column('request_review_id', sa.Integer(), nullable=True))
op.create_foreign_key(None, 'request_status_events', 'request_reviews', ['request_review_id'], ['id'])
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(None, 'request_status_events', type_='foreignkey')
op.drop_column('request_status_events', 'request_review_id')
op.drop_table('request_reviews')
# ### end Alembic commands ###

View File

@ -15,3 +15,4 @@ from .project import Project
from .environment import Environment
from .attachment import Attachment
from .request_revision import RequestRevision
from .request_review import RequestReview

View File

@ -115,13 +115,17 @@ class Request(Base):
return body
@property
def latest_status(self):
return self.status_events[-1]
@property
def status(self):
return self.status_events[-1].new_status
return self.latest_status.new_status
@property
def status_displayname(self):
return self.status_events[-1].displayname
return self.latest_status.displayname
@property
def annual_spend(self):
@ -154,3 +158,7 @@ class Request(Base):
RequestStatus.PENDING_FINANCIAL_VERIFICATION: "mission_owner",
RequestStatus.PENDING_CCPO_APPROVAL: "ccpo",
}.get(self.status)
@property
def reviews(self):
return [status.review for status in self.status_events if status.review]

View File

@ -0,0 +1,19 @@
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship
from atst.models import Base
class RequestReview(Base):
__tablename__ = "request_reviews"
id = Column(Integer, primary_key=True)
status = relationship("RequestStatusEvent", back_populates="review")
comments = Column(String)
fname_mao = Column(String)
lname_mao = Column(String)
email_mao = Column(String)
phone_mao = Column(String)
fname_ccpo = Column(String)
lname_ccpo = Column(String)

View File

@ -35,6 +35,9 @@ class RequestStatusEvent(Base):
request_revision_id = Column(ForeignKey("request_revisions.id"), nullable=False)
revision = relationship("RequestRevision")
request_review_id = Column(ForeignKey("request_reviews.id"), nullable=True)
review = relationship("RequestReview", back_populates="status")
@property
def displayname(self):
return self.new_status.value

View File

@ -7,6 +7,7 @@ import datetime
from atst.forms.data import SERVICE_BRANCHES
from atst.models.request import Request
from atst.models.request_revision import RequestRevision
from atst.models.request_review import RequestReview
from atst.models.request_status_event import RequestStatusEvent, RequestStatus
from atst.models.pe_number import PENumber
from atst.models.task_order import TaskOrder
@ -55,6 +56,11 @@ class RequestRevisionFactory(factory.alchemy.SQLAlchemyModelFactory):
id = factory.Sequence(lambda x: uuid4())
class RequestReviewFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = RequestReview
class RequestFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = Request

View File

@ -1,4 +1,9 @@
from tests.factories import RequestFactory, UserFactory
from tests.factories import (
RequestFactory,
UserFactory,
RequestStatusEventFactory,
RequestReviewFactory,
)
from atst.domain.requests import Requests, RequestStatus
@ -69,3 +74,17 @@ def test_annual_spend():
request = RequestFactory.create()
monthly = request.body.get("details_of_use").get("estimated_monthly_spend")
assert request.annual_spend == monthly * 12
def test_reviews():
request = RequestFactory.create()
request.status_events = [
RequestStatusEventFactory.create(
revision=request.latest_revision, review=RequestReviewFactory.create()
),
RequestStatusEventFactory.create(
revision=request.latest_revision, review=RequestReviewFactory.create()
),
RequestStatusEventFactory.create(revision=request.latest_revision),
]
assert len(request.reviews) == 2