From a7fe1bb37d9f0e67946af889c88782aa67e750d7 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Fri, 20 May 2016 12:54:23 -0300 Subject: [PATCH] Fix #395 enviar email com tramitacao (#479) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Transfere código de envio de email para sapl.utils * Adiciona o envio de email ao cadastrar nova tramitacção * Remove breakpoint * Adiciona o envio de email ao editar uma tramitação --- materia/views.py | 295 +++++++++++++++++++++-------------------- parlamentares/forms.py | 4 +- parlamentares/views.py | 2 - protocoloadm/views.py | 2 +- 4 files changed, 155 insertions(+), 148 deletions(-) diff --git a/materia/views.py b/materia/views.py index 167088b25..cbbf3ec73 100644 --- a/materia/views.py +++ b/materia/views.py @@ -24,7 +24,6 @@ from crispy_layout_mixin import form_actions from crud.base import Crud, make_pagination from crud.masterdetail import MasterDetailCrud from norma.models import LegislacaoCitada -from sapl.utils import get_base_url from .forms import (AcompanhamentoMateriaForm, AnexadaForm, AutoriaForm, DespachoInicialForm, DocumentoAcessorioForm, @@ -155,9 +154,19 @@ class TramitacaoCrud(MasterDetailCrud): class CreateView(MasterDetailCrud.CreateView): form_class = TramitacaoForm + def post(self, request, *args, **kwargs): + materia = MateriaLegislativa.objects.get(id=kwargs['pk']) + do_envia_email_tramitacao(request, materia) + return super(CreateView, self).post(request, *args, **kwargs) + class UpdateView(MasterDetailCrud.UpdateView): form_class = TramitacaoForm + def post(self, request, *args, **kwargs): + materia = MateriaLegislativa.objects.get(id=kwargs['pk']) + do_envia_email_tramitacao(request, materia) + return super(UpdateView, self).post(request, *args, **kwargs) + class ListView(MasterDetailCrud.ListView): def get_queryset(self): @@ -423,6 +432,148 @@ class AcompanhamentoExcluirView(TemplateView): return HttpResponseRedirect(self.get_redirect_url()) +class MateriaLegislativaPesquisaView(FilterView): + model = MateriaLegislativa + filterset_class = MateriaLegislativaFilterSet + paginate_by = 10 + + def get_filterset_kwargs(self, filterset_class): + super(MateriaLegislativaPesquisaView, + self).get_filterset_kwargs(filterset_class) + + kwargs = {'data': self.request.GET or None} + + status_tramitacao = self.request.GET.get('tramitacao__status') + unidade_destino = self.request.GET.get( + 'tramitacao__unidade_tramitacao_destino') + + qs = self.get_queryset() + + if status_tramitacao and unidade_destino: + lista = filtra_tramitacao_destino_and_status(status_tramitacao, + unidade_destino) + qs = qs.filter(id__in=lista).distinct() + + elif status_tramitacao: + lista = filtra_tramitacao_status(status_tramitacao) + qs = qs.filter(id__in=lista).distinct() + + elif unidade_destino: + lista = filtra_tramitacao_destino(unidade_destino) + qs = qs.filter(id__in=lista).distinct() + + kwargs.update({ + 'queryset': qs, + }) + return kwargs + + def get_context_data(self, **kwargs): + context = super(MateriaLegislativaPesquisaView, + self).get_context_data(**kwargs) + + paginator = context['paginator'] + page_obj = context['page_obj'] + + context['page_range'] = make_pagination( + page_obj.number, paginator.num_pages) + + return context + + def get(self, request, *args, **kwargs): + super(MateriaLegislativaPesquisaView, self).get(request) + + # Se a pesquisa estiver quebrando com a paginação + # Olhe esta função abaixo + # Provavelmente você criou um novo campo no Form/FilterSet + # Então a ordem da URL está diferente + data = self.filterset.data + if (data and data.get('tipo') is not None): + url = "&"+str(self.request.environ['QUERY_STRING']) + if url.startswith("&page"): + ponto_comeco = url.find('tipo=') - 1 + url = url[ponto_comeco:] + else: + url = '' + + self.filterset.form.fields['o'].label = _('Ordenação') + + context = self.get_context_data(filter=self.filterset, + object_list=self.object_list, + filter_url=url, + numero_res=len(self.object_list) + ) + + return self.render_to_response(context) + + +class MateriaTaView(IntegracaoTaView): + model = MateriaLegislativa + model_type_foreignkey = TipoMateriaLegislativa + + +class ProposicaoTaView(IntegracaoTaView): + model = Proposicao + model_type_foreignkey = TipoProposicao + + +class AcompanhamentoMateriaView(CreateView): + template_name = "materia/acompanhamento_materia.html" + + def get_random_chars(self): + s = ascii_letters + digits + return ''.join(choice(s) for i in range(choice([6, 7]))) + + def get(self, request, *args, **kwargs): + pk = self.kwargs['pk'] + materia = MateriaLegislativa.objects.get(id=pk) + + return self.render_to_response( + {'form': AcompanhamentoMateriaForm(), + 'materia': materia}) + + def post(self, request, *args, **kwargs): + form = AcompanhamentoMateriaForm(request.POST) + pk = self.kwargs['pk'] + materia = MateriaLegislativa.objects.get(id=pk) + + if form.is_valid(): + + email = form.cleaned_data['email'] + usuario = request.user + + hash_txt = self.get_random_chars() + + try: + AcompanhamentoMateria.objects.get( + email=email, + materia=materia, + hash=hash_txt) + except ObjectDoesNotExist: + acompanhar = form.save(commit=False) + acompanhar.hash = hash_txt + acompanhar.materia = materia + acompanhar.usuario = usuario.username + acompanhar.confirmado = False + acompanhar.save() + + do_envia_email_confirmacao(request, materia, email) + + else: + return self.render_to_response( + {'form': form, + 'materia': materia, + 'error': _('Essa matéria já está\ + sendo acompanhada por este e-mail.')}) + return self.form_valid(form) + else: + return self.render_to_response( + {'form': form, + 'materia': materia}) + + def get_success_url(self): + return reverse('sessao:list_pauta_sessao') + + def load_email_templates(templates, context={}): emails = [] @@ -617,145 +768,3 @@ def do_envia_email_tramitacao(request, materia): enviar_emails(sender, recipients, messages) return None - - -class MateriaLegislativaPesquisaView(FilterView): - model = MateriaLegislativa - filterset_class = MateriaLegislativaFilterSet - paginate_by = 10 - - def get_filterset_kwargs(self, filterset_class): - super(MateriaLegislativaPesquisaView, - self).get_filterset_kwargs(filterset_class) - - kwargs = {'data': self.request.GET or None} - - status_tramitacao = self.request.GET.get('tramitacao__status') - unidade_destino = self.request.GET.get( - 'tramitacao__unidade_tramitacao_destino') - - qs = self.get_queryset() - - if status_tramitacao and unidade_destino: - lista = filtra_tramitacao_destino_and_status(status_tramitacao, - unidade_destino) - qs = qs.filter(id__in=lista).distinct() - - elif status_tramitacao: - lista = filtra_tramitacao_status(status_tramitacao) - qs = qs.filter(id__in=lista).distinct() - - elif unidade_destino: - lista = filtra_tramitacao_destino(unidade_destino) - qs = qs.filter(id__in=lista).distinct() - - kwargs.update({ - 'queryset': qs, - }) - return kwargs - - def get_context_data(self, **kwargs): - context = super(MateriaLegislativaPesquisaView, - self).get_context_data(**kwargs) - - paginator = context['paginator'] - page_obj = context['page_obj'] - - context['page_range'] = make_pagination( - page_obj.number, paginator.num_pages) - - return context - - def get(self, request, *args, **kwargs): - super(MateriaLegislativaPesquisaView, self).get(request) - - # Se a pesquisa estiver quebrando com a paginação - # Olhe esta função abaixo - # Provavelmente você criou um novo campo no Form/FilterSet - # Então a ordem da URL está diferente - data = self.filterset.data - if (data and data.get('tipo') is not None): - url = "&"+str(self.request.environ['QUERY_STRING']) - if url.startswith("&page"): - ponto_comeco = url.find('tipo=') - 1 - url = url[ponto_comeco:] - else: - url = '' - - self.filterset.form.fields['o'].label = _('Ordenação') - - context = self.get_context_data(filter=self.filterset, - object_list=self.object_list, - filter_url=url, - numero_res=len(self.object_list) - ) - - return self.render_to_response(context) - - -class MateriaTaView(IntegracaoTaView): - model = MateriaLegislativa - model_type_foreignkey = TipoMateriaLegislativa - - -class ProposicaoTaView(IntegracaoTaView): - model = Proposicao - model_type_foreignkey = TipoProposicao - - -class AcompanhamentoMateriaView(CreateView): - template_name = "materia/acompanhamento_materia.html" - - def get_random_chars(self): - s = ascii_letters + digits - return ''.join(choice(s) for i in range(choice([6, 7]))) - - def get(self, request, *args, **kwargs): - pk = self.kwargs['pk'] - materia = MateriaLegislativa.objects.get(id=pk) - - return self.render_to_response( - {'form': AcompanhamentoMateriaForm(), - 'materia': materia}) - - def post(self, request, *args, **kwargs): - form = AcompanhamentoMateriaForm(request.POST) - pk = self.kwargs['pk'] - materia = MateriaLegislativa.objects.get(id=pk) - - if form.is_valid(): - - email = form.cleaned_data['email'] - usuario = request.user - - hash_txt = self.get_random_chars() - - try: - AcompanhamentoMateria.objects.get( - email=email, - materia=materia, - hash=hash_txt) - except ObjectDoesNotExist: - acompanhar = form.save(commit=False) - acompanhar.hash = hash_txt - acompanhar.materia = materia - acompanhar.usuario = usuario.username - acompanhar.confirmado = False - acompanhar.save() - - do_envia_email_confirmacao(request, materia, email) - - else: - return self.render_to_response( - {'form': form, - 'materia': materia, - 'error': _('Essa matéria já está\ - sendo acompanhada por este e-mail.')}) - return self.form_valid(form) - else: - return self.render_to_response( - {'form': form, - 'materia': materia}) - - def get_success_url(self): - return reverse('sessao:list_pauta_sessao') diff --git a/parlamentares/forms.py b/parlamentares/forms.py index c19b3cb48..561ff5d5f 100644 --- a/parlamentares/forms.py +++ b/parlamentares/forms.py @@ -10,8 +10,8 @@ from floppyforms.widgets import ClearableFileInput import sapl from sapl.utils import intervalos_tem_intersecao -from .models import (ComposicaoColigacao, Filiacao, Legislatura, - Mandato, Parlamentar) +from .models import (ComposicaoColigacao, Filiacao, Legislatura, Mandato, + Parlamentar) class ImageThumbnailFileInput(ClearableFileInput): diff --git a/parlamentares/views.py b/parlamentares/views.py index de5e80750..4243ad214 100644 --- a/parlamentares/views.py +++ b/parlamentares/views.py @@ -12,13 +12,11 @@ from crud.masterdetail import MasterDetailCrud from .forms import (ComposicaoColigacaoForm, FiliacaoForm, LegislaturaForm, ParlamentarCreateForm, ParlamentarForm) - from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, Dependente, Filiacao, Legislatura, Mandato, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, SituacaoMilitar, TipoAfastamento, TipoDependente) - CargoMesaCrud = Crud.build(CargoMesa, 'cargo_mesa') PartidoCrud = Crud.build(Partido, 'partidos') SessaoLegislativaCrud = Crud.build(SessaoLegislativa, 'sessao_legislativa') diff --git a/protocoloadm/views.py b/protocoloadm/views.py index 36e4431cf..35daf35b0 100644 --- a/protocoloadm/views.py +++ b/protocoloadm/views.py @@ -4,7 +4,7 @@ from datetime import date, datetime from braces.views import FormValidMessageMixin from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse -from django.db.models import Q, Max +from django.db.models import Max, Q from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import redirect from django.utils.translation import ugettext_lazy as _