Browse Source

Adiciona situação da pauta no formulário de expediente e ordem dia

pull/3257/head
Vinícius Cantuária 4 years ago
parent
commit
b50454c672
  1. 0
      docker/busy-wait.sh
  2. 109
      sapl/sessao/forms.py
  3. 25
      sapl/sessao/migrations/0054_auto_20200828_1236.py
  4. 9
      sapl/sessao/models.py
  5. 34
      sapl/sessao/views.py
  6. 8
      sapl/templates/sessao/layouts.yaml
  7. 27
      sapl/templates/sessao/pauta_sessao_detail.html

0
docker/busy-wait.sh

109
sapl/sessao/forms.py

@ -283,8 +283,14 @@ class BancadaForm(ModelForm):
class ExpedienteMateriaForm(ModelForm): class ExpedienteMateriaForm(ModelForm):
_model = ExpedienteMateria _model = ExpedienteMateria
data_atual = timezone.now() 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( tipo_materia = forms.ModelChoiceField(
label=_('Tipo Matéria'), label=_('Tipo Matéria'),
required=True, required=True,
@ -302,28 +308,40 @@ class ExpedienteMateriaForm(ModelForm):
required=True, required=True,
widget=forms.TextInput(attrs={'autocomplete': 'off'})) 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) apenas_leitura = forms.BooleanField(label='Apenas Leitura', required=False)
class Meta: class Meta:
model = ExpedienteMateria model = ExpedienteMateria
fields = ['data_ordem', 'numero_ordem', 'tipo_materia', 'observacao', fields = [
'numero_materia', 'ano_materia', 'tipo_votacao'] 'data_ordem',
'numero_ordem',
def clean_numero_ordem(self): 'tipo_materia',
sessao = self.instance.sessao_plenaria 'numero_materia',
'ano_materia',
'tipo_votacao',
'situacao_pauta',
'observacao'
]
numero_ordem_exists = ExpedienteMateria.objects.filter( def __init__(self, *args, **kwargs):
sessao_plenaria=sessao, super().__init__(*args, **kwargs)
numero_ordem=self.cleaned_data['numero_ordem']).exists() 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: if numero_ordem_exists and not self.instance.pk:
msg = _('Esse número de ordem já existe.') raise ValidationError(_('Esse número de ordem já existe.'))
raise ValidationError(msg)
return self.cleaned_data['numero_ordem'] return self.cleaned_data['numero_ordem']
@ -331,30 +349,29 @@ class ExpedienteMateriaForm(ModelForm):
return self.instance.sessao_plenaria.data_inicio return self.instance.sessao_plenaria.data_inicio
def clean(self): def clean(self):
cleaned_data = super(ExpedienteMateriaForm, self).clean() cleaned_data = super().clean()
if not self.is_valid(): if not self.is_valid():
return cleaned_data return cleaned_data
sessao = self.instance.sessao_plenaria
try: try:
materia = MateriaLegislativa.objects.get( materia = MateriaLegislativa.objects.get(numero=self.cleaned_data['numero_materia'],
numero=self.cleaned_data['numero_materia'], ano=self.cleaned_data['ano_materia'],
ano=self.cleaned_data['ano_materia'], tipo=self.cleaned_data['tipo_materia'])
tipo=self.cleaned_data['tipo_materia'])
except ObjectDoesNotExist: except ObjectDoesNotExist:
msg = _('A matéria a ser inclusa não existe no cadastro' raise ValidationError(_('A matéria a ser inclusa não existe no cadastro de matérias legislativas.'))
' de matérias legislativas.')
raise ValidationError(msg)
else: else:
cleaned_data['materia'] = materia cleaned_data['materia'] = materia
return cleaned_data return cleaned_data
def save(self, commit=False): def save(self, commit=False):
expediente = super(ExpedienteMateriaForm, self).save(commit) expediente = super().save(commit)
expediente.materia = self.cleaned_data['materia'] 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() expediente.save()
return expediente return expediente
@ -364,37 +381,25 @@ class OrdemDiaForm(ExpedienteMateriaForm):
class Meta: class Meta:
model = OrdemDia model = OrdemDia
fields = ['data_ordem', 'numero_ordem', 'tipo_materia', 'observacao', fields = [
'numero_materia', 'ano_materia', 'tipo_votacao'] 'data_ordem',
'numero_ordem',
def clean_data_ordem(self): 'tipo_materia',
return self.instance.sessao_plenaria.data_inicio 'numero_materia',
'ano_materia',
'tipo_votacao',
'situacao_pauta',
'observacao'
]
def clean_numero_ordem(self): def clean_numero_ordem(self):
sessao = self.instance.sessao_plenaria numero_ordem_exists = OrdemDia.objects.filter(sessao_plenaria=self.instance.sessao_plenaria,
numero_ordem=self.cleaned_data['numero_ordem']).exists()
numero_ordem_exists = OrdemDia.objects.filter(
sessao_plenaria=sessao,
numero_ordem=self.cleaned_data['numero_ordem']).exists()
if numero_ordem_exists and not self.instance.pk: if numero_ordem_exists and not self.instance.pk:
msg = _('Esse número de ordem já existe.') raise ValidationError(_('Esse número de ordem já existe.'))
raise ValidationError(msg)
return self.cleaned_data['numero_ordem'] 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): class PresencaForm(forms.Form):
presenca = forms.CharField(required=False, initial=False) presenca = forms.CharField(required=False, initial=False)

