Skip to content

feat: init app user_notifications#961

Merged
Winzen merged 2 commits intomainfrom
feat/user_notifications_final
Feb 10, 2026
Merged

feat: init app user_notifications#961
Winzen merged 2 commits intomainfrom
feat/user_notifications_final

Conversation

@Winzen
Copy link
Copy Markdown
Contributor

@Winzen Winzen commented Jan 14, 2026

feat: init app user_notifications #961


Este PR implementa o fluxo completo de notificação por e-mail para usuários inscritos em atualizações de tabelas, incluindo modelagem, interface administrativa, comando Django, envio de e-mails e execução automática via tarefa agendada.


📌 Contexto

Usuários podem se inscrever para acompanhar atualizações de tabelas específicas. Quando uma tabela é atualizada, o sistema deve identificar essas mudanças e notificar os usuários por e-mail, evitando envios duplicados e permitindo controle administrativo das inscrições.

A solução centraliza a lógica em um comando Django reutilizável, que pode ser executado manualmente ou automaticamente em produção.

🔄 Fluxograma do fluxo de notificação

┌──────────────────────────────┐
│ Huey (tarefa periódica)       │
│ Seg–Sex às 07:00              │
└───────────────┬──────────────┘
                │
                ▼
┌──────────────────────────────┐
│ call_command("send_notification") │
└───────────────┬──────────────┘
                │
                ▼
┌──────────────────────────────┐
│ Busca TableUpdateSubscription │
│ com status = True             │
└───────────────┬──────────────┘
                │
                ▼
┌──────────────────────────────┐
│ Para cada subscription        │
│ tabela foi atualizada?        │
└───────────────┬──────────────┘
        ┌───────┴────────┐
        │                │
        ▼                ▼
     Não ignora     Sim adiciona
                     ao grupo
                     do usuário
                         │
                         ▼
┌──────────────────────────────┐
│ Agrupa subscriptions         │
│ por usuário                  │
└───────────────┬──────────────┘
                │
                ▼
┌──────────────────────────────┐
│ Envia 1 e-mail por usuário   │
│ (HTML + texto)               │
└───────────────┬──────────────┘
                │
                ▼
┌──────────────────────────────┐
│ Atualiza subscription:       │
│ - last_notification          │
│ - updated_at                 │
└──────────────────────────────┘

✅ O que foi implementado

1. Modelagem de domínio

  • Criação do model TableUpdateSubscription, responsável por:

    • Relacionar usuário (Account) e tabela (Table)
    • Controlar status da inscrição
    • Armazenar datas de criação, última notificação e última atualização processada
  • Base para rastreabilidade, controle e futuras extensões (ex: histórico, soft-delete).


2. Interface administrativa (Django Admin)

  • Registro do model no Django Admin com configuração personalizada:

    • Listagem completa (list_display)
    • Filtros por status, tabela e usuário
    • Busca por nome da tabela e username
    • Edição inline do status da inscrição
    • Organização por fieldsets
    • Campos de data protegidos como readonly
  • Permite gestão completa das inscrições sem acesso direto ao banco.


3. Verificação de atualizações

  • Implementação de lógica para verificar se:

    • table.last_updated_at é mais recente que subscription.updated_at
  • Apenas inscrições ativas (status=True) são consideradas.

  • Subscriptions com atualização são separadas para notificação.


4. Agrupamento por usuário

  • As subscriptions são agrupadas por usuário antes do envio.
  • Garante que cada usuário receba apenas um e-mail, mesmo que múltiplas tabelas tenham sido atualizadas.

5. Envio de e-mails

  • Envio utilizando EmailMultiAlternatives, com:

    • Corpo em texto
    • Template HTML (update_table_notification.html)
  • Após o envio:

    • Atualização de last_notification
    • Sincronização de subscription.updated_at com table.last_updated_at

6. Management Command

  • Criação do comando Django send_notification, responsável por:

    • Executar a verificação
    • Enviar os e-mails
  • Pode ser executado manualmente para testes locais ou troubleshooting.


7. Execução automática (Huey + cron)

  • Criação de tarefa periódica com @db_periodic_task

  • Agendada para rodar:

    • Segunda a sexta-feira
    • Às 07:00
  • Protegida pelo decorator @production_task

  • A tarefa apenas dispara o command, mantendo a lógica centralizada e reutilizável.


🎯 Benefícios

  • Automação completa do fluxo de notificação
  • Evita spam e envios duplicados
  • Código organizado e reutilizável
  • Fácil manutenção e extensão futura
  • Controle administrativo simples via Django Admin

@Winzen Winzen self-assigned this Jan 14, 2026
@Winzen Winzen added the prod Indica que o Pull Request está com a branch de destino (base) apontando para main label Jan 14, 2026
@Winzen Winzen changed the title feat: init app user_notifications #960 feat: init app user_notifications Jan 14, 2026
@Winzen Winzen changed the title feat: init app user_notifications feat: init app user_notifications Jan 14, 2026
@Winzen Winzen force-pushed the feat/user_notifications_final branch from 1e2c656 to 299ede1 Compare February 10, 2026 07:44
@Winzen Winzen merged commit e2c2fe8 into main Feb 10, 2026
4 checks passed
@Winzen Winzen linked an issue Feb 10, 2026 that may be closed by this pull request
29 tasks
@Winzen Winzen deleted the feat/user_notifications_final branch February 10, 2026 08:37
@Winzen Winzen linked an issue Feb 10, 2026 that may be closed by this pull request
Winzen added a commit that referenced this pull request Feb 11, 2026
…981

# chore: sync staging and main (#961) feat: init app user_notifications

## Descrição das Alterações

Este Pull Request tem como objetivo atualizar a branch atual com as últimas alterações da branch main, garantindo que a base de código esteja alinhada com as mudanças mais recentes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

prod Indica que o Pull Request está com a branch de destino (base) apontando para main

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Notificação automática de atualização de tabelas por e-mail [Backend] Botão de registro de interesse

1 participant