From f1611fe5aef1d2944251a2a5237ec09f762f85c5 Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Wed, 21 Nov 2018 13:16:37 -0200
Subject: [PATCH 1/8] fix #2391 (#2392)
* fix #2391
* add test
---
sapl/parlamentares/forms.py | 2 +-
sapl/parlamentares/tests/test_parlamentares.py | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py
index 36237d448..a15a4e305 100755
--- a/sapl/parlamentares/forms.py
+++ b/sapl/parlamentares/forms.py
@@ -136,7 +136,7 @@ class MandatoForm(ModelForm):
existe_mandato = Mandato.objects.filter(
parlamentar=data['parlamentar'],
legislatura=data['legislatura']).exists()
- if existe_mandato:
+ if existe_mandato and data['titular']:
self.logger.error("Mandato nesta legislatura (parlamentar={}, legislatura={}) já existe."
.format(data['parlamentar'], data['legislatura']))
raise ValidationError(_('Mandato nesta legislatura já existe.'))
diff --git a/sapl/parlamentares/tests/test_parlamentares.py b/sapl/parlamentares/tests/test_parlamentares.py
index bc404757d..0f8d6e24f 100644
--- a/sapl/parlamentares/tests/test_parlamentares.py
+++ b/sapl/parlamentares/tests/test_parlamentares.py
@@ -178,6 +178,7 @@ def test_mandato_form_duplicado():
'legislatura': str(legislatura.pk),
'data_expedicao_diploma': '01/07/2015',
'data_inicio_mandato': legislatura.data_inicio,
+ 'titular':True,
})
assert not form.is_valid()
From 751fde35152be41d2445aae20710777ed03747e2 Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Wed, 21 Nov 2018 13:16:56 -0200
Subject: [PATCH 2/8] fix #2376 (#2388)
---
sapl/sessao/views.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
index 845608f79..2d8527aaa 100755
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -1335,7 +1335,7 @@ class ResumoView(DetailView):
).order_by('parlamentar__nome_parlamentar')
parlamentares_sessao = [p.parlamentar for p in presencas]
-
+
context.update({'presenca_sessao': parlamentares_sessao})
@@ -3086,6 +3086,7 @@ class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente):
'sessao.change_ordemdia')
def mudar_ordem_materia_sessao(request):
# Pega os dados vindos da requisição
+ # import ipdb; ipdb.set_trace()
posicao_inicial = int(request.POST['pos_ini']) + 1
posicao_final = int(request.POST['pos_fim']) + 1
pk_sessao = int(request.POST['pk_sessao'])
@@ -3099,7 +3100,7 @@ def mudar_ordem_materia_sessao(request):
elif materia == 'ordem':
materia = OrdemDia
else:
- return
+ return JsonResponse({}, safe=False)
# Testa se existe alguma matéria na posição recebida
try:
@@ -3138,7 +3139,7 @@ def mudar_ordem_materia_sessao(request):
materia_1.numero_ordem = posicao_final
materia_1.save()
- return
+ return JsonResponse({}, safe=False)
class JustificativaAusenciaCrud(MasterDetailCrud):
From cb15bd04daf6e459daecf7a6c4524009788590bf Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Wed, 21 Nov 2018 13:29:54 -0200
Subject: [PATCH 3/8] Remove chamada ipdb comentada
---
sapl/sessao/views.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
index 2d8527aaa..8731376e3 100755
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -3086,7 +3086,6 @@ class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente):
'sessao.change_ordemdia')
def mudar_ordem_materia_sessao(request):
# Pega os dados vindos da requisição
- # import ipdb; ipdb.set_trace()
posicao_inicial = int(request.POST['pos_ini']) + 1
posicao_final = int(request.POST['pos_fim']) + 1
pk_sessao = int(request.POST['pk_sessao'])
From b27102f9264cc02580a16de713fd43593e6b9fa1 Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Wed, 21 Nov 2018 13:31:18 -0200
Subject: [PATCH 4/8] Release: 3.1.135
---
docker-compose.yml | 2 +-
sapl/templates/base.html | 2 +-
setup.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index 11902a565..c55959395 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.134
+ image: interlegis/sapl:3.1.135
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index 2ff5fdea4..e7b6cd7d1 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -184,7 +184,7 @@
Desenvolvido pelo Interlegis em software livre e aberto.
- Release: 3.1.134
+ Release: 3.1.135
diff --git a/setup.py b/setup.py
index 3e97d8bf1..2e6baf114 100644
--- a/setup.py
+++ b/setup.py
@@ -52,7 +52,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
- version='3.1.134',
+ version='3.1.135',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',
From 442bfa85bcd31f64a51713a4e29fd5d8c77ff100 Mon Sep 17 00:00:00 2001
From: Edward
Date: Wed, 21 Nov 2018 15:41:48 -0200
Subject: [PATCH 5/8] Fixes #2390 (#2395)
---
sapl/relatorios/views.py | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py
index 260d85a21..3b7ab6957 100755
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -1083,8 +1083,7 @@ def get_pauta_sessao(sessao, casa):
inf_basicas_dic["nom_camara"] = casa.nome
lst_expediente_materia = []
- for expediente_materia in ExpedienteMateria.objects.filter(
- data_ordem=sessao.data_inicio, sessao_plenaria=sessao):
+ for expediente_materia in ExpedienteMateria.objects.filter(sessao_plenaria=sessao):
materia = MateriaLegislativa.objects.filter(
id=expediente_materia.materia.id).first()
From cc0a994448f2ae2656ea9afc94b4ceb463d48a29 Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Wed, 21 Nov 2018 16:14:42 -0200
Subject: [PATCH 6/8] Release: 3.1.136
---
docker-compose.yml | 2 +-
sapl/templates/base.html | 2 +-
setup.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index c55959395..24dbd8cd3 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.135
+ image: interlegis/sapl:3.1.136
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index e7b6cd7d1..efffd0cf8 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -184,7 +184,7 @@
Desenvolvido pelo Interlegis em software livre e aberto.
- Release: 3.1.135
+ Release: 3.1.136
diff --git a/setup.py b/setup.py
index 2e6baf114..281eb06e4 100644
--- a/setup.py
+++ b/setup.py
@@ -52,7 +52,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
- version='3.1.135',
+ version='3.1.136',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',
From 80117ab4dc07f09d56bb8a80288c2ccb76e32585 Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Thu, 22 Nov 2018 12:46:12 -0200
Subject: [PATCH 7/8] fix #1973 (#2383)
* [WIP] initial commit
* [WIP] adiciona tipo retirada de pauta
* [WIP]
* Fix migrations conflicts
* [WIP]
* [WIP] form in progress
* form on the away
* form working
* form update bugging, form create and view ok
* Retirada de pauta quase completo
* Edit funcionando
* fix migration conflicts
---
sapl/rules/map_rules.py | 2 +
sapl/sessao/forms.py | 102 +++++++++++++++++-
.../migrations/0028_auto_20181031_0902.py | 50 +++++++++
.../migrations/0030_auto_20181113_1149.py | 27 +++++
.../0030_resumoordenacao_decimo_primeiro.py | 2 +-
.../migrations/0031_auto_20181116_1849.py | 21 ++++
sapl/sessao/models.py | 65 +++++++++++
sapl/sessao/urls.py | 9 +-
sapl/sessao/views.py | 68 ++++++++++--
sapl/templates/menu_tabelas_auxiliares.yaml | 3 +
sapl/templates/sessao/layouts.yaml | 12 ++-
sapl/templates/sessao/retiradapauta_form.html | 6 ++
sapl/templates/sessao/subnav.yaml | 2 +
sapl/templates/sistema.html | 1 +
14 files changed, 351 insertions(+), 19 deletions(-)
create mode 100644 sapl/sessao/migrations/0028_auto_20181031_0902.py
create mode 100644 sapl/sessao/migrations/0030_auto_20181113_1149.py
create mode 100644 sapl/sessao/migrations/0031_auto_20181116_1849.py
create mode 100644 sapl/templates/sessao/retiradapauta_form.html
diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py
index 2b6204ec2..aa691da5e 100644
--- a/sapl/rules/map_rules.py
+++ b/sapl/rules/map_rules.py
@@ -172,6 +172,7 @@ rules_group_sessao = {
(sessao.RegistroVotacao, __base__),
(sessao.VotoParlamentar, __base__),
(sessao.JustificativaAusencia, __base__),
+ (sessao.RetiradaPauta, __base__)
]
}
@@ -269,6 +270,7 @@ rules_group_geral = {
(sessao.JustificativaAusencia, __base__),
(sessao.Bloco, __base__),
(sessao.ResumoOrdenacao, __base__),
+ (sessao.TipoRetiradaPauta, __base__),
(lexml.LexmlProvedor, __base__),
(lexml.LexmlPublicador, __base__),
diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py
index 2a31b60c3..386f123ca 100644
--- a/sapl/sessao/forms.py
+++ b/sapl/sessao/forms.py
@@ -23,11 +23,11 @@ from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato
from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES,
MateriaPesquisaOrderingFilter, autor_label,
autor_modal, timezone)
+from .models import (Bancada, Bloco, ExpedienteMateria, Orador, JustificativaAusencia,
+ OradorExpediente, OrdemDia, SessaoPlenaria,
+ SessaoPlenariaPresenca, TipoResultadoVotacao, OcorrenciaSessao,
+ RetiradaPauta, TipoRetiradaPauta)
-from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia,
- Orador, OradorExpediente, OrdemDia, SessaoPlenaria,
- SessaoPlenariaPresenca, TipoJustificativa, TipoResultadoVotacao,
- OcorrenciaSessao)
def recupera_anos():
@@ -191,6 +191,100 @@ class SessaoPlenariaForm(ModelForm):
return self.cleaned_data
+class RetiradaPautaForm(ModelForm):
+
+ tipo_de_retirada = forms.ModelChoiceField(required=True,
+ empty_label='------------',
+ queryset=TipoRetiradaPauta.objects.all())
+ expediente = forms.ModelChoiceField(required=False,
+ label='Matéria do Expediente',
+ queryset=ExpedienteMateria.objects.all())
+ ordem = forms.ModelChoiceField(required=False,
+ label='Matéria da Ordem do Dia',
+ queryset=OrdemDia.objects.all())
+ materia = forms.ModelChoiceField(required=False,
+ widget=forms.HiddenInput(),
+ queryset=MateriaLegislativa.objects.all())
+
+ class Meta:
+ model = RetiradaPauta
+ fields = ['ordem',
+ 'expediente',
+ 'parlamentar',
+ 'tipo_de_retirada',
+ 'data',
+ 'observacao',
+ 'materia']
+
+ def __init__(self, *args, **kwargs):
+
+ row1 = to_row([('tipo_de_retirada', 5),
+ ('parlamentar', 4),
+ ('data', 3)])
+ row2 = to_row([('ordem', 6),
+ ('expediente', 6)])
+ row3 = to_row([('observacao',12)])
+
+ self.helper = FormHelper()
+ self.helper.layout = SaplFormLayout(
+ Fieldset(_('Retirada de Pauta'),
+ row1, row2, row3))
+
+ q = Q(sessao_plenaria=kwargs['initial']['sessao_plenaria'])
+ ordens = OrdemDia.objects.filter(q)
+ expedientes = ExpedienteMateria.objects.filter(q)
+ retiradas_ordem = [r.ordem for r in RetiradaPauta.objects.filter(q, ordem__in=ordens)]
+ retiradas_expediente = [r.expediente for r in RetiradaPauta.objects.filter(q, expediente__in=expedientes)]
+ setOrdem = set(ordens) - set(retiradas_ordem)
+ setExpediente = set(expedientes) - set(retiradas_expediente)
+
+ super(RetiradaPautaForm, self).__init__(
+ *args, **kwargs)
+
+ if self.instance.pk:
+ setOrdem = set(ordens)
+ setExpediente = set(expedientes)
+
+ presencas = SessaoPlenariaPresenca.objects.filter(
+ q).order_by('parlamentar__nome_parlamentar')
+ presentes = [p.parlamentar for p in presencas]
+
+ self.fields['expediente'].choices = [
+ (None, "------------")] + [(e.id, e.materia) for e in setExpediente]
+ self.fields['ordem'].choices = [
+ (None, "------------")] + [(o.id, o.materia) for o in setOrdem]
+ self.fields['parlamentar'].choices = [
+ (None, "------------")] + [(p.id, p) for p in presentes]
+
+ def clean(self):
+
+ super(RetiradaPautaForm, self).clean()
+
+ if not self.is_valid():
+ return self.cleaned_data
+
+ sessao_plenaria = self.instance.sessao_plenaria
+ if self.cleaned_data['data'] < sessao_plenaria.data_inicio:
+ raise ValidationError(_("Data de retirada de pauta anterior à abertura da Sessão."))
+ if sessao_plenaria.data_fim and self.cleaned_data['data'] > sessao_plenaria.data_fim:
+ raise ValidationError(_("Data de retirada de pauta posterior ao encerramento da Sessão."))
+
+ if self.cleaned_data['ordem'] and self.cleaned_data['ordem'].registrovotacao_set.exists():
+ raise ValidationError(_("Essa matéria já foi votada, portanto não pode ser retirada de pauta."))
+ elif self.cleaned_data['expediente'] and self.cleaned_data['expediente'].registrovotacao_set.exists():
+ raise ValidationError(_("Essa matéria já foi votada, portanto não pode ser retirada de pauta."))
+
+ return self.cleaned_data
+
+ def save(self, commit=False):
+ retirada = super(RetiradaPautaForm, self).save(commit=False)
+ if retirada.ordem:
+ retirada.materia = retirada.ordem.materia
+ elif retirada.expediente:
+ retirada.materia = retirada.expediente.materia
+ retirada.save()
+ return retirada
+
class BancadaForm(ModelForm):
class Meta:
diff --git a/sapl/sessao/migrations/0028_auto_20181031_0902.py b/sapl/sessao/migrations/0028_auto_20181031_0902.py
new file mode 100644
index 000000000..3ff3c0dc5
--- /dev/null
+++ b/sapl/sessao/migrations/0028_auto_20181031_0902.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2018-10-31 12:02
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('materia', '0032_auto_20181022_1743'),
+ ('parlamentares', '0025_auto_20180924_1724'),
+ ('sessao', '0029_auto_20181024_0952'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='RetiradaPauta',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('observacao', models.TextField(blank=True, verbose_name='Observações')),
+ ('expediente', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.ExpedienteMateria')),
+ ('materia', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='materia.MateriaLegislativa')),
+ ('ordem', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.OrdemDia')),
+ ('parlamentar', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Parlamentar', verbose_name='Requerente')),
+ ],
+ options={
+ 'verbose_name_plural': 'Retirada de Pauta',
+ 'verbose_name': 'Retirada de Pauta',
+ },
+ ),
+ migrations.CreateModel(
+ name='TipoRetiradaPauta',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('descricao', models.CharField(max_length=150, verbose_name='Descrição')),
+ ],
+ options={
+ 'verbose_name_plural': 'Tipos de Retirada de Pauta',
+ 'verbose_name': 'Tipo de Retidara de Pauta',
+ 'ordering': ['descricao'],
+ },
+ ),
+ migrations.AddField(
+ model_name='retiradapauta',
+ name='tipo_de_retirada',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sessao.TipoRetiradaPauta', verbose_name='Motivo de Retirada de Pauta'),
+ ),
+ ]
diff --git a/sapl/sessao/migrations/0030_auto_20181113_1149.py b/sapl/sessao/migrations/0030_auto_20181113_1149.py
new file mode 100644
index 000000000..6b7c3a237
--- /dev/null
+++ b/sapl/sessao/migrations/0030_auto_20181113_1149.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2018-11-13 13:49
+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 = [
+ ('sessao', '0028_auto_20181031_0902'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='retiradapauta',
+ name='data',
+ field=models.DateField(default=django.utils.timezone.now, verbose_name='Data'),
+ ),
+ migrations.AddField(
+ model_name='retiradapauta',
+ name='sessao_plenaria',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria', verbose_name='Sessão Plenária'),
+ ),
+ ]
diff --git a/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py b/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py
index f284bf715..8bd62e137 100644
--- a/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py
+++ b/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py
@@ -8,7 +8,7 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
- ('sessao', '0029_auto_20181024_0952'),
+ ('sessao', '0031_auto_20181116_1849'),
]
operations = [
diff --git a/sapl/sessao/migrations/0031_auto_20181116_1849.py b/sapl/sessao/migrations/0031_auto_20181116_1849.py
new file mode 100644
index 000000000..61ea74b9f
--- /dev/null
+++ b/sapl/sessao/migrations/0031_auto_20181116_1849.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2018-11-16 20:49
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('sessao', '0030_auto_20181113_1149'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='retiradapauta',
+ name='materia',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='materia.MateriaLegislativa', verbose_name='Matéria'),
+ ),
+ ]
diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py
index 6f07d9645..8cc162a05 100644
--- a/sapl/sessao/models.py
+++ b/sapl/sessao/models.py
@@ -2,6 +2,7 @@ from operator import xor
from django.core.exceptions import ValidationError
from django.db import models
+from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from model_utils import Choices
import reversion
@@ -584,6 +585,18 @@ class ResumoOrdenacao(models.Model):
def __str__(self):
return 'Ordenação do Resumo de uma Sessão'
+@reversion.register()
+class TipoRetiradaPauta(models.Model):
+ descricao = models.CharField(max_length=150, verbose_name=_('Descrição'))
+
+ class Meta:
+ verbose_name = _('Tipo de Retidara de Pauta')
+ verbose_name_plural = _('Tipos de Retirada de Pauta')
+ ordering = ['descricao']
+
+ def __str__(self):
+ return self.descricao
+
@reversion.register()
class TipoJustificativa(models.Model):
@@ -662,3 +675,55 @@ class JustificativaAusencia(models.Model):
force_update=force_update,
using=using,
update_fields=update_fields)
+
+class RetiradaPauta(models.Model):
+ materia = models.ForeignKey(MateriaLegislativa,
+ on_delete=models.CASCADE,
+ verbose_name=_('Matéria'))
+ sessao_plenaria = models.ForeignKey(SessaoPlenaria,
+ on_delete=models.CASCADE,
+ verbose_name=_('Sessão Plenária'),
+ blank=True,
+ null=True)
+ ordem = models.ForeignKey(OrdemDia,
+ blank=True,
+ null=True,
+ on_delete=models.CASCADE)
+ expediente = models.ForeignKey(ExpedienteMateria,
+ blank=True,
+ null=True,
+ on_delete=models.CASCADE)
+ data = models.DateField(verbose_name=_('Data'),
+ default=timezone.now)
+ observacao = models.TextField(blank=True,
+ verbose_name=_('Observações'))
+ parlamentar = models.ForeignKey(Parlamentar,
+ on_delete=models.PROTECT,
+ verbose_name=_('Requerente'),
+ blank=True,
+ null=True)
+ tipo_de_retirada = models.ForeignKey(TipoRetiradaPauta,
+ on_delete=models.PROTECT,
+ verbose_name=_('Motivo de Retirada de Pauta'))
+
+ class Meta:
+ verbose_name = _('Retirada de Pauta')
+ verbose_name_plural = _('Retirada de Pauta')
+
+ def __str__(self):
+ return _('Ordem: %(ordem)s - Requerente: %(requerente)s - '
+ 'Matéria: %(materia)s') % {
+ 'ordem': self.ordem,
+ 'requerente': self.parlamentar,
+ 'materia': self.materia}
+
+ def clean(self):
+ """Exatamente um dos campos ordem ou expediente deve estar preenchido.
+ """
+ # TODO remover esse método quando OrdemDia e ExpedienteMateria
+ # forem reestruturados e os campos ordem e expediente forem unificados
+ if not xor(bool(self.ordem), bool(self.expediente)):
+ raise ValidationError(
+ 'ReritadaPauta deve ter exatamente um dos campos '
+ 'ordem ou expediente preenchido. Ambos estão preenchidos: '
+ '{}, {}'. format(self.ordem, self.expediente))
diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py
index f2e2fbbcc..f9b07967d 100644
--- a/sapl/sessao/urls.py
+++ b/sapl/sessao/urls.py
@@ -10,8 +10,9 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
PesquisarPautaSessaoView,
PesquisarSessaoPlenariaView,
PresencaOrdemDiaView, PresencaView,
- ResumoOrdenacaoView, ResumoView, ResumoAtaView, SessaoCrud,
+ ResumoOrdenacaoView, ResumoView, ResumoAtaView, RetiradaPautaCrud, SessaoCrud,
TipoJustificativaCrud, TipoExpedienteCrud, TipoResultadoVotacaoCrud,
+ TipoExpedienteCrud, TipoResultadoVotacaoCrud,TipoRetiradaPautaCrud,
TipoSessaoCrud, VotacaoEditView,
VotacaoExpedienteEditView,
VotacaoExpedienteView, VotacaoNominalEditView,
@@ -39,7 +40,7 @@ urlpatterns = [
OradorExpedienteCrud.get_urls() +
ExpedienteMateriaCrud.get_urls() +
JustificativaAusenciaCrud.get_urls() +
- MateriaOrdemDiaCrud.get_urls())),
+ MateriaOrdemDiaCrud.get_urls() + RetiradaPautaCrud.get_urls())),
url(r'^sessao/(?P\d+)/mesa$', MesaView.as_view(), name='mesa'),
@@ -76,6 +77,8 @@ urlpatterns = [
include(TipoExpedienteCrud.get_urls())),
url(r'^sistema/sessao-plenaria/tipo-justificativa/',
include(TipoJustificativaCrud.get_urls())),
+ url(r'^sistema/sessao-plenaria/tipo-retirada-pauta/',
+ include(TipoRetiradaPautaCrud.get_urls())),
url(r'^sistema/bancada/',
include(BancadaCrud.get_urls())),
url(r'^sistema/bloco/',
@@ -157,5 +160,5 @@ urlpatterns = [
name='votacao_simbolica_transparencia'),
url(r'^sessao/mudar-ordem-materia-sessao/',
mudar_ordem_materia_sessao,
- name='mudar_ordem_materia_sessao'),
+ name='mudar_ordem_materia_sessao'),
]
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
index 8731376e3..2af2b9805 100755
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -43,24 +43,22 @@ from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm,
MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet,
PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet,
SessaoPlenariaForm, VotacaoEditForm, VotacaoForm,
- VotacaoNominalForm)
-from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria,
- ExpedienteSessao, JustificativaAusencia, OcorrenciaSessao, IntegranteMesa,
+ VotacaoNominalForm, RetiradaPautaForm)
+from .models import (Bancada, Bloco, CargoBancada, CargoMesa,
+ ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa,
MateriaLegislativa, Orador, OradorExpediente, OrdemDia,
PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao,
SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente,
- TipoJustificativa, TipoResultadoVotacao, TipoSessaoPlenaria,
- VotoParlamentar)
+ TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar, TipoRetiradaPauta,
+ RetiradaPauta, TipoJustificativa, JustificativaAusencia)
TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria')
TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente')
TipoJustificativaCrud = CrudAux.build(TipoJustificativa, 'tipo_justificativa')
CargoBancadaCrud = CrudAux.build(CargoBancada, '')
-
-
-TipoResultadoVotacaoCrud = CrudAux.build(
- TipoResultadoVotacao, 'tipo_resultado_votacao')
+TipoResultadoVotacaoCrud = CrudAux.build(TipoResultadoVotacao, 'tipo_resultado_votacao')
+TipoRetiradaPautaCrud = CrudAux.build(TipoRetiradaPauta, 'tipo_retirada_pauta')
def reordernar_materias_expediente(request, pk):
@@ -221,7 +219,9 @@ def customize_link_materia(context, pk, has_permission, is_expediente):
exist_resultado = obj.registrovotacao_set.filter(
materia=obj.materia).exists()
- if not exist_resultado:
+ exist_retirada = obj.retiradapauta_set.filter(
+ materia=obj.materia).exists()
+ if not exist_resultado and not exist_retirada:
if obj.votacao_aberta:
url = ''
if is_expediente:
@@ -294,6 +294,19 @@ def customize_link_materia(context, pk, has_permission, is_expediente):
resultado = btn_abrir
else:
resultado = '''Não há resultado'''
+
+ elif exist_retirada:
+ retirada = obj.retiradapauta_set.filter(
+ materia_id=obj.materia_id).last()
+ retirada_descricao = retirada.tipo_de_retirada.descricao
+ retirada_observacao = retirada.observacao
+ url = reverse('sapl.sessao:retiradapauta_detail',
+ kwargs={'pk': retirada.id})
+ resultado = ('%s
%s' %
+ (url,
+ retirada_descricao,
+ retirada_observacao))
+
else:
resultado = obj.registrovotacao_set.filter(
materia_id=obj.materia_id).last()
@@ -3218,3 +3231,38 @@ class JustificativaAusenciaCrud(MasterDetailCrud):
class DeleteView(MasterDetailCrud.DeleteView):
pass
+
+
+class RetiradaPautaCrud(MasterDetailCrud):
+ model = RetiradaPauta
+ public = [RP_LIST, RP_DETAIL, ]
+ parent_field = 'sessao_plenaria'
+
+ class BaseMixin(MasterDetailCrud.BaseMixin):
+ list_field_names = ['tipo_de_retirada', 'materia', 'observacao', 'parlamentar']
+
+ class ListView(MasterDetailCrud.ListView):
+ paginate_by = 10
+
+ class CreateView(MasterDetailCrud.CreateView):
+ form_class = RetiradaPautaForm
+ layout_key = None
+
+ def get_initial(self):
+ sessao_plenaria = SessaoPlenaria.objects.get(id=self.kwargs['pk'])
+ return {'sessao_plenaria': sessao_plenaria}
+
+ def get_success_url(self):
+ return reverse('sapl.sessao:retiradapauta_list',
+ kwargs={'pk': self.kwargs['pk']})
+
+ class UpdateView(MasterDetailCrud.UpdateView):
+ form_class = RetiradaPautaForm
+ layout_key = None
+
+ def get_initial(self):
+ sessao_plenaria = RetiradaPauta.objects.get(id=self.kwargs['pk']).sessao_plenaria
+ return {'sessao_plenaria': sessao_plenaria}
+
+ class DeleteView(MasterDetailCrud.DeleteView):
+ pass
diff --git a/sapl/templates/menu_tabelas_auxiliares.yaml b/sapl/templates/menu_tabelas_auxiliares.yaml
index 65ea6fd6f..6c8734805 100644
--- a/sapl/templates/menu_tabelas_auxiliares.yaml
+++ b/sapl/templates/menu_tabelas_auxiliares.yaml
@@ -152,6 +152,9 @@
- title: {% trans 'Tipo de Expediente' %}
url: sapl.sessao:tipoexpediente_list
css_class: btn btn-link
+ - title: {% trans 'Tipo de Retirada de Pauta' %}
+ url: sapl.sessao:tiporetiradapauta_list
+ css_class: btn btn-link
- title: {% trans 'Ordenação do Resumo' %}
url: sapl.sessao:resumo_ordenacao
css_class: btn btn-link
diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml
index 4e9e1118a..55e0db570 100644
--- a/sapl/templates/sessao/layouts.yaml
+++ b/sapl/templates/sessao/layouts.yaml
@@ -91,7 +91,7 @@ TipoJustificativa:
JustificativaAusencia:
{% trans 'Justificativa de Ausência' %}:
- - parlamentar
+ - parlamentar
- data hora
- upload_anexo
- tipo_ausencia
@@ -99,3 +99,13 @@ JustificativaAusencia:
- materias_do_expediente
- materias_da_ordem_do_dia
- observacao
+
+TipoRetiradaPauta:
+ {% trans 'Tipo Retirada Pauta'%}:
+ - descricao
+
+RetiradaPauta:
+ {% trans 'Retirada de Pauta' %}:
+ - tipo_de_retirada materia
+ - data parlamentar
+ - observacao
diff --git a/sapl/templates/sessao/retiradapauta_form.html b/sapl/templates/sessao/retiradapauta_form.html
new file mode 100644
index 000000000..9d850cad0
--- /dev/null
+++ b/sapl/templates/sessao/retiradapauta_form.html
@@ -0,0 +1,6 @@
+{% extends "crud/form.html" %}
+{% load i18n %}
+{% load crispy_forms_tags %}
+{% block detail_content %}
+ {% crispy form %}
+{% endblock detail_content %}
diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml
index 40c5903c4..5e768ae4e 100644
--- a/sapl/templates/sessao/subnav.yaml
+++ b/sapl/templates/sessao/subnav.yaml
@@ -14,6 +14,8 @@
url: orador_list
- title: {% trans 'Ocorrências da Sessão' %}
url: ocorrencia_sessao
+ - title: {% trans 'Retirada de Pauta'%}
+ url: retiradapauta_list
- title: {% trans 'Expedientes' %}
children:
diff --git a/sapl/templates/sistema.html b/sapl/templates/sistema.html
index 2283266b8..8c1784038 100644
--- a/sapl/templates/sistema.html
+++ b/sapl/templates/sistema.html
@@ -104,6 +104,7 @@
+
From 3cafaca430bcbf7ec4fc561e7c616d71bdfe7d95 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Thu, 22 Nov 2018 15:28:21 -0200
Subject: [PATCH 8/8] HOT-FIX: resolve problema nas migrations de sessao
---
.../0030_resumoordenacao_decimo_primeiro.py | 2 +-
.../migrations/0032_merge_20181122_1527.py | 16 ++++++++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
create mode 100644 sapl/sessao/migrations/0032_merge_20181122_1527.py
diff --git a/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py b/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py
index 8bd62e137..f284bf715 100644
--- a/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py
+++ b/sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py
@@ -8,7 +8,7 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
- ('sessao', '0031_auto_20181116_1849'),
+ ('sessao', '0029_auto_20181024_0952'),
]
operations = [
diff --git a/sapl/sessao/migrations/0032_merge_20181122_1527.py b/sapl/sessao/migrations/0032_merge_20181122_1527.py
new file mode 100644
index 000000000..9a74abe95
--- /dev/null
+++ b/sapl/sessao/migrations/0032_merge_20181122_1527.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2018-11-22 17:27
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('sessao', '0031_auto_20181116_1849'),
+ ('sessao', '0031_auto_20181119_1103'),
+ ]
+
+ operations = [
+ ]