From acce4506885519b4debd63e67816451f1b183798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Cantu=C3=A1ria?= Date: Wed, 13 Mar 2019 13:03:03 -0300 Subject: [PATCH] =?UTF-8?q?Fix=20#2161=20-=20Cria=C3=A7=C3=A3o=20de=20hist?= =?UTF-8?q?orico=20de=20partido.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- sapl/base/forms.py | 120 ++++++++++++++---- .../migrations/0023_auto_20180626_1524.py | 28 +--- .../migrations/0026_partido_historico.py | 15 +++ .../migrations/0027_auto_20190313_1448.py | 39 ++++++ .../migrations/0028_auto_20190403_0803.py | 31 +++++ .../0029_historicopartido_proximo.py | 21 +++ .../migrations/0030_auto_20190409_1030.py | 33 +++++ .../migrations/0031_auto_20190411_0919.py | 25 ++++ sapl/parlamentares/models.py | 74 +++++++++-- sapl/parlamentares/urls.py | 9 +- sapl/parlamentares/views.py | 70 +++++++++- sapl/rules/map_rules.py | 1 + sapl/sessao/views.py | 3 +- .../parlamentares/partido_detail.html | 30 ++++- .../parlamentares/partido_update.html | 40 ++++++ sapl/utils.py | 6 +- 16 files changed, 473 insertions(+), 72 deletions(-) create mode 100644 sapl/parlamentares/migrations/0026_partido_historico.py create mode 100644 sapl/parlamentares/migrations/0027_auto_20190313_1448.py create mode 100644 sapl/parlamentares/migrations/0028_auto_20190403_0803.py create mode 100644 sapl/parlamentares/migrations/0029_historicopartido_proximo.py create mode 100644 sapl/parlamentares/migrations/0030_auto_20190409_1030.py create mode 100644 sapl/parlamentares/migrations/0031_auto_20190411_0919.py create mode 100644 sapl/templates/parlamentares/partido_update.html diff --git a/sapl/base/forms.py b/sapl/base/forms.py index a3c20064d..9a4a4606f 100644 --- a/sapl/base/forms.py +++ b/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')) ) + + diff --git a/sapl/parlamentares/migrations/0023_auto_20180626_1524.py b/sapl/parlamentares/migrations/0023_auto_20180626_1524.py index 828fbe88b..f2c5f573a 100644 --- a/sapl/parlamentares/migrations/0023_auto_20180626_1524.py +++ b/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), ] diff --git a/sapl/parlamentares/migrations/0026_partido_historico.py b/sapl/parlamentares/migrations/0026_partido_historico.py new file mode 100644 index 000000000..13ccdb3d3 --- /dev/null +++ b/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 = [ + ] diff --git a/sapl/parlamentares/migrations/0027_auto_20190313_1448.py b/sapl/parlamentares/migrations/0027_auto_20190313_1448.py new file mode 100644 index 000000000..5acca55c7 --- /dev/null +++ b/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), + ] diff --git a/sapl/parlamentares/migrations/0028_auto_20190403_0803.py b/sapl/parlamentares/migrations/0028_auto_20190403_0803.py new file mode 100644 index 000000000..c16f2aa0a --- /dev/null +++ b/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'), + ), + ] diff --git a/sapl/parlamentares/migrations/0029_historicopartido_proximo.py b/sapl/parlamentares/migrations/0029_historicopartido_proximo.py new file mode 100644 index 000000000..72293b146 --- /dev/null +++ b/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'), + ), + ] diff --git a/sapl/parlamentares/migrations/0030_auto_20190409_1030.py b/sapl/parlamentares/migrations/0030_auto_20190409_1030.py new file mode 100644 index 000000000..2ac62ee65 --- /dev/null +++ b/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'), + ), + ] diff --git a/sapl/parlamentares/migrations/0031_auto_20190411_0919.py b/sapl/parlamentares/migrations/0031_auto_20190411_0919.py new file mode 100644 index 000000000..ce0df0b40 --- /dev/null +++ b/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'), + ), + ] diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index d50600eba..1c105deff 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,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 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..966ffb510 100644 --- a/sapl/parlamentares/views.py +++ b/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') \ 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 cc197972a..dc687cac2 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, @@ -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, diff --git a/sapl/templates/parlamentares/partido_detail.html b/sapl/templates/parlamentares/partido_detail.html index 1f55da2f5..60a8586e8 100644 --- a/sapl/templates/parlamentares/partido_detail.html +++ b/sapl/templates/parlamentares/partido_detail.html @@ -6,4 +6,32 @@ -{% 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 }}X
+ +{% 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..924f020bc --- /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..5cc0897e7 100644 --- a/sapl/utils.py +++ b/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):