from ninja import Schema, ModelSchema, UploadedFile from typing import List, Optional from .models import TipoDiarioOficial from datetime import date 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] 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