25
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'),
),
]

9
sapl/sessao/models.py

@ -9,7 +9,7 @@ from model_utils import Choices
import reversion import reversion
from sapl.base.models import Autor 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, from sapl.parlamentares.models import (CargoMesa, Legislatura, Parlamentar,
Partido, SessaoLegislativa) Partido, SessaoLegislativa)
from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation, from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation,
@ -350,6 +350,13 @@ class AbstractOrdemDia(models.Model):
choices=YES_NO_CHOICES, choices=YES_NO_CHOICES,
verbose_name=_('Registro de Votação Iniciado?') 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: class Meta:
abstract = True abstract = True

34
sapl/sessao/views.py

@ -731,9 +731,12 @@ class MateriaOrdemDiaCrud(MasterDetailCrud):
public = [RP_LIST, RP_DETAIL] public = [RP_LIST, RP_DETAIL]
class BaseMixin(MasterDetailCrud.BaseMixin): class BaseMixin(MasterDetailCrud.BaseMixin):
list_field_names = ['numero_ordem', 'materia', list_field_names = [
('materia__ementa', '', 'observacao'), 'numero_ordem',
'resultado'] 'materia',
('materia__ementa', '', 'observacao'),
'resultado'
]
class CreateView(MasterDetailCrud.CreateView): class CreateView(MasterDetailCrud.CreateView):
form_class = OrdemDiaForm form_class = OrdemDiaForm
@ -744,18 +747,15 @@ class MateriaOrdemDiaCrud(MasterDetailCrud):
return context return context
def get_initial(self): def get_initial(self):
self.initial['data_ordem'] = SessaoPlenaria.objects.get( self.initial['data_ordem'] = SessaoPlenaria.objects.get(pk=self.kwargs['pk'])\
pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y') .data_inicio.strftime('%d/%m/%Y')
max_numero_ordem = OrdemDia.objects.filter( max_numero_ordem = OrdemDia.objects.filter(sessao_plenaria=self.kwargs['pk'])\
sessao_plenaria=self.kwargs['pk']).aggregate( .aggregate(Max('numero_ordem'))['numero_ordem__max']
Max('numero_ordem'))['numero_ordem__max'] self.initial['numero_ordem'] = (max_numero_ordem if max_numero_ordem else 0) + 1
self.initial['numero_ordem'] = (
max_numero_ordem if max_numero_ordem else 0) + 1
return self.initial return self.initial
def get_success_url(self): def get_success_url(self):
return reverse('sapl.sessao:ordemdia_list', return reverse('sapl.sessao:ordemdia_list', kwargs={'pk': self.kwargs['pk']})
kwargs={'pk': self.kwargs['pk']})
class UpdateView(MasterDetailCrud.UpdateView): class UpdateView(MasterDetailCrud.UpdateView):
form_class = OrdemDiaForm form_class = OrdemDiaForm
@ -3576,7 +3576,7 @@ class PautaSessaoDetailView(DetailView):
materias_expediente = [] materias_expediente = []
for m in ExpedienteMateria.objects \ for m in ExpedienteMateria.objects \
.prefetch_related('registrovotacao_set') \ .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): .filter(sessao_plenaria_id=self.object.id):
rv = m.registrovotacao_set.first() rv = m.registrovotacao_set.first()
if rv: if rv:
@ -3586,7 +3586,6 @@ class PautaSessaoDetailView(DetailView):
resultado = _('Matéria não votada') resultado = _('Matéria não votada')
resultado_observacao = _(' ') resultado_observacao = _(' ')
ultima_tramitacao = m.materia.tramitacao_set.order_by('-data_tramitacao', '-id').first()
numeracao = m.materia.numeracao_set.first() numeracao = m.materia.numeracao_set.first()
materias_expediente.append({ materias_expediente.append({
@ -3597,7 +3596,7 @@ class PautaSessaoDetailView(DetailView):
'numero': m.numero_ordem, 'numero': m.numero_ordem,
'resultado': resultado, 'resultado': resultado,
'resultado_observacao': resultado_observacao, '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 '-', '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()] 'autor': [str(x.autor) for x in m.materia.autoria_set.select_related('autor').all()]
}) })
@ -3625,7 +3624,7 @@ class PautaSessaoDetailView(DetailView):
materias_ordem = [] materias_ordem = []
for o in OrdemDia.objects \ for o in OrdemDia.objects \
.prefetch_related('registrovotacao_set') \ .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): .filter(sessao_plenaria_id=self.object.id):
# Verificar resultado # Verificar resultado
rv = o.registrovotacao_set.first() rv = o.registrovotacao_set.first()
@ -3636,7 +3635,6 @@ class PautaSessaoDetailView(DetailView):
resultado = _('Matéria não votada') resultado = _('Matéria não votada')
resultado_observacao = _(' ') resultado_observacao = _(' ')
ultima_tramitacao = o.materia.tramitacao_set.order_by('-data_tramitacao', '-id').first()
numeracao = o.materia.numeracao_set.first() numeracao = o.materia.numeracao_set.first()
materias_ordem.append({ materias_ordem.append({
@ -3647,7 +3645,7 @@ class PautaSessaoDetailView(DetailView):
'numero': o.numero_ordem, 'numero': o.numero_ordem,
'resultado': resultado, 'resultado': resultado,
'resultado_observacao': resultado_observacao, '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 '-', '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)] 'autor': [str(x.autor) for x in Autoria.objects.select_related("autor").filter(materia_id=o.materia_id)]
}) })

