Browse Source

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

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

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

Aprimorando historico partido para armanzenar varias alterações

Corrigindo migrations e adaptando historico na lista de parlamentares

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

Arrumando erros de grupos e de histoico nulo

Adicionando apagar historico e corrigindo erros

mudando estrutura de historico

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

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

Removendo campo proximo não utilizado em historico do partido

* Concertando questões relatados no PR

* Aprimorando validação de datas no historico

* Resolvendo code climate

* Add migration

* Iniciando correcoes do pr

* Refazendo migrações

* Colocando botão de voltar

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

147
sapl/base/forms.py

@ -1,9 +1,9 @@
import logging import logging
import os 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 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 import forms
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model 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 ( 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,
@ -38,8 +38,10 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES,
RangeWidgetOverride, autor_label, autor_modal, RangeWidgetOverride, autor_label, autor_modal,
models_with_gr_for_model, qs_override_django_filter, models_with_gr_for_model, qs_override_django_filter,
choice_anos_com_normas, choice_anos_com_materias, choice_anos_com_normas, choice_anos_com_materias,
FilterOverridesMetaMixin, FileFieldCheckMixin) FilterOverridesMetaMixin, FileFieldCheckMixin,
intervalos_tem_intersecao)
from .models import AppConfig, CasaLegislativa from .models import AppConfig, CasaLegislativa
from operator import xor
ACTION_CREATE_USERS_AUTOR_CHOICE = [ ACTION_CREATE_USERS_AUTOR_CHOICE = [
@ -1393,42 +1395,140 @@ 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):
super(PartidoForm,self).clean()
cleaned_data = self.cleaned_data
cleaned_data = super(PartidoForm, self).clean() 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)
class Meta:
model = Partido
exclude = []
def __init__(self, pk=None, *args, **kwargs):
super().__init__(*args, **kwargs)
row1 = to_row([
('sigla', 6),
('nome', 6),
]
)
row2 = to_row([
('historico', 2),
('data_criacao', 5),
('data_extincao', 5),
]
)
row3 = to_row([('observacao', 12)])
row4 = to_row([('logo_partido', 12)])
buttons = FormActions(
*[
HTML('''<a href="/sistema/parlamentar/partido/{{object.id}}" class="btn btn-dark btn-close-container">%s</a>''' % _('Cancelar'))
],
Submit('salvar', _('Salvar'), css_class='float-right',
onclick='return true;'),
css_class='form-group row justify-content-between'
)
self.helper = SaplFormHelper()
self.helper.layout = Layout(
row1, row2, row3, row4, to_row([(buttons, 12)]),
)
def clean(self):
cleaned_data = super(PartidoUpdateForm,self).clean()
if not self.is_valid(): if not self.is_valid():
return cleaned_data return cleaned_data
if cleaned_data['data_criacao'] and cleaned_data['data_extincao']: is_historico = cleaned_data['historico'] == 'True'
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 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 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): class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet):
@ -1467,3 +1567,4 @@ class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet):
row1, row2, row3, row1, row2, row3,
form_actions(label='Pesquisar')) form_actions(label='Pesquisar'))
) )

9
sapl/parlamentares/migrations/0023_auto_20180626_1524.py

@ -1,12 +1,12 @@
# -*- 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 from django.db import migrations
from django.core.management import call_command
import json import json
import os import os
from django.core.management import call_command
def gera_partidos_tse(apps, schema_editor): def gera_partidos_tse(apps, schema_editor):
Partido = apps.get_model("parlamentares", "Partido") Partido = apps.get_model("parlamentares", "Partido")
@ -27,13 +27,10 @@ def gera_partidos_tse(apps, schema_editor):
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), migrations.RunPython(gera_partidos_tse),
] ]

6
sapl/parlamentares/migrations/0026_bloco.py

@ -3,6 +3,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
@ -30,6 +31,11 @@ class Migration(migrations.Migration):
}, },
bases=(models.Model,), 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 = [ operations = [

19
sapl/parlamentares/migrations/0027_auto_20190430_0839.py

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

34
sapl/parlamentares/migrations/0027_auto_20190517_1050.py

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

2
sapl/parlamentares/migrations/0028_auto_20190515_1744.py

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

70
sapl/parlamentares/models.py

@ -101,23 +101,37 @@ 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,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() @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 +442,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 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): 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

7
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
@ -42,6 +44,9 @@ 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'),

37
sapl/parlamentares/views.py

@ -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,15 @@ 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
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 +680,13 @@ 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:
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 return context
@ -1043,6 +1056,8 @@ def partido_parlamentar_sessao_legislativa(sessao, parlamentar):
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:
logger.error("Filiação do parlamentar com (data<={} e data_desfiliacao>={}) " logger.error("Filiação do parlamentar com (data<={} e data_desfiliacao>={}) "
@ -1063,7 +1078,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.nome_partido_ano(sessao.data_fim.year).sigla
def altera_field_mesa_public_view(request): def altera_field_mesa_public_view(request):
@ -1183,3 +1198,15 @@ class BlocoCrud(CrudAux):
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__),

2
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,

51
sapl/templates/parlamentares/partido_detail.html

@ -7,3 +7,54 @@
<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 class="btn btn-outline-primary btn-outline-danger" data-toggle="modal" data-target="#confirmDelete{{h.pk}}">Deletar</a></td>
</tr>
<!-- Modal -->
<div class="modal fade" id="confirmDelete{{h.pk}}" tabindex="-1" role="dialog" aria-labelledby="confirmDeleteLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="confirmDeleteLabel">Deletar</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
Tem certeza que deseja deletar esse Historico {{h}} ?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
<a href="{% url 'sapl.parlamentares:deleta_historico_partido' h.pk%}" class="btn btn-outline-primary btn-outline-danger">Sim, tenho certeza.</a>
</div>
</div>
</div>
</div>
{% endfor %}
</tbody>
</table>
{% endblock table_content %}

40
sapl/templates/parlamentares/partido_update.html

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

4
sapl/utils.py

@ -818,7 +818,9 @@ def filiacao_data(parlamentar, data_inicio, data_fim=None):
data__gte=data_inicio, data__gte=data_inicio,
data__lte=data_fim) 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): def parlamentares_ativos(data_inicio, data_fim=None):

Loading…
Cancel
Save