Browse Source

Fix #2161 - Alteração de nome de Partido (#2608)

* Fix #2161 - Criação de historico de partido.

Co-authored-by: Cesar Carvalho <cesaraugc@gmail.com>
Co-authored-by: ulyssesBML <ulysses3353@gmail.com>

Aprimorando historico partido para armanzenar varias alterações

Corrigindo migrations e adaptando historico na lista de parlamentares

Adicionando data de alteração a update de partido para o uso de historico

Arrumando erros de grupos e de histoico nulo

Adicionando apagar historico e corrigindo erros

mudando estrutura de historico

Mudando nomes de partidos de acordo com a data no escopo de filiação de paramentares

Resolvendo bug da tabela de historico e arrumando htmls com partido atual

Removendo campo proximo não utilizado em historico do partido

* Concertando questões relatados no PR

* Aprimorando validação de datas no historico

* Resolvendo code climate

* Add migration

* Iniciando correcoes do pr

* Refazendo migrações

* Colocando botão de voltar

* Arrumando conflito migração
pull/2824/head
Vinícius Cantuária 6 years ago
committed by Edward
parent
commit
26ed1c606a
  1. 155
      sapl/base/forms.py
  2. 9
      sapl/parlamentares/migrations/0023_auto_20180626_1524.py
  3. 6
      sapl/parlamentares/migrations/0026_bloco.py
  4. 19
      sapl/parlamentares/migrations/0027_auto_20190430_0839.py
  5. 34
      sapl/parlamentares/migrations/0027_auto_20190517_1050.py
  6. 2
      sapl/parlamentares/migrations/0028_auto_20190515_1744.py
  7. 72
      sapl/parlamentares/models.py
  8. 9
      sapl/parlamentares/urls.py
  9. 39
      sapl/parlamentares/views.py
  10. 1
      sapl/rules/map_rules.py
  11. 2
      sapl/sessao/views.py
  12. 53
      sapl/templates/parlamentares/partido_detail.html
  13. 40
      sapl/templates/parlamentares/partido_update.html
  14. 4
      sapl/utils.py

155
sapl/base/forms.py

@ -1,9 +1,9 @@
import logging
import os
from crispy_forms.bootstrap import FieldWithButtons, InlineRadios, StrictButton
from crispy_forms.bootstrap import FieldWithButtons, InlineRadios, StrictButton, FormActions
from sapl.crispy_layout_mixin import SaplFormHelper
from crispy_forms.layout import HTML, Button, Div, Field, Fieldset, Layout, Row
from crispy_forms.layout import HTML, Button, Div, Field, Fieldset, Layout, Row, Submit
from django import forms
from django.conf import settings
from django.contrib.auth import get_user_model
@ -29,8 +29,8 @@ from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column,
from sapl.materia.models import (
MateriaLegislativa, UnidadeTramitacao, StatusTramitacao)
from sapl.norma.models import (NormaJuridica, NormaEstatisticas)
from sapl.parlamentares.models import SessaoLegislativa, Partido
from sapl.protocoloadm.models import DocumentoAdministrativo
from sapl.parlamentares.models import SessaoLegislativa, Partido, HistoricoPartido
from sapl.sessao.models import SessaoPlenaria
from sapl.settings import MAX_IMAGE_UPLOAD_SIZE
from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES,
@ -38,8 +38,10 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES,
RangeWidgetOverride, autor_label, autor_modal,
models_with_gr_for_model, qs_override_django_filter,
choice_anos_com_normas, choice_anos_com_materias,
FilterOverridesMetaMixin, FileFieldCheckMixin)
FilterOverridesMetaMixin, FileFieldCheckMixin,
intervalos_tem_intersecao)
from .models import AppConfig, CasaLegislativa
from operator import xor
ACTION_CREATE_USERS_AUTOR_CHOICE = [
@ -151,9 +153,9 @@ class UsuarioCreateForm(ModelForm):
class UsuarioFilterSet(django_filters.FilterSet):
username = django_filters.CharFilter(
label=_('Nome de Usuário'),
label=_('Nome de Usuário'),
lookup_expr='icontains')
class Meta:
@ -164,7 +166,7 @@ class UsuarioFilterSet(django_filters.FilterSet):
super(UsuarioFilterSet, self).__init__(*args, **kwargs)
row0 = to_row([('username', 12)])
self.form.helper = SaplFormHelper()
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
@ -1393,42 +1395,140 @@ class PartidoForm(FileFieldCheckMixin, ModelForm):
model = Partido
exclude = []
def __init__(self, *args, **kwargs):
super(PartidoForm, self).__init__(*args, **kwargs)
# TODO Utilizar esses campos na issue #2161 de alteração de nomes de partidos
# if self.instance:
# if self.instance.nome:
# self.fields['nome'].widget.attrs['readonly'] = True
# self.fields['sigla'].widget.attrs['readonly'] = True
def __init__(self, pk=None, *args, **kwargs):
super().__init__(*args, **kwargs)
row1 = to_row(
[('sigla', 2),
('nome', 6),
('data_criacao', 2),
('data_extincao', 2),])
row1 = to_row([
('sigla', 2),
('nome', 6),
('data_criacao', 2),
('data_extincao', 2)
]
)
row2 = to_row([('observacao', 12)])
row3 = to_row([('logo_partido', 12)])
self.helper = SaplFormHelper()
self.helper.layout = Layout(
row1, row2, row3,
form_actions(label='Salvar'))
form_actions(label='Salvar')
)
def clean(self):
super(PartidoForm,self).clean()
cleaned_data = self.cleaned_data
if not self.is_valid():
return cleaned_data
if cleaned_data['data_criacao'] and cleaned_data['data_extincao'] and cleaned_data['data_criacao'] > \
cleaned_data['data_extincao']:
raise ValidationError("Certifique-se de que a data de criação seja anterior à data de extinção.")
if self.instance.pk:
partido = Partido.objects.get(pk=self.instance.pk)
if xor(cleaned_data['sigla'] == partido.sigla, cleaned_data['nome'] == partido.nome):
raise ValidationError(_('O Partido deve ter um novo nome e uma nova sigla.'))
cleaned_data.update({'partido': partido})
return cleaned_data
class PartidoUpdateForm(PartidoForm):
opcoes = YES_NO_CHOICES
historico = forms.ChoiceField(initial=False, choices=opcoes)
cleaned_data = super(PartidoForm, self).clean()
class Meta:
model = Partido
exclude = []
def __init__(self, pk=None, *args, **kwargs):
super().__init__(*args, **kwargs)
row1 = to_row([
('sigla', 6),
('nome', 6),
]
)
row2 = to_row([
('historico', 2),
('data_criacao', 5),
('data_extincao', 5),
]
)
row3 = to_row([('observacao', 12)])
row4 = to_row([('logo_partido', 12)])
buttons = FormActions(
*[
HTML('''<a href="/sistema/parlamentar/partido/{{object.id}}" class="btn btn-dark btn-close-container">%s</a>''' % _('Cancelar'))
],
Submit('salvar', _('Salvar'), css_class='float-right',
onclick='return true;'),
css_class='form-group row justify-content-between'
)
self.helper = SaplFormHelper()
self.helper.layout = Layout(
row1, row2, row3, row4, to_row([(buttons, 12)]),
)
def clean(self):
cleaned_data = super(PartidoUpdateForm,self).clean()
if not self.is_valid():
return cleaned_data
if cleaned_data['data_criacao'] and cleaned_data['data_extincao']:
if cleaned_data['data_criacao'] > cleaned_data['data_extincao']:
raise ValidationError("Certifique-se de que a data de criação seja anterior à data de extinção.")
is_historico = cleaned_data['historico'] == 'True'
if is_historico:
if not (cleaned_data['data_criacao'] and cleaned_data['data_extincao']):
raise ValidationError("Certifique-se de que a data de inicio e fim de historico estão preenchidas")
if self.instance.data_criacao and self.instance.data_criacao > cleaned_data['data_criacao']:
raise ValidationError("Data de inicio de historico deve ser posterior a data de criação do partido.")
if self.instance.data_extincao and self.instance.data_extincao < cleaned_data['data_extincao']:
raise ValidationError("Data de fim de historico deve ser anterior a data de extinção do partido.")
if self.instance.pk:
partido = Partido.objects.get(pk=self.instance.pk)
historico = HistoricoPartido.objects.filter(partido=partido).order_by('-inicio_historico')
for h in historico:
if intervalos_tem_intersecao(h.inicio_historico,
h.fim_historico,
cleaned_data['data_criacao'],
cleaned_data['data_extincao']):
raise ValidationError("Periodo selecionado ja possui um histórico.")
return cleaned_data
def save(self,commit=False):
partido = self.instance
cleaned_data = self.cleaned_data
is_historico = cleaned_data['historico'] == 'True'
if not is_historico:
partido.save(commit)
else:
sigla = self.cleaned_data['sigla']
nome = self.cleaned_data['nome']
inicio_historico = self.cleaned_data['data_criacao']
fim_historico = self.cleaned_data['data_extincao']
logo_partido = self.cleaned_data['logo_partido']
historico_partido = HistoricoPartido(sigla=sigla,
nome=nome,
inicio_historico=inicio_historico,
fim_historico=fim_historico,
logo_partido=logo_partido,
partido=partido,
)
historico_partido.save()
return partido
class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet):
@ -1467,3 +1567,4 @@ class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet):
row1, row2, row3,
form_actions(label='Pesquisar'))
)

9
sapl/parlamentares/migrations/0023_auto_20180626_1524.py

@ -1,12 +1,12 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-03-13 17:48
from __future__ import unicode_literals
from django.db import migrations
from django.core.management import call_command
import json
import os
from django.core.management import call_command
def gera_partidos_tse(apps, schema_editor):
Partido = apps.get_model("parlamentares", "Partido")
@ -27,13 +27,10 @@ def gera_partidos_tse(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
# A dependencia real desse script é o arquivo 0001_initial.py, mas
# isso gera um erro (Conflicting migrations detected; multiple leaf
# nodes in the migration graph). para não ocasionar problemas de migração,
# vamos manter a ordem padrão do django.
('parlamentares', '0022_partido_observacao'),
]
operations = [
migrations.RunPython(gera_partidos_tse),
]

6
sapl/parlamentares/migrations/0026_bloco.py

@ -3,6 +3,7 @@
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
@ -30,6 +31,11 @@ class Migration(migrations.Migration):
},
bases=(models.Model,),
),
migrations.AlterField(
model_name='composicaocoligacao',
name='partido',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='parlamentares.Partido', verbose_name='Partidos da Coligação'),
),
]
operations = [

19
sapl/parlamentares/migrations/0027_auto_20190430_0839.py

@ -1,19 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-04-30 11:39
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0026_bloco'),
]
operations = [
migrations.AlterModelTable(
name='bloco',
table=None,
),
]

34
sapl/parlamentares/migrations/0027_auto_20190517_1050.py

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-17 13:50
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import sapl.parlamentares.models
import sapl.utils
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0026_bloco'),
]
operations = [
migrations.CreateModel(
name='HistoricoPartido',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sigla', models.CharField(max_length=9, verbose_name='Sigla')),
('nome', models.CharField(max_length=50, verbose_name='Nome')),
('inicio_historico', models.DateField(verbose_name='Data Alteração')),
('fim_historico', models.DateField(verbose_name='Data Alteração')),
('logo_partido', models.ImageField(blank=True, null=True, upload_to=sapl.parlamentares.models.logo_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_img], verbose_name='Logo Partido')),
('partido', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Partido')),
],
),
migrations.AlterModelTable(
name='bloco',
table=None,
),
]

2
sapl/parlamentares/migrations/0028_auto_20190515_1744.py

@ -8,7 +8,7 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0027_auto_20190430_0839'),
('parlamentares', '0027_auto_20190517_1050'),
]
operations = [

72
sapl/parlamentares/models.py

@ -99,25 +99,39 @@ def get_logo_media_path(instance, subpath, filename):
def logo_upload_path(instance, filename):
return get_logo_media_path(instance, 'logo', filename)
return get_logo_media_path(instance, 'logo', filename)
@reversion.register()
class Partido(models.Model):
sigla = models.CharField(max_length=9, verbose_name=_('Sigla'))
nome = models.CharField(max_length=50, verbose_name=_('Nome'))
sigla = models.CharField(
max_length=9,
verbose_name=_('Sigla')
)
nome = models.CharField(
max_length=50,
verbose_name=_('Nome')
)
data_criacao = models.DateField(
blank=True, null=True, verbose_name=_('Data Criação'))
blank=True,
null=True,
verbose_name=_('Data Criação')
)
data_extincao = models.DateField(
blank=True, null=True, verbose_name=_('Data Extinção'))
blank=True,
null=True,
verbose_name=_('Data Extinção')
)
logo_partido = models.ImageField(
blank=True,
null=True,
upload_to=logo_upload_path,
verbose_name=_('Logo Partido'),
validators=[restringe_tipos_de_arquivo_img])
validators=[restringe_tipos_de_arquivo_img]
)
observacao = models.TextField(
blank=True, verbose_name=_('Observação'))
blank=True,
verbose_name=_('Observação')
)
class Meta:
verbose_name = _('Partido')
@ -129,11 +143,44 @@ class Partido(models.Model):
}
@reversion.register()
class HistoricoPartido(models.Model):
sigla = models.CharField(
max_length=9,
verbose_name=_('Sigla')
)
nome = models.CharField(
max_length=50,
verbose_name=_('Nome')
)
inicio_historico = models.DateField(
verbose_name=_('Data Alteração')
)
fim_historico = models.DateField(
verbose_name=_('Data Alteração')
)
logo_partido = models.ImageField(
blank=True,
null=True,
upload_to=logo_upload_path,
verbose_name=_('Logo Partido'),
validators=[restringe_tipos_de_arquivo_img]
)
partido = models.ForeignKey(Partido, on_delete=models.PROTECT)
def __str__(self):
return _('%(sigla)s - %(nome)s') % {
'sigla': self.sigla, 'nome': self.nome
}
@reversion.register()
class ComposicaoColigacao(models.Model):
# TODO M2M
partido = models.ForeignKey(Partido,
on_delete=models.PROTECT,
on_delete=models.CASCADE,
verbose_name=_('Partidos da Coligação'))
coligacao = models.ForeignKey(Coligacao, on_delete=models.PROTECT)
@ -395,6 +442,13 @@ class Filiacao(models.Model):
# parlamentares e tela de Filiações do Parlamentar
ordering = ('parlamentar', '-data', '-data_desfiliacao')
def nome_partido_ano(self, ano):
historico = HistoricoPartido.objects.filter(partido=self.partido)
for h in historico:
if h.inicio_historico.year <= ano <= h.fim_historico.year:
return h
return self.partido
def __str__(self):
return _('%(parlamentar)s - %(partido)s') % {
'parlamentar': self.parlamentar, 'partido': self.partido

9
sapl/parlamentares/urls.py

@ -21,7 +21,9 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
lista_parlamentares,
parlamentares_filiados,
BlocoCrud,
PesquisarParlamentarView, VincularParlamentarView)
PesquisarParlamentarView,
VincularParlamentarView,
deleta_historico_partido)
from .apps import AppConfig
@ -41,7 +43,10 @@ urlpatterns = [
url(r'^parlamentar/pesquisar-parlamentar/',
PesquisarParlamentarView.as_view(), name='pesquisar_parlamentar'),
url(r'^parlamentar/deleta_partido/(?P<pk>\d+)/$',
deleta_historico_partido, name='deleta_historico_partido'),
url(r'^parlamentar/(?P<pk>\d+)/materias$',
ParlamentarMateriasView.as_view(), name='parlamentar_materias'),

39
sapl/parlamentares/views.py

@ -23,7 +23,7 @@ from django_filters.views import FilterView
from image_cropping.utils import get_backend
from sapl.base.forms import SessaoLegislativaForm, PartidoForm
from sapl.base.forms import SessaoLegislativaForm, PartidoForm, PartidoUpdateForm
from sapl.base.models import Autor
from sapl.comissoes.models import Participacao
from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux,
@ -42,7 +42,7 @@ from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
Dependente, Filiacao, Frente, Legislatura, Mandato,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
SituacaoMilitar, TipoAfastamento, TipoDependente, Votante,
Bloco)
Bloco, HistoricoPartido)
CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa')
@ -72,8 +72,15 @@ class PartidoCrud(CrudAux):
form_class = PartidoForm
class UpdateView(CrudAux.UpdateView):
form_class = PartidoForm
template_name = "parlamentares/partido_update.html"
layout_key = None
form_class = PartidoUpdateForm
class DetailView(CrudAux.DetailView):
def get_context_data(self, **kwargs):
context = super().get_context_data(kwargs=kwargs)
context.update({'historico': HistoricoPartido.objects.filter(partido=self.object).order_by('-inicio_historico')})
return context
class VotanteView(MasterDetailCrud):
model = Votante
@ -673,7 +680,13 @@ class ParlamentarCrud(Crud):
else:
self.logger.debug("user=" + username +
". Filiação encontrada com sucesso.")
row[1] = (filiacao.partido.sigla, None, None)
partido_aux = filiacao.partido
historico = HistoricoPartido.objects.filter(partido=partido_aux).order_by('-fim_historico')
if historico:
partido_aux = next(iter([p for p in historico if p.inicio_historico < legislatura.data_fim <= p.fim_historico]), filiacao.partido)
row[1] = (partido_aux.sigla, None, None)
return context
@ -1042,6 +1055,8 @@ def partido_parlamentar_sessao_legislativa(sessao, parlamentar):
data_desfiliacao__gte=sessao.data_fim) | Q(
data__lte=sessao.data_fim,
data_desfiliacao__isnull=True))
# Caso não exista filiação com essas condições
except ObjectDoesNotExist:
@ -1063,7 +1078,7 @@ def partido_parlamentar_sessao_legislativa(sessao, parlamentar):
logger.info("Filiação do parlamentar com (data<={} e data_desfiliacao>={}) "
"ou (data<={} e data_desfiliacao=Null encontrada com sucesso."
.format(sessao.data_fim, sessao.data_fim, sessao.data_fim))
return filiacao.partido.sigla
return filiacao.nome_partido_ano(sessao.data_fim.year).sigla
def altera_field_mesa_public_view(request):
@ -1182,4 +1197,16 @@ class BlocoCrud(CrudAux):
form_class = BlocoForm
def get_success_url(self):
return reverse('sapl.parlamentares:bloco_list')
return reverse('sapl.parlamentares:bloco_list')
def deleta_historico_partido(request, pk):
historico = HistoricoPartido.objects.get(pk=pk)
pk_partido = historico.partido.pk
historico.delete()
return HttpResponseRedirect(
reverse(
'sapl.parlamentares:partido_detail',
kwargs={'pk': pk_partido}))

1
sapl/rules/map_rules.py

@ -267,6 +267,7 @@ rules_group_geral = {
(parlamentares.Coligacao, __base__, __perms_publicas__),
(parlamentares.ComposicaoColigacao, __base__, __perms_publicas__),
(parlamentares.Partido, __base__, __perms_publicas__),
(parlamentares.HistoricoPartido, __base__, __perms_publicas__),
(parlamentares.NivelInstrucao, __base__, __perms_publicas__),
(parlamentares.SituacaoMilitar, __base__, __perms_publicas__),
(parlamentares.Parlamentar, __base__, __perms_publicas__),

2
sapl/sessao/views.py

@ -35,7 +35,7 @@ from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato,
Parlamentar, SessaoLegislativa)
from sapl.sessao.apps import AppConfig
from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm
from sapl.utils import show_results_filter_set, remover_acentos, get_client_ip
from sapl.utils import show_results_filter_set, remover_acentos, get_client_ip, filiacao_data
from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm,
ExpedienteForm, JustificativaAusenciaForm, OcorrenciaSessaoForm, ListMateriaForm,

53
sapl/templates/parlamentares/partido_detail.html

@ -6,4 +6,55 @@
<div class="actions btn-group btn-group-sm" role="group">
<a href="{% url 'sapl.parlamentares:parlamentares_filiados' object.pk %}" class="btn btn-outline-primary">Listar Parlamentares Filiados</a>
</div>
{% endblock actions %}
{% endblock actions %}
{% block table_content %}
{{ block.super }}
<p class="control-label">Historico de Alteração:</p>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Periodo Inicial</th>
<th scope="col">Periodo Final</th>
<th scope="col">Sigla - Nome Anterior</th>
<th scope="col">Deletar</th>
</tr>
</thead>
<tbody>
{% for h in historico %}
<tr>
<td>{{ h.inicio_historico }}</td>
<td>{{ h.fim_historico }}</td>
<td>{{ h }}</td>
<td><a class="btn btn-outline-primary btn-outline-danger" data-toggle="modal" data-target="#confirmDelete{{h.pk}}">Deletar</a></td>
</tr>
<!-- Modal -->
<div class="modal fade" id="confirmDelete{{h.pk}}" tabindex="-1" role="dialog" aria-labelledby="confirmDeleteLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="confirmDeleteLabel">Deletar</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
Tem certeza que deseja deletar esse Historico {{h}} ?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
<a href="{% url 'sapl.parlamentares:deleta_historico_partido' h.pk%}" class="btn btn-outline-primary btn-outline-danger">Sim, tenho certeza.</a>
</div>
</div>
</div>
</div>
{% endfor %}
</tbody>
</table>
{% endblock table_content %}

40
sapl/templates/parlamentares/partido_update.html

@ -0,0 +1,40 @@
{% extends "crud/form.html" %}
{% load i18n %}
{% load crispy_forms_tags cropping %}
{% block extra_js %}
<script language="Javascript">
var sigla_inicial = ""
var nome_inicial = ""
$(document).ready(function() {
$("#id_data_modificacao").attr("disabled", true);
check_change = () => {
if($("#id_historico").val() == 'False'){
$("#div_id_data_criacao").find("label").text("Data Criação")
$("#div_id_data_extincao").find("label").text("Data Extinção")
$( "#id_observacao" ).prop( "disabled", false );
}
else {
$("#div_id_data_criacao").find("label").text("Inicio do Histórico*")
$("#div_id_data_extincao").find("label").text("Final do Histórico*")
$( "#id_observacao" ).prop( "disabled", true );
$( "#id_observacao" ).val("");
}
}
check_change();
document.getElementById("id_historico").onchange = check_change
});
function abilita_alteracao(){
$("#id_data_modificacao").attr("disabled", false );
}
</script>
{% endblock extra_js %}

4
sapl/utils.py

@ -818,7 +818,9 @@ def filiacao_data(parlamentar, data_inicio, data_fim=None):
data__gte=data_inicio,
data__lte=data_fim)
return ' | '.join([f.partido.sigla for f in filiacoes])
data_referencia = data_fim if data_fim else data_inicio
return ' | '.join([f.nome_partido_ano(data_referencia.year).sigla for f in filiacoes])
def parlamentares_ativos(data_inicio, data_fim=None):

Loading…
Cancel
Save