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.permissions import SaplModelPermissions
from sapl.api.serializers import ChoiceSerializer from sapl.api.serializers import ChoiceSerializer
from sapl.base.models import Autor, AppConfig, DOC_ADM_OSTENSIVO 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.parlamentares.models import Parlamentar
from sapl.utils import models_with_gr_for_model, choice_anos_com_sessaoplenaria from sapl.utils import models_with_gr_for_model, choice_anos_com_sessaoplenaria
@ -348,6 +348,23 @@ class _ProposicaoViewSet(SaplSetViews['materia']['proposicao']):
return qs 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 _DocumentoAdministrativoViewSet(SaplSetViews['protocoloadm']['documentoadministrativo']):
class DocumentoAdministrativoPermission(SaplModelPermissions): class DocumentoAdministrativoPermission(SaplModelPermissions):
@ -426,6 +443,7 @@ class _SessaoPlenariaViewSet(
SaplSetViews['base']['autor'] = _AutorViewSet.build_class_with_actions() SaplSetViews['base']['autor'] = _AutorViewSet.build_class_with_actions()
SaplSetViews['materia']['proposicao'] = _ProposicaoViewSet SaplSetViews['materia']['proposicao'] = _ProposicaoViewSet
SaplSetViews['materia']['tipomaterialegislativa'] = _TipoMateriaLegislativaViewSet
SaplSetViews['parlamentares']['parlamentar'] = _ParlamentarViewSet SaplSetViews['parlamentares']['parlamentar'] = _ParlamentarViewSet

12
sapl/crud/base.py

@ -2,7 +2,6 @@ import logging
from braces.views import FormMessagesMixin from braces.views import FormMessagesMixin
from crispy_forms.bootstrap import FieldWithButtons, StrictButton from crispy_forms.bootstrap import FieldWithButtons, StrictButton
from sapl.crispy_layout_mixin import SaplFormHelper
from crispy_forms.layout import Field, Layout from crispy_forms.layout import Field, Layout
from django import forms from django import forms
from django.conf.urls import url 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 django.views.generic.list import MultipleObjectMixin
from sapl.crispy_layout_mixin import CrispyLayoutFormMixin, get_field_display 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, from sapl.rules.map_rules import (RP_ADD, RP_CHANGE, RP_DELETE, RP_DETAIL,
RP_LIST) RP_LIST)
from sapl.settings import BASE_DIR from sapl.settings import BASE_DIR
@ -449,18 +449,28 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView):
if not n: if not n:
s += '<br>' s += '<br>'
continue continue
m = obj m = obj
n = n.split('__') n = n.split('__')
for f in n[:-1]: for f in n[:-1]:
m = getattr(m, f) m = getattr(m, f)
if not m: if not m:
break break
ss = ''
if m: if m:
ss = get_field_display(m, n[-1])[1] ss = get_field_display(m, n[-1])[1]
ss = ( ss = (
('<br>' if '<ul>' in ss else ' - ') + ss)\ ('<br>' if '<ul>' in ss else ' - ') + ss)\
if ss and j != 0 and s 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 s += ss
r.append((s, url)) r.append((s, url))
return r 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 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() @reversion.register()
class TipoMateriaLegislativa(models.Model): class TipoMateriaLegislativa(models.Model):
objects = TipoMateriaManager()
sigla = models.CharField(max_length=5, verbose_name=_('Sigla')) sigla = models.CharField(max_length=5, verbose_name=_('Sigla'))
descricao = models.CharField(max_length=50, verbose_name=_('Descrição ')) descricao = models.CharField(max_length=50, verbose_name=_('Descrição '))
# XXX o que é isso ? # XXX o que é isso ?
@ -101,10 +130,17 @@ class TipoMateriaLegislativa(models.Model):
verbose_name=_('Sequência de numeração'), verbose_name=_('Sequência de numeração'),
choices=SEQUENCIA_NUMERACAO) 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: class Meta:
verbose_name = _('Tipo de Matéria Legislativa') verbose_name = _('Tipo de Matéria Legislativa')
verbose_name_plural = _('Tipos de Matérias Legislativas') verbose_name_plural = _('Tipos de Matérias Legislativas')
ordering = ['descricao'] ordering = ['sequencia_regimental', 'descricao']
def __str__(self): def __str__(self):
return self.descricao return self.descricao
@ -920,7 +956,8 @@ class Tramitacao(models.Model):
('B', 'primeira_votacao', _('1ª Votação')), ('B', 'primeira_votacao', _('1ª Votação')),
('C', 'segunda_terceira_votacao', _('2ª e 3ª Votação')), ('C', 'segunda_terceira_votacao', _('2ª e 3ª Votação')),
('D', 'deliberacao', _('Deliberaçã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 random import choice
from string import ascii_letters, digits from string import ascii_letters, digits
from sapl.crispy_layout_mixin import SaplFormHelper
from crispy_forms.layout import HTML from crispy_forms.layout import HTML
from django.conf import settings from django.conf import settings
from django.contrib import messages 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, from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_RESTRICT,
STATUS_TA_PRIVATE) STATUS_TA_PRIVATE)
from sapl.compilacao.views import IntegracaoTaView from sapl.compilacao.views import IntegracaoTaView
from sapl.crispy_layout_mixin import SaplFormHelper
from sapl.crispy_layout_mixin import SaplFormLayout, form_actions from sapl.crispy_layout_mixin import SaplFormLayout, form_actions
from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
MasterDetailCrud, MasterDetailCrud,
@ -75,9 +75,6 @@ AssuntoMateriaCrud = CrudAux.build(AssuntoMateria, 'assunto_materia')
OrigemCrud = CrudAux.build(Origem, '') OrigemCrud = CrudAux.build(Origem, '')
TipoMateriaCrud = CrudAux.build(
TipoMateriaLegislativa, 'tipo_materia_legislativa')
RegimeTramitacaoCrud = CrudAux.build( RegimeTramitacaoCrud = CrudAux.build(
RegimeTramitacao, 'regime_tramitacao') RegimeTramitacao, 'regime_tramitacao')
@ -214,7 +211,8 @@ class CriarProtocoloMateriaView(CreateView):
context['form'].fields['ano'].initial = protocolo.ano context['form'].fields['ano'].initial = protocolo.ano
if protocolo: if protocolo:
if protocolo.timestamp: 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: elif protocolo.timestamp_data_hora_manual:
context['form'].fields['data_apresentacao'].initial = protocolo.timestamp_data_hora_manual.date() context['form'].fields['data_apresentacao'].initial = protocolo.timestamp_data_hora_manual.date()
elif protocolo.data: elif protocolo.data:
@ -1115,7 +1113,8 @@ class RelatoriaCrud(MasterDetailCrud):
try: try:
self.logger.debug("user=" + username + ". Tentando obter objeto Comissao de pk={}.".format( self.logger.debug("user=" + username + ". Tentando obter objeto Comissao de pk={}.".format(
context['form'].initial['comissao'])) context['form'].initial['comissao']))
comissao = Comissao.objects.get(pk=context['form'].initial['comissao']) comissao = Comissao.objects.get(
pk=context['form'].initial['comissao'])
except: except:
self.logger.error("user=" + username + ". Objeto Comissão de pk={} não encontrado.".format( self.logger.error("user=" + username + ". Objeto Comissão de pk={} não encontrado.".format(
context['form'].initial['comissao'])) context['form'].initial['comissao']))
@ -1125,12 +1124,15 @@ class RelatoriaCrud(MasterDetailCrud):
self.logger.info("user=" + username + ". Objeto Comissao de pk={} obtido com sucesso.".format( self.logger.info("user=" + username + ". Objeto Comissao de pk={} obtido com sucesso.".format(
context['form'].initial['comissao'])) 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 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() 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) 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( self.logger.info("user=" + username + ". Objeto Comissao de pk={} obtido com sucesso.".format(
context['form'].initial['comissao'])) 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 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() 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) participacoes = Participacao.objects.select_related().filter(composicao=composicao)
@ -1952,11 +1957,11 @@ class AcompanhamentoMateriaView(CreateView):
"materia", "materia",
materia, materia,
destinatario) destinatario)
self.logger.debug('user=' + usuario.username + '. Foi enviado um e-mail de confirmação. Confira sua caixa \ 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 \ de mensagens e clique no link que nós enviamos para \
confirmar o acompanhamento desta matéria.') confirmar o acompanhamento desta matéria.')
msg = _('Foi enviado um e-mail de confirmação. Confira sua caixa \ msg = _('Foi enviado um e-mail de confirmação. Confira sua caixa \
de mensagens e clique no link que nós enviamos para \ de mensagens e clique no link que nós enviamos para \
confirmar o acompanhamento desta matéria.') confirmar o acompanhamento desta matéria.')
@ -1973,7 +1978,7 @@ class AcompanhamentoMateriaView(CreateView):
return self.render_to_response( return self.render_to_response(
{'form': form, {'form': form,
'materia': materia 'materia': materia
}) })
return HttpResponseRedirect(self.get_success_url()) return HttpResponseRedirect(self.get_success_url())
else: else:
return self.render_to_response( return self.render_to_response(
@ -2041,6 +2046,7 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
messages.add_message(request, messages.SUCCESS, msg) messages.add_message(request, messages.SUCCESS, msg)
return self.get(request, self.kwargs) return self.get(request, self.kwargs)
class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
filterset_class = AnexadaEmLoteFilterSet filterset_class = AnexadaEmLoteFilterSet
template_name = 'materia/em_lote/anexada.html' template_name = 'materia/em_lote/anexada.html'
@ -2054,7 +2060,6 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
context['subnav_template_name'] = 'materia/subnav.yaml' context['subnav_template_name'] = 'materia/subnav.yaml'
context['title'] = _('Matérias Anexadas em Lote') context['title'] = _('Matérias Anexadas em Lote')
# Verifica se os campos foram preenchidos # Verifica se os campos foram preenchidos
if not self.filterset.form.is_valid(): if not self.filterset.form.is_valid():
@ -2084,10 +2089,10 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
data_desanexacao = None data_desanexacao = None
else: else:
data_desanexacao = datetime.strptime( 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']) principal = MateriaLegislativa.objects.get(pk=kwargs['pk'])
for materia in MateriaLegislativa.objects.filter(id__in = marcadas): for materia in MateriaLegislativa.objects.filter(id__in=marcadas):
anexada = Anexada() anexada = Anexada()
anexada.materia_principal = principal anexada.materia_principal = principal
@ -2291,7 +2296,8 @@ class ImpressosView(PermissionRequiredMixin, TemplateView):
def gerar_pdf_impressos(request, context, template_name): def gerar_pdf_impressos(request, context, template_name):
template = loader.get_template(template_name) template = loader.get_template(template_name)
html = template.render(context, request) 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 = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = 'inline; filename="relatorio_impressos.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'], kwargs.update({'data__gte': form.cleaned_data['data_inicial'],
'data__lte': form.cleaned_data['data_final']}) '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() quantidade_materias = materias.count()
materias = materias[:2000] if quantidade_materias > 2000 else materias materias = materias[:2000] if quantidade_materias > 2000 else materias
@ -2486,3 +2493,47 @@ class MateriaPesquisaSimplesView(PermissionRequiredMixin, FormView):
'materias': materias} 'materias': materias}
return gerar_pdf_impressos(self.request, context, template_materia) 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): def reordernar_materias_expediente(request, pk):
expedientes = ExpedienteMateria.objects.filter( 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): for exp_num, e in enumerate(expedientes, 1):
e.numero_ordem = exp_num e.numero_ordem = exp_num
e.save() e.save()
return HttpResponseRedirect( return HttpResponseRedirect(
reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': pk})) reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': pk}))
def reordernar_materias_ordem(request, pk): def reordernar_materias_ordem(request, pk):
ordens = OrdemDia.objects.filter( 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): for ordem_num, o in enumerate(ordens, 1):
o.numero_ordem = ordem_num o.numero_ordem = ordem_num
o.save() o.save()
@ -1294,6 +1305,7 @@ def get_turno(turno):
else: else:
return '' return ''
def get_identificação_basica(sessao_plenaria): def get_identificação_basica(sessao_plenaria):
# ===================================================================== # =====================================================================
# Identificação Básica # Identificação Básica
@ -1309,18 +1321,22 @@ def get_identificação_basica(sessao_plenaria):
'encerramento': encerramento, 'hora_fim': sessao_plenaria.hora_fim} 'encerramento': encerramento, 'hora_fim': sessao_plenaria.hora_fim}
]}) ]})
def get_conteudo_multimidia(sessao_plenaria): def get_conteudo_multimidia(sessao_plenaria):
context = {} context = {}
if sessao_plenaria.url_audio: if sessao_plenaria.url_audio:
context['multimidia_audio'] = _('Audio: ') + str(sessao_plenaria.url_audio) context['multimidia_audio'] = _(
'Audio: ') + str(sessao_plenaria.url_audio)
else: else:
context['multimidia_audio'] = _('Audio: Indisponível') context['multimidia_audio'] = _('Audio: Indisponível')
if sessao_plenaria.url_video: if sessao_plenaria.url_video:
context['multimidia_video'] = _('Video: ') + str(sessao_plenaria.url_video) context['multimidia_video'] = _(
'Video: ') + str(sessao_plenaria.url_video)
else: else:
context['multimidia_video'] = _('Video: Indisponível') context['multimidia_video'] = _('Video: Indisponível')
return context return context
def get_mesa_diretora(sessao_plenaria): def get_mesa_diretora(sessao_plenaria):
mesa = IntegranteMesa.objects.filter(sessao_plenaria=sessao_plenaria) mesa = IntegranteMesa.objects.filter(sessao_plenaria=sessao_plenaria)
integrantes = [] integrantes = []
@ -1333,6 +1349,7 @@ def get_mesa_diretora(sessao_plenaria):
integrantes.append(integrante) integrantes.append(integrante)
return ({'mesa': ordenar_integrantes_por_cargo(integrantes)}) return ({'mesa': ordenar_integrantes_por_cargo(integrantes)})
def get_presenca_sessao(sessao_plenaria): def get_presenca_sessao(sessao_plenaria):
presencas = SessaoPlenariaPresenca.objects.filter( presencas = SessaoPlenariaPresenca.objects.filter(
sessao_plenaria_id=sessao_plenaria.id sessao_plenaria_id=sessao_plenaria.id
@ -1345,11 +1362,12 @@ def get_presenca_sessao(sessao_plenaria):
).order_by('parlamentar__nome_parlamentar') ).order_by('parlamentar__nome_parlamentar')
return ({'presenca_sessao': parlamentares_sessao, return ({'presenca_sessao': parlamentares_sessao,
'justificativa_ausencia': ausentes_sessao}) 'justificativa_ausencia': ausentes_sessao})
def get_expedientes(sessao_plenaria): def get_expedientes(sessao_plenaria):
expediente = ExpedienteSessao.objects.filter( 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 = [] expedientes = []
for e in expediente: for e in expediente:
tipo = TipoExpediente.objects.get(id=e.tipo_id) tipo = TipoExpediente.objects.get(id=e.tipo_id)
@ -1358,9 +1376,10 @@ def get_expedientes(sessao_plenaria):
expedientes.append(ex) expedientes.append(ex)
return ({'expedientes': expedientes}) return ({'expedientes': expedientes})
def get_materias_expediente(sessao_plenaria): def get_materias_expediente(sessao_plenaria):
materias = ExpedienteMateria.objects.filter( materias = ExpedienteMateria.objects.filter(
sessao_plenaria_id=sessao_plenaria.id) sessao_plenaria_id=sessao_plenaria.id)
materias_expediente = [] materias_expediente = []
for m in materias: for m in materias:
@ -1405,6 +1424,7 @@ def get_materias_expediente(sessao_plenaria):
context = {'materia_expediente': materias_expediente} context = {'materia_expediente': materias_expediente}
return context return context
def get_oradores_expediente(sessao_plenaria): def get_oradores_expediente(sessao_plenaria):
oradores = [] oradores = []
for orador in OradorExpediente.objects.filter( for orador in OradorExpediente.objects.filter(
@ -1423,6 +1443,7 @@ def get_oradores_expediente(sessao_plenaria):
context = {'oradores': oradores} context = {'oradores': oradores}
return context return context
def get_presenca_ordem_do_dia(sessao_plenaria): def get_presenca_ordem_do_dia(sessao_plenaria):
mesa_aux = get_mesa_diretora(sessao_plenaria) mesa_aux = get_mesa_diretora(sessao_plenaria)
presencas = PresencaOrdemDia.objects.filter( presencas = PresencaOrdemDia.objects.filter(
@ -1430,7 +1451,7 @@ def get_presenca_ordem_do_dia(sessao_plenaria):
).order_by('parlamentar__nome_parlamentar') ).order_by('parlamentar__nome_parlamentar')
parlamentares_mesa_dia = [m for m in mesa_aux['mesa']] parlamentares_mesa_dia = [m for m in mesa_aux['mesa']]
presidente_dia = '' presidente_dia = ''
for m in mesa_aux['mesa']: for m in mesa_aux['mesa']:
if m['cargo'].descricao == 'Presidente': if m['cargo'].descricao == 'Presidente':
@ -1448,14 +1469,15 @@ def get_presenca_ordem_do_dia(sessao_plenaria):
except IndexError: except IndexError:
pass pass
context ={} context = {}
context.update({'presenca_ordem': parlamentares_ordem}) context.update({'presenca_ordem': parlamentares_ordem})
config_assinatura_ata = AppsAppConfig.objects.first().assinatura_ata config_assinatura_ata = AppsAppConfig.objects.first().assinatura_ata
if config_assinatura_ata == 'T' and parlamentares_ordem: if config_assinatura_ata == 'T' and parlamentares_ordem:
context.update( context.update(
{'texto_assinatura': 'Assinatura de Todos os Parlamentares Presentes na Sessão'}) {'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: elif config_assinatura_ata == 'M' and parlamentares_mesa_dia:
context.update( context.update(
{'texto_assinatura': 'Assinatura da Mesa Diretora da Sessão'}) {'texto_assinatura': 'Assinatura da Mesa Diretora da Sessão'})
@ -1464,9 +1486,10 @@ def get_presenca_ordem_do_dia(sessao_plenaria):
context.update( context.update(
{'texto_assinatura': 'Assinatura do Presidente da Sessão'}) {'texto_assinatura': 'Assinatura do Presidente da Sessão'})
context.update({'assinatura_presentes': presidente_dia}) context.update({'assinatura_presentes': presidente_dia})
return context return context
def get_materias_ordem_do_dia(sessao_plenaria): def get_materias_ordem_do_dia(sessao_plenaria):
ordem = OrdemDia.objects.filter(sessao_plenaria_id=sessao_plenaria.id) ordem = OrdemDia.objects.filter(sessao_plenaria_id=sessao_plenaria.id)
materias_ordem = [] materias_ordem = []
@ -1494,12 +1517,12 @@ def get_materias_ordem_do_dia(sessao_plenaria):
else: else:
resultado = _('Matéria não votada') resultado = _('Matéria não votada')
resultado_observacao = _(' ') resultado_observacao = _(' ')
voto_sim = "" voto_sim = ""
voto_nao = "" voto_nao = ""
voto_abstencoes = "" voto_abstencoes = ""
voto_nominal = [] voto_nominal = []
if o.tipo_votacao == 2: if o.tipo_votacao == 2:
votos = VotoParlamentar.objects.filter(ordem=o.id) votos = VotoParlamentar.objects.filter(ordem=o.id)
for voto in votos: for voto in votos:
@ -1529,9 +1552,9 @@ def get_materias_ordem_do_dia(sessao_plenaria):
'numero_protocolo': o.materia.numero_protocolo, 'numero_protocolo': o.materia.numero_protocolo,
'numero_processo': o.materia.numeracao_set.last(), 'numero_processo': o.materia.numeracao_set.last(),
'tipo_votacao': o.TIPO_VOTACAO_CHOICES[o.tipo_votacao], 'tipo_votacao': o.TIPO_VOTACAO_CHOICES[o.tipo_votacao],
'voto_sim':voto_sim, 'voto_sim': voto_sim,
'voto_nao':voto_nao, 'voto_nao': voto_nao,
'voto_abstencoes':voto_abstencoes, 'voto_abstencoes': voto_abstencoes,
'voto_nominal': voto_nominal, 'voto_nominal': voto_nominal,
} }
materias_ordem.append(mat) materias_ordem.append(mat)
@ -1539,6 +1562,7 @@ def get_materias_ordem_do_dia(sessao_plenaria):
context = {'materias_ordem': materias_ordem} context = {'materias_ordem': materias_ordem}
return context return context
def get_oradores_explicações_pessoais(sessao_plenaria): def get_oradores_explicações_pessoais(sessao_plenaria):
oradores_explicacoes = [] oradores_explicacoes = []
for orador in Orador.objects.filter( for orador in Orador.objects.filter(
@ -1560,20 +1584,20 @@ def get_oradores_explicações_pessoais(sessao_plenaria):
context = {'oradores_explicacoes': oradores_explicacoes} context = {'oradores_explicacoes': oradores_explicacoes}
return context return context
def get_ocorrencias_da_sessão(sessao_plenaria): def get_ocorrencias_da_sessão(sessao_plenaria):
ocorrencias_sessao = OcorrenciaSessao.objects.filter( ocorrencias_sessao = OcorrenciaSessao.objects.filter(
sessao_plenaria_id=sessao_plenaria.id) sessao_plenaria_id=sessao_plenaria.id)
context = {'ocorrencias_da_sessao': ocorrencias_sessao} context = {'ocorrencias_da_sessao': ocorrencias_sessao}
return context return context
class ResumoView(DetailView): class ResumoView(DetailView):
template_name = 'sessao/resumo.html' template_name = 'sessao/resumo.html'
model = SessaoPlenaria model = SessaoPlenaria
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def get_context(self,*args, **kwargs): def get_context(self, *args, **kwargs):
self.object = self.get_object() self.object = self.get_object()
context = self.get_context_data(object=self.object) context = self.get_context_data(object=self.object)
@ -1581,23 +1605,23 @@ class ResumoView(DetailView):
materias_expediente_votacao_nominal = ExpedienteMateria.objects.filter( materias_expediente_votacao_nominal = ExpedienteMateria.objects.filter(
sessao_plenaria_id=self.object.id, sessao_plenaria_id=self.object.id,
tipo_votacao=2).order_by('-materia') tipo_votacao=2).order_by('-materia')
votacoes = [] votacoes = []
for mevn in materias_expediente_votacao_nominal: for mevn in materias_expediente_votacao_nominal:
votos_materia = [] votos_materia = []
titulo_materia = mevn.materia titulo_materia = mevn.materia
registro = RegistroVotacao.objects.filter(expediente=mevn) registro = RegistroVotacao.objects.filter(expediente=mevn)
if registro: if registro:
for vp in VotoParlamentar.objects.filter(votacao=registro).order_by('parlamentar'): for vp in VotoParlamentar.objects.filter(votacao=registro).order_by('parlamentar'):
votos_materia.append(vp) votos_materia.append(vp)
dados_votacao = { dados_votacao = {
'titulo': titulo_materia, 'titulo': titulo_materia,
'votos': votos_materia 'votos': votos_materia
} }
votacoes.append(dados_votacao) votacoes.append(dados_votacao)
context.update({'votos_nominais_materia_expediente': votacoes}) context.update({'votos_nominais_materia_expediente': votacoes})
# ===================================================================== # =====================================================================
@ -1645,7 +1669,7 @@ class ResumoView(DetailView):
'votos': votos_materia_od 'votos': votos_materia_od
} }
votacoes_od.append(dados_votacao_od) votacoes_od.append(dados_votacao_od)
context.update({'votos_nominais_materia_ordem_dia': votacoes_od}) context.update({'votos_nominais_materia_ordem_dia': votacoes_od})
context.update(get_materias_ordem_do_dia(self.object)) context.update(get_materias_ordem_do_dia(self.object))
@ -1678,36 +1702,36 @@ class ResumoView(DetailView):
try: try:
context.update( context.update(
{'primeiro_ordenacao': dict_ord_template[ordenacao.primeiro], {'primeiro_ordenacao': dict_ord_template[ordenacao.primeiro],
'segundo_ordenacao': dict_ord_template[ordenacao.segundo], 'segundo_ordenacao': dict_ord_template[ordenacao.segundo],
'terceiro_ordenacao': dict_ord_template[ordenacao.terceiro], 'terceiro_ordenacao': dict_ord_template[ordenacao.terceiro],
'quarto_ordenacao': dict_ord_template[ordenacao.quarto], 'quarto_ordenacao': dict_ord_template[ordenacao.quarto],
'quinto_ordenacao': dict_ord_template[ordenacao.quinto], 'quinto_ordenacao': dict_ord_template[ordenacao.quinto],
'sexto_ordenacao': dict_ord_template[ordenacao.sexto], 'sexto_ordenacao': dict_ord_template[ordenacao.sexto],
'setimo_ordenacao': dict_ord_template[ordenacao.setimo], 'setimo_ordenacao': dict_ord_template[ordenacao.setimo],
'oitavo_ordenacao': dict_ord_template[ordenacao.oitavo], 'oitavo_ordenacao': dict_ord_template[ordenacao.oitavo],
'nono_ordenacao': dict_ord_template[ordenacao.nono], 'nono_ordenacao': dict_ord_template[ordenacao.nono],
'decimo_ordenacao': dict_ord_template[ordenacao.decimo], 'decimo_ordenacao': dict_ord_template[ordenacao.decimo],
'decimo_primeiro_ordenacao': dict_ord_template[ordenacao.decimo_primeiro], 'decimo_primeiro_ordenacao': dict_ord_template[ordenacao.decimo_primeiro],
'decimo_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo], 'decimo_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo],
'decimo_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro]}) 'decimo_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro]})
except KeyError as e: except KeyError as e:
self.logger.error('user=' + self.request.user.username + '. ' + "KeyError: " + str(e) + ". Erro " 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.") "ao tentar utilizar configuração de ordenação. Utilizando ordenação padrão.")
context.update( context.update(
{'primeiro_ordenacao': dict_ord_template['id_basica'], {'primeiro_ordenacao': dict_ord_template['id_basica'],
'segundo_ordenacao': dict_ord_template['cont_mult'], 'segundo_ordenacao': dict_ord_template['cont_mult'],
'terceiro_ordenacao': dict_ord_template['mesa_d'], 'terceiro_ordenacao': dict_ord_template['mesa_d'],
'quarto_ordenacao': dict_ord_template['lista_p'], 'quarto_ordenacao': dict_ord_template['lista_p'],
'quinto_ordenacao': dict_ord_template['exp'], 'quinto_ordenacao': dict_ord_template['exp'],
'sexto_ordenacao': dict_ord_template['mat_exp'], 'sexto_ordenacao': dict_ord_template['mat_exp'],
'setimo_ordenacao': dict_ord_template['v_n_mat_exp'], 'setimo_ordenacao': dict_ord_template['v_n_mat_exp'],
'oitavo_ordenacao': dict_ord_template['oradores_exped'], 'oitavo_ordenacao': dict_ord_template['oradores_exped'],
'nono_ordenacao': dict_ord_template['lista_p_o_d'], 'nono_ordenacao': dict_ord_template['lista_p_o_d'],
'decimo_ordenacao': dict_ord_template['mat_o_d'], 'decimo_ordenacao': dict_ord_template['mat_o_d'],
'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'], 'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'],
'decimo_segundo_ordenacao': dict_ord_template['oradores_expli'], 'decimo_segundo_ordenacao': dict_ord_template['oradores_expli'],
'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao'] 'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao']
}) })
else: else:
context.update( context.update(
{'primeiro_ordenacao': dict_ord_template['id_basica'], {'primeiro_ordenacao': dict_ord_template['id_basica'],
@ -1725,14 +1749,13 @@ class ResumoView(DetailView):
'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao'] 'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao']
}) })
return context return context
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
context = self.get_context() context = self.get_context()
return self.render_to_response(context) return self.render_to_response(context)
class ResumoAtaView(ResumoView): class ResumoAtaView(ResumoView):
template_name = 'sessao/resumo_ata.html' template_name = 'sessao/resumo_ata.html'
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -3142,7 +3165,7 @@ class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin,
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(MateriaLegislativaPesquisaView, context = super(MateriaLegislativaPesquisaView,
self).get_context_data(**kwargs) self).get_context_data(**kwargs)
context['title'] = _('Pesquisar Matéria Legislativa') context['title'] = _('Pesquisar Matéria Legislativa')
context['root_pk'] = self.kwargs['pk'] context['root_pk'] = self.kwargs['pk']
@ -3478,7 +3501,7 @@ class VotacaoEmBlocoSimbolicaView(PermissionRequiredForAppCrudMixin, TemplateVie
'origem': request.POST['origem'], 'origem': request.POST['origem'],
'subnav_template_name': 'sessao/subnav.yaml' 'subnav_template_name': 'sessao/subnav.yaml'
} }
if 'marcadas_1' in request.POST: if 'marcadas_1' in request.POST:
context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(), context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(),

6
sapl/templates/materia/layouts.yaml

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