diff --git a/sapl/base/forms.py b/sapl/base/forms.py index e0589ed81..514fe5b94 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -18,27 +18,25 @@ from django.utils.translation import string_concat from django.utils.translation import ugettext_lazy as _ import django_filters -from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica -from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica +from sapl.audiencia.models import AudienciaPublica from sapl.base.models import Autor, TipoAutor -from sapl.comissoes.models import Reuniao, Comissao -from sapl.comissoes.models import Reuniao, Comissao -from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, - to_row) -from sapl.crispy_layout_mixin import SaplFormHelper -from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao, StatusTramitacao, - DocumentoAcessorio, TipoMateriaLegislativa) -from sapl.norma.models import (NormaJuridica, NormaEstatisticas) -from sapl.parlamentares.models import SessaoLegislativa, Partido +from sapl.comissoes.models import Reuniao +from sapl.crispy_layout_mixin import (form_actions, to_column, to_row, + SaplFormHelper, SaplFormLayout) +from sapl.materia.models import (DocumentoAcessorio, MateriaEmTramitacao, + MateriaLegislativa, UnidadeTramitacao, + StatusTramitacao) +from sapl.norma.models import NormaJuridica +from sapl.parlamentares.models import Partido, SessaoLegislativa from sapl.protocoloadm.models import DocumentoAdministrativo from sapl.sessao.models import SessaoPlenaria from sapl.settings import MAX_IMAGE_UPLOAD_SIZE -from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, - ChoiceWithoutValidationField, ImageThumbnailFileInput, - RangeWidgetOverride, autor_label, autor_modal, - models_with_gr_for_model, qs_override_django_filter, +from sapl.utils import (autor_label, autor_modal, ChoiceWithoutValidationField, choice_anos_com_normas, choice_anos_com_materias, - FilterOverridesMetaMixin, FileFieldCheckMixin) + FilterOverridesMetaMixin, FileFieldCheckMixin, + ImageThumbnailFileInput, models_with_gr_for_model, + qs_override_django_filter, RangeWidgetOverride, + RANGE_ANOS, YES_NO_CHOICES) from .models import AppConfig, CasaLegislativa @@ -1087,7 +1085,7 @@ class RelatorioAudienciaFilterSet(django_filters.FilterSet): class RelatorioMateriasTramitacaoFilterSet(django_filters.FilterSet): - ano = django_filters.ChoiceFilter(required=True, + materia__ano = django_filters.ChoiceFilter(required=True, label='Ano da Matéria', choices=choice_anos_com_materias) @@ -1102,21 +1100,24 @@ class RelatorioMateriasTramitacaoFilterSet(django_filters.FilterSet): @property def qs(self): parent = super(RelatorioMateriasTramitacaoFilterSet, self).qs - return parent.distinct().order_by('-ano', 'tipo', '-numero') + return parent.distinct().order_by( + '-materia__ano', 'materia__tipo', '-materia__numero' + ) class Meta: - model = MateriaLegislativa - fields = ['ano', 'tipo', 'tramitacao__unidade_tramitacao_destino', + model = MateriaEmTramitacao + fields = ['materia__ano', 'materia__tipo', + 'tramitacao__unidade_tramitacao_destino', 'tramitacao__status'] def __init__(self, *args, **kwargs): super(RelatorioMateriasTramitacaoFilterSet, self).__init__( *args, **kwargs) - self.filters['tipo'].label = 'Tipo de Matéria' + self.filters['materia__tipo'].label = 'Tipo de Matéria' - row1 = to_row([('ano', 12)]) - row2 = to_row([('tipo', 12)]) + row1 = to_row([('materia__ano', 12)]) + row2 = to_row([('materia__tipo', 12)]) row3 = to_row([('tramitacao__unidade_tramitacao_destino', 12)]) row4 = to_row([('tramitacao__status', 12)]) diff --git a/sapl/base/views.py b/sapl/base/views.py index 6aec5e78f..b7744fed8 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -32,23 +32,26 @@ from haystack.query import SearchQuerySet 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, Tramitacao) -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, - 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) +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, + 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, @@ -68,26 +71,6 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm, from .models import AppConfig, CasaLegislativa -def filtra_url_materias_em_tramitacao(data, qs, campo_url, local_ou_status): - id_materias = [] - filtro_url = data[campo_url] - - if local_ou_status == 'local': - for item in qs: - f = item.tramitacao_set.order_by('-id').first() - if f: - if f.unidade_tramitacao_destino_id == int(filtro_url): - id_materias.append(item.id) - elif local_ou_status == 'status': - for item in qs: - f = item.tramitacao_set.order_by('-id').first() - if f: - if f.status_id == int(filtro_url): - id_materias.append(item.id) - - return qs.filter(em_tramitacao=True, id__in=id_materias) - - def get_casalegislativa(): return CasaLegislativa.objects.first() @@ -711,7 +694,7 @@ class RelatorioAudienciaView(FilterView): class RelatorioMateriasTramitacaoView(FilterView): - model = MateriaLegislativa + model = MateriaEmTramitacao filterset_class = RelatorioMateriasTramitacaoFilterSet template_name = 'base/RelatorioMateriasPorTramitacao_filter.html' @@ -725,35 +708,68 @@ class RelatorioMateriasTramitacaoView(FilterView): if data['data']: qs = data['queryset'] - if data['data']['tramitacao__unidade_tramitacao_destino']: - qs = filtra_url_materias_em_tramitacao( - data['data'], qs, 'tramitacao__unidade_tramitacao_destino', 'local') - - if data['data']['tramitacao__status']: - qs = filtra_url_materias_em_tramitacao( - data['data'], qs, 'tramitacao__status', 'status') - - if data['data']['tipo']: - ultimas_tramitacoes = Tramitacao.objects.filter( - materia__ano=data['data']['ano'], - materia__tipo=data['data']['tipo'] - ).values( - 'materia__ano', 'materia__numero' - ).annotate(id=Max('id')) + 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'] + + if tipo_materia: + if unidade_tramitacao_destino: + if status_tramitacao: + qs = qs.filter( + materia__ano=ano_materia, + materia__tipo=tipo_materia, + tramitacao__unidade_tramitacao_destino=unidade_tramitacao_destino, + tramitacao__status=status_tramitacao + ) + else: + qs = qs.filter( + materia__ano=ano_materia, + materia__tipo=tipo_materia, + tramitacao__unidade_tramitacao_destino=unidade_tramitacao_destino + ) + else: + if status_tramitacao: + qs = qs.filter( + materia__ano=ano_materia, + materia__tipo=tipo_materia, + tramitacao__status=status_tramitacao + ) + else: + qs = qs.filter( + materia__ano=ano_materia, + materia__tipo=tipo_materia + ) else: - ultimas_tramitacoes = Tramitacao.objects.filter( - materia__ano=data['data']['ano'] - ).values( - 'materia__ano', 'materia__numero' - ).annotate(id=Max('id')) - ultimas_tramitacoes_ids = [i['id'] for i in ultimas_tramitacoes] - qs = qs.filter(tramitacao__id__in=ultimas_tramitacoes_ids) + if unidade_tramitacao_destino: + if status_tramitacao: + qs = qs.filter( + materia__ano=ano_materia, + tramitacao__unidade_tramitacao_destino=unidade_tramitacao_destino, + tramitacao__status=status_tramitacao + ) + else: + qs = qs.filter( + materia__ano=ano_materia, + tramitacao__unidade_tramitacao_destino=unidade_tramitacao_destino, + ) + else: + if status_tramitacao: + qs = qs.filter( + materia__ano=ano_materia, + tramitacao__status=status_tramitacao + ) + else: + qs = qs.filter( + materia__ano=ano_materia, + ) data['queryset'] = qs - qtdes = { tipo:0 for tipo in TipoMateriaLegislativa.objects.all()} + qtdes = { tipo:0 for tipo in TipoMateriaLegislativa.objects.all() } for i in qs: - qtdes[i.tipo] += 1 + 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 @@ -762,27 +778,30 @@ class RelatorioMateriasTramitacaoView(FilterView): def get_queryset(self): qs = super().get_queryset() - qs = qs.select_related('tipo').filter( - em_tramitacao=True).exclude( + qs = qs.select_related('materia__tipo').filter( + materia__em_tramitacao=True + ).exclude( tramitacao__status__indicador='F' - ).order_by('-ano', '-numero') + ).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() context['qtdes'] = self.total_resultados_tipos - context['ano'] = (self.request.GET['ano']) + context['ano'] = (self.request.GET['materia__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)) ) diff --git a/sapl/templates/base/RelatorioMateriasPorTramitacao_filter.html b/sapl/templates/base/RelatorioMateriasPorTramitacao_filter.html index 05a863fdf..738e615b8 100644 --- a/sapl/templates/base/RelatorioMateriasPorTramitacao_filter.html +++ b/sapl/templates/base/RelatorioMateriasPorTramitacao_filter.html @@ -44,18 +44,20 @@
- {% for materia in object_list %} + {% for materia_em_tramitacao in object_list %}