Browse Source

Fix #2559 reordenacao materia em sessao (#2646)

* add sequencial_regimental no model tipo de matéria legislativa

* applica pep

* converte TipoMateriaCrud para classe

* inclui hooks no crud list

* altera ordering de TipoMateriaLegislativa

* define layout diferente para detail e list

* define estratégia para iniciar sequencia em tipos já existentes

* add template custom para listagem de tipo de matérias

* altera call hook

* impl a reordenação no list dos tipos de matéria

* add file migrate

* autopep in sessao/views.py

* ref views functions acionadas pelo botão 'Ajustar Ordenação'
pull/2579/head
Leandro Roberto Silva 6 years ago
committed by Leandro Roberto
parent
commit
35d24f9b5a
  1. 20
      sapl/api/views.py
  2. 12
      sapl/crud/base.py
  3. 21
      sapl/materia/migrations/0042_tipomaterialegislativa_sequencia_regimental.py
  4. 19
      sapl/materia/migrations/0043_auto_20190320_1749.py
  5. 41
      sapl/materia/models.py
  6. 93
      sapl/materia/views.py
  7. 139
      sapl/sessao/views.py
  8. 6
      sapl/templates/materia/layouts.yaml
  9. 55
      sapl/templates/materia/tipomaterialegislativa_list.html

20
sapl/api/views.py

@ -22,7 +22,7 @@ from sapl.api.forms import SaplFilterSetMixin
from sapl.api.permissions import SaplModelPermissions
from sapl.api.serializers import ChoiceSerializer
from sapl.base.models import Autor, AppConfig, DOC_ADM_OSTENSIVO
from sapl.materia.models import Proposicao
from sapl.materia.models import Proposicao, TipoMateriaLegislativa
from sapl.parlamentares.models import Parlamentar
from sapl.utils import models_with_gr_for_model, choice_anos_com_sessaoplenaria
@ -348,6 +348,23 @@ class _ProposicaoViewSet(SaplSetViews['materia']['proposicao']):
return qs
class _TipoMateriaLegislativaViewSet(SaplSetViews['materia']['tipomaterialegislativa']):
@action(detail=True, methods=['POST'])
def change_position(self, request, *args, **kwargs):
result = {
'status': 200,
'message': 'OK'
}
d = request.data
if 'pos_ini' in d and 'pos_fim' in d:
if d['pos_ini'] != d['pos_fim']:
pk = kwargs['pk']
TipoMateriaLegislativa.objects.reposicione(pk, d['pos_fim'])
return Response(result)
class _DocumentoAdministrativoViewSet(SaplSetViews['protocoloadm']['documentoadministrativo']):
class DocumentoAdministrativoPermission(SaplModelPermissions):
@ -426,6 +443,7 @@ class _SessaoPlenariaViewSet(
SaplSetViews['base']['autor'] = _AutorViewSet.build_class_with_actions()
SaplSetViews['materia']['proposicao'] = _ProposicaoViewSet
SaplSetViews['materia']['tipomaterialegislativa'] = _TipoMateriaLegislativaViewSet
SaplSetViews['parlamentares']['parlamentar'] = _ParlamentarViewSet

12
sapl/crud/base.py

@ -2,7 +2,6 @@ import logging
from braces.views import FormMessagesMixin
from crispy_forms.bootstrap import FieldWithButtons, StrictButton
from sapl.crispy_layout_mixin import SaplFormHelper
from crispy_forms.layout import Field, Layout
from django import forms
from django.conf.urls import url
@ -25,6 +24,7 @@ from django.views.generic.base import ContextMixin
from django.views.generic.list import MultipleObjectMixin
from sapl.crispy_layout_mixin import CrispyLayoutFormMixin, get_field_display
from sapl.crispy_layout_mixin import SaplFormHelper
from sapl.rules.map_rules import (RP_ADD, RP_CHANGE, RP_DELETE, RP_DETAIL,
RP_LIST)
from sapl.settings import BASE_DIR
@ -449,18 +449,28 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView):
if not n:
s += '<br>'
continue
m = obj
n = n.split('__')
for f in n[:-1]:
m = getattr(m, f)
if not m:
break
ss = ''
if m:
ss = get_field_display(m, n[-1])[1]
ss = (
('<br>' if '<ul>' in ss else ' - ') + ss)\
if ss and j != 0 and s else ss
hook = 'hook_{}'.format(''.join(n))
if hasattr(self, hook):
hs, url = getattr(self, hook)(obj, ss, url)
s += str(hs)
else:
s += ss
r.append((s, url))
return r

