diff --git a/alembic/versions/7bdb2055d7c7_add_request_review_table.py b/alembic/versions/7bdb2055d7c7_add_request_review_table.py index 99274e85..ba669921 100644 --- a/alembic/versions/7bdb2055d7c7_add_request_review_table.py +++ b/alembic/versions/7bdb2055d7c7_add_request_review_table.py @@ -7,6 +7,7 @@ Create Date: 2018-09-06 15:15:40.666840 """ from alembic import op import sqlalchemy as sa +from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. @@ -27,16 +28,19 @@ def upgrade(): 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.Column('user_id', postgresql.UUID(as_uuid=True), nullable=False), 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']) + op.create_foreign_key(None, 'request_reviews', 'users', ['user_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_constraint(None, 'request_reviews', type_='foreignkey') op.drop_column('request_status_events', 'request_review_id') op.drop_table('request_reviews') # ### end Alembic commands ### diff --git a/atst/domain/requests.py b/atst/domain/requests.py index 5c853630..f87a8382 100644 --- a/atst/domain/requests.py +++ b/atst/domain/requests.py @@ -272,8 +272,8 @@ WHERE requests_with_status.status = :status return request @classmethod - def _add_review(cls, request, review_data): - request.latest_status.review = RequestReview(**review_data) + def _add_review(cls, user, request, review_data): + request.latest_status.review = RequestReview(reviewer=user, **review_data) db.session.add(request) db.session.commit() @@ -281,13 +281,13 @@ WHERE requests_with_status.status = :status return request @classmethod - def accept_for_financial_verification(cls, request, review_data): + def accept_for_financial_verification(cls, user, request, review_data): Requests.set_status(request, RequestStatus.PENDING_FINANCIAL_VERIFICATION) - return Requests._add_review(request, review_data) + return Requests._add_review(user, request, review_data) @classmethod - def request_changes(cls, request, review_data): + def request_changes(cls, user, request, review_data): Requests.set_status(request, RequestStatus.CHANGES_REQUESTED) - return Requests._add_review(request, review_data) + return Requests._add_review(user, request, review_data) diff --git a/atst/models/request_review.py b/atst/models/request_review.py index 58a6b121..3c991ea5 100644 --- a/atst/models/request_review.py +++ b/atst/models/request_review.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, BigInteger, String +from sqlalchemy import Column, BigInteger, String, ForeignKey from sqlalchemy.orm import relationship from atst.models import Base @@ -10,6 +10,9 @@ class RequestReview(Base): id = Column(BigInteger, primary_key=True) status = relationship("RequestStatusEvent", back_populates="review") + user_id = Column(ForeignKey("users.id"), nullable=False) + reviewer = relationship("User") + comment = Column(String) fname_mao = Column(String) lname_mao = Column(String) diff --git a/atst/routes/requests/approval.py b/atst/routes/requests/approval.py index 8c21493d..ca02933f 100644 --- a/atst/routes/requests/approval.py +++ b/atst/routes/requests/approval.py @@ -60,9 +60,11 @@ def submit_approval(request_id): form = CCPOReviewForm(http_request.form) if form.validate(): if http_request.form.get("approved"): - Requests.accept_for_financial_verification(request, form.data) + Requests.accept_for_financial_verification( + g.current_user, request, form.data + ) else: - Requests.request_changes(request, form.data) + Requests.request_changes(g.current_user, request, form.data) return redirect(url_for("requests.requests_index")) else: diff --git a/tests/domain/test_requests.py b/tests/domain/test_requests.py index 78a66389..34045076 100644 --- a/tests/domain/test_requests.py +++ b/tests/domain/test_requests.py @@ -184,7 +184,9 @@ def test_set_status_sets_revision(): def test_accept_for_financial_verification(): request = RequestFactory.create() review_data = RequestReviewFactory.dictionary() - Requests.accept_for_financial_verification(request, review_data) + Requests.accept_for_financial_verification( + UserFactory.create(), request, review_data + ) assert request.status == RequestStatus.PENDING_FINANCIAL_VERIFICATION current_review = request.latest_status.review assert current_review.fname_mao == review_data["fname_mao"] diff --git a/tests/models/test_requests.py b/tests/models/test_requests.py index 1b16d7db..a5bbef93 100644 --- a/tests/models/test_requests.py +++ b/tests/models/test_requests.py @@ -78,12 +78,15 @@ def test_annual_spend(): def test_reviews(): request = RequestFactory.create() + ccpo = UserFactory.from_atat_role("ccpo") request.status_events = [ RequestStatusEventFactory.create( - revision=request.latest_revision, review=RequestReviewFactory.create() + revision=request.latest_revision, + review=RequestReviewFactory.create(reviewer=ccpo), ), RequestStatusEventFactory.create( - revision=request.latest_revision, review=RequestReviewFactory.create() + revision=request.latest_revision, + review=RequestReviewFactory.create(reviewer=ccpo), ), RequestStatusEventFactory.create(revision=request.latest_revision), ]