mirror of https://github.com/interlegis/sapl.git
10 changed files with 510 additions and 11 deletions
@ -0,0 +1,205 @@ |
|||
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() |
|||
@ -0,0 +1,32 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Generated by Django 1.9.13 on 2018-09-25 15:31 |
|||
from __future__ import unicode_literals |
|||
|
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('protocoloadm', '0007_auto_20180924_1724'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.CreateModel( |
|||
name='AcompanhamentoDocumento', |
|||
fields=[ |
|||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('usuario', models.CharField(max_length=50)), |
|||
('email', models.EmailField(max_length=100, verbose_name='E-mail')), |
|||
('data_cadastro', models.DateField(auto_now_add=True)), |
|||
('hash', models.CharField(max_length=8)), |
|||
('confirmado', models.BooleanField(default=False)), |
|||
('documento', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='protocoloadm.DocumentoAdministrativo')), |
|||
], |
|||
options={ |
|||
'verbose_name_plural': 'Acompanhamentos de Documento', |
|||
'verbose_name': 'Acompanhamento de Documento', |
|||
}, |
|||
), |
|||
] |
|||
@ -0,0 +1,25 @@ |
|||
{% load i18n %} |
|||
{% load static %} |
|||
<html><head></head><body bgcolor='#ffffff'> |
|||
|
|||
<h2 align='center'><b>{{casa_legislativa}}</b> |
|||
<br/> |
|||
Sistema de Apoio ao Processo Legislativo |
|||
</h2> |
|||
|
|||
<p>Registramos seu pedido para acompanhamento por e-mail do documento administrativo identificado a seguir:</p> |
|||
<a href="{{base_url}}{{documento_url}}">{{documento}}<b> - {{descricao_documento}}</b></a><br/> |
|||
{{assunto}}<br/> |
|||
</h4> |
|||
<p></p> |
|||
<p>Para garantia de sua privacidade, solicitamos que ative o recebimento das futuras mensagens clicando no link:</p> |
|||
|
|||
<h4> |
|||
<a href="{{base_url}}{{confirmacao_url}}?hash_txt={{hash_txt}}">{{base_url}}{{confirmacao_url}}?hash_txt={{hash_txt}}</a> |
|||
</h4> |
|||
<br/> |
|||
<hr> |
|||
<p>Caso não tenha realizado o cadastramento em nosso sistema, favor desconsiderar a presente mensagem<br/> |
|||
Esta é uma mensagem automática. Por favor, não responda.</p> |
|||
</body> |
|||
</html> |
|||
@ -0,0 +1,16 @@ |
|||
{{casa_legislativa}} |
|||
|
|||
Sistema de Apoio ao Processo Legislativo |
|||
|
|||
>Registramos seu pedido para acompanhamento por e-mail do documento administrativo identificad a seguir: |
|||
|
|||
{{base_url}}{{documento_url}} - {{documento}} - {{descricao_documento}} |
|||
|
|||
{{assunto}} |
|||
|
|||
Para garantia de sua privacidade, solicitamos que ative o recebimento das futuras mensagens acessando no link: |
|||
|
|||
{{base_url}}{{url_confirmar}}?hash_txt={{hash_txt}} |
|||
|
|||
Caso não tenha realizado o cadastramento em nosso sistema, favor desconsiderar a presente mensagem |
|||
Esta é uma mensagem automática. Por favor, não responda. |
|||
@ -0,0 +1,21 @@ |
|||
{% extends "crud/detail.html" %} |
|||
{% load i18n %} |
|||
{% load crispy_forms_tags %} |
|||
{% block actions %} {% endblock %} |
|||
{% block detail_content %} |
|||
|
|||
<h1>Acompanhamento de Documento</h1> |
|||
<hr> |
|||
<div class="row"> |
|||
<div class="col-md-4"><b>Tipo:</b> {{documento.tipo.sigla}} - {{documento.tipo.descricao}}</div> |
|||
<div class="col-md-4"><b>Número:</b> {{documento.numero}}</div> |
|||
<div class="col-md-4"><b>Ano:</b> {{documento.ano}}</div> |
|||
|
|||
</div> |
|||
<div class="row"> |
|||
<div class="col-md-12"><b>Assunto:</b> {{documento.assunto|safe}}</div> |
|||
</div> |
|||
|
|||
{% if error %} <h5 align="center"><font color="#FF0000">{{ error }}</font></h5> {% endif %} |
|||
{% crispy form %} |
|||
{% endblock %} |
|||
Loading…
Reference in new issue