add request review
This commit is contained in:
parent
d295798d75
commit
8e000e3e77
42
alembic/versions/7bdb2055d7c7_add_request_review_table.py
Normal file
42
alembic/versions/7bdb2055d7c7_add_request_review_table.py
Normal 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 ###
|
@ -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
|
||||
|
@ -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]
|
||||
|
19
atst/models/request_review.py
Normal file
19
atst/models/request_review.py
Normal 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)
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user