21
sapl/materia/migrations/0042_tipomaterialegislativa_sequencia_regimental.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-03-20 11:26
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('materia', '0041_proposicao_numero_materia_futuro'),
]
operations = [
migrations.AddField(
model_name='tipomaterialegislativa',
name='sequencia_regimental',
field=models.PositiveIntegerField(
default=0, help_text='A sequência regimental diz respeito ao que define o regimento da Casa Legislativa sobre qual a ordem de entrada das proposições nas Sessões Plenárias.', verbose_name='Sequência Regimental'),
),
]

19
sapl/materia/migrations/0043_auto_20190320_1749.py

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-03-20 20:49
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('materia', '0042_tipomaterialegislativa_sequencia_regimental'),
]
operations = [
migrations.AlterModelOptions(
name='tipomaterialegislativa',
options={'ordering': ['sequencia_regimental', 'descricao'], 'verbose_name': 'Tipo de Matéria Legislativa', 'verbose_name_plural': 'Tipos de Matérias Legislativas'},
),
]

41
sapl/materia/models.py

@ -78,8 +78,37 @@ class TipoProposicao(models.Model):
return self.descricao
class TipoMateriaManager(models.Manager):
def reordene(self, exclude_pk=None):
tipos = self.get_queryset()
if exclude_pk:
tipos = tipos.exclude(pk=exclude_pk)
for sr, t in enumerate(tipos, 1):
t.sequencia_regimental = sr
t.save()
def reposicione(self, pk, idx):
tipos = self.reordene(exclude_pk=pk)
self.get_queryset(
).filter(
sequencia_regimental__gte=idx
).update(
sequencia_regimental=models.F('sequencia_regimental') + 1
)
self.get_queryset(
).filter(
pk=pk
).update(
sequencia_regimental=idx
)
@reversion.register()
class TipoMateriaLegislativa(models.Model):
objects = TipoMateriaManager()
sigla = models.CharField(max_length=5, verbose_name=_('Sigla'))
descricao = models.CharField(max_length=50, verbose_name=_('Descrição '))
# XXX o que é isso ?
@ -101,10 +130,17 @@ class TipoMateriaLegislativa(models.Model):
verbose_name=_('Sequência de numeração'),
choices=SEQUENCIA_NUMERACAO)
sequencia_regimental = models.PositiveIntegerField(
default=0,
verbose_name=_('Sequência Regimental'),
help_text=_('A sequência regimental diz respeito ao que define '
'o regimento da Casa Legislativa sobre qual a ordem '
'de entrada das proposições nas Sessões Plenárias.'))
class Meta:
verbose_name = _('Tipo de Matéria Legislativa')
verbose_name_plural = _('Tipos de Matérias Legislativas')
ordering = ['descricao']
ordering = ['sequencia_regimental', 'descricao']
def __str__(self):
return self.descricao
@ -920,7 +956,8 @@ class Tramitacao(models.Model):
('B', 'primeira_votacao', _('1ª Votação')),
('C', 'segunda_terceira_votacao', _('2ª e 3ª Votação')),
('D', 'deliberacao', _('Deliberação')),
('E', 'primeira_segunda_votacao_urgencia', _('1ª e 2ª votações em regime de urgência'))
('E', 'primeira_segunda_votacao_urgencia', _(
'1ª e 2ª votações em regime de urgência'))
)

93
sapl/materia/views.py

