diff --git a/atst/models/__init__.py b/atst/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/atst/models/request.py b/atst/models/request.py new file mode 100644 index 00000000..5762e857 --- /dev/null +++ b/atst/models/request.py @@ -0,0 +1,32 @@ +from sqlalchemy import Column, func +from sqlalchemy.types import DateTime +from sqlalchemy.dialects.postgresql import JSONB, UUID +from sqlalchemy.orm import relationship + +from requests_queue.models import Base +from requests_queue.models.types import Id + + +class Request(Base): + __tablename__ = 'requests' + + id = Id() + creator = Column(UUID(as_uuid=True)) + time_created = Column(DateTime(timezone=True), server_default=func.now()) + body = Column(JSONB) + status_events = relationship('StatusEvent', + backref='request', + order_by='StatusEvent.sequence') + + @property + def status(self): + return self.status_events[-1].new_status + + @property + def action_required_by(self): + return { + "incomplete": "mission_owner", + "pending_submission": "mission_owner", + "submitted": "ccpo", + "approved": "mission_owner", + }.get(self.status) diff --git a/atst/models/status_event.py b/atst/models/status_event.py new file mode 100644 index 00000000..c5c5c715 --- /dev/null +++ b/atst/models/status_event.py @@ -0,0 +1,17 @@ +from sqlalchemy import Column, func, ForeignKey +from sqlalchemy.types import DateTime, String, BigInteger +from sqlalchemy.schema import Sequence +from sqlalchemy.dialects.postgresql import UUID + +from requests_queue.models import Base +from requests_queue.models.types import Id + + +class StatusEvent(Base): + __tablename__ = 'status_events' + + id = Id() + new_status = Column(String()) + time_created = Column(DateTime(timezone=True), server_default=func.now()) + request_id = Column(UUID(as_uuid=True), ForeignKey('requests.id', ondelete='CASCADE')) + sequence = Column(BigInteger, Sequence('status_events_sequence_seq'), nullable=False) diff --git a/atst/models/types.py b/atst/models/types.py new file mode 100644 index 00000000..b2e1c6d7 --- /dev/null +++ b/atst/models/types.py @@ -0,0 +1,10 @@ +import sqlalchemy +from sqlalchemy import Column +from sqlalchemy.dialects.postgresql import UUID + + +def Id(): + return Column( + UUID(as_uuid=True), + primary_key=True, + server_default=sqlalchemy.text("uuid_generate_v4()"))