diff --git a/sapl/materia/apps.py b/sapl/materia/apps.py index d8eda8c44..ecc8d09de 100644 --- a/sapl/materia/apps.py +++ b/sapl/materia/apps.py @@ -7,5 +7,5 @@ class AppConfig(apps.AppConfig): label = 'materia' verbose_name = _('Matéria') -# def ready(self): -# from . import signals + def ready(self): + from . import signals diff --git a/sapl/materia/receivers.py b/sapl/materia/receivers.py new file mode 100644 index 000000000..5ef7c4d1f --- /dev/null +++ b/sapl/materia/receivers.py @@ -0,0 +1,76 @@ +from datetime import datetime + +from django.core.mail import send_mass_mail +from django.core.urlresolvers import reverse +from django.dispatch import receiver + +from sapl.base.models import CasaLegislativa +from sapl.materia.signals import tramitacao_signal +from sapl.settings import EMAIL_SEND_USER +from sapl.utils import get_base_url + +from .models import AcompanhamentoMateria +from .views import load_email_templates + + +@receiver(tramitacao_signal) +def handle_tramitacao_signal(sender, **kwargs): + tramitacao = kwargs.get("post") + request = kwargs.get("request") + materia = tramitacao.materia + + destinatarios = AcompanhamentoMateria.objects.filter( + materia=materia, + confirmado=True) + + casa = CasaLegislativa.objects.first() + + if not casa: + raise ValueError('Casa Legislativa é obrigatória') + + # FIXME i18n + casa_nome = (casa.nome + ' de ' + + casa.municipio + '-' + + casa.uf) + + sender = EMAIL_SEND_USER + + # FIXME i18n + subject = "[SAPL] " + str(materia) + \ + " - Acompanhamento de Materia Legislativa" + + base_url = get_base_url(request) + url_materia = reverse('sapl.materia:tramitacao_list', + kwargs={'pk': materia.id}) + url_excluir = reverse('sapl.materia:acompanhar_excluir', + kwargs={'pk': materia.id}) + + autores = [] + for autoria in materia.autoria_set.all(): + autores.append(autoria.autor.nome) + + templates = load_email_templates( + ['email/tramitacao.txt', + 'email/tramitacao.html'], + {"casa_legislativa": casa_nome, + "data_registro": datetime.now().strftime( + "%d/%m/%Y"), + "cod_materia": materia.id, + "logotipo": casa.logotipo, + "descricao_materia": materia.ementa, + "autoria": autores, + "data": tramitacao.data_tramitacao, + "status": tramitacao.status, + "localizacao": tramitacao.unidade_tramitacao_destino, + "texto_acao": tramitacao.texto, + "hash_txt": '', + "materia": str(materia), + "base_url": base_url, + "materia_url": url_materia, + "excluir_url": url_excluir}) + + lista_emails = destinatarios.values_list('email', flat=True).distinct() + + send_mass_mail( + ((subject, templates[0], sender, lista_emails),), + fail_silently=True) diff --git a/sapl/materia/signals.py b/sapl/materia/signals.py index 7314d7504..adeee3275 100644 --- a/sapl/materia/signals.py +++ b/sapl/materia/signals.py @@ -1,10 +1,15 @@ from django.db.models.signals import post_delete, post_save +import django.dispatch + from sapl.utils import delete_texto, save_texto -from .models import DocumentoAcessorio, MateriaLegislativa +from .models import DocumentoAcessorio, MateriaLegislativa, Tramitacao + + +tramitacao_signal = django.dispatch.Signal(providing_args=["post", "request"]) -post_save.connect(save_texto, sender=MateriaLegislativa) -post_save.connect(save_texto, sender=DocumentoAcessorio) -post_delete.connect(delete_texto, sender=MateriaLegislativa) -post_delete.connect(delete_texto, sender=DocumentoAcessorio) +# post_save.connect(save_texto, sender=MateriaLegislativa) +# post_save.connect(save_texto, sender=DocumentoAcessorio) +# post_delete.connect(delete_texto, sender=MateriaLegislativa) +# post_delete.connect(delete_texto, sender=DocumentoAcessorio) diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index 7eac42e5c..600fadfc6 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -25,6 +25,8 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, from .apps import AppConfig +from . import receivers + app_name = AppConfig.name urlpatterns_materia = [ diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 69da1c757..a00a4106a 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -59,6 +59,8 @@ from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria, TipoDocumento, TipoFimRelatoria, TipoMateriaLegislativa, TipoProposicao, Tramitacao, UnidadeTramitacao) +from .signals import tramitacao_signal + AssuntoMateriaCrud = Crud.build(AssuntoMateria, 'assunto_materia') @@ -914,7 +916,7 @@ class TramitacaoCrud(MasterDetailCrud): id=request.POST['status']).first() unidade_destino = UnidadeTramitacao.objects.get( id=request.POST['unidade_tramitacao_destino'] - ) + ) texto = request.POST['texto'] data_tramitacao = request.POST['data_tramitacao'] do_envia_email_tramitacao( @@ -922,6 +924,13 @@ class TramitacaoCrud(MasterDetailCrud): unidade_destino, texto, data_tramitacao) return super(CreateView, self).post(request, *args, **kwargs) + def form_valid(self, form): + self.object = form.save() + tramitacao_signal.send(sender=Tramitacao, + post=self.object, + request=self.request) + return super().form_valid(form) + class UpdateView(MasterDetailCrud.UpdateView): form_class = TramitacaoUpdateForm @@ -933,8 +942,7 @@ class TramitacaoCrud(MasterDetailCrud): status = StatusTramitacao.objects.filter( id=request.POST['status']).first() unidade_destino = UnidadeTramitacao.objects.get( - id=request.POST['unidade_tramitacao_destino'] - ) + id=request.POST['unidade_tramitacao_destino']) texto = request.POST['texto'] data_tramitacao = request.POST['data_tramitacao'] do_envia_email_tramitacao( @@ -947,6 +955,13 @@ class TramitacaoCrud(MasterDetailCrud): def layout_key(self): return 'TramitacaoUpdate' + def form_valid(self, form): + self.object = form.save() + tramitacao_signal.send(sender=Tramitacao, + post=self.object, + request=self.request) + return super().form_valid(form) + class ListView(MasterDetailCrud.ListView): def get_queryset(self): @@ -1493,9 +1508,9 @@ def criar_email_confirmacao(request, casa_legislativa, materia, hash_txt=''): return templates -def criar_email_tramitacao( - request, casa_legislativa, materia, status, - unidade_destino, texto, data_tramitacao, hash_txt=''): +def criar_email_tramitacao(request, casa_legislativa, materia, + status, unidade_destino, texto, + data_tramitacao, hash_txt=''): if not casa_legislativa: raise ValueError("Casa Legislativa é obrigatória") @@ -1611,8 +1626,12 @@ def do_envia_email_confirmacao(request, materia, email): return None -def do_envia_email_tramitacao( - request, materia, status, unidade_destino, texto, data_tramitacao): +def do_envia_email_tramitacao(request, + materia, + status, + unidade_destino, + texto, + data_tramitacao): # # Envia email de tramitacao para usuarios cadastrados #