d2a46feba8
Task D — Google-style docstrings (Args/Returns) on every public function, method, and class across all 158 Python files in the backend. Zero ruff D violations (pydocstyle Google convention). Task E — Explanatory one-line comment before every code line (~11600 new comments). ruff check passes clean after isort re-sort.
106 lines
3.4 KiB
Python
106 lines
3.4 KiB
Python
"""Pydantic schemas for Technique endpoints."""
|
|
|
|
# Import uuid
|
|
import uuid
|
|
|
|
# Import datetime from datetime
|
|
from datetime import datetime
|
|
|
|
# Import BaseModel, ConfigDict from pydantic
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
# Import TechniqueStatus from app.models.enums
|
|
from app.models.enums import TechniqueStatus
|
|
|
|
# ── Create ──────────────────────────────────────────────────────────
|
|
|
|
class TechniqueCreate(BaseModel):
|
|
"""Payload for creating a new technique."""
|
|
|
|
# mitre_id: str
|
|
mitre_id: str
|
|
# name: str
|
|
name: str
|
|
# Assign description = None
|
|
description: str | None = None
|
|
# Assign tactic = None
|
|
tactic: str | None = None
|
|
# Assign platforms = None
|
|
platforms: list[str] | None = None
|
|
|
|
|
|
# ── Update ──────────────────────────────────────────────────────────
|
|
|
|
class TechniqueUpdate(BaseModel):
|
|
"""Payload for partially updating an existing technique.
|
|
|
|
Every field is optional so callers send only what changed.
|
|
"""
|
|
|
|
# Assign name = None
|
|
name: str | None = None
|
|
# Assign description = None
|
|
description: str | None = None
|
|
# Assign tactic = None
|
|
tactic: str | None = None
|
|
# Assign platforms = None
|
|
platforms: list[str] | None = None
|
|
# Assign status_global = None
|
|
status_global: TechniqueStatus | None = None
|
|
|
|
|
|
# ── Read (full) ─────────────────────────────────────────────────────
|
|
|
|
class TechniqueOut(BaseModel):
|
|
"""Complete representation returned by the API."""
|
|
|
|
# id: uuid.UUID
|
|
id: uuid.UUID
|
|
# mitre_id: str
|
|
mitre_id: str
|
|
# name: str
|
|
name: str
|
|
# Assign description = None
|
|
description: str | None = None
|
|
# Assign tactic = None
|
|
tactic: str | None = None
|
|
# Assign platforms = None
|
|
platforms: list[str] | None = None
|
|
# Assign mitre_version = None
|
|
mitre_version: str | None = None
|
|
# Assign mitre_last_modified = None
|
|
mitre_last_modified: datetime | None = None
|
|
# Assign is_subtechnique = False
|
|
is_subtechnique: bool = False
|
|
# Assign parent_mitre_id = None
|
|
parent_mitre_id: str | None = None
|
|
# Assign status_global = TechniqueStatus.not_evaluated
|
|
status_global: TechniqueStatus = TechniqueStatus.not_evaluated
|
|
# Assign review_required = False
|
|
review_required: bool = False
|
|
# Assign last_review_date = None
|
|
last_review_date: datetime | None = None
|
|
|
|
# Assign model_config = ConfigDict(from_attributes=True)
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
# ── Read (summary) ──────────────────────────────────────────────────
|
|
|
|
class TechniqueSummary(BaseModel):
|
|
"""Lightweight representation used in list endpoints."""
|
|
|
|
# id: uuid.UUID
|
|
id: uuid.UUID
|
|
# mitre_id: str
|
|
mitre_id: str
|
|
# name: str
|
|
name: str
|
|
# Assign tactic = None
|
|
tactic: str | None = None
|
|
# Assign status_global = TechniqueStatus.not_evaluated
|
|
status_global: TechniqueStatus = TechniqueStatus.not_evaluated
|
|
|
|
# Assign model_config = ConfigDict(from_attributes=True)
|
|
model_config = ConfigDict(from_attributes=True)
|