Some checks failed
Aegis CI / lint-and-test (push) Has been cancelled
Full Jira/Tempo pipeline: link Aegis entities to Jira issues, auto-sync
status hourly, log time internally with integrity hashing, and optionally
push worklogs to Tempo.
- 1.1 JiraLink model + Worklog model: Alembic migration b020 with indexes,
enums (jiralinkentitytype, jirasyncdirection), and integrity_hash column
- 1.2 Jira service: atlassian-python-api wrapper with lazy singleton client,
search/create/sync operations, feature-flagged via JIRA_ENABLED
- 1.3 Jira router: CRUD endpoints for /jira/links, /jira/search,
/jira/create-issue with audit logging and entity-to-issue auto-creation
- 1.4 Tempo service: worklog push via tempo-api-python-client, auto-log from
test completions when TEMPO_ENABLED, graceful fallback on failure
- 1.5 Worklog service + router: immutable internal time records with SHA-256
integrity hash, CRUD at /worklogs, /worklogs/{id}/verify endpoint
- 1.6 Frontend: JiraLinkPanel component (search, link, sync, unlink) and
WorklogTimeline component (timeline view, manual log form) integrated into
TestDetailPage sidebar, CampaignDetailPage grid, TechniqueDetailPage
- 1.7 Jira sync job: APScheduler hourly job syncs all links from Jira,
registered in background scheduler alongside existing jobs
47 lines
1.2 KiB
Python
47 lines
1.2 KiB
Python
"""Pydantic schemas for Jira integration endpoints."""
|
|
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from app.models.jira_link import JiraLinkEntityType, JiraSyncDirection
|
|
|
|
|
|
class JiraLinkCreate(BaseModel):
|
|
entity_type: JiraLinkEntityType
|
|
entity_id: UUID
|
|
jira_issue_key: str = Field(..., pattern=r"^[A-Z][A-Z0-9]+-\d+$")
|
|
sync_direction: JiraSyncDirection = JiraSyncDirection.bidirectional
|
|
|
|
|
|
class JiraLinkOut(BaseModel):
|
|
id: UUID
|
|
entity_type: JiraLinkEntityType
|
|
entity_id: UUID
|
|
jira_issue_key: str
|
|
jira_issue_id: Optional[str] = None
|
|
jira_project_key: Optional[str] = None
|
|
jira_status: Optional[str] = None
|
|
jira_priority: Optional[str] = None
|
|
jira_assignee: Optional[str] = None
|
|
jira_story_points: Optional[str] = None
|
|
last_synced_at: Optional[datetime] = None
|
|
created_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class JiraIssueSearch(BaseModel):
|
|
query: str
|
|
|
|
|
|
class JiraIssueResult(BaseModel):
|
|
issue_key: str
|
|
summary: str
|
|
status: str
|
|
assignee: Optional[str] = None
|
|
priority: Optional[str] = None
|