Date: Fri, 17 Apr 2026 17:31:07 -0300
Subject: [PATCH 14/26] fix:
https://github.com/interlegis/sapl/pull/3829#discussion_r3083757964
---
sapl/parlamentares/models.py | 2 +-
sapl/templates/parlamentares/mesadiretora_filter.html | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py
index 957d06ee3..759835783 100644
--- a/sapl/parlamentares/models.py
+++ b/sapl/parlamentares/models.py
@@ -522,7 +522,7 @@ class ComposicaoMesa(models.Model):
class Meta:
verbose_name = _('Ocupação de cargo na Mesa')
verbose_name_plural = _('Ocupações de cargo na Mesa')
- ordering = ('id', )
+ ordering = ('cargo', 'parlamentar')
def __str__(self):
return _('%(parlamentar)s - %(cargo)s') % {
diff --git a/sapl/templates/parlamentares/mesadiretora_filter.html b/sapl/templates/parlamentares/mesadiretora_filter.html
index 1ab1b94ef..a07c5262f 100644
--- a/sapl/templates/parlamentares/mesadiretora_filter.html
+++ b/sapl/templates/parlamentares/mesadiretora_filter.html
@@ -2,7 +2,7 @@
{% load i18n common_tags crispy_forms_tags cropping %}
{% block container_table_list %}
- {% if perms.add_mesadiretora %}
+ {% if perms.parlamentares.add_mesadiretora %}
{{ block.super }}
{% else %}
From 7a14c1ec1c2a1acf8cefd3ae85cc675dce833ee2 Mon Sep 17 00:00:00 2001
From: LeandroJatai
Date: Fri, 17 Apr 2026 18:25:32 -0300
Subject: [PATCH 15/26] fix:
https://github.com/interlegis/sapl/pull/3829#discussion_r3093425814
---
.../0046_mesadiretora_legislatura.py | 25 ++++++++-----------
1 file changed, 11 insertions(+), 14 deletions(-)
diff --git a/sapl/parlamentares/migrations/0046_mesadiretora_legislatura.py b/sapl/parlamentares/migrations/0046_mesadiretora_legislatura.py
index 052527523..d7e6d59d1 100644
--- a/sapl/parlamentares/migrations/0046_mesadiretora_legislatura.py
+++ b/sapl/parlamentares/migrations/0046_mesadiretora_legislatura.py
@@ -5,20 +5,17 @@ import django.db.models.deletion
from datetime import date
def add_legislatura_to_mesa_diretora(apps, schema_editor):
- MesaDiretora = apps.get_model('parlamentares', 'MesaDiretora')
- SessaoLegislativa = apps.get_model('parlamentares', 'SessaoLegislativa')
-
- for mesa in MesaDiretora.objects.all():
- mesa.legislatura = mesa.sessao_legislativa.legislatura
- data_inicio = mesa.sessao_legislativa.data_inicio
- data_fim = mesa.sessao_legislativa.data_fim
- if data_inicio.year == data_fim.year:
- mesa.data_inicio = date(data_inicio.year, 1, 1)
- mesa.data_fim = date(data_fim.year, 12, 31)
- else:
- mesa.data_inicio = data_inicio
- mesa.data_fim = data_fim
- mesa.save()
+ schema_editor.execute("""
+ UPDATE parlamentares_mesadiretora md
+ SET
+ legislatura_id = sl.legislatura_id,
+ data_inicio = sl.data_inicio,
+ data_fim = sl.data_fim
+ FROM
+ parlamentares_sessaolegislativa sl
+ WHERE
+ sl.id = md.sessao_legislativa_id
+ """)
class Migration(migrations.Migration):
From 507cc4ad0e77dab680276a85c935a724e76a9d02 Mon Sep 17 00:00:00 2001
From: LeandroJatai
Date: Fri, 17 Apr 2026 18:36:24 -0300
Subject: [PATCH 16/26] fix:
https://github.com/interlegis/sapl/pull/3829#discussion_r3083452572
---
.../migrations/0048_auto_20260413_1049.py | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/sapl/parlamentares/migrations/0048_auto_20260413_1049.py b/sapl/parlamentares/migrations/0048_auto_20260413_1049.py
index ee0d1f3a0..91910292c 100644
--- a/sapl/parlamentares/migrations/0048_auto_20260413_1049.py
+++ b/sapl/parlamentares/migrations/0048_auto_20260413_1049.py
@@ -4,13 +4,17 @@ from django.db import migrations, models
import django.db.models.deletion
def preencher_titulo_mesa_diretora(apps, schema_editor):
- MesaDiretora = apps.get_model('parlamentares', 'MesaDiretora')
- for mesa in MesaDiretora.objects.all():
- ano_inicio = mesa.data_inicio.year if mesa.data_inicio else None
- ano_fim = mesa.data_fim.year if mesa.data_fim else None
- if ano_inicio and ano_fim:
- mesa.titulo = f'Mesa Diretora{" Biênio" if ano_fim - ano_inicio == 1 else ""} {ano_inicio}/{ano_fim}'
- mesa.save()
+ schema_editor.execute("""
+ UPDATE parlamentares_mesadiretora
+ SET titulo = 'Mesa Diretora' ||
+ CASE WHEN EXTRACT(YEAR FROM data_fim)::integer - EXTRACT(YEAR FROM data_inicio)::integer = 1
+ THEN ' Biênio'
+ ELSE ''
+ END || ' ' ||
+ EXTRACT(YEAR FROM data_inicio)::integer::text || '/' ||
+ EXTRACT(YEAR FROM data_fim)::integer::text
+ WHERE data_inicio IS NOT NULL AND data_fim IS NOT NULL
+ """)
class Migration(migrations.Migration):
From c9e55dcd57fbdec1e70854ca0bfed10a8aa32391 Mon Sep 17 00:00:00 2001
From: LeandroJatai
Date: Fri, 17 Apr 2026 19:13:01 -0300
Subject: [PATCH 17/26] fix:
https://github.com/interlegis/sapl/pull/3829/changes/BASE..958e83fd2a18b5fe8d296b8bc891dc03de0f8595#r3093413994
---
sapl/parlamentares/forms.py | 22 ++++++++++++++--------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py
index 2775be5a1..7da23b763 100755
--- a/sapl/parlamentares/forms.py
+++ b/sapl/parlamentares/forms.py
@@ -785,17 +785,26 @@ class MesaDiretoraForm(ModelForm):
def clean(self):
super(MesaDiretoraForm, self).clean()
- if not self.is_valid():
- return self.cleaned_data
data = self.cleaned_data
- legislatura = data['legislatura']
- data_inicio = data['data_inicio']
- data_fim = data['data_fim']
+
+ legislatura = data.get('legislatura', None)
+ if not legislatura:
+ raise ValidationError(_('Legislatura é obrigatória.'))
+
+ data_inicio = data.get('data_inicio', None)
+ data_fim = data.get('data_fim', None)
+
+ if not data_inicio or not data_fim:
+ raise ValidationError(_('As datas de início e fim da mesa diretora são obrigatórias.'))
if data_inicio >= data_fim:
raise ValidationError(_('A data de início deve ser anterior à data de fim.'))
+ # Verifica se as datas da mesa diretora estão dentro do intervalo da legislatura
+ if data_inicio < legislatura.data_inicio or data_fim > legislatura.data_fim:
+ raise ValidationError(_('As datas da mesa diretora devem estar dentro do período da legislatura.'))
+
# Verifica se há intersecção de datas com outra mesa diretora da mesma legislatura
intersecao_mesadiretora = MesaDiretora.objects.filter(
legislatura=legislatura,
@@ -805,9 +814,6 @@ class MesaDiretoraForm(ModelForm):
if intersecao_mesadiretora:
raise ValidationError(_('As datas da mesa diretora se sobrepõem com outra mesa diretora existente.'))
- # Verifica se as datas da mesa diretora estão dentro do intervalo da legislatura
- if data_inicio < legislatura.data_inicio or data_fim > legislatura.data_fim:
- raise ValidationError(_('As datas da mesa diretora devem estar dentro do período da legislatura.'))
return data
class ComposicaoMesaForm(ModelForm):
From 3d629556a772418955cabc30d838a73bda632c6b Mon Sep 17 00:00:00 2001
From: LeandroJatai
Date: Fri, 17 Apr 2026 19:19:47 -0300
Subject: [PATCH 18/26] fix: reviews
https://github.com/interlegis/sapl/pull/3829#discussion_r3083631421
https://github.com/interlegis/sapl/pull/3829#discussion_r3083748499
---
.../migrations/0049_auto_20260417_1917.py | 39 +++++++++++++++++++
sapl/parlamentares/models.py | 6 +--
2 files changed, 42 insertions(+), 3 deletions(-)
create mode 100644 sapl/parlamentares/migrations/0049_auto_20260417_1917.py
diff --git a/sapl/parlamentares/migrations/0049_auto_20260417_1917.py b/sapl/parlamentares/migrations/0049_auto_20260417_1917.py
new file mode 100644
index 000000000..401e07433
--- /dev/null
+++ b/sapl/parlamentares/migrations/0049_auto_20260417_1917.py
@@ -0,0 +1,39 @@
+# Generated by Django 2.2.28 on 2026-04-17 22:17
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('parlamentares', '0048_auto_20260413_1049'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='composicaomesa',
+ name='cargo',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.CargoMesa', verbose_name='Cargo'),
+ ),
+ migrations.AlterField(
+ model_name='composicaomesa',
+ name='mesa_diretora',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='composicaomesa_set', to='parlamentares.MesaDiretora', verbose_name='Mesa Diretora'),
+ ),
+ migrations.AlterField(
+ model_name='composicaomesa',
+ name='parlamentar',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Parlamentar', verbose_name='Parlamentar'),
+ ),
+ migrations.AlterField(
+ model_name='mesadiretora',
+ name='data_fim',
+ field=models.DateField(verbose_name='Data Fim'),
+ ),
+ migrations.AlterField(
+ model_name='mesadiretora',
+ name='data_inicio',
+ field=models.DateField(verbose_name='Data Início'),
+ ),
+ ]
diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py
index 759835783..260757768 100644
--- a/sapl/parlamentares/models.py
+++ b/sapl/parlamentares/models.py
@@ -492,8 +492,8 @@ class CargoMesa(models.Model):
class MesaDiretora(models.Model):
titulo = models.CharField(max_length=100, default='', verbose_name=_('Título da Mesa Diretora'))
- data_inicio = models.DateField(verbose_name=_('Data Início'), null=True)
- data_fim = models.DateField(verbose_name=_('Data Fim'), null=True)
+ data_inicio = models.DateField(verbose_name=_('Data Início'))
+ data_fim = models.DateField(verbose_name=_('Data Fim'))
legislatura = models.ForeignKey(Legislatura,
on_delete=models.PROTECT,
verbose_name=_('Legislatura'))
@@ -516,7 +516,7 @@ class ComposicaoMesa(models.Model):
parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT, verbose_name=_('Parlamentar'))
cargo = models.ForeignKey(CargoMesa, on_delete=models.PROTECT, verbose_name=_('Cargo'))
mesa_diretora = models.ForeignKey(
- MesaDiretora, on_delete=models.PROTECT, null=True,
+ MesaDiretora, on_delete=models.PROTECT,
related_name='composicaomesa_set', verbose_name=_('Mesa Diretora'))
class Meta:
From a6ee8d33c750229a0ae723aa80c45f943944d5da Mon Sep 17 00:00:00 2001
From: LeandroJatai
Date: Fri, 17 Apr 2026 19:48:46 -0300
Subject: [PATCH 19/26] fix: ajuste em subnav_mesa.yaml
---
sapl/templates/parlamentares/subnav_mesa.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/templates/parlamentares/subnav_mesa.yaml b/sapl/templates/parlamentares/subnav_mesa.yaml
index 32779de54..5391023db 100644
--- a/sapl/templates/parlamentares/subnav_mesa.yaml
+++ b/sapl/templates/parlamentares/subnav_mesa.yaml
@@ -1,5 +1,5 @@
{% load i18n common_tags %}
- title: {% trans 'Mesa Diretora' %}
- url: sapl.parlamentares:mesadiretora_list
+ url: sapl.parlamentares:mesadiretora_detail
- title: {% trans 'Composição da Mesa' %}
url: sapl.parlamentares:composicaomesa_list
\ No newline at end of file
From 29c9dc09e49884ac141d46763cbb63db9146da42 Mon Sep 17 00:00:00 2001
From: LeandroJatai
Date: Fri, 17 Apr 2026 20:00:40 -0300
Subject: [PATCH 20/26] fix:
https://github.com/interlegis/sapl/pull/3829#discussion_r3093455410
---
sapl/parlamentares/views.py | 7 -------
sapl/templates/parlamentares/layouts.yaml | 7 -------
2 files changed, 14 deletions(-)
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
index f6f4ba76f..4fac0701a 100644
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -1052,13 +1052,6 @@ class MesaDiretoraCrud(Crud):
context['subnav_template_name'] = ''
return context
- class DetailView(Crud.DetailView):
- layout_key = 'MesaDiretoraDetail'
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- return context
-
-
class ComposicaoMesaCrud(MasterDetailCrud):
model = ComposicaoMesa
parent_field = 'mesa_diretora'
diff --git a/sapl/templates/parlamentares/layouts.yaml b/sapl/templates/parlamentares/layouts.yaml
index 6ff9b6351..45a0efe3a 100644
--- a/sapl/templates/parlamentares/layouts.yaml
+++ b/sapl/templates/parlamentares/layouts.yaml
@@ -174,13 +174,6 @@ MesaDiretora:
{% trans 'Descrição' %}:
- descricao
-MesaDiretoraDetail:
- {% trans 'Período e Legislatura' %}:
- - titulo
- - data_inicio data_fim legislatura:6
- {% trans 'Descrição' %}:
- - descricao
-
ComposicaoMesa:
{% trans 'Composição da Mesa' %}:
- cargo:4 parlamentar
\ No newline at end of file
From f36970c6211d2e4d9f0e7500ee48e35aeff5f312 Mon Sep 17 00:00:00 2001
From: LeandroJatai
Date: Fri, 17 Apr 2026 20:32:57 -0300
Subject: [PATCH 21/26] fix:
https://github.com/interlegis/sapl/pull/3829#discussion_r3093434428
---
sapl/parlamentares/models.py | 4 +++-
sapl/parlamentares/views.py | 6 ++++++
.../parlamentares/mesadiretora_filter.html | 14 +++++++-------
3 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py
index 260757768..74351957e 100644
--- a/sapl/parlamentares/models.py
+++ b/sapl/parlamentares/models.py
@@ -298,7 +298,9 @@ class Parlamentar(models.Model):
@property
def filiacao_atual(self):
- ultima_filiacao = self.filiacao_set.order_by('-data').first()
+ # este método conta com a ordenação default do model Filiacao para trazer a última filiação primeiro
+ # se order_by for adicionado aqui, o prefetch_related que inclui filiacao_set não irá pré-carregar como esperado
+ ultima_filiacao = self.filiacao_set.first()
if ultima_filiacao and not ultima_filiacao.data_desfiliacao:
return ultima_filiacao.partido.sigla
else:
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
index 4fac0701a..e98c811b3 100644
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -1032,6 +1032,12 @@ class MesaDiretoraCrud(Crud):
fk['data'] = {'legislatura': legislatura}
return fk
+ def get_queryset(self):
+ return super().get_queryset().prefetch_related(
+ 'composicaomesa_set__parlamentar__filiacao_set__partido',
+ 'composicaomesa_set__cargo'
+ )
+
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['subnav_template_name'] = ''
diff --git a/sapl/templates/parlamentares/mesadiretora_filter.html b/sapl/templates/parlamentares/mesadiretora_filter.html
index a07c5262f..ecbcfcb81 100644
--- a/sapl/templates/parlamentares/mesadiretora_filter.html
+++ b/sapl/templates/parlamentares/mesadiretora_filter.html
@@ -45,19 +45,19 @@