Browse Source

Merge pull request #282 from interlegis/217-refatora-pesquisa-materia-django-filter

fix #217 refatora pesquisa materia django filter
pull/337/merge
Edward 9 years ago
parent
commit
9e274ec9d1
  1. 235
      materia/forms.py
  2. 3
      materia/test_materia_urls.py
  3. 5
      materia/urls.py
  4. 161
      materia/views.py
  5. 2
      parlamentares/models.py
  6. 6
      parlamentares/test_parlamentares_urls.py
  7. 1
      requirements/requirements.txt
  8. 7
      sapl/settings.py
  9. 10
      static/js/app.js
  10. 48
      templates/materia/materialegislativa_filter.html
  11. 8
      templates/materia/pesquisa_materia.html
  12. 26
      templates/materia/pesquisa_materia_list.html
  13. 10
      templates/materia/proposicao/proposicao_list.html
  14. 6
      templates/paginacao.html

235
materia/forms.py

@ -1,7 +1,10 @@
import django_filters
from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Button, Column, Fieldset, Layout, Submit
from django import forms
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db import models
from django.db.models import Max
from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _
@ -10,14 +13,14 @@ import sapl
from crispy_layout_mixin import form_actions
from norma.models import LegislacaoCitada, TipoNormaJuridica
from sapl.settings import MAX_DOC_UPLOAD_SIZE
from sapl.utils import RANGE_ANOS
from .models import (AcompanhamentoMateria, Anexada, Autor, Autoria,
DespachoInicial, DocumentoAcessorio, MateriaLegislativa,
Numeracao, Proposicao, Relatoria, StatusTramitacao,
TipoMateriaLegislativa, Tramitacao, UnidadeTramitacao)
Numeracao, Proposicao, Relatoria, TipoMateriaLegislativa,
Tramitacao)
ORDENACAO_MATERIAIS = [(1, 'Crescente'),
(2, 'Decrescente')]
ANO_CHOICES = [('', '---------')] + RANGE_ANOS
def em_tramitacao():
@ -140,13 +143,13 @@ class DocumentoAcessorioForm(ModelForm):
[('tipo', 4), ('nome', 4), ('data', 4)])
row2 = crispy_layout_mixin.to_row(
[('autor', 0),
(Button('pesquisar',
'Pesquisar Autor',
css_class='btn btn-primary btn-sm'), 2),
(Button('limpar',
'Limpar Autor',
css_class='btn btn-primary btn-sm'), 10)])
[('autor', 0),
(Button('pesquisar',
'Pesquisar Autor',
css_class='btn btn-primary btn-sm'), 2),
(Button('limpar',
'Limpar Autor',
css_class='btn btn-primary btn-sm'), 10)])
row3 = crispy_layout_mixin.to_row(
[('ementa', 12)])
@ -192,7 +195,7 @@ class TramitacaoForm(ModelForm):
label='Tramitando',
choices=[(True, 'Sim'), (False, 'Não')],
widget=forms.Select(
attrs={'class': 'selector'}))
attrs={'class': 'selector'}))
class Meta:
model = Tramitacao
@ -455,75 +458,90 @@ class AutoriaForm(ModelForm):
*args, **kwargs)
class MateriaLegislativaPesquisaForm(ModelForm):
class RangeWidgetOverride(forms.MultiWidget):
autor = forms.CharField(widget=forms.HiddenInput(), required=False)
def __init__(self, attrs=None):
widgets = (forms.DateInput(format='%d/%m/%Y',
attrs={'class': 'dateinput',
'placeholder': 'Inicial'}),
forms.DateInput(format='%d/%m/%Y',
attrs={'class': 'dateinput',
'placeholder': 'Final'}))
super(RangeWidgetOverride, self).__init__(widgets, attrs)
localizacao = forms.ModelChoiceField(
label='Localização Atual',
required=False,
queryset=UnidadeTramitacao.objects.all(),
empty_label='Selecione',
)
def decompress(self, value):
if value:
return [value.start, value.stop]
return [None, None]
situacao = forms.ModelChoiceField(
label='Situação',
required=False,
queryset=StatusTramitacao.objects.all(),
empty_label='Selecione',
)
def format_output(self, rendered_widgets):
return ''.join(rendered_widgets)
class MateriaLegislativaFilterSet(django_filters.FilterSet):
filter_overrides = {models.DateField: {
'filter_class': django_filters.DateFromToRangeFilter,
'extra': lambda f: {
'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
'widget': RangeWidgetOverride}
}}
em_tramitacao = forms.ChoiceField(required=False,
label='Tramitando',
choices=em_tramitacao(),
widget=forms.Select(
attrs={'class': 'selector'}))
publicacao_inicial = forms.DateField(label=u'Data Publicação Inicial',
input_formats=['%d/%m/%Y'],
required=False,
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'class': 'dateinput'}))
publicacao_final = forms.DateField(label=u'Data Publicação Final',
input_formats=['%d/%m/%Y'],
required=False,
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'class': 'dateinput'}))
apresentacao_inicial = forms.DateField(label=u'Data Apresentação Inicial',
input_formats=['%d/%m/%Y'],
required=False,
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'class': 'dateinput'}))
apresentacao_final = forms.DateField(label=u'Data Apresentação Final',
input_formats=['%d/%m/%Y'],
required=False,
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'class': 'dateinput'}))
ano = django_filters.ChoiceFilter(required=False,
label=u'Ano da Matéria',
choices=ANO_CHOICES)
autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput())
ementa = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = MateriaLegislativa
fields = ['tipo',
'numero',
'ano',
fields = ['numero',
'numero_protocolo',
'apresentacao_inicial',
'apresentacao_final',
'publicacao_inicial',
'publicacao_final',
'autor',
'ano',
'tipo',
'data_apresentacao',
'data_publicacao',
'autoria__autor__tipo',
'autoria__partido',
'relatoria__parlamentar_id',
'local_origem_externa',
'localizacao',
'tramitacao__unidade_tramitacao_destino',
'tramitacao__status',
'em_tramitacao',
'situacao']
]
order_by = (
('', 'Selecione'),
('dataC', 'Data, Tipo, Ano, Numero - Ordem Crescente'),
('dataD', 'Data, Tipo, Ano, Numero - Ordem Decrescente'),
('tipoC', 'Tipo, Ano, Numero, Data - Ordem Crescente'),
('tipoD', 'Tipo, Ano, Numero, Data - Ordem Decrescente')
)
order_by_mapping = {
'': [],
'dataC': ['data_apresentacao', 'tipo__sigla', 'ano', 'numero'],
'dataD': ['-data_apresentacao', '-tipo__sigla', '-ano', '-numero'],
'tipoC': ['tipo__sigla', 'ano', 'numero', 'data_apresentacao'],
'tipoD': ['-tipo__sigla', '-ano', '-numero', '-data_apresentacao'],
}
def get_order_by(self, order_value):
if order_value in self.order_by_mapping:
return self.order_by_mapping[order_value]
else:
return super(MateriaLegislativaFilterSet,
self).get_order_by(order_value)
def __init__(self, *args, **kwargs):
super(MateriaLegislativaFilterSet, self).__init__(*args, **kwargs)
self.filters['tipo'].label = 'Tipo de Matéria'
self.filters['autoria__autor__tipo'].label = 'Tipo de Autor'
self.filters['autoria__partido'].label = 'Partido do Autor'
self.filters['relatoria__parlamentar_id'].label = 'Relatoria'
row1 = crispy_layout_mixin.to_row(
[('tipo', 12)])
@ -532,34 +550,73 @@ class MateriaLegislativaPesquisaForm(ModelForm):
('ano', 4),
('numero_protocolo', 4)])
row3 = crispy_layout_mixin.to_row(
[('apresentacao_inicial', 6),
('apresentacao_final', 6)])
[('data_apresentacao', 6),
('data_publicacao', 6)])
row4 = crispy_layout_mixin.to_row(
[('publicacao_inicial', 6),
('publicacao_final', 6)])
[('autoria__autor', 0),
(Button('pesquisar',
'Pesquisar Autor',
css_class='btn btn-primary btn-sm'), 2),
(Button('limpar',
'limpar Autor',
css_class='btn btn-primary btn-sm'), 10)])
row5 = crispy_layout_mixin.to_row(
[('autor', 0),
(Button('pesquisar',
'Pesquisar Autor',
css_class='btn btn-primary btn-sm'), 2),
(Button('limpar',
'limpar Autor',
css_class='btn btn-primary btn-sm'), 10)])
[('autoria__autor__tipo', 6),
('autoria__partido', 6)])
row6 = crispy_layout_mixin.to_row(
[('local_origem_externa', 6),
('localizacao', 6)])
[('relatoria__parlamentar_id', 6),
('local_origem_externa', 6)])
row7 = crispy_layout_mixin.to_row(
[('tramitacao__unidade_tramitacao_destino', 6),
('tramitacao__status', 6)])
row8 = crispy_layout_mixin.to_row(
[('em_tramitacao', 6),
('situacao', 6)])
('o', 6)])
row9 = crispy_layout_mixin.to_row(
[('ementa', 12)])
self.helper = FormHelper()
self.helper.layout = Layout(
self.form.helper = FormHelper()
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Pesquisa Básica'),
row1, row2, row3, row4,
row1, row2, row3,
HTML(sapl.utils.autor_label),
HTML(sapl.utils.autor_modal),
row5, row6, row7,
row4, row5, row6, row7, row8, row9,
form_actions(save_label='Pesquisar'))
)
super(MateriaLegislativaPesquisaForm, self).__init__(
*args, **kwargs)
def pega_ultima_tramitacao():
ultimas_tramitacoes = Tramitacao.objects.values(
'materia_id').annotate(data_encaminhamento=Max(
'data_encaminhamento'),
id=Max('id')).values_list('id')
lista = [item for sublist in ultimas_tramitacoes for item in sublist]
return lista
def filtra_tramitacao_status(status):
lista = pega_ultima_tramitacao()
return Tramitacao.objects.filter(
id__in=lista,
status=status).distinct().values_list('materia_id', flat=True)
def filtra_tramitacao_destino(destino):
lista = pega_ultima_tramitacao()
return Tramitacao.objects.filter(
id__in=lista,
unidade_tramitacao_destino=destino).distinct().values_list(
'materia_id', flat=True)
def filtra_tramitacao_destino_and_status(status, destino):
lista = pega_ultima_tramitacao()
return Tramitacao.objects.filter(
id__in=lista,
status=status,
unidade_tramitacao_destino=destino).distinct().values_list(
'materia_id', flat=True)

