From b50454c6720c211e575793cddb43b11a2d569465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Cantu=C3=A1ria?= Date: Wed, 2 Sep 2020 15:37:59 -0300 Subject: [PATCH] =?UTF-8?q?Adiciona=20situa=C3=A7=C3=A3o=20da=20pauta=20no?= =?UTF-8?q?=20formul=C3=A1rio=20de=20expediente=20e=20ordem=20dia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/busy-wait.sh | 0 sapl/sessao/forms.py | 109 +++++++++--------- .../migrations/0054_auto_20200828_1236.py | 25 ++++ sapl/sessao/models.py | 9 +- sapl/sessao/views.py | 34 +++--- sapl/templates/sessao/layouts.yaml | 8 +- .../templates/sessao/pauta_sessao_detail.html | 27 +++-- 7 files changed, 123 insertions(+), 89 deletions(-) mode change 100755 => 100644 docker/busy-wait.sh create mode 100644 sapl/sessao/migrations/0054_auto_20200828_1236.py diff --git a/docker/busy-wait.sh b/docker/busy-wait.sh old mode 100755 new mode 100644 diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index ba10e5b2a..f3b7363bd 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -283,8 +283,14 @@ class BancadaForm(ModelForm): class ExpedienteMateriaForm(ModelForm): _model = ExpedienteMateria + data_atual = timezone.now() + data_ordem = forms.CharField( + label='Data Sessão', + initial=datetime.strftime(timezone.now(), '%d/%m/%Y'), + widget=forms.TextInput(attrs={'readonly': 'readonly'})) + tipo_materia = forms.ModelChoiceField( label=_('Tipo Matéria'), required=True, @@ -302,28 +308,40 @@ class ExpedienteMateriaForm(ModelForm): required=True, widget=forms.TextInput(attrs={'autocomplete': 'off'})) - data_ordem = forms.CharField( - label='Data Sessão', - initial=datetime.strftime(timezone.now(), '%d/%m/%Y'), - widget=forms.TextInput(attrs={'readonly': 'readonly'})) - apenas_leitura = forms.BooleanField(label='Apenas Leitura', required=False) class Meta: model = ExpedienteMateria - fields = ['data_ordem', 'numero_ordem', 'tipo_materia', 'observacao', - 'numero_materia', 'ano_materia', 'tipo_votacao'] - - def clean_numero_ordem(self): - sessao = self.instance.sessao_plenaria + fields = [ + 'data_ordem', + 'numero_ordem', + 'tipo_materia', + 'numero_materia', + 'ano_materia', + 'tipo_votacao', + 'situacao_pauta', + 'observacao' + ] - numero_ordem_exists = ExpedienteMateria.objects.filter( - sessao_plenaria=sessao, - numero_ordem=self.cleaned_data['numero_ordem']).exists() + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.new_object = True if not self.instance.pk else False + + if not self.new_object: + situacoes = self.instance.materia.tramitacao_set.order_by('-data_tramitacao') + if situacoes: + self.fields['situacao_pauta'].choices = [(s.pk, s) for s in situacoes] + self.fields['situacao_pauta'].initial = (self.instance.situacao_pauta.pk, self.instance.situacao_pauta) + else: + self.fields['situacao_pauta'].choices = [('', '---------')] + else: + self.fields['situacao_pauta'].widget = forms.HiddenInput() + def clean_numero_ordem(self): + numero_ordem_exists = ExpedienteMateria.objects.filter(sessao_plenaria=self.instance.sessao_plenaria, + numero_ordem=self.cleaned_data['numero_ordem']).exists() if numero_ordem_exists and not self.instance.pk: - msg = _('Esse número de ordem já existe.') - raise ValidationError(msg) + raise ValidationError(_('Esse número de ordem já existe.')) return self.cleaned_data['numero_ordem'] @@ -331,30 +349,29 @@ class ExpedienteMateriaForm(ModelForm): return self.instance.sessao_plenaria.data_inicio def clean(self): - cleaned_data = super(ExpedienteMateriaForm, self).clean() + cleaned_data = super().clean() if not self.is_valid(): return cleaned_data - sessao = self.instance.sessao_plenaria - try: - materia = MateriaLegislativa.objects.get( - numero=self.cleaned_data['numero_materia'], - ano=self.cleaned_data['ano_materia'], - tipo=self.cleaned_data['tipo_materia']) + materia = MateriaLegislativa.objects.get(numero=self.cleaned_data['numero_materia'], + ano=self.cleaned_data['ano_materia'], + tipo=self.cleaned_data['tipo_materia']) except ObjectDoesNotExist: - msg = _('A matéria a ser inclusa não existe no cadastro' - ' de matérias legislativas.') - raise ValidationError(msg) + raise ValidationError(_('A matéria a ser inclusa não existe no cadastro de matérias legislativas.')) else: cleaned_data['materia'] = materia return cleaned_data def save(self, commit=False): - expediente = super(ExpedienteMateriaForm, self).save(commit) - expediente.materia = self.cleaned_data['materia'] + expediente = super().save(commit) + materia = self.cleaned_data['materia'] + expediente.materia = materia + if self.new_object: + expediente.situacao_pauta = materia.tramitacao_set.order_by('-data_tramitacao').first() expediente.save() + return expediente @@ -364,37 +381,25 @@ class OrdemDiaForm(ExpedienteMateriaForm): class Meta: model = OrdemDia - fields = ['data_ordem', 'numero_ordem', 'tipo_materia', 'observacao', - 'numero_materia', 'ano_materia', 'tipo_votacao'] - - def clean_data_ordem(self): - return self.instance.sessao_plenaria.data_inicio + fields = [ + 'data_ordem', + 'numero_ordem', + 'tipo_materia', + 'numero_materia', + 'ano_materia', + 'tipo_votacao', + 'situacao_pauta', + 'observacao' + ] def clean_numero_ordem(self): - sessao = self.instance.sessao_plenaria - - numero_ordem_exists = OrdemDia.objects.filter( - sessao_plenaria=sessao, - numero_ordem=self.cleaned_data['numero_ordem']).exists() - + numero_ordem_exists = OrdemDia.objects.filter(sessao_plenaria=self.instance.sessao_plenaria, + numero_ordem=self.cleaned_data['numero_ordem']).exists() if numero_ordem_exists and not self.instance.pk: - msg = _('Esse número de ordem já existe.') - raise ValidationError(msg) + raise ValidationError(_('Esse número de ordem já existe.')) return self.cleaned_data['numero_ordem'] - def clean(self): - cleaned_data = super(OrdemDiaForm, self).clean() - if not self.is_valid(): - return cleaned_data - return self.cleaned_data - - def save(self, commit=False): - ordem = super(OrdemDiaForm, self).save(commit) - ordem.materia = self.cleaned_data['materia'] - ordem.save() - return ordem - class PresencaForm(forms.Form): presenca = forms.CharField(required=False, initial=False) diff --git a/sapl/sessao/migrations/0054_auto_20200828_1236.py b/sapl/sessao/migrations/0054_auto_20200828_1236.py new file mode 100644 index 000000000..5b6b7eeb5 --- /dev/null +++ b/sapl/sessao/migrations/0054_auto_20200828_1236.py @@ -0,0 +1,25 @@ +# Generated by Django 2.2.13 on 2020-08-28 15:36 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0071_auto_20200609_1503'), + ('sessao', '0053_auto_20200609_1501'), + ] + + operations = [ + migrations.AddField( + model_name='expedientemateria', + name='situacao_pauta', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.Tramitacao', verbose_name='Situação Pauta'), + ), + migrations.AddField( + model_name='ordemdia', + name='situacao_pauta', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.Tramitacao', verbose_name='Situação Pauta'), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 8585be2ad..55b2e5536 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -9,7 +9,7 @@ from model_utils import Choices import reversion from sapl.base.models import Autor -from sapl.materia.models import MateriaLegislativa +from sapl.materia.models import MateriaLegislativa, Tramitacao from sapl.parlamentares.models import (CargoMesa, Legislatura, Parlamentar, Partido, SessaoLegislativa) from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation, @@ -350,6 +350,13 @@ class AbstractOrdemDia(models.Model): choices=YES_NO_CHOICES, verbose_name=_('Registro de Votação Iniciado?') ) + situacao_pauta = models.ForeignKey( + Tramitacao, + null=True, + blank=True, + on_delete=models.PROTECT, + verbose_name=_('Situação Pauta') + ) class Meta: abstract = True diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 7f67e82e8..39540aedf 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -731,9 +731,12 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): public = [RP_LIST, RP_DETAIL] class BaseMixin(MasterDetailCrud.BaseMixin): - list_field_names = ['numero_ordem', 'materia', - ('materia__ementa', '', 'observacao'), - 'resultado'] + list_field_names = [ + 'numero_ordem', + 'materia', + ('materia__ementa', '', 'observacao'), + 'resultado' + ] class CreateView(MasterDetailCrud.CreateView): form_class = OrdemDiaForm @@ -744,18 +747,15 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): return context def get_initial(self): - self.initial['data_ordem'] = SessaoPlenaria.objects.get( - pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y') - max_numero_ordem = OrdemDia.objects.filter( - sessao_plenaria=self.kwargs['pk']).aggregate( - Max('numero_ordem'))['numero_ordem__max'] - self.initial['numero_ordem'] = ( - max_numero_ordem if max_numero_ordem else 0) + 1 + self.initial['data_ordem'] = SessaoPlenaria.objects.get(pk=self.kwargs['pk'])\ + .data_inicio.strftime('%d/%m/%Y') + max_numero_ordem = OrdemDia.objects.filter(sessao_plenaria=self.kwargs['pk'])\ + .aggregate(Max('numero_ordem'))['numero_ordem__max'] + self.initial['numero_ordem'] = (max_numero_ordem if max_numero_ordem else 0) + 1 return self.initial def get_success_url(self): - return reverse('sapl.sessao:ordemdia_list', - kwargs={'pk': self.kwargs['pk']}) + return reverse('sapl.sessao:ordemdia_list', kwargs={'pk': self.kwargs['pk']}) class UpdateView(MasterDetailCrud.UpdateView): form_class = OrdemDiaForm @@ -3576,7 +3576,7 @@ class PautaSessaoDetailView(DetailView): materias_expediente = [] for m in ExpedienteMateria.objects \ .prefetch_related('registrovotacao_set') \ - .select_related("materia", "materia__tipo") \ + .select_related("materia", "materia__tipo", "situacao_pauta", "situacao_pauta__status") \ .filter(sessao_plenaria_id=self.object.id): rv = m.registrovotacao_set.first() if rv: @@ -3586,7 +3586,6 @@ class PautaSessaoDetailView(DetailView): resultado = _('Matéria não votada') resultado_observacao = _(' ') - ultima_tramitacao = m.materia.tramitacao_set.order_by('-data_tramitacao', '-id').first() numeracao = m.materia.numeracao_set.first() materias_expediente.append({ @@ -3597,7 +3596,7 @@ class PautaSessaoDetailView(DetailView): 'numero': m.numero_ordem, 'resultado': resultado, 'resultado_observacao': resultado_observacao, - 'situacao': ultima_tramitacao.status if ultima_tramitacao else _("Não informada"), + 'situacao_pauta': m.situacao_pauta.status if m.situacao_pauta else _('Não informada'), 'processo': f'{str(numeracao.numero_materia)}/{str(numeracao.ano_materia)}' if numeracao else '-', 'autor': [str(x.autor) for x in m.materia.autoria_set.select_related('autor').all()] }) @@ -3625,7 +3624,7 @@ class PautaSessaoDetailView(DetailView): materias_ordem = [] for o in OrdemDia.objects \ .prefetch_related('registrovotacao_set') \ - .select_related("materia", "materia__tipo") \ + .select_related("materia", "materia__tipo", "situacao_pauta", "situacao_pauta__status") \ .filter(sessao_plenaria_id=self.object.id): # Verificar resultado rv = o.registrovotacao_set.first() @@ -3636,7 +3635,6 @@ class PautaSessaoDetailView(DetailView): resultado = _('Matéria não votada') resultado_observacao = _(' ') - ultima_tramitacao = o.materia.tramitacao_set.order_by('-data_tramitacao', '-id').first() numeracao = o.materia.numeracao_set.first() materias_ordem.append({ @@ -3647,7 +3645,7 @@ class PautaSessaoDetailView(DetailView): 'numero': o.numero_ordem, 'resultado': resultado, 'resultado_observacao': resultado_observacao, - 'situacao': ultima_tramitacao.status if ultima_tramitacao else _("Não informada"), + 'situacao_pauta': o.situacao_pauta.status if o.situacao_pauta else _('Não informada'), 'processo': f'{str(numeracao.numero_materia)}/{str(numeracao.ano_materia)}' if numeracao else '-', 'autor': [str(x.autor) for x in Autoria.objects.select_related("autor").filter(materia_id=o.materia_id)] }) diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml index 67abdf16d..5a2ed0b88 100644 --- a/sapl/templates/sessao/layouts.yaml +++ b/sapl/templates/sessao/layouts.yaml @@ -58,7 +58,7 @@ ExpedienteMateria: {% trans 'Matéria do Expediente' %}: - data_ordem numero_ordem - tipo_materia numero_materia ano_materia - - tipo_votacao + - tipo_votacao:4 situacao_pauta - apenas_leitura - observacao @@ -66,7 +66,7 @@ OrdemDia: {% trans 'Matéria da Ordem do Dia' %}: - data_ordem numero_ordem - tipo_materia numero_materia ano_materia - - tipo_votacao + - tipo_votacao:4 situacao_pauta - apenas_leitura - observacao @@ -74,14 +74,14 @@ ExpedienteMateriaDetail: {% trans 'Matérias do Expediente' %}: - materia - ementa - - tipo_votacao + - tipo_votacao:4 situacao_pauta - observacao OrdemDiaDetail: {% trans 'Matérias da Ordem do Dia' %}: - materia - ementa - - tipo_votacao + - tipo_votacao:4 situacao_pauta - observacao Bancada: diff --git a/sapl/templates/sessao/pauta_sessao_detail.html b/sapl/templates/sessao/pauta_sessao_detail.html index bf58a3cea..56038f116 100644 --- a/sapl/templates/sessao/pauta_sessao_detail.html +++ b/sapl/templates/sessao/pauta_sessao_detail.html @@ -45,7 +45,8 @@ {{m.numero}} - {{m.titulo}}
Processo: {{ m.processo }}
- Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }} + Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }}
+ Situação: {{ m.situacao_pauta }} {{m.ementa|safe}} @@ -65,19 +66,17 @@ {% for m in materias_ordem %} - - - - - + + + + + {% endfor %}
MatériaEmenta Situação
- {{m.numero}} - - {{m.titulo}}
- Processo: {{ m.processo }}
- Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }} -
- {{m.ementa|safe}} - {% if m.observacao %}

Obs.: {{m.observacao}} {% endif %} -
{{m.situacao|linebreaksbr|safe}}
+ {{m.numero}} - + {{m.titulo}}
+ Processo: {{ m.processo }}
+ Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }}
+ Situação: {{ m.situacao_pauta }} +
{{m.ementa|safe}}
{{m.observacao|linebreaksbr|safe}}
{{m.situacao|linebreaksbr|safe}}
{% else %}