Browse Source

Refatora formulário de pesquisa de matérias

pull/2448/head
Leandro Roberto 6 years ago
parent
commit
5fff880249
  1. 153
      sapl/materia/forms.py
  2. 41
      sapl/materia/migrations/0036_auto_20190106_0330.py
  3. 16
      sapl/materia/models.py
  4. 78
      sapl/materia/views.py
  5. 3
      sapl/parlamentares/models.py
  6. 156
      sapl/templates/materia/materialegislativa_filter.html

153
sapl/materia/forms.py

@ -12,7 +12,7 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.files.base import File
from django.core.urlresolvers import reverse
from django.db import models, transaction
from django.db.models import Max
from django.db.models import Max, Q, F
from django.forms import ModelChoiceField, ModelForm, widgets
from django.forms.forms import Form
from django.forms.models import ModelMultipleChoiceField
@ -37,7 +37,7 @@ from sapl.materia.models import (AssuntoMateria, Autoria, MateriaAssunto,
UnidadeTramitacao)
from sapl.norma.models import (LegislacaoCitada, NormaJuridica,
TipoNormaJuridica)
from sapl.parlamentares.models import Legislatura
from sapl.parlamentares.models import Legislatura, Partido
from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo
from sapl.settings import MAX_DOC_UPLOAD_SIZE
from sapl.utils import (YES_NO_CHOICES, SEPARADOR_HASH_PROPOSICAO,
@ -52,12 +52,19 @@ from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial,
TipoMateriaLegislativa, Tramitacao, UnidadeTramitacao)
def em_tramitacao():
def CHOICE_TRAMITACAO():
return [('', 'Tanto Faz'),
(1, 'Sim'),
(0, 'Não')]
def CHOICE_TIPO_LISTAGEM():
return [
(1, _('Detalhada')),
(2, _('Simplificada')),
]
class AdicionarVariasAutoriasFilterSet(django_filters.FilterSet):
class Meta:
@ -767,32 +774,43 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
autoria__primeiro_autor = django_filters.BooleanFilter(
required=False,
label='Primeiro Autor',
widget=forms.HiddenInput())
label=_('Primeiro Autor'))
ementa = django_filters.CharFilter(lookup_expr='icontains')
autoria__autor__parlamentar_set__filiacao__partido = django_filters.ModelChoiceFilter(
queryset=Partido.objects.all(),
label=_('Matérias por Partido'))
ementa = django_filters.CharFilter(
label=_('Pesquisar expressões na ementa'),
method='filter_ementa'
)
indexacao = django_filters.CharFilter(lookup_expr='icontains',
label=_('Indexação'))
em_tramitacao = django_filters.ChoiceFilter(required=False,
label='Em tramitação',
choices=em_tramitacao)
choices=CHOICE_TRAMITACAO)
materiaassunto__assunto = django_filters.ModelChoiceFilter(
queryset=AssuntoMateria.objects.all(),
label=_('Assunto da Matéria'))
label=_('Assunto'))
numeracao__numero_materia = django_filters.NumberFilter(
required=False,
label=_('Número do Processo'))
label=_('Número do processo'))
o = MateriaPesquisaOrderingFilter(help_text='')
o = MateriaPesquisaOrderingFilter()
tipo_listagem = forms.ChoiceField(
required=True,
choices=CHOICE_TIPO_LISTAGEM,
label=_('Tipo da Listagem do Resultado da Pesquisa'))
class Meta:
filter_overrides = {models.DateField: {
'filter_class': django_filters.DateFromToRangeFilter,
'extra': lambda f: {
'label': '%s (%s)' % (f.verbose_name, _('Inicial Final')),
'label': '%s (%s)' % (f.verbose_name, _('Inicial / Final')),
'widget': RangeWidgetOverride}
}}
model = MateriaLegislativa
@ -805,7 +823,7 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
'data_publicacao',
'autoria__autor__tipo',
'autoria__primeiro_autor',
# FIXME 'autoria__autor__partido',
'autoria__autor__parlamentar_set__filiacao__partido',
'relatoria__parlamentar_id',
'local_origem_externa',
'tramitacao__unidade_tramitacao_destino',
@ -814,16 +832,36 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
'em_tramitacao',
]
def filter_ementa(self, queryset, name, value):
texto = value.split()
q = Q()
for t in texto:
q &= Q(ementa__icontains=t)
return queryset.filter(q)
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__autor__partido'].label = 'Partido do Autor'
self.filters['relatoria__parlamentar_id'].label = 'Relatoria'
# self.filters['tipo'].label = 'Tipo de Matéria'
self.filters[
'autoria__autor__parlamentar_set__filiacao__partido'
].label = 'Partido do Autor'
self.filters['autoria__autor__tipo'].label = _('Tipo de Autor')
self.filters['relatoria__parlamentar_id'].label = _('Relatoria')
self.filters['tramitacao__unidade_tramitacao_destino'].label = _(
'Unidade de tramitação atual')
self.filters['tramitacao__status'].label = _(
'Status da tramitação atual')
self.filters['tramitacao__status'].label = _(
'Status da tramitação atual')
self.filters['o'].label = _('Ordenação')
self.form.fields['tipo_listagem'] = self.tipo_listagem
row1 = to_row(
[('tipo', 12)])
[('tipo', 5), ('ementa', 7)])
row2 = to_row(
[('numero', 3),
('numeracao__numero_materia', 3),
@ -832,47 +870,78 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
row3 = to_row(
[('data_apresentacao', 6),
('data_publicacao', 6)])
row4 = to_row(
[('autoria__autor', 0),
('autoria__primeiro_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 = to_row(
[('autoria__autor__tipo', 12),
# ('autoria__autor__partido', 6)
])
row4 = to_row([
('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'), 2),
('autoria__primeiro_autor', 2),
('autoria__autor__tipo', 3),
('autoria__autor__parlamentar_set__filiacao__partido', 3)
])
row6 = to_row(
[('relatoria__parlamentar_id', 6),
('local_origem_externa', 6)])
row7 = to_row(
[('tramitacao__unidade_tramitacao_destino', 6),
('tramitacao__status', 6)])
row8 = to_row(
[('em_tramitacao', 6),
('o', 6)])
[('tramitacao__unidade_tramitacao_destino', 5),
('tramitacao__status', 5),
('em_tramitacao', 2)
])
row9 = to_row(
[('materiaassunto__assunto', 6), ('indexacao', 6)])
row10 = to_row(
[('ementa', 12)])
row8 = to_row(
[
('o', 8),
('tipo_listagem', 4)
])
self.form.helper = FormHelper()
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Pesquisa de Matéria'),
row1, row2, row3,
Fieldset(_('Pesquisa Básica'),
row1, row2),
Fieldset(_('Como listar os resultados da pesquisa'),
row8
),
Fieldset(_('Pesquisa Avançada'),
row3,
HTML(autor_label),
HTML(autor_modal),
row4, row5, row6, row7, row8, row9, row10,
form_actions(label='Pesquisar'))
row4, row6, row7, row9,
form_actions(label=_('Pesquisar')))
)
@property
def qs(self):
return qs_override_django_filter(self)
qs = qs_override_django_filter(self)
if hasattr(self.form, 'cleaned_data') and self.form.cleaned_data[
'autoria__autor__parlamentar_set__filiacao__partido']:
q_data_inicio_e_fim = Q(data_apresentacao__gte=F(
'autoria__autor__parlamentar_set__filiacao__data'),
data_apresentacao__lte=F(
'autoria__autor__parlamentar_set__filiacao__data_desfiliacao'))
q_data_inicio = Q(
data_apresentacao__gte=F(
'autoria__autor__parlamentar_set__filiacao__data'),
autoria__autor__parlamentar_set__filiacao__data_desfiliacao__isnull=True
)
qs = qs.filter(
q_data_inicio_e_fim | q_data_inicio
)
return qs
def pega_ultima_tramitacao():

