Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: CI

on:
push:
branches: [ main ]
branches: [ main, develop ]
pull_request:
branches: [ main ]
branches: [ main, develop ]

jobs:
lint:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -169,3 +169,4 @@ docs/tasking-mvp/tasking-mvp.postman_collection.json
docs/tasking-mvp/tasking-mvp.postman_environment.json
docs/tasking-mvp/_enrich_postman.py
docs/tasking-mvp/feature-coverage.md
.idea/
5 changes: 1 addition & 4 deletions alembic_osm/versions/9221408912dd_add_user_role_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
from sqlalchemy import inspect, text
from sqlalchemy.dialects import postgresql


# revision identifiers, used by Alembic.
revision: str = "9221408912dd"
down_revision: Union[str, None] = None
Expand All @@ -37,9 +36,7 @@ def upgrade() -> None:
"users",
# `id` matches the Rails `users.id` numeric PK so the FK
# from `team_user.user_id` in the next migration can attach.
sa.Column(
"id", sa.BigInteger(), autoincrement=True, nullable=False
),
sa.Column("id", sa.BigInteger(), autoincrement=True, nullable=False),
sa.Column("auth_uid", sa.String(), nullable=False),
sa.Column("email", sa.String(), nullable=True),
sa.Column("display_name", sa.String(), nullable=True),
Expand Down
23 changes: 5 additions & 18 deletions alembic_osm/versions/a1b2c3d4e5f6_tasking_mvp_schema.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@


from typing import Sequence, Union

import sqlalchemy as sa
Expand Down Expand Up @@ -244,9 +242,7 @@ def upgrade() -> None:
),
sa.Column("project_id", sa.BigInteger(), nullable=False),
sa.Column("task_number", sa.Integer(), nullable=False),
sa.Column(
"area_sqkm", sa.Numeric(precision=10, scale=4), nullable=False
),
sa.Column("area_sqkm", sa.Numeric(precision=10, scale=4), nullable=False),
sa.Column(
"status",
postgresql.ENUM(
Expand Down Expand Up @@ -287,13 +283,8 @@ def upgrade() -> None:
"ON tasking_tasks USING GIST (geometry)"
)
else:
op.execute(
"ALTER TABLE tasking_tasks "
"ADD COLUMN geometry BYTEA"
)
op.create_index(
"tasking_tasks_project_idx", "tasking_tasks", ["project_id"]
)
op.execute("ALTER TABLE tasking_tasks " "ADD COLUMN geometry BYTEA")
op.create_index("tasking_tasks_project_idx", "tasking_tasks", ["project_id"])

# ---- tasking_locks ------------------------------------------------

Expand Down Expand Up @@ -439,13 +430,9 @@ def upgrade() -> None:
sa.ForeignKeyConstraint(
["project_id"], ["tasking_projects.id"], ondelete="CASCADE"
),
sa.ForeignKeyConstraint(
["author_user_auth_uid"], ["users.auth_uid"]
),
)
op.create_index(
"tasking_feedback_task_idx", "tasking_feedback", ["task_id"]
sa.ForeignKeyConstraint(["author_user_auth_uid"], ["users.auth_uid"]),
)
op.create_index("tasking_feedback_task_idx", "tasking_feedback", ["task_id"])
op.create_index(
"tasking_feedback_project_idx", "tasking_feedback", ["project_id"]
)
Expand Down
6 changes: 3 additions & 3 deletions alembic_task/versions/c5121cbba124_initial_task_schema.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

from typing import Sequence, Union

import sqlalchemy as sa
Expand Down Expand Up @@ -54,7 +53,9 @@ def upgrade() -> None:
sa.Column("tdeiProjectGroupId", sa.Uuid(), nullable=False),
sa.Column("tdeiRecordId", sa.Uuid(), nullable=True),
sa.Column("tdeiServiceId", sa.Uuid(), nullable=True),
sa.Column("tdeiMetadata", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
sa.Column(
"tdeiMetadata", postgresql.JSONB(astext_type=sa.Text()), nullable=True
),
sa.Column("createdAt", sa.DateTime(), nullable=False),
sa.Column("createdBy", sa.Uuid(), nullable=False),
sa.Column("createdByName", sa.String(), nullable=False),
Expand Down Expand Up @@ -98,7 +99,6 @@ def upgrade() -> None:
)



def downgrade() -> None:
bind = op.get_bind()
assert bind is not None
Expand Down
4 changes: 1 addition & 3 deletions api/core/security.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,7 @@ async def fetch_project_group_users(
TdeiProjectGroupUser(
auth_uid=str(uid),
email=row.get("email"),
display_name=(
row.get("username")
),
display_name=(row.get("username")),
)
)

Expand Down
2 changes: 2 additions & 0 deletions api/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
init_tdei_client,
validate_token,
)
from api.src.tasking.audit.routes import router as tasking_audit_router
from api.src.tasking.projects.routes import me_router as tasking_me_router
from api.src.tasking.projects.routes import router as tasking_projects_router
from api.src.tasking.tasks.routes import router as tasking_tasks_router
Expand Down Expand Up @@ -97,6 +98,7 @@ async def lifespan(_app: FastAPI):
app.include_router(tasking_projects_router, prefix="/api/v1")
app.include_router(tasking_me_router, prefix="/api/v1")
app.include_router(tasking_tasks_router, prefix="/api/v1")
app.include_router(tasking_audit_router, prefix="/api/v1")


@app.get("/health")
Expand Down
Empty file.
41 changes: 41 additions & 0 deletions api/src/tasking/audit/dtos.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from __future__ import annotations

from datetime import datetime
from typing import Any, Optional
from uuid import UUID

from api.src.tasking.audit.schemas import AuditEventType
from api.src.tasking.projects.dtos import Pagination, WireModel


class ActorRef(WireModel):
"""Resolved actor for an audit event."""

user_id: UUID
display_name: Optional[str] = None


class AuditEvent(WireModel):
"""One row in `tasking_audit_events`, with `actor` joined for display."""

id: int
event_type: AuditEventType
project_id: int
task_id: Optional[int] = None
task_number: Optional[int] = None
actor: ActorRef
occurred_at: datetime
details: dict[str, Any]
project_deleted: bool = False


class AuditEventListResponse(WireModel):
results: list[AuditEvent]
pagination: Pagination


__all__ = [
"ActorRef",
"AuditEvent",
"AuditEventListResponse",
]
Loading
Loading