@ -3,7 +3,6 @@ import logging
from random import choice
from string import ascii_letters, digits
from sapl.crispy_layout_mixin import SaplFormHelper
from crispy_forms.layout import HTML
from django.conf import settings
from django.contrib import messages
@ -32,6 +31,7 @@ from sapl.comissoes.models import Comissao, Participacao
from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_RESTRICT,
STATUS_TA_PRIVATE)
from sapl.compilacao.views import IntegracaoTaView
from sapl.crispy_layout_mixin import SaplFormHelper
from sapl.crispy_layout_mixin import SaplFormLayout, form_actions
from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
MasterDetailCrud,
@ -75,9 +75,6 @@ AssuntoMateriaCrud = CrudAux.build(AssuntoMateria, 'assunto_materia')
OrigemCrud = CrudAux.build(Origem, '')
TipoMateriaCrud = CrudAux.build(
TipoMateriaLegislativa, 'tipo_materia_legislativa')
RegimeTramitacaoCrud = CrudAux.build(
RegimeTramitacao, 'regime_tramitacao')
@ -214,7 +211,8 @@ class CriarProtocoloMateriaView(CreateView):
context['form'].fields['ano'].initial = protocolo.ano
if protocolo:
if protocolo.timestamp:
context['form'].fields['data_apresentacao'].initial = protocolo.timestamp.date()
context['form'].fields['data_apresentacao'].initial = protocolo.timestamp.date(
)
elif protocolo.timestamp_data_hora_manual:
context['form'].fields['data_apresentacao'].initial = protocolo.timestamp_data_hora_manual.date()
elif protocolo.data:
@ -1115,7 +1113,8 @@ class RelatoriaCrud(MasterDetailCrud):
try:
self.logger.debug("user=" + username + ". Tentando obter objeto Comissao de pk={}.".format(
context['form'].initial['comissao']))
comissao = Comissao.objects.get(pk=context['form'].initial['comissao'])
comissao = Comissao.objects.get(
pk=context['form'].initial['comissao'])
except:
self.logger.error("user=" + username + ". Objeto Comissão de pk={} não encontrado.".format(
context['form'].initial['comissao']))
@ -1125,12 +1124,15 @@ class RelatoriaCrud(MasterDetailCrud):
self.logger.info("user=" + username + ". Objeto Comissao de pk={} obtido com sucesso.".format(
context['form'].initial['comissao']))
materia = MateriaLegislativa.objects.get(pk=self.kwargs.get('pk'))
materia = MateriaLegislativa.objects.get(
pk=self.kwargs.get('pk'))
ano_materia = materia.ano
comissao = Comissao.objects.get(pk=context['form'].initial['comissao'])
comissao = Comissao.objects.get(
pk=context['form'].initial['comissao'])
composicoes = comissao.composicao_set.all()
composicao = comissao.composicao_set.filter(periodo__data_inicio__year=ano_materia)
composicao = comissao.composicao_set.filter(
periodo__data_inicio__year=ano_materia)
participacoes = Participacao.objects.select_related().filter(composicao=composicao)
@ -1182,12 +1184,15 @@ class RelatoriaCrud(MasterDetailCrud):
self.logger.info("user=" + username + ". Objeto Comissao de pk={} obtido com sucesso.".format(
context['form'].initial['comissao']))
relatoria = Relatoria.objects.select_related('materia').get(pk=self.kwargs.get('pk'))
relatoria = Relatoria.objects.select_related(
'materia').get(pk=self.kwargs.get('pk'))
ano_materia = relatoria.materia.ano
comissao = Comissao.objects.get(pk=context['form'].initial['comissao'])
comissao = Comissao.objects.get(
pk=context['form'].initial['comissao'])
composicoes = comissao.composicao_set.all()
composicao = comissao.composicao_set.filter(periodo__data_inicio__year=ano_materia)
composicao = comissao.composicao_set.filter(
periodo__data_inicio__year=ano_materia)
participacoes = Participacao.objects.select_related().filter(composicao=composicao)
@ -1952,11 +1957,11 @@ class AcompanhamentoMateriaView(CreateView):
"materia",
materia,
destinatario)
self.logger.debug('user=' + usuario.username + '. Foi enviado um e-mail de confirmação. Confira sua caixa \
de mensagens e clique no link que nós enviamos para \
confirmar o acompanhamento desta matéria.')
msg = _('Foi enviado um e-mail de confirmação. Confira sua caixa \
de mensagens e clique no link que nós enviamos para \
confirmar o acompanhamento desta matéria.')
@ -1973,7 +1978,7 @@ class AcompanhamentoMateriaView(CreateView):
return self.render_to_response(
{'form': form,
'materia': materia
})
})
return HttpResponseRedirect(self.get_success_url())
else:
return self.render_to_response(
@ -2041,6 +2046,7 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
messages.add_message(request, messages.SUCCESS, msg)
return self.get(request, self.kwargs)
class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
filterset_class = AnexadaEmLoteFilterSet
template_name = 'materia/em_lote/anexada.html'
@ -2054,7 +2060,6 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
context['subnav_template_name'] = 'materia/subnav.yaml'
context['title'] = _('Matérias Anexadas em Lote')
# Verifica se os campos foram preenchidos
if not self.filterset.form.is_valid():
@ -2084,10 +2089,10 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
data_desanexacao = None
else:
data_desanexacao = datetime.strptime(
request.POST['data_desanexacao'], "%d/%m/%Y").date()
request.POST['data_desanexacao'], "%d/%m/%Y").date()
principal = MateriaLegislativa.objects.get(pk = kwargs['pk'])
for materia in MateriaLegislativa.objects.filter(id__in = marcadas):
principal = MateriaLegislativa.objects.get(pk=kwargs['pk'])
for materia in MateriaLegislativa.objects.filter(id__in=marcadas):
anexada = Anexada()
anexada.materia_principal = principal
@ -2291,7 +2296,8 @@ class ImpressosView(PermissionRequiredMixin, TemplateView):
def gerar_pdf_impressos(request, context, template_name):
template = loader.get_template(template_name)
html = template.render(context, request)
pdf = weasyprint.HTML(string=html, base_url=request.build_absolute_uri()).write_pdf()
pdf = weasyprint.HTML(
string=html, base_url=request.build_absolute_uri()).write_pdf()
response = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = 'inline; filename="relatorio_impressos.pdf"'
@ -2476,7 +2482,8 @@ class MateriaPesquisaSimplesView(PermissionRequiredMixin, FormView):
kwargs.update({'data__gte': form.cleaned_data['data_inicial'],
'data__lte': form.cleaned_data['data_final']})
materias = MateriaLegislativa.objects.filter(**kwargs).order_by('-numero', 'ano')
materias = MateriaLegislativa.objects.filter(
**kwargs).order_by('-numero', 'ano')
quantidade_materias = materias.count()
materias = materias[:2000] if quantidade_materias > 2000 else materias
@ -2486,3 +2493,47 @@ class MateriaPesquisaSimplesView(PermissionRequiredMixin, FormView):
'materias': materias}
return gerar_pdf_impressos(self.request, context, template_materia)
class TipoMateriaCrud(CrudAux):
model = TipoMateriaLegislativa
class DetailView(CrudAux.DetailView):
layout_key = 'TipoMateriaLegislativaDetail'
class DeleteView(CrudAux.DeleteView):
def delete(self, request, *args, **kwargs):
d = CrudAux.DeleteView.delete(self, request, *args, **kwargs)
TipoMateriaLegislativa.objects.reordene()
return d
class ListView(CrudAux.ListView):
paginate_by = None
layout_key = 'TipoMateriaLegislativaDetail'
template_name = "materia/tipomaterialegislativa_list.html"
def hook_sigla(self, obj, default, url):
return '<a href="{}" pk="{}">{}</a>'.format(
url, obj.id, obj.sigla), ''
def get(self, request, *args, **kwargs):
if TipoMateriaLegislativa.objects.filter(
sequencia_regimental=0).exists():
TipoMateriaLegislativa.objects.reordene()
return CrudAux.ListView.get(self, request, *args, **kwargs)
class CreateView(CrudAux.CreateView):
def form_valid(self, form):
fv = super().form_valid(form)
if not TipoMateriaLegislativa.objects.exclude(
sequencia_regimental=0).exists():
TipoMateriaLegislativa.objects.reordene()
else:
sr__max = TipoMateriaLegislativa.objects.all().aggregate(
Max('sequencia_regimental'))
self.object.sequencia_regimental = sr__max['sequencia_regimental__max'] + 1
self.object.save()
return fv

