From 799f0ec7f04261fa450806280d3bc410d9ddab3c Mon Sep 17 00:00:00 2001
From: LeandroJatai
Date: Sun, 12 Apr 2026 23:57:17 -0300
Subject: [PATCH] =?UTF-8?q?feat:=20cria=20MesaDiretoraCrud=20e=20Composica?=
=?UTF-8?q?oMesaCrud=20sem=20forms=20e=20regras=20de=20neg=C3=B3cio?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../0046_mesadiretora_legislatura.py | 37 ++++++++++++++
.../migrations/0047_auto_20260412_2256.py | 23 +++++++++
sapl/parlamentares/models.py | 17 ++++---
sapl/parlamentares/urls.py | 8 +++-
sapl/parlamentares/views.py | 48 +++++++++++++++++--
sapl/templates/index.html | 2 +-
sapl/templates/navbar.yaml | 2 +-
...form.html => composicaomesa_form_old.html} | 0
sapl/templates/parlamentares/layouts.yaml | 15 ++++++
...ml => public_composicaomesa_form_old.html} | 0
sapl/templates/parlamentares/subnav_mesa.yaml | 5 ++
11 files changed, 142 insertions(+), 15 deletions(-)
create mode 100644 sapl/parlamentares/migrations/0046_mesadiretora_legislatura.py
create mode 100644 sapl/parlamentares/migrations/0047_auto_20260412_2256.py
rename sapl/templates/parlamentares/{composicaomesa_form.html => composicaomesa_form_old.html} (100%)
rename sapl/templates/parlamentares/{public_composicaomesa_form.html => public_composicaomesa_form_old.html} (100%)
create mode 100644 sapl/templates/parlamentares/subnav_mesa.yaml
diff --git a/sapl/parlamentares/migrations/0046_mesadiretora_legislatura.py b/sapl/parlamentares/migrations/0046_mesadiretora_legislatura.py
new file mode 100644
index 000000000..052527523
--- /dev/null
+++ b/sapl/parlamentares/migrations/0046_mesadiretora_legislatura.py
@@ -0,0 +1,37 @@
+# Generated by Django 2.2.28 on 2026-04-13 01:48
+
+from django.db import migrations, models
+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()
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('parlamentares', '0045_auto_20251201_1531'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='mesadiretora',
+ name='legislatura',
+ field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Legislatura', verbose_name='Legislatura'),
+ ),
+ migrations.RunPython(add_legislatura_to_mesa_diretora),
+ ]
diff --git a/sapl/parlamentares/migrations/0047_auto_20260412_2256.py b/sapl/parlamentares/migrations/0047_auto_20260412_2256.py
new file mode 100644
index 000000000..66eae56c1
--- /dev/null
+++ b/sapl/parlamentares/migrations/0047_auto_20260412_2256.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.2.28 on 2026-04-13 01:56
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('parlamentares', '0046_mesadiretora_legislatura'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='mesadiretora',
+ name='legislatura',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Legislatura', verbose_name='Legislatura'),
+ ),
+ migrations.RemoveField(
+ model_name='mesadiretora',
+ name='sessao_legislativa',
+ ),
+ ]
diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py
index eecc2f314..62c88e111 100644
--- a/sapl/parlamentares/models.py
+++ b/sapl/parlamentares/models.py
@@ -493,27 +493,30 @@ class CargoMesa(models.Model):
class MesaDiretora(models.Model):
data_inicio = models.DateField(verbose_name=_('Data Início'), null=True)
data_fim = models.DateField(verbose_name=_('Data Fim'), null=True)
- sessao_legislativa = models.ForeignKey(SessaoLegislativa,
- on_delete=models.PROTECT)
+ legislatura = models.ForeignKey(Legislatura,
+ on_delete=models.PROTECT,
+ verbose_name=_('Legislatura'))
descricao = models.TextField(verbose_name=_('Descrição'), blank=True)
class Meta:
verbose_name = _('Mesa Diretora')
verbose_name_plural = _('Mesas Diretoras')
- ordering = ('-data_inicio', '-sessao_legislativa')
+ ordering = ('-data_inicio', '-legislatura')
def __str__(self):
- return _('Mesa da %(sessao)s sessao da %(legislatura)s Legislatura') % {
- 'sessao': self.sessao_legislativa, 'legislatura': self.sessao_legislativa.legislatura
+ return _('%(legislatura)s - %(data_inicio)s a %(data_fim)s') % {
+ 'legislatura': self.legislatura,
+ 'data_inicio': self.data_inicio,
+ 'data_fim': self.data_fim
}
-
class ComposicaoMesa(models.Model):
# TODO M2M ???? Ternary?????
parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT)
cargo = models.ForeignKey(CargoMesa, on_delete=models.PROTECT)
mesa_diretora = models.ForeignKey(
- MesaDiretora, on_delete=models.PROTECT, null=True)
+ MesaDiretora, on_delete=models.PROTECT, null=True,
+ related_name='composicaomesa_set')
class Meta:
verbose_name = _('Ocupação de cargo na Mesa')
diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py
index d67a1f6b1..08442ee24 100644
--- a/sapl/parlamentares/urls.py
+++ b/sapl/parlamentares/urls.py
@@ -1,6 +1,6 @@
from django.conf.urls import include, url
-from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud,
+from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud, ComposicaoMesaCrud, MesaDiretoraCrud,
coligacao_legislatura,
ComposicaoColigacaoCrud, DependenteCrud,
FiliacaoCrud, FrenteCrud, FrenteList,
@@ -104,6 +104,12 @@ urlpatterns = [
url(r'^sistema/mesa-diretora/cargo-mesa/',
include(CargoMesaCrud.get_urls())),
+ url(r'^mesadiretora/', include(
+ MesaDiretoraCrud.get_urls() + ComposicaoMesaCrud.get_urls()
+ )),
+]
+
+urlpatterns_mesa_old = [
url(r'^mesa-diretora/$',
MesaDiretoraView.as_view(), name='mesa_diretora'),
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
index a46ce2b84..9bc605eb3 100644
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -1007,20 +1007,58 @@ def parlamentares_filiados(request, pk):
return render(request, template_name, {'partido': partido, 'parlamentares': parlamentares_filiados})
+class MesaDiretoraCrud(Crud):
+ model = MesaDiretora
+ help_topic = 'mesa_diretora'
+ public = [RP_DETAIL, RP_LIST]
+
+ class BaseMixin(Crud.BaseMixin):
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ if 'subnav_template_name' not in context:
+ context['subnav_template_name'] = 'parlamentares/subnav_mesa.yaml'
+ return context
+
+ class ListView(Crud.ListView):
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context['subnav_template_name'] = ''
+ return context
+
+ class CreateView(Crud.CreateView):
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context['subnav_template_name'] = ''
+ return context
+
+
+class ComposicaoMesaCrud(MasterDetailCrud):
+ model = ComposicaoMesa
+ parent_field = 'mesa_diretora'
+ help_topic = 'mesa_diretora'
+ public = [RP_LIST, RP_DETAIL]
+
+ class BaseMixin(MasterDetailCrud.BaseMixin):
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context['subnav_template_name'] = 'parlamentares/subnav_mesa.yaml'
+ return context
+
+
class MesaDiretoraView(FormView):
- template_name = 'parlamentares/composicaomesa_form.html'
- success_url = reverse_lazy('sapl.parlamentares:mesa_diretora')
+ template_name = 'parlamentares/composicaomesa_form_old.html'
+ success_url = ''#reverse_lazy('sapl.parlamentares:mesa_diretora')
logger = logging.getLogger(__name__)
def get_template_names(self):
if self.request.user.has_perm('parlamentares.change_composicaomesa'):
if 'iframe' not in self.request.GET:
if not self.request.session.get('iframe'):
- return 'parlamentares/composicaomesa_form.html'
+ return 'parlamentares/composicaomesa_form_old.html'
elif self.request.GET['iframe'] == '0':
- return 'parlamentares/composicaomesa_form.html'
+ return 'parlamentares/composicaomesa_form_old.html'
- return 'parlamentares/public_composicaomesa_form.html'
+ return 'parlamentares/public_composicaomesa_form_old.html'
# Essa função avisa quando se pode compor uma Mesa Legislativa
def validation(self, request):
diff --git a/sapl/templates/index.html b/sapl/templates/index.html
index 3cb59bbc6..57b73cbcd 100644
--- a/sapl/templates/index.html
+++ b/sapl/templates/index.html
@@ -26,7 +26,7 @@
a dois anos.
-
+
diff --git a/sapl/templates/navbar.yaml b/sapl/templates/navbar.yaml
index e4dc39c10..1a5cb415b 100644
--- a/sapl/templates/navbar.yaml
+++ b/sapl/templates/navbar.yaml
@@ -6,7 +6,7 @@
- title: {% trans 'Institucional' %}
children:
- title: {% trans 'Mesa Diretora' %}
- url: sapl.parlamentares:mesa_diretora
+ url: sapl.parlamentares:mesadiretora_list
- title: {% trans 'Bancadas Parlamentares' %}
url: sapl.sessao:bancada_list
- title: {% trans 'Blocos Parlamentares' %}
diff --git a/sapl/templates/parlamentares/composicaomesa_form.html b/sapl/templates/parlamentares/composicaomesa_form_old.html
similarity index 100%
rename from sapl/templates/parlamentares/composicaomesa_form.html
rename to sapl/templates/parlamentares/composicaomesa_form_old.html
diff --git a/sapl/templates/parlamentares/layouts.yaml b/sapl/templates/parlamentares/layouts.yaml
index 9d2037477..3cb32ac9b 100644
--- a/sapl/templates/parlamentares/layouts.yaml
+++ b/sapl/templates/parlamentares/layouts.yaml
@@ -166,3 +166,18 @@ BlocoMembroList:
- id
- cargo:4 parlamentar
- data_entrada data_saida
+
+MesaDiretora:
+ {% trans 'Período e Legislatura' %}:
+ - data_inicio data_fim legislatura:6
+ - descricao
+
+MesaDiretoraDetail:
+ {% trans 'Período e Legislatura' %}:
+ - data_inicio data_fim legislatura:6
+ - descricao
+ - composicaomesa_set
+
+ComposicaoMesa:
+ {% trans 'Composição da Mesa' %}:
+ - cargo:4 parlamentar
\ No newline at end of file
diff --git a/sapl/templates/parlamentares/public_composicaomesa_form.html b/sapl/templates/parlamentares/public_composicaomesa_form_old.html
similarity index 100%
rename from sapl/templates/parlamentares/public_composicaomesa_form.html
rename to sapl/templates/parlamentares/public_composicaomesa_form_old.html
diff --git a/sapl/templates/parlamentares/subnav_mesa.yaml b/sapl/templates/parlamentares/subnav_mesa.yaml
new file mode 100644
index 000000000..32779de54
--- /dev/null
+++ b/sapl/templates/parlamentares/subnav_mesa.yaml
@@ -0,0 +1,5 @@
+{% load i18n common_tags %}
+- title: {% trans 'Mesa Diretora' %}
+ url: sapl.parlamentares:mesadiretora_list
+- title: {% trans 'Composição da Mesa' %}
+ url: sapl.parlamentares:composicaomesa_list
\ No newline at end of file