new request statues events should be associated with latest revision

This commit is contained in:
dandds 2018-09-04 14:33:39 -04:00
parent 59fdad8554
commit 1e0523ebf6
5 changed files with 60 additions and 5 deletions

View File

@ -0,0 +1,30 @@
"""add relationship between revision and status event
Revision ID: e66a49285f23
Revises: 090e1bd0d7ce
Create Date: 2018-09-04 14:01:31.548665
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = 'e66a49285f23'
down_revision = '090e1bd0d7ce'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('request_status_events', sa.Column('request_revision_id', postgresql.UUID(as_uuid=True), nullable=False))
op.create_foreign_key(None, 'request_status_events', 'request_revisions', ['request_revision_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_revision_id')
# ### end Alembic commands ###

View File

@ -143,7 +143,9 @@ class Requests(object):
@classmethod @classmethod
def set_status(cls, request: Request, status: RequestStatus): def set_status(cls, request: Request, status: RequestStatus):
status_event = RequestStatusEvent(new_status=status) status_event = RequestStatusEvent(
new_status=status, revision=request.latest_revision
)
request.status_events.append(status_event) request.status_events.append(status_event)
return request return request

View File

@ -1,5 +1,6 @@
from enum import Enum from enum import Enum
from sqlalchemy import Column, func, ForeignKey, Enum as SQLAEnum from sqlalchemy import Column, func, ForeignKey, Enum as SQLAEnum
from sqlalchemy.orm import relationship
from sqlalchemy.types import DateTime, BigInteger from sqlalchemy.types import DateTime, BigInteger
from sqlalchemy.schema import Sequence from sqlalchemy.schema import Sequence
from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.dialects.postgresql import UUID
@ -31,6 +32,8 @@ class RequestStatusEvent(Base):
sequence = Column( sequence = Column(
BigInteger, Sequence("request_status_events_sequence_seq"), nullable=False BigInteger, Sequence("request_status_events_sequence_seq"), nullable=False
) )
request_revision_id = Column(ForeignKey("request_revisions.id"), nullable=False)
revision = relationship("RequestRevision")
@property @property
def displayname(self): def displayname(self):

View File

@ -66,7 +66,9 @@ def test_should_allow_submission():
assert Requests.should_allow_submission(new_request) assert Requests.should_allow_submission(new_request)
RequestStatusEventFactory.create( RequestStatusEventFactory.create(
request=new_request, new_status=RequestStatus.CHANGES_REQUESTED request=new_request,
new_status=RequestStatus.CHANGES_REQUESTED,
revision=new_request.latest_revision,
) )
assert Requests.should_allow_submission(new_request) assert Requests.should_allow_submission(new_request)
@ -101,6 +103,7 @@ def test_status_count(session):
RequestStatusEventFactory.create( RequestStatusEventFactory.create(
sequence=2, sequence=2,
request_id=request2.id, request_id=request2.id,
revision=request2.latest_revision,
new_status=RequestStatus.PENDING_FINANCIAL_VERIFICATION, new_status=RequestStatus.PENDING_FINANCIAL_VERIFICATION,
) )
@ -169,3 +172,9 @@ def test_update_financial_verification_with_invalid_task_order():
request.body["financial_verification"]["task_order_number"] request.body["financial_verification"]["task_order_number"]
== request_financial_data["task_order_number"] == request_financial_data["task_order_number"]
) )
def test_set_status_sets_revision():
request = RequestFactory.create()
Requests.set_status(request, RequestStatus.APPROVED)
assert request.latest_revision == request.status_events[-1].revision

View File

@ -56,17 +56,28 @@ class RequestFactory(factory.alchemy.SQLAlchemyModelFactory):
model = Request model = Request
id = factory.Sequence(lambda x: uuid4()) id = factory.Sequence(lambda x: uuid4())
status_events = factory.RelatedFactory(
RequestStatusEventFactory, "request", new_status=RequestStatus.STARTED
)
creator = factory.SubFactory(UserFactory) creator = factory.SubFactory(UserFactory)
revisions = factory.LazyAttribute( revisions = factory.LazyAttribute(
lambda r: [RequestFactory.create_initial_revision(r)] lambda r: [RequestFactory.create_initial_revision(r)]
) )
status_events = factory.RelatedFactory(
RequestStatusEventFactory,
"request",
new_status=RequestStatus.STARTED,
revision=factory.LazyAttribute(lambda se: se.factory_parent.revisions[-1]),
)
class Params: class Params:
initial_revision = None initial_revision = None
@classmethod
def create_initial_status_event(cls, request):
return RequestStatusEventFactory(
request=request,
new_status=RequestStatus.STARTED,
revision=request.revisions,
)
@classmethod @classmethod
def create_initial_revision(cls, request, dollar_value=1000000): def create_initial_revision(cls, request, dollar_value=1000000):
user = request.creator user = request.creator