41
sapl/materia/migrations/0036_auto_20190106_0330.py

@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.8 on 2019-01-06 05:30
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('materia', '0035_auto_20190104_1021'),
]
operations = [
migrations.AlterField(
model_name='materialegislativa',
name='data_apresentacao',
field=models.DateField(verbose_name='Data de Apresentação'),
),
migrations.AlterField(
model_name='materialegislativa',
name='data_publicacao',
field=models.DateField(blank=True, null=True, verbose_name='Data de Publicação'),
),
migrations.AlterField(
model_name='materialegislativa',
name='local_origem_externa',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.Origem', verbose_name='Local de Origem'),
),
migrations.AlterField(
model_name='materialegislativa',
name='numero_protocolo',
field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Número do Protocolo'),
),
migrations.AlterField(
model_name='materialegislativa',
name='tipo',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='materia.TipoMateriaLegislativa', verbose_name='Tipo de Matéria Legislativa'),
),
]

16
sapl/materia/models.py

@ -142,15 +142,17 @@ def anexo_upload_path(instance, filename):
@reversion.register()
class MateriaLegislativa(models.Model):
tipo = models.ForeignKey(TipoMateriaLegislativa,
on_delete=models.PROTECT,
verbose_name=_('Tipo'))
tipo = models.ForeignKey(
TipoMateriaLegislativa,
on_delete=models.PROTECT,
verbose_name=TipoMateriaLegislativa._meta.verbose_name)
numero = models.PositiveIntegerField(verbose_name=_('Número'))
ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'),
choices=RANGE_ANOS)
numero_protocolo = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Núm. Protocolo'))
data_apresentacao = models.DateField(verbose_name=_('Data Apresentação'))
blank=True, null=True, verbose_name=_('Número do Protocolo'))
data_apresentacao = models.DateField(
verbose_name=_('Data de Apresentação'))
tipo_apresentacao = models.CharField(
max_length=1, blank=True,
verbose_name=_('Tipo de Apresentação'),
@ -160,7 +162,7 @@ class MateriaLegislativa(models.Model):
on_delete=models.PROTECT,
verbose_name=_('Regime Tramitação'))
data_publicacao = models.DateField(
blank=True, null=True, verbose_name=_('Data Publicação'))
blank=True, null=True, verbose_name=_('Data de Publicação'))
tipo_origem_externa = models.ForeignKey(
TipoMateriaLegislativa,
blank=True,
@ -176,7 +178,7 @@ class MateriaLegislativa(models.Model):
blank=True, null=True, verbose_name=_('Data'))
local_origem_externa = models.ForeignKey(
Origem, blank=True, null=True,
on_delete=models.PROTECT, verbose_name=_('Local Origem'))
on_delete=models.PROTECT, verbose_name=_('Local de Origem'))
apelido = models.CharField(
max_length=50, blank=True, verbose_name=_('Apelido'))
dias_prazo = models.PositiveIntegerField(

78
sapl/materia/views.py

@ -1747,42 +1747,52 @@ class MateriaLegislativaPesquisaView(FilterView):
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')
tipo_listagem = self.request.GET.get('tipo_listagem', '1')
tipo_listagem = '1' if not tipo_listagem else tipo_listagem
qs = self.get_queryset().distinct()
if tipo_listagem == '1':
status_tramitacao = self.request.GET.get('tramitacao__status')
unidade_destino = self.request.GET.get(
'tramitacao__unidade_tramitacao_destino')
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()
qs = qs.prefetch_related("autoria_set",
"autoria_set__autor",
"numeracao_set",
"anexadas",
"tipo",
"texto_articulado",
"tramitacao_set",
"tramitacao_set__status",
"tramitacao_set__unidade_tramitacao_local",
"tramitacao_set__unidade_tramitacao_destino",
"normajuridica_set",
"registrovotacao_set",
"documentoacessorio_set")
else:
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()
qs = qs.prefetch_related("autoria_set",
"numeracao_set",
"autoria_set__autor",
"tipo",)
if 'o' in self.request.GET and not self.request.GET['o']:
qs = qs.order_by('-ano', 'tipo__sigla', '-numero')
qs = qs.prefetch_related("autoria_set",
"autoria_set__autor",
"numeracao_set",
"anexadas",
"tipo",
"texto_articulado",
"tramitacao_set",
"tramitacao_set__status",
"tramitacao_set__unidade_tramitacao_local",
"tramitacao_set__unidade_tramitacao_destino",
"normajuridica_set",
"registrovotacao_set",
"documentoacessorio_set")
kwargs.update({
'queryset': qs,
})
@ -1794,7 +1804,10 @@ class MateriaLegislativaPesquisaView(FilterView):
context['title'] = _('Pesquisar Matéria Legislativa')
self.filterset.form.fields['o'].label = _('Ordenação')
tipo_listagem = self.request.GET.get('tipo_listagem', '1')
tipo_listagem = '1' if not tipo_listagem else tipo_listagem
context['tipo_listagem'] = tipo_listagem
qr = self.request.GET.copy()
if 'page' in qr:
@ -1810,7 +1823,8 @@ class MateriaLegislativaPesquisaView(FilterView):
context['show_results'] = show_results_filter_set(qr)
context['USE_SOLR'] = settings.USE_SOLR if hasattr(settings, 'USE_SOLR') else False
context['USE_SOLR'] = settings.USE_SOLR if hasattr(
settings, 'USE_SOLR') else False
return context
@ -2067,7 +2081,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView):
for materia_id in marcadas:
try:
data_tramitacao = tz.localize(datetime.strptime(
request.POST['data_tramitacao'], "%d/%m/%Y"))
request.POST['data_tramitacao'], "%d/%m/%Y"))
except ValueError:
msg = _('Formato da data da tramitação incorreto.')
messages.add_message(request, messages.ERROR, msg)