139
sapl/sessao/views.py

@ -63,18 +63,29 @@ TipoRetiradaPautaCrud = CrudAux.build(TipoRetiradaPauta, 'tipo_retirada_pauta')
def reordernar_materias_expediente(request, pk):
expedientes = ExpedienteMateria.objects.filter(
sessao_plenaria_id=pk)
sessao_plenaria_id=pk
).order_by(
'materia__tipo__sequencia_regimental',
'materia__ano',
'materia__numero'
)
for exp_num, e in enumerate(expedientes, 1):
e.numero_ordem = exp_num
e.save()
return HttpResponseRedirect(
reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': pk}))
def reordernar_materias_ordem(request, pk):
ordens = OrdemDia.objects.filter(
sessao_plenaria_id=pk)
sessao_plenaria_id=pk
).order_by(
'materia__tipo__sequencia_regimental',
'materia__ano',
'materia__numero'
)
for ordem_num, o in enumerate(ordens, 1):
o.numero_ordem = ordem_num
o.save()
@ -1294,6 +1305,7 @@ def get_turno(turno):
else:
return ''
def get_identificação_basica(sessao_plenaria):
# =====================================================================
# Identificação Básica
@ -1309,18 +1321,22 @@ def get_identificação_basica(sessao_plenaria):
'encerramento': encerramento, 'hora_fim': sessao_plenaria.hora_fim}
]})
def get_conteudo_multimidia(sessao_plenaria):
context = {}
if sessao_plenaria.url_audio:
context['multimidia_audio'] = _('Audio: ') + str(sessao_plenaria.url_audio)
context['multimidia_audio'] = _(
'Audio: ') + str(sessao_plenaria.url_audio)
else:
context['multimidia_audio'] = _('Audio: Indisponível')
context['multimidia_audio'] = _('Audio: Indisponível')
if sessao_plenaria.url_video:
context['multimidia_video'] = _('Video: ') + str(sessao_plenaria.url_video)
context['multimidia_video'] = _(
'Video: ') + str(sessao_plenaria.url_video)
else:
context['multimidia_video'] = _('Video: Indisponível')
return context
def get_mesa_diretora(sessao_plenaria):
mesa = IntegranteMesa.objects.filter(sessao_plenaria=sessao_plenaria)
integrantes = []
@ -1333,6 +1349,7 @@ def get_mesa_diretora(sessao_plenaria):
integrantes.append(integrante)
return ({'mesa': ordenar_integrantes_por_cargo(integrantes)})
def get_presenca_sessao(sessao_plenaria):
presencas = SessaoPlenariaPresenca.objects.filter(
sessao_plenaria_id=sessao_plenaria.id
@ -1345,11 +1362,12 @@ def get_presenca_sessao(sessao_plenaria):
).order_by('parlamentar__nome_parlamentar')
return ({'presenca_sessao': parlamentares_sessao,
'justificativa_ausencia': ausentes_sessao})
'justificativa_ausencia': ausentes_sessao})
def get_expedientes(sessao_plenaria):
expediente = ExpedienteSessao.objects.filter(
sessao_plenaria_id=sessao_plenaria.id).order_by('tipo__nome')
sessao_plenaria_id=sessao_plenaria.id).order_by('tipo__nome')
expedientes = []
for e in expediente:
tipo = TipoExpediente.objects.get(id=e.tipo_id)
@ -1358,9 +1376,10 @@ def get_expedientes(sessao_plenaria):
expedientes.append(ex)
return ({'expedientes': expedientes})
def get_materias_expediente(sessao_plenaria):
materias = ExpedienteMateria.objects.filter(
sessao_plenaria_id=sessao_plenaria.id)
sessao_plenaria_id=sessao_plenaria.id)
materias_expediente = []
for m in materias:
@ -1405,6 +1424,7 @@ def get_materias_expediente(sessao_plenaria):
context = {'materia_expediente': materias_expediente}
return context
def get_oradores_expediente(sessao_plenaria):
oradores = []
for orador in OradorExpediente.objects.filter(
@ -1423,6 +1443,7 @@ def get_oradores_expediente(sessao_plenaria):
context = {'oradores': oradores}
return context
def get_presenca_ordem_do_dia(sessao_plenaria):
mesa_aux = get_mesa_diretora(sessao_plenaria)
presencas = PresencaOrdemDia.objects.filter(
@ -1430,7 +1451,7 @@ def get_presenca_ordem_do_dia(sessao_plenaria):
).order_by('parlamentar__nome_parlamentar')
parlamentares_mesa_dia = [m for m in mesa_aux['mesa']]
presidente_dia = ''
for m in mesa_aux['mesa']:
if m['cargo'].descricao == 'Presidente':
@ -1448,14 +1469,15 @@ def get_presenca_ordem_do_dia(sessao_plenaria):
except IndexError:
pass
context ={}
context = {}
context.update({'presenca_ordem': parlamentares_ordem})
config_assinatura_ata = AppsAppConfig.objects.first().assinatura_ata
if config_assinatura_ata == 'T' and parlamentares_ordem:
context.update(
{'texto_assinatura': 'Assinatura de Todos os Parlamentares Presentes na Sessão'})
context.update({'assinatura_mesa':parlamentares_mesa_dia,'assinatura_presentes': parlamentares_ordem})
context.update({'assinatura_mesa': parlamentares_mesa_dia,
'assinatura_presentes': parlamentares_ordem})
elif config_assinatura_ata == 'M' and parlamentares_mesa_dia:
context.update(
{'texto_assinatura': 'Assinatura da Mesa Diretora da Sessão'})
@ -1464,9 +1486,10 @@ def get_presenca_ordem_do_dia(sessao_plenaria):
context.update(
{'texto_assinatura': 'Assinatura do Presidente da Sessão'})
context.update({'assinatura_presentes': presidente_dia})
return context
def get_materias_ordem_do_dia(sessao_plenaria):
ordem = OrdemDia.objects.filter(sessao_plenaria_id=sessao_plenaria.id)
materias_ordem = []
@ -1494,12 +1517,12 @@ def get_materias_ordem_do_dia(sessao_plenaria):
else:
resultado = _('Matéria não votada')
resultado_observacao = _(' ')
voto_sim = ""
voto_nao = ""
voto_abstencoes = ""
voto_nominal = []
if o.tipo_votacao == 2:
votos = VotoParlamentar.objects.filter(ordem=o.id)
for voto in votos:
@ -1529,9 +1552,9 @@ def get_materias_ordem_do_dia(sessao_plenaria):
'numero_protocolo': o.materia.numero_protocolo,
'numero_processo': o.materia.numeracao_set.last(),
'tipo_votacao': o.TIPO_VOTACAO_CHOICES[o.tipo_votacao],
'voto_sim':voto_sim,
'voto_nao':voto_nao,
'voto_abstencoes':voto_abstencoes,
'voto_sim': voto_sim,
'voto_nao': voto_nao,
'voto_abstencoes': voto_abstencoes,
'voto_nominal': voto_nominal,
}
materias_ordem.append(mat)
@ -1539,6 +1562,7 @@ def get_materias_ordem_do_dia(sessao_plenaria):
context = {'materias_ordem': materias_ordem}
return context
def get_oradores_explicações_pessoais(sessao_plenaria):
oradores_explicacoes = []
for orador in Orador.objects.filter(
@ -1560,20 +1584,20 @@ def get_oradores_explicações_pessoais(sessao_plenaria):
context = {'oradores_explicacoes': oradores_explicacoes}
return context
def get_ocorrencias_da_sessão(sessao_plenaria):
ocorrencias_sessao = OcorrenciaSessao.objects.filter(
sessao_plenaria_id=sessao_plenaria.id)
sessao_plenaria_id=sessao_plenaria.id)
context = {'ocorrencias_da_sessao': ocorrencias_sessao}
return context
class ResumoView(DetailView):
template_name = 'sessao/resumo.html'
model = SessaoPlenaria
logger = logging.getLogger(__name__)
def get_context(self,*args, **kwargs):
def get_context(self, *args, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
@ -1581,23 +1605,23 @@ class ResumoView(DetailView):
materias_expediente_votacao_nominal = ExpedienteMateria.objects.filter(
sessao_plenaria_id=self.object.id,
tipo_votacao=2).order_by('-materia')
votacoes = []
for mevn in materias_expediente_votacao_nominal:
for mevn in materias_expediente_votacao_nominal:
votos_materia = []
titulo_materia = mevn.materia
registro = RegistroVotacao.objects.filter(expediente=mevn)
if registro:
if registro:
for vp in VotoParlamentar.objects.filter(votacao=registro).order_by('parlamentar'):
votos_materia.append(vp)
dados_votacao = {
'titulo': titulo_materia,
'votos': votos_materia
}
}
votacoes.append(dados_votacao)
context.update({'votos_nominais_materia_expediente': votacoes})
# =====================================================================
@ -1645,7 +1669,7 @@ class ResumoView(DetailView):
'votos': votos_materia_od
}
votacoes_od.append(dados_votacao_od)
context.update({'votos_nominais_materia_ordem_dia': votacoes_od})
context.update(get_materias_ordem_do_dia(self.object))
@ -1678,36 +1702,36 @@ class ResumoView(DetailView):
try:
context.update(
{'primeiro_ordenacao': dict_ord_template[ordenacao.primeiro],
'segundo_ordenacao': dict_ord_template[ordenacao.segundo],
'terceiro_ordenacao': dict_ord_template[ordenacao.terceiro],
'quarto_ordenacao': dict_ord_template[ordenacao.quarto],
'quinto_ordenacao': dict_ord_template[ordenacao.quinto],
'sexto_ordenacao': dict_ord_template[ordenacao.sexto],
'setimo_ordenacao': dict_ord_template[ordenacao.setimo],
'oitavo_ordenacao': dict_ord_template[ordenacao.oitavo],
'nono_ordenacao': dict_ord_template[ordenacao.nono],
'decimo_ordenacao': dict_ord_template[ordenacao.decimo],
'decimo_primeiro_ordenacao': dict_ord_template[ordenacao.decimo_primeiro],
'decimo_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo],
'decimo_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro]})
'segundo_ordenacao': dict_ord_template[ordenacao.segundo],
'terceiro_ordenacao': dict_ord_template[ordenacao.terceiro],
'quarto_ordenacao': dict_ord_template[ordenacao.quarto],
'quinto_ordenacao': dict_ord_template[ordenacao.quinto],
'sexto_ordenacao': dict_ord_template[ordenacao.sexto],
'setimo_ordenacao': dict_ord_template[ordenacao.setimo],
'oitavo_ordenacao': dict_ord_template[ordenacao.oitavo],
'nono_ordenacao': dict_ord_template[ordenacao.nono],
'decimo_ordenacao': dict_ord_template[ordenacao.decimo],
'decimo_primeiro_ordenacao': dict_ord_template[ordenacao.decimo_primeiro],
'decimo_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo],
'decimo_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro]})
except KeyError as e:
self.logger.error('user=' + self.request.user.username + '. ' + "KeyError: " + str(e) + ". Erro "
"ao tentar utilizar configuração de ordenação. Utilizando ordenação padrão.")
context.update(
{'primeiro_ordenacao': dict_ord_template['id_basica'],
'segundo_ordenacao': dict_ord_template['cont_mult'],
'terceiro_ordenacao': dict_ord_template['mesa_d'],
'quarto_ordenacao': dict_ord_template['lista_p'],
'quinto_ordenacao': dict_ord_template['exp'],
'sexto_ordenacao': dict_ord_template['mat_exp'],
'setimo_ordenacao': dict_ord_template['v_n_mat_exp'],
'oitavo_ordenacao': dict_ord_template['oradores_exped'],
'nono_ordenacao': dict_ord_template['lista_p_o_d'],
'decimo_ordenacao': dict_ord_template['mat_o_d'],
'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'],
'decimo_segundo_ordenacao': dict_ord_template['oradores_expli'],
'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao']
})
{'primeiro_ordenacao': dict_ord_template['id_basica'],
'segundo_ordenacao': dict_ord_template['cont_mult'],
'terceiro_ordenacao': dict_ord_template['mesa_d'],
'quarto_ordenacao': dict_ord_template['lista_p'],
'quinto_ordenacao': dict_ord_template['exp'],
'sexto_ordenacao': dict_ord_template['mat_exp'],
'setimo_ordenacao': dict_ord_template['v_n_mat_exp'],
'oitavo_ordenacao': dict_ord_template['oradores_exped'],
'nono_ordenacao': dict_ord_template['lista_p_o_d'],
'decimo_ordenacao': dict_ord_template['mat_o_d'],
'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'],
'decimo_segundo_ordenacao': dict_ord_template['oradores_expli'],
'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao']
})
else:
context.update(
{'primeiro_ordenacao': dict_ord_template['id_basica'],
@ -1725,14 +1749,13 @@ class ResumoView(DetailView):
'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao']
})
return context
return context
def get(self, request, *args, **kwargs):
context = self.get_context()
return self.render_to_response(context)
class ResumoAtaView(ResumoView):
template_name = 'sessao/resumo_ata.html'
logger = logging.getLogger(__name__)
@ -3142,7 +3165,7 @@ class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin,
def get_context_data(self, **kwargs):
context = super(MateriaLegislativaPesquisaView,
self).get_context_data(**kwargs)
context['title'] = _('Pesquisar Matéria Legislativa')
context['root_pk'] = self.kwargs['pk']
@ -3478,7 +3501,7 @@ class VotacaoEmBlocoSimbolicaView(PermissionRequiredForAppCrudMixin, TemplateVie
'origem': request.POST['origem'],
'subnav_template_name': 'sessao/subnav.yaml'
}
if 'marcadas_1' in request.POST:
context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(),

