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 ( from sapl.materia.models import (
MateriaLegislativa, UnidadeTramitacao, StatusTramitacao) MateriaLegislativa, UnidadeTramitacao, StatusTramitacao)
from sapl.norma.models import (NormaJuridica, NormaEstatisticas) from sapl.norma.models import (NormaJuridica, NormaEstatisticas)
from sapl.parlamentares.models import SessaoLegislativa, Partido
from sapl.protocoloadm.models import DocumentoAdministrativo from sapl.protocoloadm.models import DocumentoAdministrativo
from sapl.parlamentares.models import SessaoLegislativa, Partido, HistoricoPartido
from sapl.sessao.models import SessaoPlenaria from sapl.sessao.models import SessaoPlenaria
from sapl.settings import MAX_IMAGE_UPLOAD_SIZE from sapl.settings import MAX_IMAGE_UPLOAD_SIZE
from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, 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, choice_anos_com_normas, choice_anos_com_materias,
FilterOverridesMetaMixin, FileFieldCheckMixin) FilterOverridesMetaMixin, FileFieldCheckMixin)
from .models import AppConfig, CasaLegislativa from .models import AppConfig, CasaLegislativa
from operator import xor
ACTION_CREATE_USERS_AUTOR_CHOICE = [ ACTION_CREATE_USERS_AUTOR_CHOICE = [
@ -151,9 +152,9 @@ class UsuarioCreateForm(ModelForm):
class UsuarioFilterSet(django_filters.FilterSet): class UsuarioFilterSet(django_filters.FilterSet):
username = django_filters.CharFilter( username = django_filters.CharFilter(
label=_('Nome de Usuário'), label=_('Nome de Usuário'),
lookup_expr='icontains') lookup_expr='icontains')
class Meta: class Meta:
@ -164,7 +165,7 @@ class UsuarioFilterSet(django_filters.FilterSet):
super(UsuarioFilterSet, self).__init__(*args, **kwargs) super(UsuarioFilterSet, self).__init__(*args, **kwargs)
row0 = to_row([('username', 12)]) row0 = to_row([('username', 12)])
self.form.helper = SaplFormHelper() self.form.helper = SaplFormHelper()
self.form.helper.form_method = 'GET' self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout( self.form.helper.layout = Layout(
@ -1393,42 +1394,109 @@ class PartidoForm(FileFieldCheckMixin, ModelForm):
model = Partido model = Partido
exclude = [] exclude = []
def __init__(self, *args, **kwargs): def __init__(self, pk=None, *args, **kwargs):
super().__init__(*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
row1 = to_row( row1 = to_row([
[('sigla', 2), ('sigla', 2),
('nome', 6), ('nome', 6),
('data_criacao', 2), ('data_criacao', 2),
('data_extincao', 2),]) ('data_extincao', 2)
]
)
row2 = to_row([('observacao', 12)]) row2 = to_row([('observacao', 12)])
row3 = to_row([('logo_partido', 12)]) row3 = to_row([('logo_partido', 12)])
self.helper = SaplFormHelper() self.helper = SaplFormHelper()
self.helper.layout = Layout( self.helper.layout = Layout(
row1, row2, row3, row1, row2, row3,
form_actions(label='Salvar')) form_actions(label='Salvar')
)
def clean(self): def clean(self):
cleaned_data = self.cleaned_data
cleaned_data = super(PartidoForm, self).clean()
if not self.is_valid(): if not self.is_valid():
return cleaned_data return cleaned_data
if cleaned_data['data_criacao'] and cleaned_data['data_extincao']: if cleaned_data['data_criacao'] and cleaned_data['data_extincao'] and cleaned_data['data_criacao'] > \
if cleaned_data['data_criacao'] > cleaned_data['data_extincao']: cleaned_data['data_extincao']:
raise ValidationError("Certifique-se de que a data de criação seja anterior à data de extinção.") 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 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): class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet):
@ -1467,3 +1535,5 @@ class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet):
row1, row2, row3, row1, row2, row3,
form_actions(label='Pesquisar')) form_actions(label='Pesquisar'))
) )

