Browse Source

Fix duplicate email_utils

pull/2257/head
tapumar@gmail.com 7 years ago
parent
commit
42b00a36df
  1. 106
      sapl/base/email_utils.py
  2. 5
      sapl/materia/receivers.py
  3. 3
      sapl/materia/views.py
  4. 205
      sapl/protocoloadm/email_utils.py
  5. 2
      sapl/protocoloadm/migrations/0008_acompanhamentodocumento.py
  6. 6
      sapl/protocoloadm/receivers.py
  7. 6
      sapl/protocoloadm/views.py
  8. 1
      sapl/rules/map_rules.py
  9. 4
      sapl/rules/tests/test_rules.py

106
sapl/materia/email_utils.py → 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:
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})
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': materia.id})
kwargs={'pk': doc_mat.id})
ementa = doc_mat.ementa
autores = []
for autoria in materia.autoria_set.all():
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 = ""
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:
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)
url_materia = reverse('sapl.materia:tramitacao_list',
kwargs={'pk': materia.id})
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': materia.id})
kwargs={'pk': doc_mat.id})
ementa = doc_mat.ementa
autores = []
for autoria in materia.autoria_set.all():
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
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,
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,)

5
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)

3
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)

205
sapl/protocoloadm/email_utils.py

@ -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()

2
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

6
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

6
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:

1
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]),
]
}

4
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]

Loading…
Cancel
Save