6
sapl/templates/materia/layouts.yaml

@ -3,9 +3,13 @@ Origem:
{% trans 'Origem' %}:
- nome:8 sigla
TipoMateriaLegislativaDetail:
{% trans 'Tipo Matéria Legislativa' %}:
- sigla:2 descricao sequencia_numeracao:2 sequencia_regimental:2
TipoMateriaLegislativa:
{% trans 'Tipo Matéria Legislativa' %}:
- sigla:4 descricao sequencia_numeracao
- sigla:2 descricao sequencia_numeracao:3
RegimeTramitacao:
{% trans 'Tipo de Documento' %}:

55
sapl/templates/materia/tipomaterialegislativa_list.html

@ -0,0 +1,55 @@
{% extends "crud/list_tabaux.html" %}
{% load i18n %}
{% load common_tags %}
{% block container_table_list %}
<div style="cursor: all-scroll">
{{ block.super }}
</div>
{% endblock %}
{% block extra_js %}
<script type="text/javascript">
$('tbody').sortable({
revert: false,
distance: 15,
start: function(event, ui) {
ui.item.startPos = ui.item.index();
},
stop: function(event, ui) {
var pos_ini = ui.item.startPos + 1;
var pos_fim = ui.item.index() + 1;
var pk = ui.item.find('a[pk]').attr('pk');
var url = "{% url 'sapl.api:tipomaterialegislativa-change-position' 0 %}";
url = url.replace('0', pk) ;
$.ajax({
url: url,
type: 'POST',
contentType: "application/json",
data: JSON.stringify({
"pos_ini": pos_ini,
"pos_fim": pos_fim,
}),
headers: {
'X-CSRFToken': getCookie('csrftoken')
},
error: function(e) {
console.log(e);
}
});
setTimeout(function(){ window.location.reload(true) }, 500);
}
});
$(window).on('beforeunload', function () {
$('tbody').sortable('disable');
$("input[type=submit], input[type=button]").prop("disabled", "disabled");
});
</script>
{% endblock %}
Loading…
Cancel
Save