28
sapl/parlamentares/migrations/0023_auto_20180626_1524.py

@ -1,39 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-03-13 17:48
from __future__ import unicode_literals 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): class Migration(migrations.Migration):
dependencies = [ 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'), ('parlamentares', '0022_partido_observacao'),
] ]
operations = [ 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): def logo_upload_path(instance, filename):
return get_logo_media_path(instance, 'logo', filename) return get_logo_media_path(instance, 'logo', filename)
@reversion.register() @reversion.register()
class Partido(models.Model): class Partido(models.Model):
sigla = models.CharField(max_length=9, verbose_name=_('Sigla')) sigla = models.CharField(
nome = models.CharField(max_length=50, verbose_name=_('Nome')) max_length=9,
verbose_name=_('Sigla')
)
nome = models.CharField(
max_length=50,
verbose_name=_('Nome')
)
data_criacao = models.DateField( 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( 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( logo_partido = models.ImageField(
blank=True, blank=True,
null=True, null=True,
upload_to=logo_upload_path, upload_to=logo_upload_path,
verbose_name=_('Logo Partido'), verbose_name=_('Logo Partido'),
validators=[restringe_tipos_de_arquivo_img]) validators=[restringe_tipos_de_arquivo_img]
)
observacao = models.TextField( observacao = models.TextField(
blank=True, verbose_name=_('Observação')) blank=True,
verbose_name=_('Observação')
)
class Meta: class Meta:
verbose_name = _('Partido') 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() @reversion.register()
class ComposicaoColigacao(models.Model): class ComposicaoColigacao(models.Model):
# TODO M2M # TODO M2M
partido = models.ForeignKey(Partido, partido = models.ForeignKey(Partido,
on_delete=models.PROTECT, on_delete=models.CASCADE,
verbose_name=_('Partidos da Coligação')) verbose_name=_('Partidos da Coligação'))
coligacao = models.ForeignKey(Coligacao, on_delete=models.PROTECT) coligacao = models.ForeignKey(Coligacao, on_delete=models.PROTECT)
@ -395,6 +444,13 @@ class Filiacao(models.Model):
# parlamentares e tela de Filiações do Parlamentar # parlamentares e tela de Filiações do Parlamentar
ordering = ('parlamentar', '-data', '-data_desfiliacao') 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): def __str__(self):
return _('%(parlamentar)s - %(partido)s') % { return _('%(parlamentar)s - %(partido)s') % {
'parlamentar': self.parlamentar, 'partido': self.partido 'parlamentar': self.parlamentar, 'partido': self.partido

9
sapl/parlamentares/urls.py

@ -21,7 +21,9 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
lista_parlamentares, lista_parlamentares,
parlamentares_filiados, parlamentares_filiados,
BlocoCrud, BlocoCrud,
PesquisarParlamentarView, VincularParlamentarView) PesquisarParlamentarView,
VincularParlamentarView,
deleta_historico_partido)
from .apps import AppConfig from .apps import AppConfig
@ -41,7 +43,10 @@ urlpatterns = [
url(r'^parlamentar/pesquisar-parlamentar/', url(r'^parlamentar/pesquisar-parlamentar/',
PesquisarParlamentarView.as_view(), name='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$', url(r'^parlamentar/(?P<pk>\d+)/materias$',
ParlamentarMateriasView.as_view(), name='parlamentar_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 import messages
from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.contenttypes.models import ContentType 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.core.urlresolvers import reverse, reverse_lazy
from django.db.models import F, Q from django.db.models import F, Q
from django.db.models.aggregates import Count 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 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.base.models import Autor
from sapl.comissoes.models import Participacao from sapl.comissoes.models import Participacao
from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux, 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, Dependente, Filiacao, Frente, Legislatura, Mandato,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
SituacaoMilitar, TipoAfastamento, TipoDependente, Votante, SituacaoMilitar, TipoAfastamento, TipoDependente, Votante,
Bloco) Bloco, HistoricoPartido)
CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa') CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa')
@ -72,8 +72,41 @@ class PartidoCrud(CrudAux):
form_class = PartidoForm form_class = PartidoForm
class UpdateView(CrudAux.UpdateView): 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): class VotanteView(MasterDetailCrud):
model = Votante model = Votante
@ -673,7 +706,16 @@ class ParlamentarCrud(Crud):
else: else:
self.logger.debug("user=" + username + self.logger.debug("user=" + username +
". Filiação encontrada com sucesso.") ". 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 return context
@ -1042,6 +1084,8 @@ def partido_parlamentar_sessao_legislativa(sessao, parlamentar):
data_desfiliacao__gte=sessao.data_fim) | Q( data_desfiliacao__gte=sessao.data_fim) | Q(
data__lte=sessao.data_fim, data__lte=sessao.data_fim,
data_desfiliacao__isnull=True)) data_desfiliacao__isnull=True))
# Caso não exista filiação com essas condições # Caso não exista filiação com essas condições
except ObjectDoesNotExist: except ObjectDoesNotExist:
@ -1063,7 +1107,7 @@ def partido_parlamentar_sessao_legislativa(sessao, parlamentar):
logger.info("Filiação do parlamentar com (data<={} e data_desfiliacao>={}) " logger.info("Filiação do parlamentar com (data<={} e data_desfiliacao>={}) "
"ou (data<={} e data_desfiliacao=Null encontrada com sucesso." "ou (data<={} e data_desfiliacao=Null encontrada com sucesso."
.format(sessao.data_fim, sessao.data_fim, sessao.data_fim)) .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): def altera_field_mesa_public_view(request):
@ -1182,4 +1226,16 @@ class BlocoCrud(CrudAux):
form_class = BlocoForm form_class = BlocoForm
def get_success_url(self): 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.Coligacao, __base__, __perms_publicas__),
(parlamentares.ComposicaoColigacao, __base__, __perms_publicas__), (parlamentares.ComposicaoColigacao, __base__, __perms_publicas__),
(parlamentares.Partido, __base__, __perms_publicas__), (parlamentares.Partido, __base__, __perms_publicas__),
(parlamentares.HistoricoPartido, __base__, __perms_publicas__),
(parlamentares.NivelInstrucao, __base__, __perms_publicas__), (parlamentares.NivelInstrucao, __base__, __perms_publicas__),
(parlamentares.SituacaoMilitar, __base__, __perms_publicas__), (parlamentares.SituacaoMilitar, __base__, __perms_publicas__),
(parlamentares.Parlamentar, __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) Parlamentar, SessaoLegislativa)
from sapl.sessao.apps import AppConfig from sapl.sessao.apps import AppConfig
from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm 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, from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm,
ExpedienteForm, JustificativaAusenciaForm, OcorrenciaSessaoForm, ListMateriaForm, ExpedienteForm, JustificativaAusenciaForm, OcorrenciaSessaoForm, ListMateriaForm,
@ -1626,6 +1626,7 @@ def get_oradores_explicações_pessoais(sessao_plenaria):
if not partido_sigla: if not partido_sigla:
sigla = '' sigla = ''
else: else:
sigla = filiacao_data(parlamentar, sessao_plenaria.data_inicio)
sigla = partido_sigla.partido.sigla sigla = partido_sigla.partido.sigla
oradores = { oradores = {
'numero_ordem': orador.numero_ordem, '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"> <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> <a href="{% url 'sapl.parlamentares:parlamentares_filiados' object.pk %}" class="btn btn-outline-primary">Listar Parlamentares Filiados</a>
</div> </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__gte=data_inicio,
data__lte=data_fim) 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): def parlamentares_ativos(data_inicio, data_fim=None):

Loading…
Cancel
Save