Create Request.creator relationship

- Rename creator_id to user_id
This commit is contained in:
richard-dds 2018-08-07 21:03:27 -04:00
parent 2030b4d318
commit e99ddd491a
8 changed files with 89 additions and 36 deletions

View File

@ -0,0 +1,43 @@
"""rename request creator
Revision ID: 05d6272bdb43
Revises: 77b065750596
Create Date: 2018-08-07 20:21:22.559283
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = '05d6272bdb43'
down_revision = '77b065750596'
branch_labels = None
depends_on = None
def upgrade():
db = op.get_bind()
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('requests', sa.Column('user_id', postgresql.UUID(as_uuid=True), nullable=True))
op.create_foreign_key('requests_user_id_fk', 'requests', 'users', ['user_id'], ['id'])
# ### end Alembic commands ###
db.execute("UPDATE requests SET user_id = creator")
op.alter_column('requests', 'user_id', nullable=False)
op.drop_column('requests', 'creator')
def downgrade():
db = op.get_bind()
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('requests', sa.Column('creator', postgresql.UUID(), autoincrement=False, nullable=True))
op.drop_constraint('requests_user_id_fk', 'requests', type_='foreignkey')
# ### end Alembic commands ###
db.execute("UPDATE requests SET creator = user_id")
op.drop_column('requests', 'user_id')

View File

@ -58,10 +58,10 @@ class Requests(object):
return request return request
@classmethod @classmethod
def get_many(cls, creator_id=None): def get_many(cls, creator=None):
filters = [] filters = []
if creator_id: if creator:
filters.append(Request.creator == creator_id) filters.append(Request.creator == creator)
requests = ( requests = (
db.session.query(Request) db.session.query(Request)

View File

@ -1,6 +1,6 @@
from sqlalchemy import Column, func from sqlalchemy import Column, func, ForeignKey
from sqlalchemy.types import DateTime from sqlalchemy.types import DateTime
from sqlalchemy.dialects.postgresql import JSONB, UUID from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from atst.models import Base from atst.models import Base
@ -11,13 +11,15 @@ class Request(Base):
__tablename__ = "requests" __tablename__ = "requests"
id = Id() id = Id()
creator = Column(UUID(as_uuid=True))
time_created = Column(DateTime(timezone=True), server_default=func.now()) time_created = Column(DateTime(timezone=True), server_default=func.now())
body = Column(JSONB) body = Column(JSONB)
status_events = relationship( status_events = relationship(
"RequestStatusEvent", backref="request", order_by="RequestStatusEvent.sequence" "RequestStatusEvent", backref="request", order_by="RequestStatusEvent.sequence"
) )
user_id = Column(ForeignKey("users.id"), nullable=False)
creator = relationship("User")
@property @property
def status(self): def status(self):
return self.status_events[-1].new_status return self.status_events[-1].new_status

View File

@ -28,7 +28,7 @@ def requests_index():
): ):
requests = Requests.get_many() requests = Requests.get_many()
else: else:
requests = Requests.get_many(creator_id=g.current_user.id) requests = Requests.get_many(creator=g.current_user)
mapped_requests = [map_request(g.current_user, r) for r in requests] mapped_requests = [map_request(g.current_user, r) for r in requests]

View File

@ -124,5 +124,5 @@ class JEDIRequestFlow(object):
if self.request_id: if self.request_id:
Requests.update(self.request_id, request_data) Requests.update(self.request_id, request_data)
else: else:
request = Requests.create(self.current_user.id, request_data) request = Requests.create(self.current_user, request_data)
self.request_id = request.id self.request_id = request.id

View File

@ -5,7 +5,7 @@ from atst.domain.exceptions import NotFoundError
from atst.domain.requests import Requests from atst.domain.requests import Requests
from atst.models.request_status_event import RequestStatus from atst.models.request_status_event import RequestStatus
from tests.factories import RequestFactory from tests.factories import RequestFactory, UserFactory
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
@ -25,7 +25,7 @@ def test_nonexistent_request_raises():
def test_new_request_has_started_status(): def test_new_request_has_started_status():
request = Requests.create(uuid4(), {}) request = Requests.create(UserFactory.build(), {})
assert request.status == RequestStatus.STARTED assert request.status == RequestStatus.STARTED

View File

@ -9,31 +9,6 @@ from atst.models.user import User
from atst.models.role import Role from atst.models.role import Role
class RequestStatusFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = RequestStatusEvent
class RequestFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = Request
id = factory.Sequence(lambda x: uuid4())
status_events = factory.RelatedFactory(
RequestStatusFactory, "request", new_status=RequestStatus.STARTED
)
class PENumberFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = PENumber
class TaskOrderFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = TaskOrder
class RoleFactory(factory.alchemy.SQLAlchemyModelFactory): class RoleFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta: class Meta:
model = Role model = Role
@ -50,3 +25,29 @@ class UserFactory(factory.alchemy.SQLAlchemyModelFactory):
first_name = "Fake" first_name = "Fake"
last_name = "User" last_name = "User"
atat_role = factory.SubFactory(RoleFactory) atat_role = factory.SubFactory(RoleFactory)
class RequestStatusFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = RequestStatusEvent
class RequestFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = Request
id = factory.Sequence(lambda x: uuid4())
status_events = factory.RelatedFactory(
RequestStatusFactory, "request", new_status=RequestStatus.STARTED
)
creator = factory.SubFactory(UserFactory)
class PENumberFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = PENumber
class TaskOrderFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = TaskOrder

View File

@ -1,4 +1,4 @@
from tests.factories import RequestFactory from tests.factories import RequestFactory, UserFactory
from atst.domain.requests import Requests, RequestStatus from atst.domain.requests import Requests, RequestStatus
@ -19,3 +19,10 @@ def test_pending_ccpo_approval_requires_ccpo():
request = Requests.set_status(request, RequestStatus.PENDING_CCPO_APPROVAL) request = Requests.set_status(request, RequestStatus.PENDING_CCPO_APPROVAL)
assert Requests.action_required_by(request) == "ccpo" assert Requests.action_required_by(request) == "ccpo"
def test_request_has_creator():
user = UserFactory.create()
request = RequestFactory.create(creator=user)
assert request.creator == user