3
sapl/parlamentares/models.py

@ -1,10 +1,10 @@
import reversion
from django.db import models
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from image_cropping.fields import ImageCropField, ImageRatioField
from model_utils import Choices
import reversion
from sapl.base.models import Autor
from sapl.decorators import vigencia_atual
@ -281,6 +281,7 @@ class Parlamentar(models.Model):
('nome_completo', '__icontains'),
('nome_parlamentar', '__icontains'),
('filiacao__partido__sigla', '__icontains'),
('filiacao__partido', '__exact'),
))
class Meta:

156
sapl/templates/materia/materialegislativa_filter.html

@ -34,7 +34,11 @@
</thead>
{% if paginator.count %}
{% if paginator.count > 1 %}
<h3>{% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}</h3>
{% if not tipo_listagem or tipo_listagem == '1' %}
<h3>{% blocktrans with paginator.count as total_materias %}Pesquisa detalhada concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}</h3>
{% else %}
<h3>{% blocktrans with paginator.count as total_materias %}Pesquisa simplificada concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}</h3>
{% endif %}
{% elif paginator.count == 1 %}
<h3>{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}</h3>
{% endif %}
@ -63,92 +67,96 @@
{% endif %}
{% if m.autoria_set.all %}
<strong>Autor:</strong>
{% for a in m.autoria_set.all %}
<strong>Autor:</strong>
{% for a in m.autoria_set.all %}
{% if not forloop.first %}
</br> {{a.autor}}
{% else %}
&nbsp;{{a.autor}}
{% endif %}
{% endfor %}
</br>
{% endif %}
{% if m.tramitacao_set.last.unidade_tramitacao_destino %}
<strong>Localização Atual:</strong> &nbsp;{{m.tramitacao_set.last.unidade_tramitacao_destino}}</br>
{% endif %}
{% if m.tramitacao_set.last.status %}
<strong>Status:</strong> &nbsp;{{m.tramitacao_set.last.status}}</br>
<strong>Data Fim Prazo (Tramitação):</strong>&nbsp;{{m.tramitacao_set.last.data_fim_prazo|default_if_none:""}}</br>
{% endif %}
{% if m.registrovotacao_set.exists %}
<strong>Data Votação:</strong>
{% for rv in m.registrovotacao_set.all %}
{% if rv.ordem %}
<a href="{% url 'sapl.sessao:ordemdia_list' rv.ordem.sessao_plenaria_id %}">
{{ rv.ordem.sessao_plenaria.data_inicio }}
</a>
{% elif rv.expediente %}
<a href="{% url 'sapl.sessao:expedientemateria_list' rv.expediente.sessao_plenaria_id %}">
{{ rv.expediente.sessao_plenaria.data_inicio }}
</a>
{% endif %}
</br>
{% endfor %}
{% endif %}
{% if m.tramitacao_set.last.data_tramitacao %}
<strong>Data da última Tramitação:</strong> &nbsp;{{m.tramitacao_set.last.data_tramitacao}}</br>
<strong>Ultima Ação:</strong> &nbsp; {{m.tramitacao_set.last.texto}}</br>
{% endif %}
{% if m.anexo_de.exists %}
{% for a in m.materia_anexada_set.all %}
<strong>Matéria Anexadora: </strong>&nbsp;
<a href="{% url 'sapl.materia:materialegislativa_detail' a.materia_principal.id %}">
{{ a.materia_principal }}&nbsp;
</a>
<strong>Data Anexação:</strong> {{a.data_anexacao}}
</br>
{% endfor %}
{% endif %}
{% if m.anexadas.all.exists %}
{% for anexada in m.materia_principal_set.all %}
<strong>Matéria Anexada: </strong>&nbsp;
<a href="{% url 'sapl.materia:materialegislativa_detail' anexada.materia_anexada.id %}">
{{ anexada.materia_anexada }}&nbsp;
</a>
<strong>Data Anexação:</strong> {{anexada.data_anexacao}}
</br>
{% endfor %}
{% endif %}
{% if m.documentoacessorio_set.all.exists %}
<strong>Documentos Acessórios:</strong>
<a href="{% url 'sapl.materia:documentoacessorio_list' m.id %}">
{{ m.documentoacessorio_set.all.count }}
{% if not tipo_listagem or tipo_listagem == '1' %}
{% if m.tramitacao_set.last.unidade_tramitacao_destino %}
<strong>Localização Atual:</strong> &nbsp;{{m.tramitacao_set.last.unidade_tramitacao_destino}}</br>
{% endif %}
{% if m.tramitacao_set.last.status %}
<strong>Status:</strong> &nbsp;{{m.tramitacao_set.last.status}}</br>
<strong>Data Fim Prazo (Tramitação):</strong>&nbsp;{{m.tramitacao_set.last.data_fim_prazo|default_if_none:""}}</br>
{% endif %}
{% if m.registrovotacao_set.exists %}
<strong>Data Votação:</strong>
{% for rv in m.registrovotacao_set.all %}
{% if rv.ordem %}
<a href="{% url 'sapl.sessao:ordemdia_list' rv.ordem.sessao_plenaria_id %}">
{{ rv.ordem.sessao_plenaria.data_inicio }}
</a>
{% elif rv.expediente %}
<a href="{% url 'sapl.sessao:expedientemateria_list' rv.expediente.sessao_plenaria_id %}">
{{ rv.expediente.sessao_plenaria.data_inicio }}
</a>
{% endif %}
</br>
{% endfor %}
{% endif %}
{% if m.tramitacao_set.last.data_tramitacao %}
<strong>Data da última Tramitação:</strong> &nbsp;{{m.tramitacao_set.last.data_tramitacao}}</br>
<strong>Ultima Ação:</strong> &nbsp; {{m.tramitacao_set.last.texto}}</br>
{% endif %}
{% if m.anexo_de.exists %}
{% for a in m.materia_anexada_set.all %}
<strong>Matéria Anexadora: </strong>&nbsp;
<a href="{% url 'sapl.materia:materialegislativa_detail' a.materia_principal.id %}">
{{ a.materia_principal }}&nbsp;
</a>
<strong>Data Anexação:</strong> {{a.data_anexacao}}
</br>
{% endif %}
{% if m.texto_original %}<strong><a href="{{m.texto_original.url}}">Texto Original</a></strong></br>{% endif %}
{% if m.texto_articulado.exists %}<strong><a href="{% url 'sapl.materia:materia_ta' m.id%}">Texto Articulado</a></strong></br>{% endif %}
{% if m.normajuridica_set.exists %}
{% for nr in m.normajuridica_set.all %}
<strong>Norma Jurídica Vinculada: </strong>
<a href="{% url 'sapl.norma:normajuridica_detail' nr.id %}">
{{ nr }}
{% endfor %}
{% endif %}
{% if m.anexadas.all.exists %}
{% for anexada in m.materia_principal_set.all %}
<strong>Matéria Anexada: </strong>&nbsp;
<a href="{% url 'sapl.materia:materialegislativa_detail' anexada.materia_anexada.id %}">
{{ anexada.materia_anexada }}&nbsp;
</a>
<strong>Data Anexação:</strong> {{anexada.data_anexacao}}
</br>
{% endfor %}
{% endif %}
{% if m.documentoacessorio_set.all.exists %}
<strong>Documentos Acessórios:</strong>
<a href="{% url 'sapl.materia:documentoacessorio_list' m.id %}">
{{ m.documentoacessorio_set.all.count }}
</a>
</br>
{% endif %}
{% if m.texto_original %}<strong><a href="{{m.texto_original.url}}">Texto Original</a></strong></br>{% endif %}
{% if m.texto_articulado.exists %}<strong><a href="{% url 'sapl.materia:materia_ta' m.id%}">Texto Articulado</a></strong></br>{% endif %}
{% if m.normajuridica_set.exists %}
{% for nr in m.normajuridica_set.all %}
<strong>Norma Jurídica Vinculada: </strong>
<a href="{% url 'sapl.norma:normajuridica_detail' nr.id %}">
{{ nr }}
</a>
</br>
{% endfor %}
{% endif %}
{% if m.audienciapublica_set.exists %}
<strong>Audiência(s) Pública(s): </strong>
{% for ap in m.audienciapublica_set.all %}
<a href="{% url 'sapl.audiencia:audienciapublica_detail' ap.id %}">
{{ ap.nome }}
</a>
{% if not forloop.last %},&nbsp;{% endif %}
{% endfor %}
{% endif %}
{% if m.audienciapublica_set.exists %}
<strong>Audiência(s) Pública(s): </strong>
{% for ap in m.audienciapublica_set.all %}
<a href="{% url 'sapl.audiencia:audienciapublica_detail' ap.id %}">
{{ ap.nome }}
</a>
{% if not forloop.last %},&nbsp;{% endif %}
{% endfor %}
{% endif %}
<p></p>
{% if m.em_tramitacao and mail_service_configured %}
<a href="{% url 'sapl.materia:acompanhar_materia' m.id %}">Acompanhar Matéria</a>
{% endif %}
<p></p>
{% if m.em_tramitacao and mail_service_configured %}
<a href="{% url 'sapl.materia:acompanhar_materia' m.id %}">Acompanhar Matéria</a>
{% endif %}
{% endif %}
</td>
</tr>

Loading…
Cancel
Save