diff --git a/sapl/base/email_utils.py b/sapl/base/email_utils.py index 5d98ae0aa..737449e57 100644 --- a/sapl/base/email_utils.py +++ b/sapl/base/email_utils.py @@ -62,21 +62,22 @@ def enviar_emails(sender, recipients, messages): fail_silently=False) -def criar_email_confirmacao(base_url, casa_legislativa, tipo, doc_mat, hash_txt=''): +def criar_email_confirmacao(base_url, casa_legislativa, doc_mat, tipo, hash_txt=''): if not casa_legislativa: raise ValueError("Casa Legislativa é obrigatória") if not doc_mat: if tipo == "materia": - raise ValueError("Matéria é obrigatória") + msg = "Matéria é obrigatória" else: - raise ValueError("Documento é obrigatório") + msg = "Documento é obrigatório" + raise ValueError(msg) # FIXME i18n - casa_nome = (casa_legislativa.nome + ' de ' + - casa_legislativa.municipio + '-' + - casa_legislativa.uf) + casa_nome = ("{} de {} - {}".format(casa_legislativa.nome, + casa_legislativa.municipio, + casa_legislativa.uf)) if tipo == "materia": doc_mat_url = reverse('sapl.materia:materialegislativa_detail', @@ -84,14 +85,12 @@ def criar_email_confirmacao(base_url, casa_legislativa, tipo, doc_mat, hash_txt= confirmacao_url = reverse('sapl.materia:acompanhar_confirmar', kwargs={'pk': doc_mat.id}) ementa = doc_mat.ementa - autores = [] - for autoria in doc_mat.autoria_set.all(): - autores.append(autoria.autor.nome) + autores = [autoria.autor.nome for autoria in doc_mat.autoria_set.all()] else: doc_mat_url = reverse('sapl.protocoloadm:documentoadministrativo_detail', - kwargs={'pk': documento.id}) + kwargs={'pk': doc_mat.id}) confirmacao_url = reverse('sapl.protocoloadm:acompanhar_confirmar', - kwargs={'pk': documento.id}) + kwargs={'pk': doc_mat.id}) ementa = doc_mat.assunto autores = "" @@ -119,16 +118,17 @@ def do_envia_email_confirmacao(base_url, casa, tipo, doc_mat, destinatario): sender = EMAIL_SEND_USER # FIXME i18n if tipo == "materia": - msg = " - Ative o Acompanhamento da Materia" + msg = " - Ative o Acompanhamento da Matéria" else: msg = " - Ative o Acompanhamento de Documento" - subject = "[SAPL] " + str(doc_mat) + msg + subject = "[SAPL] {} {}".format(str(doc_mat), msg) messages = [] recipients = [] email_texts = criar_email_confirmacao(base_url, casa, doc_mat, + tipo, destinatario.hash,) recipients.append(destinatario.email) messages.append({ @@ -149,14 +149,15 @@ def criar_email_tramitacao(base_url, casa_legislativa, tipo, doc_mat, status, if not doc_mat: if tipo == "materia": - raise ValueError("Matéria é obrigatória") + msg = "Matéria é obrigatória" else: - raise ValueError("Documento é obrigatório") + msg = "Documento é obrigatório" + raise ValueError(msg) # FIXME i18n - casa_nome = (casa_legislativa.nome + ' de ' + - casa_legislativa.municipio + '-' + - casa_legislativa.uf) + casa_nome = ("{} de {} - {}".format(casa_legislativa.nome, + casa_legislativa.municipio, + casa_legislativa.uf)) if tipo == "materia": doc_mat_url = reverse('sapl.materia:tramitacao_list', kwargs={'pk': doc_mat.id}) @@ -164,19 +165,17 @@ def criar_email_tramitacao(base_url, casa_legislativa, tipo, doc_mat, status, kwargs={'pk': doc_mat.id}) ementa = doc_mat.ementa - autores = [] - for autoria in doc_mat.autoria_set.all(): - autores.append(autoria.autor.nome) + autores = [autoria.autor.nome for autoria in doc_mat.autoria_set.all()] + tramitacao = doc_mat.tramitacao_set.last() + else: - doc_mat_url = reverse('sapl.protocoloadm:tramitacao_list', + doc_mat_url = reverse('sapl.protocoloadm:tramitacaoadministrativo_list', kwargs={'pk': doc_mat.id}) url_excluir = reverse('sapl.protocoloadm:acompanhar_excluir', kwargs={'pk': doc_mat.id}) autores = "" ementa = doc_mat.assunto - - - tramitacao = doc_mat.tramitacao_set.last() + tramitacao = doc_mat.tramitacaoadministrativo_set.last() templates = load_email_templates(['email/tramitacao.txt', 'email/tramitacao.html'], @@ -216,12 +215,10 @@ def do_envia_email_tramitacao(base_url, tipo, doc_mat, status, unidade_destino): sender = EMAIL_SEND_USER # FIXME i18nn if tipo == "materia": - msg = " - Acompanhamento de Materia Legislativa" + msg = " - Acompanhamento de Matéria Legislativa" else: msg = " - Acompanhamento de Documento" - - subject = "[SAPL] " + str(doc_mat) + \ - msg + subject = "[SAPL] {} {}".format(str(doc_mat), msg) connection = get_connection() connection.open() @@ -234,7 +231,7 @@ def do_envia_email_tramitacao(base_url, tipo, doc_mat, status, unidade_destino): doc_mat, status, unidade_destino, - destinatario.hash,) + destinatario.hash) email = EmailMultiAlternatives( subject, diff --git a/sapl/base/receivers.py b/sapl/base/receivers.py new file mode 100644 index 000000000..b2176be14 --- /dev/null +++ b/sapl/base/receivers.py @@ -0,0 +1,42 @@ +from django.db.models.signals import post_delete, post_save +from django.dispatch import receiver + +from sapl.materia.models import Tramitacao +from sapl.protocoloadm.models import TramitacaoAdministrativo +from sapl.base.signals import tramitacao_signal +from sapl.utils import get_base_url + +from sapl.base.email_utils import do_envia_email_tramitacao + + +@receiver(tramitacao_signal) +def handle_tramitacao_signal(sender, **kwargs): + tramitacao = kwargs.get("post") + request = kwargs.get("request") + if 'protocoloadm' in str(sender): + doc_mat = tramitacao.documento + tipo = "documento" + elif 'materia' in str(sender): + tipo = "materia" + doc_mat = tramitacao.materia + + do_envia_email_tramitacao( + get_base_url(request), + tipo, + doc_mat, + tramitacao.status, + tramitacao.unidade_tramitacao_destino) + + +@receiver(post_delete) +def status_tramitacao_materia(sender, instance, **kwargs): + if isinstance(sender, TramitacaoAdministrativo): + if instance.status.indicador == 'F': + materia = instance.materia + materia.em_tramitacao = True + materia.save() + elif isinstance(sender, TramitacaoAdministrativo): + if instance.status.indicador == 'F': + documento = instance.documento + documento.tramitacao = True + documento.save() diff --git a/sapl/materia/signals.py b/sapl/base/signals.py similarity index 100% rename from sapl/materia/signals.py rename to sapl/base/signals.py diff --git a/sapl/materia/apps.py b/sapl/materia/apps.py index bb4f72f73..2cc3559ae 100644 --- a/sapl/materia/apps.py +++ b/sapl/materia/apps.py @@ -8,4 +8,4 @@ class AppConfig(apps.AppConfig): verbose_name = _('Matéria') def ready(self): - from . import receivers + from sapl.base import receivers diff --git a/sapl/materia/receivers.py b/sapl/materia/receivers.py deleted file mode 100644 index 260f22bdb..000000000 --- a/sapl/materia/receivers.py +++ /dev/null @@ -1,30 +0,0 @@ -from django.db.models.signals import post_delete, post_save -from django.dispatch import receiver - -from sapl.materia.models import Tramitacao -from .signals import tramitacao_signal -from sapl.utils import get_base_url - -from sapl.base.email_utils import do_envia_email_tramitacao - - -@receiver(tramitacao_signal) -def handle_tramitacao_signal(sender, **kwargs): - tramitacao = kwargs.get("post") - request = kwargs.get("request") - materia = tramitacao.materia - - do_envia_email_tramitacao( - get_base_url(request), - "materia", - materia, - tramitacao.status, - tramitacao.unidade_tramitacao_destino) - - -@receiver(post_delete, sender=Tramitacao) -def status_tramitacao_materia(sender, instance, **kwargs): - if instance.status.indicador == 'F': - materia = instance.materia - materia.em_tramitacao = True - materia.save() diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 7cba34991..767726a97 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -65,7 +65,7 @@ from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria, RegimeTramitacao, Relatoria, StatusTramitacao, TipoDocumento, TipoFimRelatoria, TipoMateriaLegislativa, TipoProposicao, Tramitacao, UnidadeTramitacao) -from .signals import tramitacao_signal +from sapl.base.signals import tramitacao_signal AssuntoMateriaCrud = CrudAux.build(AssuntoMateria, 'assunto_materia') diff --git a/sapl/protocoloadm/apps.py b/sapl/protocoloadm/apps.py index 8697e58d9..98e28ea36 100644 --- a/sapl/protocoloadm/apps.py +++ b/sapl/protocoloadm/apps.py @@ -6,3 +6,6 @@ class AppConfig(apps.AppConfig): name = 'sapl.protocoloadm' label = 'protocoloadm' verbose_name = _('Protocolo Administrativo') + + def ready(self): + from sapl.base import receivers diff --git a/sapl/protocoloadm/receivers.py b/sapl/protocoloadm/receivers.py deleted file mode 100644 index 298bfcd99..000000000 --- a/sapl/protocoloadm/receivers.py +++ /dev/null @@ -1,30 +0,0 @@ -from django.db.models.signals import post_delete, post_save -from django.dispatch import receiver - -from .models import TramitacaoAdministrativo -from .signals import tramitacao_signal -from sapl.utils import get_base_url - -from sapl.base.email_utils import do_envia_email_tramitacao - - -@receiver(tramitacao_signal) -def handle_tramitacao_signal(sender, **kwargs): - tramitacao = kwargs.get("post") - request = kwargs.get("request") - documento = tramitacao.documento - - do_envia_email_tramitacao( - get_base_url(request), - tipo == "documento", - documento, - tramitacao.status, - tramitacao.unidade_tramitacao_destino) - - -@receiver(post_delete, sender=TramitacaoAdministrativo) -def status_tramitacao_documento(sender, instance, **kwargs): - if instance.status.indicador == 'F': - documento = instance.documento - documento.tramitacao = True - documento.save() diff --git a/sapl/protocoloadm/signals.py b/sapl/protocoloadm/signals.py deleted file mode 100644 index 3381ff3a6..000000000 --- a/sapl/protocoloadm/signals.py +++ /dev/null @@ -1,3 +0,0 @@ -import django.dispatch - -tramitacao_signal = django.dispatch.Signal(providing_args=['post', 'request']) diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index ee604efcb..67ea62d5d 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -43,7 +43,7 @@ from .forms import (AcompanhamentoDocumentoForm, AnularProcoloAdmForm, from .models import (AcompanhamentoDocumento, DocumentoAcessorioAdministrativo, DocumentoAdministrativo, StatusTramitacaoAdministrativo, TipoDocumentoAdministrativo, TramitacaoAdministrativo) -from .signals import tramitacao_signal +from sapl.base.signals import tramitacao_signal TipoDocumentoAdministrativoCrud = CrudAux.build( @@ -842,6 +842,20 @@ class TramitacaoAdmCrud(MasterDetailCrud): class UpdateView(MasterDetailCrud.UpdateView): form_class = TramitacaoAdmEditForm + def form_valid(self, form): + self.object = form.save() + try: + tramitacao_signal.send(sender=TramitacaoAdministrativo, + post=self.object, + request=self.request) + except Exception as e: + # TODO log error + msg = _('Tramitação criada, mas e-mail de acompanhamento ' + 'de documento não enviado. A não configuração do' + ' servidor de e-mail impede o envio de aviso de tramitação') + messages.add_message(self.request, messages.WARNING, msg) + return HttpResponseRedirect(self.get_success_url()) + return super().form_valid(form) class ListView(DocumentoAdministrativoMixin, MasterDetailCrud.ListView):