8
sapl/templates/sessao/layouts.yaml

@ -58,7 +58,7 @@ ExpedienteMateria:
{% trans 'Matéria do Expediente' %}: {% trans 'Matéria do Expediente' %}:
- data_ordem numero_ordem - data_ordem numero_ordem
- tipo_materia numero_materia ano_materia - tipo_materia numero_materia ano_materia
- tipo_votacao - tipo_votacao:4 situacao_pauta
- apenas_leitura - apenas_leitura
- observacao - observacao
@ -66,7 +66,7 @@ OrdemDia:
{% trans 'Matéria da Ordem do Dia' %}: {% trans 'Matéria da Ordem do Dia' %}:
- data_ordem numero_ordem - data_ordem numero_ordem
- tipo_materia numero_materia ano_materia - tipo_materia numero_materia ano_materia
- tipo_votacao - tipo_votacao:4 situacao_pauta
- apenas_leitura - apenas_leitura
- observacao - observacao
@ -74,14 +74,14 @@ ExpedienteMateriaDetail:
{% trans 'Matérias do Expediente' %}: {% trans 'Matérias do Expediente' %}:
- materia - materia
- ementa - ementa
- tipo_votacao - tipo_votacao:4 situacao_pauta
- observacao - observacao
OrdemDiaDetail: OrdemDiaDetail:
{% trans 'Matérias da Ordem do Dia' %}: {% trans 'Matérias da Ordem do Dia' %}:
- materia - materia
- ementa - ementa
- tipo_votacao - tipo_votacao:4 situacao_pauta
- observacao - observacao
Bancada: Bancada:

27
sapl/templates/sessao/pauta_sessao_detail.html

@ -45,7 +45,8 @@
{{m.numero}} - {{m.numero}} -
<a href="{% url 'sapl.materia:materialegislativa_detail' m.id %}">{{m.titulo}}</a><br/> <a href="{% url 'sapl.materia:materialegislativa_detail' m.id %}">{{m.titulo}}</a><br/>
<b>Processo</b>: {{ m.processo }}<br/> <b>Processo</b>: {{ m.processo }}<br/>
<b>Autor{{ m.autor|length|pluralize:"es" }}</b>: {{ m.autor|join:', ' }} <b>Autor{{ m.autor|length|pluralize:"es" }}</b>: {{ m.autor|join:', ' }}<br/>
<b>Situação</b>: {{ m.situacao_pauta }}
</td> </td>
<td style="width:60%;"> <td style="width:60%;">
{{m.ementa|safe}} {{m.ementa|safe}}
@ -65,19 +66,17 @@
<table class="table table-striped"> <table class="table table-striped">
<thead><tr><th>Matéria</th><th>Ementa</th> <th>Situação</th> </tr></thead> <thead><tr><th>Matéria</th><th>Ementa</th> <th>Situação</th> </tr></thead>
{% for m in materias_ordem %} {% for m in materias_ordem %}
<tr> <tr>
<td style="width:20%;"> <td style="width:20%;">
{{m.numero}} - {{m.numero}} -
<a href="{% url 'sapl.materia:materialegislativa_detail' m.id %}">{{m.titulo}}</a><br/> <a href="{% url 'sapl.materia:materialegislativa_detail' m.id %}">{{m.titulo}}</a><br/>
<b>Processo</b>: {{ m.processo }}<br/> <b>Processo</b>: {{ m.processo }}<br/>
<b>Autor{{ m.autor|length|pluralize:"es" }}</b>: {{ m.autor|join:', ' }} <b>Autor{{ m.autor|length|pluralize:"es" }}</b>: {{ m.autor|join:', ' }}<br/>
</td> <b>Situação</b>: {{ m.situacao_pauta }}
<td style="width:60%;"> </td>
{{m.ementa|safe}} <td style="width:60%;">{{m.ementa|safe}}<br>{{m.observacao|linebreaksbr|safe}}</td>
{% if m.observacao %}<br><br>Obs.: {{m.observacao}} {% endif %} <td style="width:20%;">{{m.situacao|linebreaksbr|safe}}</td>
</td> </tr>
<td style="width:20%;">{{m.situacao|linebreaksbr|safe}}</td>
</tr>
{% endfor %} {% endfor %}
</table> </table>
{% else %} {% else %}

Loading…
Cancel
Save