064bb6ea65
Source CRUD (reusable, tree-scoped) and Citation create/list/soft-delete linking one source to exactly one fact (person/event/name/relationship). Editor-gated writes, privacy-filtered reads, audit throughout; tenant + existence validation on source and target. list_citations returns all tree citations so the UI can render 'sourced' indicators in one round-trip. 22 tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Justin Paul <justin@jpaul.me>
62 lines
1.5 KiB
Python
62 lines
1.5 KiB
Python
import uuid
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
from app.models.enums import CitationConfidence
|
|
|
|
|
|
class SourceCreate(BaseModel):
|
|
title: str
|
|
author: str | None = None
|
|
source_type: str | None = None
|
|
repository: str | None = None
|
|
url: str | None = None
|
|
citation_text: str | None = None
|
|
publication_info: str | None = None
|
|
quality_note: str | None = None
|
|
|
|
|
|
class SourceRead(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: uuid.UUID
|
|
tree_id: uuid.UUID
|
|
title: str
|
|
author: str | None
|
|
source_type: str | None
|
|
repository: str | None
|
|
url: str | None
|
|
citation_text: str | None
|
|
publication_info: str | None
|
|
quality_note: str | None
|
|
created_at: datetime
|
|
|
|
|
|
class CitationCreate(BaseModel):
|
|
source_id: uuid.UUID
|
|
# Exactly one target fact.
|
|
person_id: uuid.UUID | None = None
|
|
event_id: uuid.UUID | None = None
|
|
name_id: uuid.UUID | None = None
|
|
relationship_id: uuid.UUID | None = None
|
|
page: str | None = None
|
|
detail: str | None = None
|
|
confidence: CitationConfidence | None = None
|
|
|
|
|
|
class CitationRead(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: uuid.UUID
|
|
tree_id: uuid.UUID
|
|
source_id: uuid.UUID
|
|
person_id: uuid.UUID | None
|
|
event_id: uuid.UUID | None
|
|
name_id: uuid.UUID | None
|
|
relationship_id: uuid.UUID | None
|
|
page: str | None
|
|
detail: str | None
|
|
confidence: CitationConfidence | None
|
|
created_at: datetime
|