From 26ed1c606ab129fa9fd90034f19803fae7266f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Cantu=C3=A1ria?= Date: Thu, 30 May 2019 12:48:30 -0300 Subject: [PATCH] =?UTF-8?q?Fix=20#2161=20-=20Altera=C3=A7=C3=A3o=20de=20no?= =?UTF-8?q?me=20de=20Partido=20(#2608)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix #2161 - Criação de historico de partido. Co-authored-by: Cesar Carvalho Co-authored-by: ulyssesBML 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 --- sapl/base/forms.py | 155 +++++++++++++++--- .../migrations/0023_auto_20180626_1524.py | 9 +- sapl/parlamentares/migrations/0026_bloco.py | 6 + .../migrations/0027_auto_20190430_0839.py | 19 --- .../migrations/0027_auto_20190517_1050.py | 34 ++++ .../migrations/0028_auto_20190515_1744.py | 2 +- sapl/parlamentares/models.py | 72 +++++++- sapl/parlamentares/urls.py | 9 +- sapl/parlamentares/views.py | 39 ++++- sapl/rules/map_rules.py | 1 + sapl/sessao/views.py | 2 +- .../parlamentares/partido_detail.html | 53 +++++- .../parlamentares/partido_update.html | 40 +++++ sapl/utils.py | 4 +- 14 files changed, 372 insertions(+), 73 deletions(-) delete mode 100644 sapl/parlamentares/migrations/0027_auto_20190430_0839.py create mode 100644 sapl/parlamentares/migrations/0027_auto_20190517_1050.py create mode 100644 sapl/templates/parlamentares/partido_update.html diff --git a/sapl/base/forms.py b/sapl/base/forms.py index a3c20064d..9e7103c2a 100644 --- a/sapl/base/forms.py +++ b/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('''%s''' % _('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')) ) + diff --git a/sapl/parlamentares/migrations/0023_auto_20180626_1524.py b/sapl/parlamentares/migrations/0023_auto_20180626_1524.py index 828fbe88b..9bb00fce9 100644 --- a/sapl/parlamentares/migrations/0023_auto_20180626_1524.py +++ b/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), ] + diff --git a/sapl/parlamentares/migrations/0026_bloco.py b/sapl/parlamentares/migrations/0026_bloco.py index 2ba9f2c07..e30b89d3c 100644 --- a/sapl/parlamentares/migrations/0026_bloco.py +++ b/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 = [ diff --git a/sapl/parlamentares/migrations/0027_auto_20190430_0839.py b/sapl/parlamentares/migrations/0027_auto_20190430_0839.py deleted file mode 100644 index 454101416..000000000 --- a/sapl/parlamentares/migrations/0027_auto_20190430_0839.py +++ /dev/null @@ -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, - ), - ] diff --git a/sapl/parlamentares/migrations/0027_auto_20190517_1050.py b/sapl/parlamentares/migrations/0027_auto_20190517_1050.py new file mode 100644 index 000000000..523a2e91f --- /dev/null +++ b/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, + ), + ] diff --git a/sapl/parlamentares/migrations/0028_auto_20190515_1744.py b/sapl/parlamentares/migrations/0028_auto_20190515_1744.py index 2c230d88c..10f3efc68 100644 --- a/sapl/parlamentares/migrations/0028_auto_20190515_1744.py +++ b/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 = [ diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index d50600eba..e897129d5 100644 --- a/sapl/parlamentares/models.py +++ b/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 diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py index 8bf83b301..e32819da0 100644 --- a/sapl/parlamentares/urls.py +++ b/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\d+)/$', + deleta_historico_partido, name='deleta_historico_partido'), + url(r'^parlamentar/(?P\d+)/materias$', ParlamentarMateriasView.as_view(), name='parlamentar_materias'), diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 39c44351b..42bac2e3f 100644 --- a/sapl/parlamentares/views.py +++ b/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') \ No newline at end of file + 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})) + diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index 4f1b4b515..41d2e965c 100644 --- a/sapl/rules/map_rules.py +++ b/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__), diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 93dd7fd9e..3cf90b990 100755 --- a/sapl/sessao/views.py +++ b/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, diff --git a/sapl/templates/parlamentares/partido_detail.html b/sapl/templates/parlamentares/partido_detail.html index 1f55da2f5..f8f866bd2 100644 --- a/sapl/templates/parlamentares/partido_detail.html +++ b/sapl/templates/parlamentares/partido_detail.html @@ -6,4 +6,55 @@ -{% endblock actions %} \ No newline at end of file +{% endblock actions %} + +{% block table_content %} + {{ block.super }} + +

Historico de Alteração:

+ + + + + + + + + + + + {% for h in historico %} + + + + + + + + + + + {% endfor %} + +
Periodo InicialPeriodo FinalSigla - Nome AnteriorDeletar
{{ h.inicio_historico }}{{ h.fim_historico }}{{ h }}Deletar
+ + +{% endblock table_content %} \ No newline at end of file diff --git a/sapl/templates/parlamentares/partido_update.html b/sapl/templates/parlamentares/partido_update.html new file mode 100644 index 000000000..ed68db4b2 --- /dev/null +++ b/sapl/templates/parlamentares/partido_update.html @@ -0,0 +1,40 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags cropping %} + + +{% block extra_js %} + + +{% endblock extra_js %} diff --git a/sapl/utils.py b/sapl/utils.py index f3b4b953c..e6e2dabc3 100644 --- a/sapl/utils.py +++ b/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):