3
materia/test_materia_urls.py

@ -3,9 +3,6 @@ from django.core.urlresolvers import reverse
@pytest.mark.parametrize("test_input,kwargs,expected", [
('materia:pesquisar_materia_list',
{},
'/materia/pesquisar-materia-list'),
('materia:relatoria_edit',
{'pk': '11', 'id': '99'},
'/materia/11/relatoria/99/edit'),

5
materia/urls.py

@ -11,8 +11,7 @@ from materia.views import (AcompanhamentoConfirmarView,
MateriaLegislativaCrud,
MateriaLegislativaPesquisaView, MateriaTaView,
NumeracaoEditView, NumeracaoView, OrgaoCrud,
OrigemCrud, PesquisaMateriaListView,
ProposicaoEditView, ProposicaoListView,
OrigemCrud, ProposicaoEditView, ProposicaoListView,
ProposicaoTaView, ProposicaoView,
RegimeTramitacaoCrud, RelatoriaEditView,
RelatoriaView, StatusTramitacaoCrud, TipoAutorCrud,
@ -93,8 +92,6 @@ urlpatterns = [
ProposicaoEditView.as_view(), name='editar_proposicao'),
url(r'^materia/pesquisar-materia$',
MateriaLegislativaPesquisaView.as_view(), name='pesquisar_materia'),
url(r'^materia/pesquisar-materia-list$',
PesquisaMateriaListView.as_view(), name='pesquisar_materia_list'),
url(r'^materia/(?P<pk>\d+)/acompanhar-materia/$',
AcompanhamentoMateriaView.as_view(), name='acompanhar_materia'),
url(r'^materia/(?P<pk>\d+)/acompanhar-confirmar$',

161
materia/views.py

@ -12,6 +12,7 @@ from django.shortcuts import redirect
from django.template import Context, loader
from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, FormView, ListView, TemplateView
from django_filters.views import FilterView
import crud.base
from base.models import CasaLegislativa
@ -25,8 +26,10 @@ from sapl.utils import get_base_url
from .forms import (AcompanhamentoMateriaForm, AutoriaForm,
DespachoInicialForm, DocumentoAcessorioForm,
LegislacaoCitadaForm, MateriaAnexadaForm,
MateriaLegislativaPesquisaForm, NumeracaoForm,
ProposicaoForm, RelatoriaForm, TramitacaoForm)
MateriaLegislativaFilterSet, NumeracaoForm, ProposicaoForm,
RelatoriaForm, TramitacaoForm, filtra_tramitacao_destino,
filtra_tramitacao_destino_and_status,
filtra_tramitacao_status)
from .models import (AcompanhamentoMateria, Anexada, Autor, Autoria,
DespachoInicial, DocumentoAcessorio, MateriaLegislativa,
Numeracao, Orgao, Origem, Proposicao, RegimeTramitacao,
@ -219,7 +222,7 @@ class MateriaAnexadaEditView(FormView):
def get_success_url(self):
pk = self.kwargs['pk']
return reverse('materia:materia_anexada', kwargs={'pk': pk})
return reverse('materia_anexada', kwargs={'pk': pk})
class DespachoInicialView(CreateView):
@ -1186,118 +1189,78 @@ class ProposicaoListView(ListView):
return context
class MateriaLegislativaPesquisaView(FormView):
template_name = 'materia/pesquisa_materia.html'
def get_success_url(self):
return reverse('materia:pesquisar_materia')
def get(self, request, *args, **kwargs):
form = MateriaLegislativaPesquisaForm()
return self.render_to_response({'form': form})
def post(self, request, *args, **kwargs):
kwargs = {}
form = MateriaLegislativaPesquisaForm(request.POST)
class MateriaLegislativaPesquisaView(FilterView):
model = MateriaLegislativa
filterset_class = MateriaLegislativaFilterSet
paginate_by = 10
if form.data['tipo']:
kwargs['tipo'] = form.data['tipo']
def get_filterset_kwargs(self, filterset_class):
super(MateriaLegislativaPesquisaView,
self).get_filterset_kwargs(filterset_class)
if form.data['numero']:
kwargs['numero'] = form.data['numero']
kwargs = {'data': self.request.GET or None}
if form.data['ano']:
kwargs['ano'] = form.data['ano']
status_tramitacao = self.request.GET.get('tramitacao__status')
unidade_destino = self.request.GET.get(
'tramitacao__unidade_tramitacao_destino')
if form.data['numero_protocolo']:
kwargs['numero_protocolo'] = form.data['numero_protocolo']
qs = self.get_queryset()
if (form.data['apresentacao_inicial'] and
form.data['apresentacao_final']):
kwargs['apresentacao_inicial'] = form.data['apresentacao_inicial']
kwargs['apresentacao_final'] = form.data['apresentacao_final']
if status_tramitacao and unidade_destino:
lista = filtra_tramitacao_destino_and_status(status_tramitacao,
unidade_destino)
qs = qs.filter(id__in=lista).distinct()
if (form.data['publicacao_inicial'] and
form.data['publicacao_final']):
kwargs['publicacao_inicial'] = form.data['publicacao_inicial']
kwargs['publicacao_final'] = form.data['publicacao_final']
elif status_tramitacao:
lista = filtra_tramitacao_status(status_tramitacao)
qs = qs.filter(id__in=lista).distinct()
if form.data['local_origem_externa']:
kwargs['local_origem_externa'] = form.data['local_origem_externa']
elif unidade_destino:
lista = filtra_tramitacao_destino(unidade_destino)
qs = qs.filter(id__in=lista).distinct()
if form.data['autor']:
kwargs['autor'] = form.data['autor']
kwargs.update({
'queryset': qs,
})
return kwargs
if form.data['localizacao']:
kwargs['localizacao'] = form.data['localizacao']
def get_context_data(self, **kwargs):
context = super(MateriaLegislativaPesquisaView,
self).get_context_data(**kwargs)
if form.data['em_tramitacao']:
kwargs['em_tramitacao'] = form.data['em_tramitacao']
paginator = context['paginator']
page_obj = context['page_obj']
if form.data['situacao']:
kwargs['situacao'] = form.data['situacao']
context['page_range'] = make_pagination(
page_obj.number, paginator.num_pages)
request.session['kwargs'] = kwargs
return context
return redirect('materia:pesquisar_materia_list')
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')
class PesquisaMateriaListView(ListView):
template_name = 'materia/pesquisa_materia_list.html'
context_object_name = 'materias'
model = MateriaLegislativa
paginate_by = 10
context = self.get_context_data(filter=self.filterset,
object_list=self.object_list,
filter_url=url,
numero_res=len(self.object_list)
)
def get_queryset(self):
kwargs = self.request.session['kwargs']
materias = MateriaLegislativa.objects.all().order_by(
'-numero', '-ano')
if 'apresentacao_inicial' in kwargs:
inicial = datetime.strptime(
kwargs['apresentacao_inicial'],
'%d/%m/%Y').strftime('%Y-%m-%d')
final = datetime.strptime(
kwargs['apresentacao_final'],
'%d/%m/%Y').strftime('%Y-%m-%d')
materias = materias.filter(
data_apresentacao__range=(inicial, final))
if 'publicacao_inicial' in kwargs:
inicial = datetime.strptime(
kwargs['publicacao_inicial'],
'%d/%m/%Y').strftime('%Y-%m-%d')
final = datetime.strptime(
kwargs['publicacao_final'],
'%d/%m/%Y').strftime('%Y-%m-%d')
materias = materias.filter(
data_publicacao__range=(inicial, final))
if 'tipo' in kwargs:
materias = materias.filter(tipo_id=kwargs['tipo'])
if 'numero' in kwargs:
materias = materias.filter(numero=kwargs['numero'])
if 'ano' in kwargs:
materias = materias.filter(ano=kwargs['ano'])
if 'numero_protocolo' in kwargs:
materias = materias.filter(numero=kwargs['numero_protocolo'])
if 'em_tramitacao' in kwargs:
materias = materias.filter(em_tramitacao=kwargs['em_tramitacao'])
if 'local_origem_externa' in kwargs:
materias = materias.filter(
local_origem_externa=kwargs['local_origem_externa'])
# autor
# localizao atual
# situacao
return materias
return self.render_to_response(context)
class ProposicaoView(CreateView):

2
parlamentares/models.py

@ -239,8 +239,6 @@ class Parlamentar(models.Model):
biografia = models.TextField(
blank=True, verbose_name=_('Biografia'))
# XXX Esse atribuito foi colocado aqui para não atrapalhar a migração
unidade_deliberativa = models.BooleanField(
default=False, verbose_name=_('Unidade Deliberativa'))
fotografia = models.ImageField(
blank=True,
null=True,

6
parlamentares/test_parlamentares_urls.py

@ -1,6 +0,0 @@
from django.core.urlresolvers import reverse
def test_urls_materia():
st = reverse('materia:pesquisar_materia_list')
assert st == '/materia/pesquisar-materia-list'

1
requirements/requirements.txt

@ -7,6 +7,7 @@ django-compressor==2.0
django-crispy-forms==1.6.0
python-decouple==3.0
django-extra-views==0.7.1
django-filter==0.13.0
django-model-utils==2.4
django-sass-processor==0.3.4
django==1.9.5

7
sapl/settings.py

@ -122,8 +122,8 @@ EMAIL_HOST_USER = config('EMAIL_HOST_USER', cast=str)
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD', cast=str)
EMAIL_PORT = config('EMAIL_PORT', cast=int)
MAX_DOC_UPLOAD_SIZE = 5*1024*1024 # 5MB
MAX_IMAGE_UPLOAD_SIZE = 2*1024*1024 # 2MB
MAX_DOC_UPLOAD_SIZE = 5 * 1024 * 1024 # 5MB
MAX_IMAGE_UPLOAD_SIZE = 2 * 1024 * 1024 # 2MB
# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/
@ -187,3 +187,6 @@ SASS_PROCESSOR_INCLUDE_DIRS = (BOWER_COMPONENTS_ROOT.child(
# hack to suppress many annoying warnings from crispy_forms
# see sapl.temp_suppress_crispy_form_warnings
LOGGING = SUPRESS_CRISPY_FORM_WARNINGS_LOGGING
# suprime texto de ajuda default do django-filter
FILTERS_HELP_TEXT_FILTER = False

10
static/js/app.js

@ -105,9 +105,17 @@ function autorModal() {
id = res.val();
nome = res.text();
$("#id_autor").val(id);
$("#nome_autor").text(nome);
// MateriaLegislativa pesquisa Autor via a tabela Autoria
if ($('#id_autoria__autor').length) {
$('#id_autoria__autor').val(id);
}
// Protocolo pesquisa a própria tabela de Autor
if ($('#id_autor').length) {
$("#id_autor").val(id);
}
dialog.dialog( "close" );
});
});

48
templates/materia/materialegislativa_filter.html

@ -0,0 +1,48 @@
{% extends "materia/materialegislativa_detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %}{% endblock %}
{% block sections_nav %} {% endblock %}
{% block detail_content %}
<h1><b>Pesquisar Matéria</b></h1>
<br></br>
{% crispy filter.form %}
<p></p>
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr><td><h3>Resultados</h3></td></tr>
</thead>
{% if page_obj|length %}
{% if numero_res > 1 %}
<h3>Pesquisa concluída com sucesso! Foram encontradas {{numero_res}} matérias.</h3>
{% elif numero_res == 1 %}
<h3>Pesquisa concluída com sucesso! Foi encontrada {{numero_res}} matéria.</h3>
{% endif %}
{% for m in page_obj %}
<tr>
<td>
<strong><a href="{% url 'materia:materialegislativa_detail' m.id %}">{{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}</strong></a></br>
{{ m.ementa|safe }}</br>
<strong>Localização Atual:</strong> {{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não Informada"}}</br>
<p></p>
</tr>
{% endfor %}
{% else %}
<tr>
<td>
<h3>Nenhuma matéria encontrada com essas especificações</h3>
</tr>
{% endif %}
</table>
{% include "paginacao.html" %}
{% endblock detail_content %}

8
templates/materia/pesquisa_materia.html

@ -1,8 +0,0 @@
{% extends "materia/materialegislativa_detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %}{% endblock %}
{% block sections_nav %}{% endblock %}
{% block detail_content %}
{% crispy form %}
{% endblock %}

26
templates/materia/pesquisa_materia_list.html

@ -1,26 +0,0 @@
{% extends "materia/materialegislativa_detail.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block actions %}{% endblock %}
{% block sections_nav %} {% endblock %}
{% block detail_content %}
{% if materias %}
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr><td><h3>Resultados</h3></td></tr>
</thead>
{% for m in materias %}
<tr>
<td>
<strong><a href="{% url 'materia:materialegislativa_detail' m.id %}">{{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}</strong></a></br>
{{ m.ementa|safe }}</br>
<strong>Localização Atual:</strong> {{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não Informada"}}</br>
<p></p>
</tr>
{% endfor %}
</table>
{% include "paginacao.html" %}
{% else %}
<h2>Nenhum Registro recuperado</h2>
{% endif %}
{% endblock detail_content %}

10
templates/materia/proposicao/proposicao_list.html

@ -3,16 +3,16 @@
{% load crispy_forms_tags %}
{% block actions %}<!-- Remvoer botões 'Editar' e 'Excluir' -->{% endblock %}
<!--
{% block sections_nav %}
{% endblock %} -->
{% endblock %}
{% block detail_content %}
<div class="actions btn-group pull-right" role="group">
<h2><b>Proposições</b></h2>
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'materia:adicionar_proposicao' %}" class="btn btn-default">Nova Proposição</a>
</div>
<h2><b>Proposições</b></h2>
</div>
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>

6
templates/paginacao.html

@ -3,7 +3,7 @@
<ul class="pagination">
{% if page_obj.has_previous %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.previous_page_number }}">
<a class="page-link" href="?page={{ page_obj.previous_page_number }}{{filter_url}}">
<span class="pager-prev">Anterior</span>
</a>
</li>
@ -18,14 +18,14 @@
</li>
{% else %}
<li {% if page == page_obj.number %} class="page-item active" {% endif %}>
<a class="page-link" href="?page={{ page }}">{{ page }}</a>
<a class="page-link" href="?page={{ page }}{{filter_url}}">{{ page }}</a>
</li>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.next_page_number }}">
<a class="page-link" href="?page={{ page_obj.next_page_number }}{{filter_url}}">
<span class="pager-next">Próxima</span>
</a>
</li>

Loading…
Cancel
Save