2025-06-16 13:11:57 -04:00
|
|
|
from ninja import Schema, ModelSchema, UploadedFile
|
2025-05-26 14:22:19 +02:00
|
|
|
from typing import List, Optional
|
2025-06-16 13:11:57 -04:00
|
|
|
from .models import TipoDiarioOficial
|
|
|
|
|
from datetime import date
|
2025-05-26 14:22:19 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class PaginaSchema(Schema):
|
|
|
|
|
"""Schema que representa uma página de um Diário Oficial.
|
|
|
|
|
|
|
|
|
|
Attributes:
|
|
|
|
|
numero (int): Número ordinal da página no Diário (começa em 1).
|
|
|
|
|
conteudo (str): Texto extraído da página.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
numero: int
|
|
|
|
|
conteudo: str
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ResultadoSchema(Schema):
|
|
|
|
|
"""Schema de resposta para um Diário Oficial em resultados de busca.
|
|
|
|
|
|
|
|
|
|
Attributes:
|
|
|
|
|
id (int): ID único do Diário no banco de dados.
|
|
|
|
|
numero (str): Número de identificação oficial do Diário (e.g., '123-A').
|
|
|
|
|
data (str): Data de publicação no formato ISO (YYYY-MM-DD).
|
|
|
|
|
link (str): URL para acessar o Diário Oficial online.
|
|
|
|
|
tipo (str): Nome do tipo de Diário (e.g., 'Municipal', 'Federal').
|
|
|
|
|
paginas (List[PaginaSchema]): Lista de páginas com conteúdo extraído.
|
|
|
|
|
score (Optional[float]): Relevância do resultado (0 a 1), se aplicável.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
id: int
|
|
|
|
|
numero: str
|
|
|
|
|
data: str
|
|
|
|
|
link: str
|
|
|
|
|
tipo: str
|
|
|
|
|
paginas: List[PaginaSchema]
|
|
|
|
|
score: Optional[float] = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class BuscaDiariosResponseSchema(Schema):
|
|
|
|
|
"""Schema de resposta para buscas paginadas em Diários Oficiais.
|
|
|
|
|
|
|
|
|
|
Attributes:
|
|
|
|
|
total (int): Total de resultados disponíveis (ignorando paginação).
|
|
|
|
|
resultados (List[ResultadoSchema]): Lista de Diários encontrados.
|
|
|
|
|
pagina (int): Número da página atual (começa em 1).
|
|
|
|
|
por_pagina (int): Quantidade de resultados por página.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
total: int
|
|
|
|
|
resultados: List[ResultadoSchema]
|
|
|
|
|
pagina: int
|
|
|
|
|
por_pagina: int
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SugestaoResponse(Schema):
|
|
|
|
|
"""Schema para sugestões de correção de busca (e.g., 'Voc quis dizer...?').
|
|
|
|
|
|
|
|
|
|
Attributes:
|
|
|
|
|
sugestao (Optional[str]): Termo sugerido para refinar a busca.
|
|
|
|
|
None se nenhuma sugestão for relevante.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
sugestao: Optional[str]
|
2025-06-16 13:11:57 -04:00
|
|
|
|
|
|
|
|
class TipoDiarioSchema(ModelSchema):
|
|
|
|
|
class Config:
|
|
|
|
|
model = TipoDiarioOficial
|
|
|
|
|
model_fields = ["id", "nome"]
|
|
|
|
|
|
|
|
|
|
class DiarioOficialIn(Schema):
|
|
|
|
|
"""Schema para criação de Diário Oficial"""
|
|
|
|
|
data: date
|
|
|
|
|
numero: str
|
|
|
|
|
tipo_id: Optional[int] = None
|
|
|
|
|
link: Optional[str] = None
|
|
|
|
|
arquivo: Optional[UploadedFile] = None # Adicionando o campo de arquivo
|
|
|
|
|
|
|
|
|
|
class Config:
|
|
|
|
|
# Configuração adicional para o Swagger UI
|
|
|
|
|
json_schema_extra = {
|
|
|
|
|
"example": {
|
|
|
|
|
"data": "2023-12-01",
|
|
|
|
|
"numero": "1234/2023",
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class DiarioOficialOut(Schema):
|
|
|
|
|
"""Schema para retorno de Diário Oficial (com detalhes completos)"""
|
|
|
|
|
id: int
|
|
|
|
|
data: str # Será formatado como ISO (YYYY-MM-DD)
|
|
|
|
|
numero: str
|
|
|
|
|
link: Optional[str]
|
|
|
|
|
tipo: Optional[TipoDiarioSchema]
|
|
|
|
|
total_paginas: int
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def resolve_data(obj):
|
|
|
|
|
return obj.data.isoformat()
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def resolve_total_paginas(obj):
|
|
|
|
|
return obj.paginas.count()
|
|
|
|
|
|
|
|
|
|
class DiarioOficialUpdate(Schema):
|
|
|
|
|
"""Schema para atualização de Diário Oficial"""
|
|
|
|
|
data: Optional[date] = None
|
|
|
|
|
numero: Optional[str] = None
|
|
|
|
|
tipo_id: Optional[int] = None
|
|
|
|
|
link: Optional[str] = None
|
|
|
|
|
|
|
|
|
|
class DiarioListagem(Schema):
|
|
|
|
|
"""Schema simplificado para listagem de Diários"""
|
|
|
|
|
id: int
|
|
|
|
|
data: str
|
|
|
|
|
numero: str
|
|
|
|
|
tipo_nome: Optional[str]
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def resolve_data(obj):
|
|
|
|
|
return obj.data.isoformat()
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def resolve_tipo_nome(obj):
|
|
|
|
|
return obj.tipo.nome if obj.tipo else None
|