Download do Termo de Uso com dados do usuário no admin
TLDR: O botão “Baixar Termo de Uso do Usuário” no admin Django renderiza o template
default_terms.htmlcomo PDF via WeasyPrint, com os placeholders[USUÁRIO]e[ACEITE]substituídos pelonameeaccept_terms_atdo usuário.
Contexto
O admin Django exibe um botão “Baixar Termo de Uso do Usuário” no change form do CommonUser. O conteúdo do termo vive em templates/admin/accounts/user/default_terms.html e contém dois placeholders textuais — [USUÁRIO] e [ACEITE] — que devem ser substituídos pelos campos name e accept_terms_at do usuário no momento do download. O PDF é gerado on-the-fly, não é persistido.
Objetivos
- Renderizar
default_terms.htmlcomo PDF dinâmico no servidor - Retornar
HttpResponsecomContent-Type: application/pdfeContent-Disposition: attachment - Manter o botão existente no template (o
hrefjá aponta pra URL do admin)
Fora de escopo
- Salvar o PDF gerado em disco ou S3
- Versionar o termo por usuário (histórico de aceites)
- Exibir o PDF em iframe no admin
Mudanças
pyproject.toml
- Adicionar
weasyprintàs dependências (uv add weasyprint)
templates/admin/accounts/user/default_terms.html
- Substituir o literal
[USUÁRIO](aparece no corpo do termo e no bloco de assinatura) por{{ user.name|default:"—" }} - Substituir
[ACEITE]por{{ user.accept_terms_at|date:"d/m/Y H:i"|default:"Não informado" }} - Substituir
(data do aceite)no blocolocal-datapor{{ user.accept_terms_at|date:"d/m/Y"|default:"—" }}
apps/accounts/admin.py (BaseUserAdmin)
- Adicionar URL
<int:user_id>/download-terms-pdf/emget_urls(), nomeadaaccounts_user_download_terms_pdf - Implementar view
download_terms_pdf(request, user_id):get_object_or_404(User, pk=user_id)- Renderiza
templates/admin/accounts/user/default_terms.htmlcom contexto{"user": user} - Converte HTML em PDF com
weasyprint.HTML(string=html).write_pdf() - Retorna
HttpResponse(pdf, content_type="application/pdf")com headerContent-Disposition: attachment; filename="termo-<user.id>.pdf"
templates/admin/accounts/user/change_form.html
- Sem alteração (o
hrefjá usa{% url 'admin:accounts_user_download_terms_pdf' original.pk %})
Como verificar
- Abrir o admin em
/dash/accounts/commonuser/<id>/change/ - Clicar em “Baixar Termo de Uso do Usuário”
- O PDF baixado deve conter o
namedo usuário nos dois pontos onde havia[USUÁRIO]e oaccept_terms_atformatado onde havia[ACEITE] - Usuário sem
accept_terms_atdeve exibir “Não informado” no bloco de assinatura e “—” no bloco de data local - Layout do PDF deve preservar o CSS do template (fontes serifadas, linha de assinatura,
text-align: justify)
Documentação
Nenhuma mudança em .project/docs/rules/ — o comportamento de download é um detalhe de admin, não uma regra de negócio.