From 868269168b2ca312f979d76545a549ee9cdfe707 Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Wed, 3 Jul 2024 21:15:53 +0545 Subject: [PATCH] updated state in tast_events table with State enums --- src/backend/app/db/db_models.py | 3 +- .../app/migrations/versions/bf26afac872d_.py | 93 +++++++++++++++++++ src/backend/app/models/enums.py | 48 ++++++++++ 3 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 src/backend/app/migrations/versions/bf26afac872d_.py diff --git a/src/backend/app/db/db_models.py b/src/backend/app/db/db_models.py index 6e7670fb..98df433b 100644 --- a/src/backend/app/db/db_models.py +++ b/src/backend/app/db/db_models.py @@ -24,6 +24,7 @@ ProjectStatus, ProjectVisibility, UserRole, + State, ) from sqlalchemy.orm import ( object_session, @@ -202,7 +203,7 @@ class TaskEvent(Base): user_id = cast(str, Column(String(100), ForeignKey("users.id"), nullable=False)) comment = cast(str, Column(String)) - state = cast(TaskStatus, Column(Enum(TaskStatus), nullable=False)) + state = cast(State, Column(Enum(TaskStatus), nullable=False)) created_at = cast(datetime, Column(DateTime, default=timestamp)) __table_args__ = ( diff --git a/src/backend/app/migrations/versions/bf26afac872d_.py b/src/backend/app/migrations/versions/bf26afac872d_.py new file mode 100644 index 00000000..cf81a3cc --- /dev/null +++ b/src/backend/app/migrations/versions/bf26afac872d_.py @@ -0,0 +1,93 @@ +""" + +Revision ID: bf26afac872d +Revises: 1ebfe5e4cf1c +Create Date: 2024-07-03 15:27:42.903931 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = "bf26afac872d" +down_revision: Union[str, None] = "1ebfe5e4cf1c" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column("projects", sa.Column("overlap_percent", sa.Float(), nullable=True)) + op.add_column("projects", sa.Column("gsd_cm_px", sa.Float(), nullable=True)) + op.add_column( + "projects", + sa.Column("gimble_angles_degrees", sa.ARRAY(sa.SmallInteger()), nullable=True), + ) + op.drop_column("projects", "overlap") + op.drop_column("projects", "gimble_angles") + op.drop_column("projects", "gsd") + op.drop_index("ix_tasks_locked_by", table_name="tasks") + op.drop_index("ix_tasks_mapped_by", table_name="tasks") + op.drop_index("ix_tasks_validated_by", table_name="tasks") + op.drop_constraint("fk_users_validator", "tasks", type_="foreignkey") + op.drop_constraint("fk_users_mapper", "tasks", type_="foreignkey") + op.drop_constraint("fk_users_locked", "tasks", type_="foreignkey") + op.drop_column("tasks", "locked_by") + op.drop_column("tasks", "validated_by") + op.drop_column("tasks", "mapped_by") + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column( + "tasks", + sa.Column("mapped_by", sa.VARCHAR(), autoincrement=False, nullable=True), + ) + op.add_column( + "tasks", + sa.Column("validated_by", sa.VARCHAR(), autoincrement=False, nullable=True), + ) + op.add_column( + "tasks", + sa.Column("locked_by", sa.VARCHAR(), autoincrement=False, nullable=True), + ) + op.create_foreign_key("fk_users_locked", "tasks", "users", ["locked_by"], ["id"]) + op.create_foreign_key("fk_users_mapper", "tasks", "users", ["mapped_by"], ["id"]) + op.create_foreign_key( + "fk_users_validator", "tasks", "users", ["validated_by"], ["id"] + ) + op.create_index("ix_tasks_validated_by", "tasks", ["validated_by"], unique=False) + op.create_index("ix_tasks_mapped_by", "tasks", ["mapped_by"], unique=False) + op.create_index("ix_tasks_locked_by", "tasks", ["locked_by"], unique=False) + op.add_column( + "projects", + sa.Column( + "gsd", sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True + ), + ) + op.add_column( + "projects", + sa.Column( + "gimble_angles", + postgresql.ARRAY(sa.SMALLINT()), + autoincrement=False, + nullable=True, + ), + ) + op.add_column( + "projects", + sa.Column( + "overlap", + sa.DOUBLE_PRECISION(precision=53), + autoincrement=False, + nullable=True, + ), + ) + op.drop_column("projects", "gimble_angles_degrees") + op.drop_column("projects", "gsd_cm_px") + op.drop_column("projects", "overlap_percent") + # ### end Alembic commands ### diff --git a/src/backend/app/models/enums.py b/src/backend/app/models/enums.py index d9f5ee50..8e9c8af5 100644 --- a/src/backend/app/models/enums.py +++ b/src/backend/app/models/enums.py @@ -114,3 +114,51 @@ class UserRole(IntEnum, Enum): PROJECT_CREATOR = 1 DRONE_PILOT = 2 BOTH = 3 + + +class State(int, Enum): + """The state of a task. + + The state can be: + - ``unlocked to map`` + - ``locked for mapping`` + - ``unlocked to validate`` + - ``locked for validation`` + - ``unlocked done`` + """ + + UNLOCKED_TO_MAP = 0 + LOCKED_FOR_MAPPING = 1 + UNLOCKED_TO_VALIDATE = 2 + LOCKED_FOR_VALIDATION = 3 + UNLOCKED_DONE = 4 + + +class EventType(str, Enum): + """Events that can be used via the API to update a state + + Specify the event type for ``POST`` to: + ``/project/{pid}/event`` . + + Possible values are: + + - ``map`` -- Set to *locked for mapping*, i.e. mapping in progress. + - ``finish`` -- Set to *unlocked to validate*, i.e. is mapped. + - ``validate`` -- Request recent task ready to be validate. + - ``good`` -- Set the state to *unlocked done*. + - ``bad`` -- Set the state *unlocked to map* again, to be mapped once again. + - ``split`` -- Set the state *unlocked done* then generate additional subdivided task areas. + - ``assign`` -- For a requester user to assign a task to another user. Set the state *locked for mapping* passing in the required user id. + - ``comment`` -- Keep the state the same, but simply add a comment. + + Note that ``task_id`` must be specified in the endpoint too. + """ + + MAP = "map" + FINISH = "finish" + VALIDATE = "validate" + GOOD = "good" + BAD = "bad" + SPLIT = "split" + ASSIGN = "assign" + COMMENT = "comment"