Skip to content
Snippets Groups Projects
Commit b592059a authored by Daniel Lyons's avatar Daniel Lyons
Browse files

Add timestamps to workflow and capability requests

 - Add columns to tables workflow_requests and capability_requests
 - Make the updated_at column auto-update in the database for both
 - Use in the __repr__ method for Python for human-friendliness

Manually verified that the timezone manipulations were correct
parent eda6f1fa
No related branches found
No related tags found
1 merge request!128Add timestamps to workflow and capability requests
Pipeline #932 passed
"""add created/updated timestamps to capability and workflow requests
Revision ID: 72cee10f1f0d
Revises: 50ff97fe0c2a
Create Date: 2021-03-10 10:30:01.160958
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = "72cee10f1f0d"
down_revision = "50ff97fe0c2a"
branch_labels = None
depends_on = None
def upgrade():
op.add_column(
"capability_requests",
sa.Column(
"created_at",
sa.DateTime(timezone=True),
server_default=sa.func.now(),
nullable=False,
),
)
op.add_column(
"workflow_requests",
sa.Column(
"created_at",
sa.DateTime(timezone=True),
server_default=sa.func.now(),
nullable=False,
),
)
op.add_column(
"capability_requests",
sa.Column(
"updated_at",
sa.DateTime(timezone=True),
server_default=sa.func.now(),
nullable=False,
),
)
op.add_column(
"workflow_requests",
sa.Column(
"updated_at",
sa.DateTime(timezone=True),
server_default=sa.func.now(),
nullable=False,
),
)
op.execute(
"""
create or replace function update_updated_at_timestamp() RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
NEW.updated_at := current_timestamp;
RETURN NEW;
END;
$$;"""
)
op.execute(
"""
create trigger capability_request_updated
before update on capability_requests
for each row execute function update_updated_at_timestamp();"""
)
op.execute(
"""
create trigger workflow_request_updated
before update on workflow_requests
for each row execute function update_updated_at_timestamp();"""
)
def downgrade():
op.drop_column("capability_requests", "created_at")
op.drop_column("workflow_requests", "created_at")
op.drop_column("capability_requests", "updated_at")
op.drop_column("workflow_requests", "updated_at")
op.execute("drop trigger workflow_request_updated on workflow_requests")
op.execute("drop trigger capability_request_updated on capability_requests")
op.execute("drop function update_updated_at_timestamp")
......@@ -3,6 +3,7 @@ from __future__ import annotations
import json
from typing import Dict, Tuple
import pendulum
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
......@@ -154,6 +155,20 @@ class CapabilityRequest(Base, CapabilityRequestIF):
"capability_name", sa.String, sa.ForeignKey("capabilities.capability_name")
)
parameters = sa.Column("parameters", sa.JSON)
created_at = sa.Column(
"created_at",
sa.DateTime(timezone=True),
server_default=sa.func.now(),
nullable=False,
)
updated_at = sa.Column(
"updated_at",
sa.DateTime(timezone=True),
server_default=sa.func.now(),
server_onupdate=sa.func.now(),
nullable=False,
)
# FIXME: This needs to be changed to properly keep track of product locators.
# future_products = sa.Column('future_products', sa.String)
versions = relationship("CapabilityVersion", back_populates="request")
......@@ -173,6 +188,22 @@ class CapabilityRequest(Base, CapabilityRequestIF):
"parameters": self.parameters,
}
@property
def created_at_ago(self) -> str:
return pendulum.instance(self.created_at).diff_for_humans()
@property
def updated_at_ago(self) -> str:
return pendulum.instance(self.updated_at).diff_for_humans()
def __repr__(self):
return (
f"<CapabilityRequest #{self.id} "
f"for capability {self.capability_name}, "
f"created {self.created_at_ago} and "
f"last updated {self.updated_at_ago})>"
)
class CapabilityVersion(Base, CapabilityVersionIF):
"""
......
......@@ -4,6 +4,7 @@ from pathlib import Path
from typing import Dict, List
import chevron
import pendulum
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
......@@ -184,6 +185,27 @@ class WorkflowRequest(Base, WorkflowRequestIF):
state = sa.Column("state", sa.String)
results_dir = sa.Column("results_dir", sa.String)
files = relationship("WorkflowRequestFile", backref="request")
created_at = sa.Column(
"created_at",
sa.DateTime(timezone=True),
server_default=sa.func.now(),
nullable=False,
)
updated_at = sa.Column(
"updated_at",
sa.DateTime(timezone=True),
server_default=sa.func.now(),
server_onupdate=sa.func.now(),
nullable=False,
)
@property
def created_at_ago(self) -> str:
return pendulum.instance(self.created_at).diff_for_humans()
@property
def updated_at_ago(self) -> str:
return pendulum.instance(self.updated_at).diff_for_humans()
@property
def request(self) -> AbstractRequest:
......@@ -217,7 +239,11 @@ class WorkflowRequest(Base, WorkflowRequestIF):
return self.files
def __repr__(self):
return f"<WorkflowRequest workflow_request_id= {self.workflow_request_id}>"
return (
f"<WorkflowRequest workflow_request_id= {self.workflow_request_id}"
f"created {self.created_at_ago} and "
f"last updated {self.updated_at_ago})>"
)
class WorkflowRequestFile(Base, WorkflowRequestFileIF):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment