Browse Source

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
pull/2608/head
Vinícius Cantuária 7 years ago
committed by ulyssesBML
parent
commit
acce450688
  1. 120
      sapl/base/forms.py
  2. 28
      sapl/parlamentares/migrations/0023_auto_20180626_1524.py
  3. 15
      sapl/parlamentares/migrations/0026_partido_historico.py
  4. 39
      sapl/parlamentares/migrations/0027_auto_20190313_1448.py
  5. 31
      sapl/parlamentares/migrations/0028_auto_20190403_0803.py
  6. 21
      sapl/parlamentares/migrations/0029_historicopartido_proximo.py
  7. 33
      sapl/parlamentares/migrations/0030_auto_20190409_1030.py
  8. 25
      sapl/parlamentares/migrations/0031_auto_20190411_0919.py
  9. 74
      sapl/parlamentares/models.py
  10. 9
      sapl/parlamentares/urls.py
  11. 70
      sapl/parlamentares/views.py
  12. 1
      sapl/rules/map_rules.py
  13. 3
      sapl/sessao/views.py
  14. 30
      sapl/templates/parlamentares/partido_detail.html
  15. 40
      sapl/templates/parlamentares/partido_update.html
  16. 6
      sapl/utils.py

120
sapl/base/forms.py

@ -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,
@ -40,6 +40,7 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES,
choice_anos_com_normas, choice_anos_com_materias,
FilterOverridesMetaMixin, FileFieldCheckMixin)
from .models import AppConfig, CasaLegislativa
from operator import xor
ACTION_CREATE_USERS_AUTOR_CHOICE = [
@ -151,9 +152,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 +165,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 +1394,109 @@ 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):
cleaned_data = 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']:
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.")
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 = (('nao','Não'),
('sim','Sim')
)
historico = forms.ChoiceField(initial='nao', choices=opcoes)
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)])
self.helper = SaplFormHelper()
self.helper.layout = Layout(
row1, row2, row3, row4,
form_actions(label='Salvar')
)
def clean(self):
cleaned_data = self.cleaned_data
is_historico = cleaned_data['historico'] == 'sim'
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 inicio seja anterior à data fim.")
if is_historico:
if cleaned_data['data_criacao'] == None or cleaned_data['data_extincao'] == None:
raise ValidationError("Certifique-se de que a data de inicio e fim de historico estão preenchidas")
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 (h.inicio_historico < cleaned_data['data_extincao'] and \
h.inicio_historico > cleaned_data['data_criacao']) or \
(h.fim_historico < cleaned_data['data_extincao'] and \
h.fim_historico > cleaned_data['data_criacao']):
raise ValidationError("Periodo selecionado ja possui um histórico.")
return cleaned_data
class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet):
@ -1467,3 +1535,5 @@ class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet):
row1, row2, row3,
form_actions(label='Pesquisar'))
)

28
sapl/parlamentares/migrations/0023_auto_20180626_1524.py

@ -1,39 +1,15 @@
# -*- 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
import json
import os
from django.core.management import call_command
from django.db import migrations
def gera_partidos_tse(apps, schema_editor):
Partido = apps.get_model("parlamentares", "Partido")
db_alias = schema_editor.connection.alias
partidos = Partido.objects.all().exists()
if partidos:
# Caso haja algum partido cadastrado na base de dados,
# a migração não deve ser carregada para evitar duplicações de dados.
print("Carga de Partido não efetuada. Já Existem partidos cadastrados...")
else:
fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures'))
# pega partidos listados em fixtures/pre_popula_partidos.json
fixture_filename = 'pre_popula_partidos.json'
fixture_file = os.path.join(fixture_dir, fixture_filename)
call_command('loaddata', fixture_file, ignorenonexistent=True)
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),
]

15
sapl/parlamentares/migrations/0026_partido_historico.py

@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-03-13 13:21
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0025_auto_20180924_1724'),
]
operations = [
]

39
sapl/parlamentares/migrations/0027_auto_20190313_1448.py

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
import json
import os
from django.core.management import call_command
def gera_partidos_tse(apps, schema_editor):
Partido = apps.get_model("parlamentares", "Partido")
db_alias = schema_editor.connection.alias
partidos = Partido.objects.all().exists()
if partidos:
# Caso haja algum partido cadastrado na base de dados,
# a migração não deve ser carregada para evitar duplicações de dados.
print("Carga de Partido não efetuada. Já Existem partidos cadastrados...")
else:
fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures'))
# pega partidos listados em fixtures/pre_popula_partidos.json
fixture_filename = 'pre_popula_partidos.json'
fixture_file = os.path.join(fixture_dir, fixture_filename)
call_command('loaddata', fixture_file, ignorenonexistent=True)
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', '0026_partido_historico'),
]
operations = [
migrations.RunPython(gera_partidos_tse),
]

31
sapl/parlamentares/migrations/0028_auto_20190403_0803.py

@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-04-03 11:03
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0027_auto_20190313_1448'),
]
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')),
('data_alteracao', models.DateField(default=django.utils.timezone.now, verbose_name='Data Alteração')),
],
),
migrations.AddField(
model_name='historicopartido',
name='partido',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Partido'),
),
]

21
sapl/parlamentares/migrations/0029_historicopartido_proximo.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-04-09 11:23
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0028_auto_20190403_0803'),
]
operations = [
migrations.AddField(
model_name='historicopartido',
name='proximo',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='parlamentares.HistoricoPartido'),
),
]

33
sapl/parlamentares/migrations/0030_auto_20190409_1030.py

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-04-09 13:30
from __future__ import unicode_literals
from django.db import migrations, models
import django.utils.timezone
import sapl.parlamentares.models
import sapl.utils
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0029_historicopartido_proximo'),
]
operations = [
migrations.RenameField(
model_name='historicopartido',
old_name='data_alteracao',
new_name='fim_historico',
),
migrations.AddField(
model_name='historicopartido',
name='inicio_historico',
field=models.DateField(default=django.utils.timezone.now, verbose_name='Data Alteração'),
),
migrations.AddField(
model_name='historicopartido',
name='logo_partido',
field=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'),
),
]

25
sapl/parlamentares/migrations/0031_auto_20190411_0919.py

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-04-11 12:19
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('parlamentares', '0030_auto_20190409_1030'),
]
operations = [
migrations.RemoveField(
model_name='historicopartido',
name='proximo',
),
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'),
),
]

74
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,46 @@ 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(
default=timezone.now,
verbose_name=_('Data Alteração')
)
fim_historico = models.DateField(
default=timezone.now,
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 +444,13 @@ class Filiacao(models.Model):
# parlamentares e tela de Filiações do Parlamentar
ordering = ('parlamentar', '-data', '-data_desfiliacao')
def get_nome_partido_no_ano(self, ano):
historico = HistoricoPartido.objects.filter(partido=self.partido)
for h in historico:
if ano > h.inicio_historico.year and 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'),

70
sapl/parlamentares/views.py

@ -5,7 +5,7 @@ import logging
from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError
from django.core.urlresolvers import reverse, reverse_lazy
from django.db.models import F, Q
from django.db.models.aggregates import Count
@ -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,41 @@ 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
def form_valid(self, form):
is_historico = form.cleaned_data['historico']
if is_historico == "nao":
super().form_valid(form)
elif is_historico == "sim":
sigla = form.cleaned_data['sigla']
nome = form.cleaned_data['nome']
inicio_historico = form.cleaned_data['data_criacao']
fim_historico = form.cleaned_data['data_extincao']
logo_partido = form.cleaned_data['logo_partido']
partido = partido = Partido.objects.get(pk=self.kwargs.get('pk'))
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 HttpResponseRedirect(
reverse('sapl.parlamentares:partido_detail', kwargs={'pk': self.kwargs.get('pk')}))
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 +706,16 @@ 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:
for p in historico:
if p.inicio_historico < legislatura.data_fim and p.fim_historico >= legislatura.data_fim:
partido_aux = p
break
row[1] = (partido_aux.sigla, None, None)
return context
@ -1042,6 +1084,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 +1107,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.get_nome_partido_no_ano(sessao.data_fim.year).sigla
def altera_field_mesa_public_view(request):
@ -1182,4 +1226,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__),

3
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,
@ -1626,6 +1626,7 @@ def get_oradores_explicações_pessoais(sessao_plenaria):
if not partido_sigla:
sigla = ''
else:
sigla = filiacao_data(parlamentar, sessao_plenaria.data_inicio)
sigla = partido_sigla.partido.sigla
oradores = {
'numero_ordem': orador.numero_ordem,

30
sapl/templates/parlamentares/partido_detail.html

@ -6,4 +6,32 @@
<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 href="{% url 'sapl.parlamentares:deleta_historico_partido' h.pk%}">X</a></td>
</tr>
{% 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() == 'nao'){
$("#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("");
}
}
document.getElementById("id_historico").onchange = check_change
});
function abilita_alteracao(){
$("#id_data_modificacao").attr("disabled", false );
}
</script>
{% endblock extra_js %}

6
sapl/utils.py

@ -818,7 +818,11 @@ 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_inicio
if data_fim:
data_referencia = data_fim
return ' | '.join([f.get_nome_partido_no_ano(data_referencia.year).sigla for f in filiacoes])
def parlamentares_ativos(data_inicio, data_fim=None):

Loading…
Cancel
Save