|
|
|
@ -13,7 +13,8 @@ from django.core.exceptions import ObjectDoesNotExist, PermissionDenied, Validat |
|
|
|
from django.core.mail import send_mail |
|
|
|
from django.core.urlresolvers import reverse, reverse_lazy |
|
|
|
from django.db import connection |
|
|
|
from django.db.models import Count, Q, ProtectedError |
|
|
|
from django.db.models import Count, Q, ProtectedError, Max |
|
|
|
from django.shortcuts import render |
|
|
|
from django.http import Http404, HttpResponseRedirect, JsonResponse |
|
|
|
from django.template import TemplateDoesNotExist |
|
|
|
from django.template.loader import get_template |
|
|
|
@ -39,23 +40,26 @@ from sapl.relatorios.views import (relatorio_materia_em_tramitacao, relatorio_ma |
|
|
|
|
|
|
|
from sapl import settings |
|
|
|
from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica |
|
|
|
from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm |
|
|
|
from sapl.base.models import Autor, TipoAutor |
|
|
|
from sapl.comissoes.models import Reuniao, Comissao |
|
|
|
from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm |
|
|
|
from sapl.comissoes.models import Comissao, Reuniao |
|
|
|
from sapl.crud.base import CrudAux, make_pagination |
|
|
|
from sapl.materia.models import (Autoria, MateriaLegislativa, Proposicao, Anexada, |
|
|
|
TipoMateriaLegislativa, StatusTramitacao, UnidadeTramitacao, |
|
|
|
DocumentoAcessorio, TipoDocumento) |
|
|
|
from sapl.norma.models import (NormaJuridica, TipoNormaJuridica, NormaEstatisticas) |
|
|
|
from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato, Filiacao, SessaoLegislativa |
|
|
|
from sapl.protocoloadm.models import (Protocolo, TipoDocumentoAdministrativo, |
|
|
|
from sapl.materia.models import (Anexada, Autoria, DocumentoAcessorio, |
|
|
|
MateriaEmTramitacao, MateriaLegislativa, Proposicao, |
|
|
|
StatusTramitacao, TipoDocumento, |
|
|
|
TipoMateriaLegislativa, UnidadeTramitacao, Tramitacao) |
|
|
|
from sapl.norma.models import NormaJuridica, TipoNormaJuridica |
|
|
|
from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato, Parlamentar, |
|
|
|
SessaoLegislativa) |
|
|
|
from sapl.protocoloadm.models import (Anexado, DocumentoAdministrativo, Protocolo, |
|
|
|
StatusTramitacaoAdministrativo, |
|
|
|
DocumentoAdministrativo, Anexado) |
|
|
|
from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria, |
|
|
|
SessaoPlenariaPresenca, Bancada, TipoSessaoPlenaria) |
|
|
|
from sapl.utils import (parlamentares_ativos, gerar_hash_arquivo, SEPARADOR_HASH_PROPOSICAO, |
|
|
|
show_results_filter_set, mail_service_configured, |
|
|
|
intervalos_tem_intersecao, remover_acentos) |
|
|
|
TipoDocumentoAdministrativo) |
|
|
|
from sapl.sessao.models import (Bancada, PresencaOrdemDia, SessaoPlenaria, |
|
|
|
SessaoPlenariaPresenca, TipoSessaoPlenaria) |
|
|
|
from sapl.utils import (gerar_hash_arquivo, intervalos_tem_intersecao, |
|
|
|
mail_service_configured, parlamentares_ativos, |
|
|
|
SEPARADOR_HASH_PROPOSICAO, show_results_filter_set) |
|
|
|
|
|
|
|
from .forms import (AlterarSenhaForm, CasaLegislativaForm, |
|
|
|
ConfiguracoesAppForm, RelatorioAtasFilterSet, |
|
|
|
RelatorioAudienciaFilterSet, |
|
|
|
@ -63,7 +67,7 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm, |
|
|
|
RelatorioHistoricoTramitacaoFilterSet, |
|
|
|
RelatorioMateriasPorAnoAutorTipoFilterSet, |
|
|
|
RelatorioMateriasPorAutorFilterSet, |
|
|
|
RelatorioMateriasTramitacaoilterSet, |
|
|
|
RelatorioMateriasTramitacaoFilterSet, |
|
|
|
RelatorioPresencaSessaoFilterSet, |
|
|
|
RelatorioReuniaoFilterSet, UsuarioCreateForm, |
|
|
|
UsuarioEditForm, RelatorioNormasMesFilterSet, |
|
|
|
@ -75,19 +79,6 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm, |
|
|
|
from .models import AppConfig, CasaLegislativa |
|
|
|
|
|
|
|
|
|
|
|
def filtra_url_materias_em_tramitacao(qr, qs, campo_url, local_ou_status): |
|
|
|
id_materias = [] |
|
|
|
filtro_url = qr[campo_url] |
|
|
|
if local_ou_status == 'local': |
|
|
|
id_materias = [item.id for item in qs if item.tramitacao_set.order_by( |
|
|
|
'-id').first().unidade_tramitacao_destino_id == int(filtro_url)] |
|
|
|
elif local_ou_status == 'status': |
|
|
|
id_materias = [item.id for item in qs if item.tramitacao_set.order_by( |
|
|
|
'-id').first().status_id == int(filtro_url)] |
|
|
|
|
|
|
|
return qs.filter(em_tramitacao=True, id__in=id_materias) |
|
|
|
|
|
|
|
|
|
|
|
def get_casalegislativa(): |
|
|
|
return CasaLegislativa.objects.first() |
|
|
|
|
|
|
|
@ -731,62 +722,109 @@ class RelatorioAudienciaView(RelatorioMixin, FilterView): |
|
|
|
|
|
|
|
|
|
|
|
class RelatorioMateriasTramitacaoView(RelatorioMixin, FilterView): |
|
|
|
model = MateriaLegislativa |
|
|
|
filterset_class = RelatorioMateriasTramitacaoilterSet |
|
|
|
model = MateriaEmTramitacao |
|
|
|
filterset_class = RelatorioMateriasTramitacaoFilterSet |
|
|
|
template_name = 'base/RelatorioMateriasPorTramitacao_filter.html' |
|
|
|
relatorio = relatorio_materia_em_tramitacao |
|
|
|
|
|
|
|
paginate_by = 100 |
|
|
|
|
|
|
|
total_resultados_tipos = {} |
|
|
|
|
|
|
|
def get_filterset_kwargs(self, filterset_class): |
|
|
|
data = super().get_filterset_kwargs(filterset_class) |
|
|
|
|
|
|
|
if data['data']: |
|
|
|
qs = data['queryset'] |
|
|
|
|
|
|
|
ano_materia = data['data']['materia__ano'] |
|
|
|
tipo_materia = data['data']['materia__tipo'] |
|
|
|
unidade_tramitacao_destino = data['data']['tramitacao__unidade_tramitacao_destino'] |
|
|
|
status_tramitacao = data['data']['tramitacao__status'] |
|
|
|
|
|
|
|
kwargs = {} |
|
|
|
if ano_materia: |
|
|
|
kwargs['materia__ano'] = ano_materia |
|
|
|
if tipo_materia: |
|
|
|
kwargs['materia__tipo'] = tipo_materia |
|
|
|
if unidade_tramitacao_destino: |
|
|
|
kwargs['tramitacao__unidade_tramitacao_destino'] = unidade_tramitacao_destino |
|
|
|
if status_tramitacao: |
|
|
|
kwargs['tramitacao__status'] = status_tramitacao |
|
|
|
qs = qs.filter(**kwargs) |
|
|
|
|
|
|
|
data['queryset'] = qs |
|
|
|
|
|
|
|
qtdes = { tipo:0 for tipo in TipoMateriaLegislativa.objects.all() } |
|
|
|
for i in qs: |
|
|
|
qtdes[i.materia.tipo] += 1 |
|
|
|
|
|
|
|
# remove as entradas de valor igual a zero |
|
|
|
qtdes = {k:v for k,v in qtdes.items() if v > 0} |
|
|
|
self.total_resultados_tipos = qtdes |
|
|
|
|
|
|
|
return data |
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
|
qs = super().get_queryset() |
|
|
|
qs = qs.select_related('materia__tipo').filter( |
|
|
|
materia__em_tramitacao=True |
|
|
|
).exclude( |
|
|
|
tramitacao__status__indicador='F' |
|
|
|
).order_by('-materia__ano', '-materia__numero') |
|
|
|
return qs |
|
|
|
|
|
|
|
def get_context_data(self, **kwargs): |
|
|
|
context = super(RelatorioMateriasTramitacaoView, |
|
|
|
self).get_context_data(**kwargs) |
|
|
|
context = super( |
|
|
|
RelatorioMateriasTramitacaoView, self |
|
|
|
).get_context_data(**kwargs) |
|
|
|
|
|
|
|
context['title'] = _('Matérias em Tramitação') |
|
|
|
|
|
|
|
if not self.filterset.form.is_valid(): |
|
|
|
return context |
|
|
|
|
|
|
|
qr = self.request.GET.copy() |
|
|
|
qs = context['object_list'] |
|
|
|
qs = qs.filter(em_tramitacao=True) |
|
|
|
|
|
|
|
if qr.get('tramitacao__unidade_tramitacao_destino'): |
|
|
|
qs = filtra_url_materias_em_tramitacao( |
|
|
|
qr, qs, 'tramitacao__unidade_tramitacao_destino', 'local') |
|
|
|
if qr.get('tramitacao__status'): |
|
|
|
qs = filtra_url_materias_em_tramitacao( |
|
|
|
qr, qs, 'tramitacao__status', 'status') |
|
|
|
|
|
|
|
li = [li1 for li1 in qs if li1.tramitacao_set.last() and li1.tramitacao_set.last().status.indicador != 'F'] |
|
|
|
context['object_list'] = li |
|
|
|
context['qtdes'] = self.total_resultados_tipos |
|
|
|
context['ano'] = (self.request.GET['materia__ano']) |
|
|
|
|
|
|
|
qtdes = {} |
|
|
|
for tipo in TipoMateriaLegislativa.objects.all(): |
|
|
|
li = context['object_list'] |
|
|
|
qtde = sum(1 for i in li if i.tipo_id==tipo.id) |
|
|
|
if qtde > 0: |
|
|
|
qtdes[tipo] = qtde |
|
|
|
context['qtdes'] = qtdes |
|
|
|
context['ano'] = (self.request.GET['ano']) |
|
|
|
if self.request.GET['tipo']: |
|
|
|
tipo = self.request.GET['tipo'] |
|
|
|
if self.request.GET['materia__tipo']: |
|
|
|
tipo = self.request.GET['materia__tipo'] |
|
|
|
context['tipo'] = ( |
|
|
|
str(TipoMateriaLegislativa.objects.get(id=tipo))) |
|
|
|
str(TipoMateriaLegislativa.objects.get(id=tipo)) |
|
|
|
) |
|
|
|
else: |
|
|
|
context['tipo'] = '' |
|
|
|
|
|
|
|
if self.request.GET['tramitacao__status']: |
|
|
|
tramitacao_status = self.request.GET['tramitacao__status'] |
|
|
|
context['tramitacao__status'] = ( |
|
|
|
str(StatusTramitacao.objects.get(id=tramitacao_status))) |
|
|
|
str(StatusTramitacao.objects.get(id=tramitacao_status)) |
|
|
|
) |
|
|
|
else: |
|
|
|
context['tramitacao__status'] = '' |
|
|
|
|
|
|
|
if self.request.GET['tramitacao__unidade_tramitacao_destino']: |
|
|
|
context['tramitacao__unidade_tramitacao_destino'] = (str(UnidadeTramitacao.objects.get( |
|
|
|
id=self.request.GET['tramitacao__unidade_tramitacao_destino']))) |
|
|
|
context['tramitacao__unidade_tramitacao_destino'] = ( |
|
|
|
str(UnidadeTramitacao.objects.get( |
|
|
|
id=self.request.GET['tramitacao__unidade_tramitacao_destino'] |
|
|
|
)) |
|
|
|
) |
|
|
|
else: |
|
|
|
context['tramitacao__unidade_tramitacao_destino'] = '' |
|
|
|
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' |
|
|
|
|
|
|
|
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' |
|
|
|
context['show_results'] = show_results_filter_set(qr) |
|
|
|
|
|
|
|
paginator = context['paginator'] |
|
|
|
page_obj = context['page_obj'] |
|
|
|
|
|
|
|
context['page_range'] = make_pagination( |
|
|
|
page_obj.number, paginator.num_pages |
|
|
|
) |
|
|
|
context['NO_ENTRIES_MSG'] = 'Nenhum encontrado.' |
|
|
|
|
|
|
|
return context |
|
|
|
|
|
|
|
|
|
|
|
@ -1471,7 +1509,7 @@ class ListarParlMandatosIntersecaoView(PermissionRequiredMixin, ListView): |
|
|
|
|
|
|
|
|
|
|
|
def parlamentares_duplicados(): |
|
|
|
return [parlamentar.values() for parlamentar in Parlamentar.objects.values( |
|
|
|
return [parlamentar for parlamentar in Parlamentar.objects.values( |
|
|
|
'nome_parlamentar').order_by('nome_parlamentar').annotate(count=Count( |
|
|
|
'nome_parlamentar')).filter(count__gt=1)] |
|
|
|
|
|
|
|
@ -1656,14 +1694,10 @@ class ListarProtocolosComMateriasView(PermissionRequiredMixin, ListView): |
|
|
|
|
|
|
|
|
|
|
|
def protocolos_duplicados(): |
|
|
|
protocolos = {} |
|
|
|
for p in Protocolo.objects.order_by('-ano', 'numero'): |
|
|
|
key = "{}/{}".format(p.numero, p.ano) |
|
|
|
val = protocolos.get(key, list()) |
|
|
|
val.append(p) |
|
|
|
protocolos[key] = val |
|
|
|
|
|
|
|
return [(v[0], len(v)) for (k, v) in protocolos.items() if len(v) > 1] |
|
|
|
return [ |
|
|
|
protocolo for protocolo in Protocolo.objects.values( |
|
|
|
'numero', 'ano').order_by('-ano', 'numero').annotate(total=Count('numero')).filter(total__gt=1) |
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
class ListarProtocolosDuplicadosView(PermissionRequiredMixin, ListView): |
|
|
|
|