FK do áudio para a notificação agendada

TLDR: Adiciona uma FK em Audio apontando para sua Notification agendada, para que o reagendamento cancele apenas a notificação daquele áudio, e não todas as pendentes.

Contexto

Quando um áudio é criado ou atualizado, _schedule_audio_notification cria uma Notification com scheduled_at futuro. Antes, um filtro amplo cancelava todas as notificações de áudio pendentes em qualquer save — fazendo com que áudios de dias diferentes cancelassem as notificações uns dos outros. Esse filtro foi removido, mas agora reagendar um áudio deixa a notificação antiga pendente (com o horário errado) ao lado da nova.

A correção é dar ao Audio uma FK para a sua própria Notification. No reagendamento, apenas aquela notificação específica é cancelada antes de criar a nova. Notification permanece totalmente genérica — não conhece Audio.

Objetivos

  • Audio pode referenciar sua notificação agendada
  • Reagendar um áudio cancela apenas a própria notificação pendente
  • Criar 4 áudios em 4 dias diferentes mantém as 4 notificações pendentes
  • O model Notification permanece inalterado

Fora de escopo

— (não registrado na spec original)

Mudanças

  • apps/audios/models/audio.py — adicionar scheduled_notification = ForeignKey(Notification, null=True, blank=True, on_delete=SET_NULL, related_name="+")
  • apps/audios/migrations/ — nova migration para a FK
  • apps/audios/signals.py — em _schedule_audio_notification, cancelar audio.scheduled_notification se estiver pendente, criar a nova notificação e salvar a referência no áudio
  • tests/audios/test_tasks_signals_apps.py — teste do cenário de reagendamento (notificação antiga cancelada, nova criada) e ajuste do helper _make_audio se necessário

Como verificar

  1. Criar o áudio A para hoje e o áudio B para amanhã — ambas as notificações permanecem pending
  2. Atualizar o available_time do áudio A — a notificação antiga vira canceled, uma nova pending é criada e a notificação do áudio B não é tocada
  3. Rodar dispatch_scheduled_notifications depois que o horário do áudio A passar — apenas a notificação do áudio A é despachada

Documentação

Nenhuma mudança de documentação necessária.