diff --git a/alembic/versions/e66a49285f23_add_relationship_between_revision_and_.py b/alembic/versions/e66a49285f23_add_relationship_between_revision_and_.py new file mode 100644 index 00000000..1c22c188 --- /dev/null +++ b/alembic/versions/e66a49285f23_add_relationship_between_revision_and_.py @@ -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 ### diff --git a/atst/domain/requests.py b/atst/domain/requests.py index 4c922629..6fe45002 100644 --- a/atst/domain/requests.py +++ b/atst/domain/requests.py @@ -143,7 +143,9 @@ class Requests(object): @classmethod 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) return request diff --git a/atst/models/request_status_event.py b/atst/models/request_status_event.py index bf95f5ce..ba13c242 100644 --- a/atst/models/request_status_event.py +++ b/atst/models/request_status_event.py @@ -1,5 +1,6 @@ from enum import Enum from sqlalchemy import Column, func, ForeignKey, Enum as SQLAEnum +from sqlalchemy.orm import relationship from sqlalchemy.types import DateTime, BigInteger from sqlalchemy.schema import Sequence from sqlalchemy.dialects.postgresql import UUID @@ -31,6 +32,8 @@ class RequestStatusEvent(Base): sequence = Column( BigInteger, Sequence("request_status_events_sequence_seq"), nullable=False ) + request_revision_id = Column(ForeignKey("request_revisions.id"), nullable=False) + revision = relationship("RequestRevision") @property def displayname(self): diff --git a/tests/domain/test_requests.py b/tests/domain/test_requests.py index d1ab45e8..e938d7bc 100644 --- a/tests/domain/test_requests.py +++ b/tests/domain/test_requests.py @@ -66,7 +66,9 @@ def test_should_allow_submission(): assert Requests.should_allow_submission(new_request) 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) @@ -101,6 +103,7 @@ def test_status_count(session): RequestStatusEventFactory.create( sequence=2, request_id=request2.id, + revision=request2.latest_revision, 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_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 diff --git a/tests/factories.py b/tests/factories.py index 5f94da13..ea6097c7 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -56,17 +56,28 @@ class RequestFactory(factory.alchemy.SQLAlchemyModelFactory): model = Request id = factory.Sequence(lambda x: uuid4()) - status_events = factory.RelatedFactory( - RequestStatusEventFactory, "request", new_status=RequestStatus.STARTED - ) creator = factory.SubFactory(UserFactory) revisions = factory.LazyAttribute( 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: initial_revision = None + @classmethod + def create_initial_status_event(cls, request): + return RequestStatusEventFactory( + request=request, + new_status=RequestStatus.STARTED, + revision=request.revisions, + ) + @classmethod def create_initial_revision(cls, request, dollar_value=1000000): user = request.creator