klg-asutk-app/backend/app/schemas/legal.py
Yuriy 0150aba4f5 Consolidation: KLG ASUTK + PAPA integration
- Unify API: lib/api.ts uses /api/v1, inbox uses /api/inbox (rewrites)
- Remove localhost refs: openapi, inbox page
- Add rewrites: /api/inbox|tmc -> inbox-server, /api/v1 -> FastAPI
- Add stub routes: knowledge/insights, recommendations, search, log-error
- Transfer from PAPA: prompts (inspection, tmc), scripts, supabase, data/tmc-requests
- Fix inbox-server: ORDER BY created_at, package.json
- Remove redundant app/api/inbox/files route (rewrites handle it)
- knowledge/ in gitignore (large PDFs)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 17:18:31 +03:00

178 lines
4.4 KiB
Python

"""
Схемы Pydantic для API юридических документов, комментариев, судебной практики и перекрёстных ссылок.
"""
from datetime import datetime
from typing import Any
from pydantic import BaseModel, Field
from app.schemas.common import ORMBase, TimestampOut
# --- Jurisdiction ---
class JurisdictionBase(ORMBase):
code: str
name: str
name_ru: str | None = None
description: str | None = None
is_active: bool = True
class JurisdictionCreate(JurisdictionBase):
pass
class JurisdictionUpdate(BaseModel):
name: str | None = None
name_ru: str | None = None
description: str | None = None
is_active: bool | None = None
class JurisdictionOut(JurisdictionBase, TimestampOut):
id: str
# --- LegalDocument ---
class LegalDocumentBase(ORMBase):
jurisdiction_id: str
document_type: str = Field(..., description="legislative|recommendatory|directive|notification|regulatory|contractual|judicial|other")
title: str
title_original: str | None = None
short_name: str | None = None
content: str | None = None
summary: str | None = None
effective_date: str | None = None
publication_date: str | None = None
registration_number: str | None = None
source_file_path: str | None = None
class LegalDocumentCreate(LegalDocumentBase):
pass
class LegalDocumentUpdate(BaseModel):
document_type: str | None = None
title: str | None = None
title_original: str | None = None
short_name: str | None = None
content: str | None = None
summary: str | None = None
effective_date: str | None = None
publication_date: str | None = None
registration_number: str | None = None
compliance_notes: str | None = None
analysis_json: str | None = None
source_file_path: str | None = None
class LegalDocumentOut(LegalDocumentBase, TimestampOut):
id: str
compliance_notes: str | None = None
analysis_json: str | None = None
# --- CrossReference ---
class CrossReferenceBase(ORMBase):
source_document_id: str
target_document_id: str
quote_excerpt: str | None = None
target_article: str | None = None
relevance: str | None = None
class CrossReferenceCreate(CrossReferenceBase):
created_by_agent: str | None = None
class CrossReferenceOut(CrossReferenceBase, TimestampOut):
id: str
created_by_agent: str | None = None
# --- LegalComment ---
class LegalCommentBase(ORMBase):
jurisdiction_id: str
document_id: str | None = None
title: str
content: str
article_ref: str | None = None
author: str | None = None
source: str | None = None
is_official: bool = False
class LegalCommentCreate(LegalCommentBase):
pass
class LegalCommentUpdate(BaseModel):
title: str | None = None
content: str | None = None
article_ref: str | None = None
author: str | None = None
source: str | None = None
is_official: bool | None = None
document_id: str | None = None
class LegalCommentOut(LegalCommentBase, TimestampOut):
id: str
# --- JudicialPractice ---
class JudicialPracticeBase(ORMBase):
jurisdiction_id: str
document_id: str | None = None
court_name: str
case_number: str | None = None
decision_date: str | None = None
summary: str
legal_grounds: str | None = None
outcome: str | None = None
full_text_ref: str | None = None
class JudicialPracticeCreate(JudicialPracticeBase):
pass
class JudicialPracticeUpdate(BaseModel):
court_name: str | None = None
case_number: str | None = None
decision_date: str | None = None
summary: str | None = None
legal_grounds: str | None = None
outcome: str | None = None
full_text_ref: str | None = None
document_id: str | None = None
class JudicialPracticeOut(JudicialPracticeBase, TimestampOut):
id: str
# --- Analysis (ИИ-агенты) ---
class AnalysisRequest(BaseModel):
document_id: str | None = None
jurisdiction_id: str
title: str
content: str | None = None
skip_agents: list[str] | None = Field(default=None, description="classifier, norm_compliance, cross_reference, comment_enrichment, judicial_practice, formatting")
save_cross_references: bool = True
class AnalysisResponse(BaseModel):
document_type: str
analysis_json: str | None
compliance_notes: str | None
results: dict[str, Any]