|
|
@ -38,10 +38,10 @@ from sapl.materia.models import (Autoria, TipoMateriaLegislativa, |
|
|
|
from sapl.materia.views import MateriaLegislativaPesquisaView |
|
|
|
from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato, |
|
|
|
Parlamentar, SessaoLegislativa) |
|
|
|
from sapl.protocoloadm.models import TipoDocumentoAdministrativo,\ |
|
|
|
from sapl.protocoloadm.models import TipoDocumentoAdministrativo, \ |
|
|
|
DocumentoAdministrativo |
|
|
|
from sapl.sessao.apps import AppConfig |
|
|
|
from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm, OrdemExpedienteLeituraForm,\ |
|
|
|
from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm, OrdemExpedienteLeituraForm, \ |
|
|
|
CorrespondenciaForm, CorrespondenciaEmLoteFilterSet |
|
|
|
from sapl.sessao.models import Correspondencia |
|
|
|
from sapl.settings import TIME_ZONE |
|
|
@ -62,7 +62,6 @@ from .models import (Bancada, CargoBancada, CargoMesa, |
|
|
|
RetiradaPauta, TipoJustificativa, JustificativaAusencia, OradorOrdemDia, |
|
|
|
ORDENACAO_RESUMO, RegistroLeitura) |
|
|
|
|
|
|
|
|
|
|
|
TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') |
|
|
|
TipoJustificativaCrud = CrudAux.build(TipoJustificativa, 'tipo_justificativa') |
|
|
|
CargoBancadaCrud = CrudAux.build(CargoBancada, '') |
|
|
@ -167,7 +166,8 @@ def verifica_sessao_iniciada(request, spk, is_leitura=False): |
|
|
|
username = request.user.username |
|
|
|
aux_text = 'leitura' if is_leitura else 'votação' |
|
|
|
logger.info('user=' + username + '. Não é possível abrir matérias para {}. ' |
|
|
|
'Esta SessaoPlenaria (id={}) não foi iniciada ou está finalizada.'.format(aux_text, spk)) |
|
|
|
'Esta SessaoPlenaria (id={}) não foi iniciada ou está finalizada.'.format( |
|
|
|
aux_text, spk)) |
|
|
|
msg = _('Não é possível abrir matérias para {}. ' |
|
|
|
'Esta Sessão Plenária não foi iniciada ou está finalizada.' |
|
|
|
' Vá em "Abertura"->"Dados Básicos" e altere os valores dos campos necessários.'.format(aux_text)) |
|
|
@ -235,11 +235,11 @@ def customize_link_materia(context, pk, has_permission, is_expediente): |
|
|
|
num_protocolo = materia.numero_protocolo if materia.numero_protocolo else "-" |
|
|
|
sessao_plenaria = SessaoPlenaria.objects.get(id=pk) |
|
|
|
data_sessao = sessao_plenaria.data_fim if sessao_plenaria.data_fim else sessao_plenaria.data_inicio |
|
|
|
tramitacao = Tramitacao.objects\ |
|
|
|
.select_related('materia', 'status', 'materia__tipo')\ |
|
|
|
.filter(materia=materia, turno__isnull=False, data_tramitacao__lte=data_sessao)\ |
|
|
|
.exclude(turno__exact='')\ |
|
|
|
.order_by('-data_tramitacao', '-id')\ |
|
|
|
tramitacao = Tramitacao.objects \ |
|
|
|
.select_related('materia', 'status', 'materia__tipo') \ |
|
|
|
.filter(materia=materia, turno__isnull=False, data_tramitacao__lte=data_sessao) \ |
|
|
|
.exclude(turno__exact='') \ |
|
|
|
.order_by('-data_tramitacao', '-id') \ |
|
|
|
.first() |
|
|
|
turno = '-' |
|
|
|
if tramitacao: |
|
|
@ -247,9 +247,9 @@ def customize_link_materia(context, pk, has_permission, is_expediente): |
|
|
|
if t[0] == tramitacao.turno: |
|
|
|
turno = t[1] |
|
|
|
break |
|
|
|
materia_em_tramitacao = MateriaEmTramitacao.objects\ |
|
|
|
.select_related("materia", "tramitacao")\ |
|
|
|
.filter(materia=materia)\ |
|
|
|
materia_em_tramitacao = MateriaEmTramitacao.objects \ |
|
|
|
.select_related("materia", "tramitacao") \ |
|
|
|
.filter(materia=materia) \ |
|
|
|
.first() |
|
|
|
# idUnica para cada materia |
|
|
|
idAutor = "autor" + str(i) |
|
|
@ -274,7 +274,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente): |
|
|
|
exist_leitura = obj.registroleitura_set.filter( |
|
|
|
materia=obj.materia).exists() |
|
|
|
|
|
|
|
if (obj.tipo_votacao != 4 and not exist_resultado and not exist_retirada) or\ |
|
|
|
if (obj.tipo_votacao != 4 and not exist_resultado and not exist_retirada) or \ |
|
|
|
(obj.tipo_votacao == 4 and not exist_leitura): |
|
|
|
if obj.votacao_aberta: |
|
|
|
url = '' |
|
|
@ -1815,7 +1815,8 @@ def insere_parlamentar_composicao(request): |
|
|
|
cargo_id=composicao.cargo.id).exists() |
|
|
|
|
|
|
|
if parlamentar_ja_inserido: |
|
|
|
logger.debug("user=" + username + ". Parlamentar (id={}) já inserido na sessao_plenaria(id={}) e cargo(ìd={})." |
|
|
|
logger.debug( |
|
|
|
"user=" + username + ". Parlamentar (id={}) já inserido na sessao_plenaria(id={}) e cargo(ìd={})." |
|
|
|
.format(request.POST['parlamentar'], composicao.sessao_plenaria.id, composicao.cargo.id)) |
|
|
|
return JsonResponse({'msg': ('Parlamentar já inserido!', 0)}) |
|
|
|
|
|
|
@ -1968,7 +1969,6 @@ def get_mesa_diretora(sessao_plenaria): |
|
|
|
|
|
|
|
|
|
|
|
def get_presenca_sessao(sessao_plenaria): |
|
|
|
|
|
|
|
parlamentares_sessao = [p.parlamentar for p in SessaoPlenariaPresenca.objects.filter( |
|
|
|
sessao_plenaria_id=sessao_plenaria.id |
|
|
|
).order_by('parlamentar__nome_parlamentar').distinct()] |
|
|
@ -2029,7 +2029,8 @@ def get_materias_expediente(sessao_plenaria): |
|
|
|
for m in ExpedienteMateria.objects.select_related("materia").filter(sessao_plenaria_id=sessao_plenaria.id): |
|
|
|
tramitacao = '' |
|
|
|
data_sessao = sessao_plenaria.data_fim if sessao_plenaria.data_fim else sessao_plenaria.data_inicio |
|
|
|
for aux_tramitacao in Tramitacao.objects.filter(materia=m.materia, data_tramitacao__lte=data_sessao).order_by('-data_tramitacao', '-id'): |
|
|
|
for aux_tramitacao in Tramitacao.objects.filter(materia=m.materia, data_tramitacao__lte=data_sessao).order_by( |
|
|
|
'-data_tramitacao', '-id'): |
|
|
|
if aux_tramitacao.turno: |
|
|
|
tramitacao = aux_tramitacao |
|
|
|
break |
|
|
@ -2175,7 +2176,8 @@ def get_materias_ordem_do_dia(sessao_plenaria): |
|
|
|
for o in OrdemDia.objects.filter(sessao_plenaria_id=sessao_plenaria.id): |
|
|
|
tramitacao = '' |
|
|
|
data_sessao = sessao_plenaria.data_fim if sessao_plenaria.data_fim else sessao_plenaria.data_inicio |
|
|
|
for aux_tramitacao in Tramitacao.objects.filter(materia=o.materia, data_tramitacao__lte=data_sessao).order_by('-data_tramitacao', '-id'): |
|
|
|
for aux_tramitacao in Tramitacao.objects.filter(materia=o.materia, data_tramitacao__lte=data_sessao).order_by( |
|
|
|
'-data_tramitacao', '-id'): |
|
|
|
if aux_tramitacao.turno: |
|
|
|
tramitacao = aux_tramitacao |
|
|
|
break |
|
|
@ -2316,7 +2318,7 @@ class ResumoView(DetailView): |
|
|
|
|
|
|
|
# Votos de Votação Nominal de Matérias Expediente |
|
|
|
votacoes = [] |
|
|
|
for mevn in ExpedienteMateria.objects.filter(sessao_plenaria_id=self.object.id, tipo_votacao=2)\ |
|
|
|
for mevn in ExpedienteMateria.objects.filter(sessao_plenaria_id=self.object.id, tipo_votacao=2) \ |
|
|
|
.order_by('-materia'): |
|
|
|
votos_materia = [] |
|
|
|
titulo_materia = mevn.materia |
|
|
@ -2510,7 +2512,6 @@ class ExpedienteView(FormMixin, DetailView): |
|
|
|
list_conteudo = request.POST.getlist('conteudo') |
|
|
|
|
|
|
|
for tipo, conteudo in zip(list_tipo, list_conteudo): |
|
|
|
|
|
|
|
ExpedienteSessao.objects.filter( |
|
|
|
sessao_plenaria_id=self.object.id, |
|
|
|
tipo_id=tipo).delete() |
|
|
@ -2523,7 +2524,8 @@ class ExpedienteView(FormMixin, DetailView): |
|
|
|
|
|
|
|
msg = _('Registro salvo com sucesso') |
|
|
|
messages.add_message(self.request, messages.SUCCESS, msg) |
|
|
|
self.logger.info('user=' + username + '. ExpedienteSessao(sessao_plenaria_id={} e tipo_id={}) salvo com sucesso.' |
|
|
|
self.logger.info( |
|
|
|
'user=' + username + '. ExpedienteSessao(sessao_plenaria_id={} e tipo_id={}) salvo com sucesso.' |
|
|
|
.format(self.object.id, tipo)) |
|
|
|
|
|
|
|
return self.form_valid(form) |
|
|
@ -2609,7 +2611,8 @@ class OcorrenciaSessaoView(FormMixin, DetailView): |
|
|
|
|
|
|
|
username = self.request.user.username |
|
|
|
self.logger.info( |
|
|
|
'user=' + username + '. OcorrenciaSessao de sessao_plenaria_id={} atualizada com sucesso.'.format(self.object.id)) |
|
|
|
'user=' + username + '. OcorrenciaSessao de sessao_plenaria_id={} atualizada com sucesso.'.format( |
|
|
|
self.object.id)) |
|
|
|
|
|
|
|
@method_decorator(permission_required('sessao.add_ocorrenciasessao')) |
|
|
|
def post(self, request, *args, **kwargs): |
|
|
@ -2677,7 +2680,8 @@ class ConsideracoesFinaisView(FormMixin, DetailView): |
|
|
|
|
|
|
|
username = self.request.user.username |
|
|
|
self.logger.info( |
|
|
|
'user=' + username + '. consideracoesFinais de sessao_plenaria_id={} atualizada com sucesso.'.format(self.object.id)) |
|
|
|
'user=' + username + '. consideracoesFinais de sessao_plenaria_id={} atualizada com sucesso.'.format( |
|
|
|
self.object.id)) |
|
|
|
|
|
|
|
@method_decorator(permission_required('sessao.add_consideracoesfinais')) |
|
|
|
def post(self, request, *args, **kwargs): |
|
|
@ -2701,7 +2705,6 @@ class ConsideracoesFinaisView(FormMixin, DetailView): |
|
|
|
|
|
|
|
|
|
|
|
class VotacaoEditView(SessaoPermissionMixin): |
|
|
|
|
|
|
|
''' |
|
|
|
Votação Simbólica e Secreta |
|
|
|
''' |
|
|
@ -2716,7 +2719,7 @@ class VotacaoEditView(SessaoPermissionMixin): |
|
|
|
materia_id = kwargs['mid'] |
|
|
|
ordem_id = kwargs['oid'] |
|
|
|
|
|
|
|
if(int(request.POST['anular_votacao']) == 1): |
|
|
|
if (int(request.POST['anular_votacao']) == 1): |
|
|
|
RegistroVotacao.objects.filter(ordem_id=ordem_id).delete() |
|
|
|
|
|
|
|
ordem = OrdemDia.objects.get(id=ordem_id) |
|
|
@ -2774,7 +2777,6 @@ class VotacaoEditView(SessaoPermissionMixin): |
|
|
|
|
|
|
|
|
|
|
|
class VotacaoView(SessaoPermissionMixin): |
|
|
|
|
|
|
|
""" |
|
|
|
Votação Simbólica e Secreta |
|
|
|
""" |
|
|
@ -2895,7 +2897,8 @@ class VotacaoView(SessaoPermissionMixin): |
|
|
|
except Exception as e: |
|
|
|
username = request.user.username |
|
|
|
self.logger.error('user=' + username + '. Problemas ao salvar RegistroVotacao da materia de id={} ' |
|
|
|
'e da ordem de id={}. '.format(materia_id, ordem_id) + str(e)) |
|
|
|
'e da ordem de id={}. '.format(materia_id, ordem_id) + str( |
|
|
|
e)) |
|
|
|
return self.form_invalid(form) |
|
|
|
else: |
|
|
|
ordem = OrdemDia.objects.get(id=ordem_id) |
|
|
@ -3266,7 +3269,8 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin): |
|
|
|
|
|
|
|
if not ordem or not votacao: |
|
|
|
self.logger.error( |
|
|
|
'user=' + username + '. Objeto OrdemDia com id={} ou RegistroVotacao de OrdemDia não existe.'.format(ordem_id)) |
|
|
|
'user=' + username + '. Objeto OrdemDia com id={} ou RegistroVotacao de OrdemDia não existe.'.format( |
|
|
|
ordem_id)) |
|
|
|
raise Http404() |
|
|
|
|
|
|
|
materia = ordem.materia |
|
|
@ -3354,7 +3358,7 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin): |
|
|
|
'user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id)) |
|
|
|
raise Http404() |
|
|
|
|
|
|
|
if(int(request.POST['anular_votacao']) == 1): |
|
|
|
if (int(request.POST['anular_votacao']) == 1): |
|
|
|
fechar_votacao_materia(materia_votacao) |
|
|
|
|
|
|
|
return self.form_valid(form) |
|
|
@ -3530,7 +3534,6 @@ class VotacaoSimbolicaTransparenciaDetailView(TemplateView): |
|
|
|
|
|
|
|
|
|
|
|
class VotacaoExpedienteView(SessaoPermissionMixin): |
|
|
|
|
|
|
|
""" |
|
|
|
Votação Simbólica e Secreta |
|
|
|
""" |
|
|
@ -3683,7 +3686,6 @@ class VotacaoExpedienteView(SessaoPermissionMixin): |
|
|
|
|
|
|
|
|
|
|
|
class VotacaoExpedienteEditView(SessaoPermissionMixin): |
|
|
|
|
|
|
|
""" |
|
|
|
Votação Simbólica e Secreta |
|
|
|
""" |
|
|
@ -3887,7 +3889,7 @@ class PautaSessaoDetailView(DetailView): |
|
|
|
# ===================================================================== |
|
|
|
# Expedientes |
|
|
|
expedientes = [] |
|
|
|
for e in ExpedienteSessao.objects.select_related("tipo").filter(sessao_plenaria_id=self.object.id)\ |
|
|
|
for e in ExpedienteSessao.objects.select_related("tipo").filter(sessao_plenaria_id=self.object.id) \ |
|
|
|
.order_by('tipo__ordenacao'): |
|
|
|
conteudo = e.conteudo |
|
|
|
from sapl.relatorios.views import is_empty |
|
|
@ -4070,7 +4072,8 @@ def verifica_materia_sessao_plenaria_ajax(request): |
|
|
|
materia=id_materia_selecionada |
|
|
|
).exists() |
|
|
|
|
|
|
|
return JsonResponse({'is_materia_presente': is_materia_presente, 'is_materia_presente_any_sessao': is_materia_presente_any_sessao}) |
|
|
|
return JsonResponse( |
|
|
|
{'is_materia_presente': is_materia_presente, 'is_materia_presente_any_sessao': is_materia_presente_any_sessao}) |
|
|
|
|
|
|
|
|
|
|
|
class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin, |
|
|
@ -4316,7 +4319,6 @@ class JustificativaAusenciaCrud(MasterDetailCrud): |
|
|
|
|
|
|
|
@property |
|
|
|
def layout_display(self): |
|
|
|
|
|
|
|
layout = super().layout_display |
|
|
|
|
|
|
|
if self.object.ausencia == 2: |
|
|
@ -4335,7 +4337,6 @@ class JustificativaAusenciaCrud(MasterDetailCrud): |
|
|
|
layout_key = None |
|
|
|
|
|
|
|
def get_context_data_old(self, **kwargs): |
|
|
|
|
|
|
|
context = super().get_context_data(**kwargs) |
|
|
|
|
|
|
|
presencas = SessaoPlenariaPresenca.objects.filter( |
|
|
@ -4371,7 +4372,6 @@ class JustificativaAusenciaCrud(MasterDetailCrud): |
|
|
|
kwargs={'pk': self.kwargs['pk']}) |
|
|
|
|
|
|
|
class UpdateView(MasterDetailCrud.UpdateView): |
|
|
|
|
|
|
|
form_class = JustificativaAusenciaForm |
|
|
|
layout_key = None |
|
|
|
|
|
|
@ -4384,6 +4384,90 @@ class JustificativaAusenciaCrud(MasterDetailCrud): |
|
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
class LeituraEmBlocoExpediente(PermissionRequiredForAppCrudMixin, ListView): |
|
|
|
template_name = 'sessao/leitura/leitura_bloco.html' |
|
|
|
app_label = AppConfig.label |
|
|
|
expediente = True |
|
|
|
paginate_by = 100 |
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
|
return ExpedienteMateria.objects.filter(sessao_plenaria_id=self.kwargs['pk'], |
|
|
|
retiradapauta=None, tipo_votacao=4, registroleitura__materia=None) |
|
|
|
|
|
|
|
def get_context_data(self, **kwargs): |
|
|
|
context = super().get_context_data(**kwargs) |
|
|
|
context['pk'] = self.kwargs['pk'] |
|
|
|
context['root_pk'] = self.kwargs['pk'] |
|
|
|
if not verifica_sessao_iniciada(self.request, self.kwargs['pk']): |
|
|
|
context['sessao_iniciada'] = False |
|
|
|
return context |
|
|
|
context['sessao_iniciada'] = True |
|
|
|
context['turno_choices'] = Tramitacao.TURNO_CHOICES |
|
|
|
context['title'] = SessaoPlenaria.objects.get(id=self.kwargs['pk']) |
|
|
|
if self.expediente: |
|
|
|
context['expediente'] = True |
|
|
|
else: |
|
|
|
context['expediente'] = False |
|
|
|
return context |
|
|
|
|
|
|
|
def post(self, request, *args, **kwargs): |
|
|
|
if 'marcadas_4' in request.POST: |
|
|
|
models = None |
|
|
|
if request.POST['origem'] == 'ordem': |
|
|
|
models = OrdemDia.objects.filter(id__in=request.POST.getlist('marcadas_4')) |
|
|
|
elif request.POST['origem'] == 'expediente': |
|
|
|
models = ExpedienteMateria.objects.filter(id__in=request.POST.getlist('marcadas_4')) |
|
|
|
|
|
|
|
if models is None: |
|
|
|
messages.add_message(self.request, messages.ERROR, |
|
|
|
_('Impossível localizar as matérias selecionadas')) |
|
|
|
return self.get(request, self.kwargs) |
|
|
|
else: |
|
|
|
for m in models: |
|
|
|
try: |
|
|
|
obj = None |
|
|
|
if isinstance(m, ExpedienteMateria): |
|
|
|
obj = RegistroLeitura.objects.filter(materia=m.materia, expediente=m).delete() |
|
|
|
obj = RegistroLeitura() |
|
|
|
obj.expediente = m |
|
|
|
elif isinstance(m, OrdemDia): |
|
|
|
obj = RegistroLeitura.objects.filter(materia=m.materia, ordem=m).delete() |
|
|
|
obj = RegistroLeitura() |
|
|
|
obj.ordem = m |
|
|
|
else: |
|
|
|
messages.add_message(self.request, messages.ERROR, |
|
|
|
_('Tipo de Pauta nao encontrado')) |
|
|
|
return self.get(request, self.kwargs) |
|
|
|
|
|
|
|
obj.materia = m.materia |
|
|
|
obj.observacao = request.POST['observacao'] |
|
|
|
obj.user = self.request.user |
|
|
|
obj.ip = get_client_ip(self.request) |
|
|
|
obj.save() |
|
|
|
|
|
|
|
except Exception as e: |
|
|
|
messages.add_message(self.request, messages.ERROR, |
|
|
|
_('Erro ao salvar registro de Leitura, por favor, refaça a operação')) |
|
|
|
return self.get(request, self.kwargs) |
|
|
|
else: |
|
|
|
m.resultado = "Matéria lida" |
|
|
|
m.votacao_aberta = False |
|
|
|
m.save() |
|
|
|
else: |
|
|
|
messages.add_message(self.request, messages.ERROR, _('Nenhuma matéria selecionada para leitura em Bloco')) |
|
|
|
return self.get(request, self.kwargs) |
|
|
|
|
|
|
|
return HttpResponseRedirect(self.get_success_url()) |
|
|
|
|
|
|
|
def get_success_url(self): |
|
|
|
if self.request.POST['origem'] == 'ordem': |
|
|
|
return reverse('sapl.sessao:ordemdia_list', |
|
|
|
kwargs={'pk': self.kwargs['pk']}) |
|
|
|
else: |
|
|
|
return reverse('sapl.sessao:expedientemateria_list', |
|
|
|
kwargs={'pk': self.kwargs['pk']}) |
|
|
|
|
|
|
|
|
|
|
|
class VotacaoEmBlocoExpediente(PermissionRequiredForAppCrudMixin, ListView): |
|
|
|
template_name = 'sessao/votacao/votacao_bloco.html' |
|
|
|
app_label = AppConfig.label |
|
|
@ -4423,7 +4507,6 @@ class VotacaoEmBlocoOrdemDia(VotacaoEmBlocoExpediente): |
|
|
|
|
|
|
|
|
|
|
|
class VotacaoEmBlocoSimbolicaView(PermissionRequiredForAppCrudMixin, TemplateView): |
|
|
|
|
|
|
|
""" |
|
|
|
Votação Simbólica |
|
|
|
""" |
|
|
@ -4551,8 +4634,10 @@ class VotacaoEmBlocoSimbolicaView(PermissionRequiredForAppCrudMixin, TemplateVie |
|
|
|
votacao.save() |
|
|
|
except Exception as e: |
|
|
|
username = request.user.username |
|
|
|
self.logger.error('user=' + username + '. Problemas ao salvar RegistroVotacao da materia de id={} ' |
|
|
|
'e da ordem de id={}. '.format(expediente.materia.id, expediente.id) + str(e)) |
|
|
|
self.logger.error( |
|
|
|
'user=' + username + '. Problemas ao salvar RegistroVotacao da materia de id={} ' |
|
|
|
'e da ordem de id={}. '.format(expediente.materia.id, |
|
|
|
expediente.id) + str(e)) |
|
|
|
return self.form_invalid(form, context) |
|
|
|
else: |
|
|
|
expediente.resultado = resultado.nome |
|
|
|