import zipfile
from io import BytesIO
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
from weasyprint import HTML
from src.dados_comuns.utils import envia_email_unico_com_anexo_inmemory
from src.dieta_especial.solicitacao_dieta_especial.models import (
SolicitacaoDietaEspecial,
)
from src.relatorios.relatorios import relatorio_dieta_especial_protocolo
[docs]
class Command(BaseCommand):
help = "Gera PDFs dos protocolos de dieta especial, salva o arquivo em memória e envia por e-mail"
[docs]
def add_arguments(self, parser):
parser.add_argument(
"--lote", required=True, type=str, help="Nome do lote (obrigatório)"
)
parser.add_argument(
"--email", required=True, type=str, help="E-mail de destino (obrigatório)"
)
parser.add_argument(
"--inicio", type=int, default=0, help="Índice inicial (opcional)"
)
parser.add_argument(
"--fim", type=int, default=None, help="Índice final (opcional)"
)
[docs]
def handle(self, *args, **options):
lote = options["lote"]
email = options["email"]
inicio = options["inicio"]
fim = options["fim"]
zip_filename = f"protocolos_dieta_especial_{lote}.zip"
buffer_zip = BytesIO()
dietas = SolicitacaoDietaEspecial.objects.filter(
status="CODAE_AUTORIZADO", ativo=True, escola_destino__lote__nome=lote
).order_by("escola_destino__nome", "aluno__nome")[inicio:fim]
if not dietas.exists():
raise CommandError("Nenhuma dieta encontrada com os filtros fornecidos.")
with zipfile.ZipFile(buffer_zip, "w", zipfile.ZIP_DEFLATED) as zip_file:
for dieta in dietas:
nome = dieta.aluno.nome.replace("/", "-")
nome_escola = dieta.escola_destino.nome
codigo = dieta.aluno.codigo_eol or "Nao matriculado"
filename = f"Protocolo - {nome_escola} - {nome} - {codigo}.pdf"
html_string = relatorio_dieta_especial_protocolo(None, dieta)
pdf_buffer = BytesIO()
HTML(string=html_string, base_url=settings.STATIC_URL).write_pdf(
pdf_buffer
)
zip_file.writestr(filename, pdf_buffer.getvalue())
self.stdout.write(self.style.SUCCESS(f"Adicionado: {filename}"))
envia_email_unico_com_anexo_inmemory(
assunto=f"Protocolos de Dieta Especial - {lote} - {inicio + 1} a {fim}",
corpo=f"""
<p>Olá,</p>
<p>Segue em anexo o arquivo ZIP com os protocolos do lote <strong>{lote}</strong>.</p>
<p>Atenciosamente,<br>SIGPAE</p>
""",
email=email,
anexo_nome=zip_filename,
mimetypes="application/zip",
anexo=buffer_zip.getvalue(),
)
self.stdout.write(self.style.SUCCESS(f"E-mail enviado para {email}"))