diff --git a/sapl/materia/email_utils.py b/sapl/base/email_utils.py similarity index 60% rename from sapl/materia/email_utils.py rename to sapl/base/email_utils.py index 3dc6b220d..422e6b652 100644 --- a/sapl/materia/email_utils.py +++ b/sapl/base/email_utils.py @@ -8,7 +8,8 @@ from django.utils import timezone from sapl.base.models import CasaLegislativa from sapl.settings import EMAIL_SEND_USER -from .models import AcompanhamentoMateria +from sapl.materia.models import AcompanhamentoMateria +from sapl.protocoloadm.models import AcompanhamentoDocumento def load_email_templates(templates, context={}): @@ -61,56 +62,73 @@ def enviar_emails(sender, recipients, messages): fail_silently=False) -def criar_email_confirmacao(base_url, casa_legislativa, materia, hash_txt=''): +def criar_email_confirmacao(base_url, casa_legislativa, tipo, doc_mat, hash_txt=''): if not casa_legislativa: raise ValueError("Casa Legislativa é obrigatória") - if not materia: - raise ValueError("Matéria é obrigatória") + if not doc_mat: + if tipo == "materia": + raise ValueError("Matéria é obrigatória") + else: + raise ValueError("Documento é obrigatório") # FIXME i18n casa_nome = (casa_legislativa.nome + ' de ' + casa_legislativa.municipio + '-' + casa_legislativa.uf) - materia_url = reverse('sapl.materia:materialegislativa_detail', - kwargs={'pk': materia.id}) - confirmacao_url = reverse('sapl.materia:acompanhar_confirmar', - kwargs={'pk': materia.id}) + if tipo == "materia": + doc_mat_url = reverse('sapl.materia:materialegislativa_detail', + kwargs={'pk': doc_mat.id}) + 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) + else: + doc_mat_url = reverse('sapl.protocoloadm:documentoadministrativo_detail', + kwargs={'pk': documento.id}) + confirmacao_url = reverse('sapl.protocoloadm:acompanhar_confirmar', + kwargs={'pk': documento.id}) + ementa = doc_mat.assunto + autores = "" + - autores = [] - for autoria in materia.autoria_set.all(): - autores.append(autoria.autor.nome) templates = load_email_templates(['email/acompanhar.txt', 'email/acompanhar.html'], {"casa_legislativa": casa_nome, "logotipo": casa_legislativa.logotipo, - "descricao_materia": materia.ementa, + "descricao_materia": ementa, "autoria": autores, "hash_txt": hash_txt, "base_url": base_url, - "materia": str(materia), - "materia_url": materia_url, + "materia": str(doc_mat), + "materia_url": doc_mat_url, "confirmacao_url": confirmacao_url, }) return templates -def do_envia_email_confirmacao(base_url, casa, materia, destinatario): +def do_envia_email_confirmacao(base_url, casa, tipo, doc_mat, destinatario): # # Envia email de confirmacao para atualizações de tramitação # sender = EMAIL_SEND_USER # FIXME i18n - subject = "[SAPL] " + str(materia) + " - Ative o Acompanhamento da Materia" + if tipo == "materia": + msg = " - Ative o Acompanhamento da Materia" + else: + msg = " - Ative o Acompanhamento de Documento" + subject = "[SAPL] " + str(doc_mat) + msg messages = [] recipients = [] email_texts = criar_email_confirmacao(base_url, casa, - materia, + doc_mat, destinatario.hash,) recipients.append(destinatario.email) messages.append({ @@ -123,30 +141,42 @@ def do_envia_email_confirmacao(base_url, casa, materia, destinatario): enviar_emails(sender, recipients, messages) -def criar_email_tramitacao(base_url, casa_legislativa, materia, status, +def criar_email_tramitacao(base_url, casa_legislativa, tipo, doc_mat, status, unidade_destino, hash_txt=''): if not casa_legislativa: raise ValueError("Casa Legislativa é obrigatória") - if not materia: - raise ValueError("Matéria é obrigatória") + if not doc_mat: + if tipo == "materia": + raise ValueError("Matéria é obrigatória") + else: + raise ValueError("Documento é obrigatório") # FIXME i18n casa_nome = (casa_legislativa.nome + ' de ' + casa_legislativa.municipio + '-' + casa_legislativa.uf) + if tipo == "materia": + doc_mat_url = reverse('sapl.materia:tramitacao_list', + kwargs={'pk': doc_mat.id}) + url_excluir = reverse('sapl.materia:acompanhar_excluir', + kwargs={'pk': doc_mat.id}) + + ementa = doc_mat.ementa + autores = [] + for autoria in doc_mat.autoria_set.all(): + autores.append(autoria.autor.nome) + else: + doc_mat_url = reverse('sapl.protocoloadm:tramitacao_list', + kwargs={'pk': doc_mat.id}) + url_excluir = reverse('sapl.protocoloadm:acompanhar_excluir', + kwargs={'pk': doc_mat.id}) + autores = "" + ementa = doc_mat.assunto - 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) - tramitacao = materia.tramitacao_set.last() + tramitacao = doc_mat.tramitacao_set.last() templates = load_email_templates(['email/tramitacao.txt', 'email/tramitacao.html'], @@ -154,34 +184,45 @@ def criar_email_tramitacao(base_url, casa_legislativa, materia, status, "data_registro": dt.strftime( timezone.now(), "%d/%m/%Y"), - "cod_materia": materia.id, + "cod_materia": doc_mat.id, "logotipo": casa_legislativa.logotipo, - "descricao_materia": materia.ementa, + "descricao_materia": ementa, "autoria": autores, "data": tramitacao.data_tramitacao, "status": status, "localizacao": unidade_destino, "texto_acao": tramitacao.texto, "hash_txt": hash_txt, - "materia": str(materia), + "materia": str(doc_mat), "base_url": base_url, - "materia_url": url_materia, + "materia_url": doc_mat_url, "excluir_url": url_excluir}) return templates -def do_envia_email_tramitacao(base_url, materia, status, unidade_destino): +def do_envia_email_tramitacao(base_url, tipo, doc_mat, status, unidade_destino): # # Envia email de tramitacao para usuarios cadastrados # - destinatarios = AcompanhamentoMateria.objects.filter(materia=materia, - confirmado=True) + import ipdb; ipdb.set_trace() + if tipo == "materia": + destinatarios = AcompanhamentoMateria.objects.filter(materia=doc_mat, + confirmado=True) + else: + destinatarios = AcompanhamentoDocumento.objects.filter(documento=doc_mat, + confirmado=True) + casa = CasaLegislativa.objects.first() sender = EMAIL_SEND_USER - # FIXME i18n - subject = "[SAPL] " + str(materia) + \ - " - Acompanhamento de Materia Legislativa" + # FIXME i18nn + if tipo == "materia": + msg = " - Acompanhamento de Materia Legislativa" + else: + msg = " - Acompanhamento de Documento" + + subject = "[SAPL] " + str(doc_mat) + \ + msg connection = get_connection() connection.open() @@ -190,7 +231,8 @@ def do_envia_email_tramitacao(base_url, materia, status, unidade_destino): try: email_texts = criar_email_tramitacao(base_url, casa, - materia, + tipo, + doc_mat, status, unidade_destino, destinatario.hash,) diff --git a/sapl/materia/receivers.py b/sapl/materia/receivers.py index 945c6636e..260f22bdb 100644 --- a/sapl/materia/receivers.py +++ b/sapl/materia/receivers.py @@ -2,10 +2,10 @@ from django.db.models.signals import post_delete, post_save from django.dispatch import receiver from sapl.materia.models import Tramitacao -from sapl.materia.signals import tramitacao_signal +from .signals import tramitacao_signal from sapl.utils import get_base_url -from .email_utils import do_envia_email_tramitacao +from sapl.base.email_utils import do_envia_email_tramitacao @receiver(tramitacao_signal) @@ -16,6 +16,7 @@ def handle_tramitacao_signal(sender, **kwargs): do_envia_email_tramitacao( get_base_url(request), + "materia", materia, tramitacao.status, tramitacao.unidade_tramitacao_destino) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 480a22a59..7cba34991 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -46,7 +46,7 @@ from sapl.utils import (YES_NO_CHOICES, autor_label, autor_modal, get_mime_type_from_file_extension, montar_row_autor, show_results_filter_set) -from .email_utils import do_envia_email_confirmacao +from sapl.base.email_utils import do_envia_email_confirmacao from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, AdicionarVariasAutoriasFilterSet, DespachoInicialForm, DocumentoAcessorioForm, EtiquetaPesquisaForm, @@ -1683,6 +1683,7 @@ class AcompanhamentoMateriaView(CreateView): do_envia_email_confirmacao(base_url, casa, + "materia", materia, destinatario) diff --git a/sapl/protocoloadm/email_utils.py b/sapl/protocoloadm/email_utils.py deleted file mode 100644 index 84ea352b0..000000000 --- a/sapl/protocoloadm/email_utils.py +++ /dev/null @@ -1,205 +0,0 @@ -from datetime import datetime as dt - -from django.core.mail import EmailMultiAlternatives, get_connection, send_mail -from django.core.urlresolvers import reverse -from django.template import Context, loader -from django.utils import timezone - -from sapl.base.models import CasaLegislativa -from sapl.settings import EMAIL_SEND_USER - -from .models import AcompanhamentoDocumento - - -def load_email_templates(templates, context={}): - - emails = [] - for t in templates: - tpl = loader.get_template(t) - email = tpl.render(Context(context)) - if t.endswith(".html"): - email = email.replace('\n', '').replace('\r', '') - emails.append(email) - return emails - - -def enviar_emails(sender, recipients, messages): - ''' - Recipients is a string list of email addresses - - Messages is an array of dicts of the form: - {'recipient': 'address', # useless???? - 'subject': 'subject text', - 'txt_message': 'text message', - 'html_message': 'html message' - } - ''' - - if len(messages) == 1: - # sends an email simultaneously to all recipients - send_mail(messages[0]['subject'], - messages[0]['txt_message'], - sender, - recipients, - html_message=messages[0]['html_message'], - fail_silently=False) - - elif len(recipients) > len(messages): - raise ValueError("Message list should have size 1 \ - or equal recipient list size. \ - recipients: %s, messages: %s" % (recipients, messages) - ) - - else: - # sends an email simultaneously to all reciepients - for (d, m) in zip(recipients, messages): - send_mail(m['subject'], - m['txt_message'], - sender, - [d], - html_message=m['html_message'], - fail_silently=False) - - -def criar_email_confirmacao(base_url, casa_legislativa, documento, hash_txt=''): - - if not casa_legislativa: - raise ValueError("Casa Legislativa é obrigatória") - - if not documento: - raise ValueError("Documento é obrigatório") - - # FIXME i18n - casa_nome = (casa_legislativa.nome + ' de ' + - casa_legislativa.municipio + '-' + - casa_legislativa.uf) - - documento_url = reverse('sapl.protocoloadm:documentoadministrativo_detail', - kwargs={'pk': documento.id}) - confirmacao_url = reverse('sapl.protocoloadm:acompanhar_confirmar', - kwargs={'pk': documento.id}) - - - templates = load_email_templates(['email/acompanhar.txt', - 'email/acompanhar.html'], - {"casa_legislativa": casa_nome, - "logotipo": casa_legislativa.logotipo, - "descricao_documento": documento.assunto, - "hash_txt": hash_txt, - "base_url": base_url, - "documento": str(documento), - "documento_url": documento_url, - "confirmacao_url": confirmacao_url, }) - return templates - - -def do_envia_email_confirmacao(base_url, casa, documento, destinatario): - # - # Envia email de confirmacao para atualizações de tramitação - # - - sender = EMAIL_SEND_USER - # FIXME i18n - subject = "[SAPL] " + str(documento) + " - Ative o Acompanhamento do Documento" - messages = [] - recipients = [] - - email_texts = criar_email_confirmacao(base_url, - casa, - documento, - destinatario.hash,) - recipients.append(destinatario.email) - messages.append({ - 'recipient': destinatario.email, - 'subject': subject, - 'txt_message': email_texts[0], - 'html_message': email_texts[1] - }) - - enviar_emails(sender, recipients, messages) - - -def criar_email_tramitacao(base_url, casa_legislativa, documento, status, - unidade_destino, hash_txt=''): - - if not casa_legislativa: - raise ValueError("Casa Legislativa é obrigatória") - - if not documento: - raise ValueError("Documento é obrigatória") - - # FIXME i18n - casa_nome = (casa_legislativa.nome + ' de ' + - casa_legislativa.municipio + '-' + - casa_legislativa.uf) - - url_documento = reverse('sapl.documento:tramitacao_list', - kwargs={'pk': documento.id}) - url_excluir = reverse('sapl.documento:acompanhar_excluir', - kwargs={'pk': documento.id}) - - tramitacao = documento.tramitacao_set.last() - - templates = load_email_templates(['email/tramitacao.txt', - 'email/tramitacao.html'], - {"casa_legislativa": casa_nome, - "data_registro": dt.strftime( - timezone.now(), - "%d/%m/%Y"), - "cod_documento": documento.id, - "logotipo": casa_legislativa.logotipo, - "descricao_documento": documento.assunto, - "data": tramitacao.data_tramitacao, - "status": status, - "localizacao": unidade_destino, - "texto_acao": tramitacao.texto, - "hash_txt": hash_txt, - "documento": str(documento), - "base_url": base_url, - "documento_url": url_documento, - "excluir_url": url_excluir}) - return templates - - -def do_envia_email_tramitacao(base_url, documento, status, unidade_destino): - # - # Envia email de tramitacao para usuarios cadastrados - # - destinatarios = AcompanhamentoDocumento.objects.filter(documento=documento, - confirmado=True) - casa = CasaLegislativa.objects.first() - - sender = EMAIL_SEND_USER - # FIXME i18n - subject = "[SAPL] " + str(documento) + \ - " - Acompanhamento de Documento Administrativo" - - connection = get_connection() - connection.open() - - for destinatario in destinatarios: - try: - email_texts = criar_email_tramitacao(base_url, - casa, - documento, - status, - unidade_destino, - destinatario.hash,) - - email = EmailMultiAlternatives( - subject, - email_texts[0], - sender, - [destinatario.email], - connection=connection) - email.attach_alternative(email_texts[1], "text/html") - email.send() - - # Garantia de que, mesmo com o lançamento de qualquer exceção, - # a conexão será fechada - except Exception: - connection.close() - raise Exception( - 'Erro ao enviar e-mail de acompanhamento de documento.') - - connection.close() diff --git a/sapl/protocoloadm/migrations/0008_acompanhamentodocumento.py b/sapl/protocoloadm/migrations/0008_acompanhamentodocumento.py index cd71df05c..dcc25ed45 100644 --- a/sapl/protocoloadm/migrations/0008_acompanhamentodocumento.py +++ b/sapl/protocoloadm/migrations/0008_acompanhamentodocumento.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.13 on 2018-09-25 15:31 +# Generated by Django 1.9.13 on 2018-09-27 15:24 from __future__ import unicode_literals from django.db import migrations, models diff --git a/sapl/protocoloadm/receivers.py b/sapl/protocoloadm/receivers.py index d0995e30b..e1ea01757 100644 --- a/sapl/protocoloadm/receivers.py +++ b/sapl/protocoloadm/receivers.py @@ -5,10 +5,11 @@ from .models import TramitacaoAdministrativo from .signals import tramitacao_signal from sapl.utils import get_base_url -from .email_utils import do_envia_email_tramitacao +from sapl.base.email_utils import do_envia_email_tramitacao @receiver(tramitacao_signal) +import ipdb; ipdb.set_trace() def handle_tramitacao_signal(sender, **kwargs): tramitacao = kwargs.get("post") request = kwargs.get("request") @@ -16,12 +17,13 @@ def handle_tramitacao_signal(sender, **kwargs): do_envia_email_tramitacao( get_base_url(request), + tipo == "documento", documento, tramitacao.status, tramitacao.unidade_tramitacao_destino) -@receiver(post_delete, sender=Tramitacao) +@receiver(post_delete, sender=TramitacaoAdministrativo) def status_tramitacao_documento(sender, instance, **kwargs): if instance.status.indicador == 'F': documento = instance.documento diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index be437675f..ee604efcb 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -30,7 +30,7 @@ from sapl.protocoloadm.models import Protocolo from sapl.utils import (create_barcode, get_base_url, get_client_ip, get_mime_type_from_file_extension, show_results_filter_set) -from .email_utils import do_envia_email_confirmacao +from sapl.base.email_utils import do_envia_email_confirmacao from .forms import (AcompanhamentoDocumentoForm, AnularProcoloAdmForm, DocumentoAcessorioAdministrativoForm, DocumentoAdministrativoFilterSet, @@ -45,6 +45,7 @@ from .models import (AcompanhamentoDocumento, DocumentoAcessorioAdministrativo, TipoDocumentoAdministrativo, TramitacaoAdministrativo) from .signals import tramitacao_signal + TipoDocumentoAdministrativoCrud = CrudAux.build( TipoDocumentoAdministrativo, '') @@ -196,6 +197,7 @@ class AcompanhamentoDocumentoView(CreateView): do_envia_email_confirmacao(base_url, casa, + "documento", documento, destinatario) @@ -826,7 +828,7 @@ class TramitacaoAdmCrud(MasterDetailCrud): self.object = form.save() try: - tramitacao_signal.send(sender=Tramitacao, + tramitacao_signal.send(sender=TramitacaoAdministrativo, post=self.object, request=self.request) except Exception as e: diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index bba114149..813a125d8 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -299,6 +299,7 @@ rules_group_anonymous = { 'group': SAPL_GROUP_ANONYMOUS, 'rules': [ (materia.AcompanhamentoMateria, [RP_ADD, RP_DELETE]), + (protocoloadm.AcompanhamentoDocumento, [RP_ADD, RP_DELETE]), ] } diff --git a/sapl/rules/tests/test_rules.py b/sapl/rules/tests/test_rules.py index 07302bae5..e1ed7f7e4 100644 --- a/sapl/rules/tests/test_rules.py +++ b/sapl/rules/tests/test_rules.py @@ -11,6 +11,7 @@ from sapl.compilacao.models import (PerfilEstruturalTextoArticulado, TipoDispositivo, TipoDispositivoRelationship) from sapl.materia.models import AcompanhamentoMateria +from sapl.protocoloadm.models import AcompanhamentoDocumento from sapl.rules import SAPL_GROUPS, map_rules from sapl.test_urls import create_perms_post_migrate from scripts.lista_permissions_in_decorators import \ @@ -61,6 +62,7 @@ __fp__in__test_permission_of_models_in_rules_patterns = { PerfilEstruturalTextoArticulado], map_rules.RP_CHANGE: [AcompanhamentoMateria, + AcompanhamentoDocumento, TipoDispositivo, TipoDispositivoRelationship, PerfilEstruturalTextoArticulado], @@ -71,11 +73,13 @@ __fp__in__test_permission_of_models_in_rules_patterns = { PerfilEstruturalTextoArticulado], map_rules.RP_LIST: [AcompanhamentoMateria, + AcompanhamentoDocumento, TipoDispositivo, TipoDispositivoRelationship, PerfilEstruturalTextoArticulado], map_rules.RP_DETAIL: [AcompanhamentoMateria, + AcompanhamentoDocumento, TipoDispositivo, TipoDispositivoRelationship, PerfilEstruturalTextoArticulado]