diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index a72a86109..d70353475 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -786,3 +786,79 @@ class JustificativaAusenciaForm(ModelForm): justificativa.materias_do_expediente.clear() justificativa.materias_da_ordem_do_dia.clear() return justificativa + + +class VotacaoEmBlocoFilterSet(MateriaLegislativaFilterSet): + + o = MateriaPesquisaOrderingFilter() + tramitacao__status = django_filters.ModelChoiceFilter( + required=True, + queryset=StatusTramitacao.objects.all(), + label=_('Status da Matéria')) + + class Meta: + model = MateriaLegislativa + fields = ['tramitacao__status', + 'numero', + 'numero_protocolo', + 'ano', + 'tipo', + 'data_apresentacao', + 'data_publicacao', + 'autoria__autor__tipo', + # FIXME 'autoria__autor__partido', + 'relatoria__parlamentar_id', + 'local_origem_externa', + 'em_tramitacao', + ] + + def __init__(self, *args, **kwargs): + super(MateriaLegislativaFilterSet, self).__init__(*args, **kwargs) + + self.filters['tipo'].label = 'Tipo de Matéria' + self.filters['autoria__autor__tipo'].label = 'Tipo de Autor' + # self.filters['autoria__autor__partido'].label = 'Partido do Autor' + self.filters['relatoria__parlamentar_id'].label = 'Relatoria' + + row1 = to_row( + [('tramitacao__status', 12)]) + row2 = to_row( + [('tipo', 12)]) + row3 = to_row( + [('numero', 4), + ('ano', 4), + ('numero_protocolo', 4)]) + row4 = to_row( + [('data_apresentacao', 6), + ('data_publicacao', 6)]) + row5 = to_row( + [('autoria__autor', 0), + (Button('pesquisar', + 'Pesquisar Autor', + css_class='btn btn-primary btn-sm'), 2), + (Button('limpar', + 'limpar Autor', + css_class='btn btn-primary btn-sm'), 10)]) + row6 = to_row( + [('autoria__autor__tipo', 6), + # ('autoria__autor__partido', 6) + ]) + row7 = to_row( + [('relatoria__parlamentar_id', 6), + ('local_origem_externa', 6)]) + row8 = to_row( + [('em_tramitacao', 6), + ('o', 6)]) + row9 = to_row( + [('ementa', 12)]) + + self.form.helper = FormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisa de Matéria'), + row1, row2, row3, + HTML(autor_label), + HTML(autor_modal), + row4, row5, row6, row7, row8, row9, + form_actions(label='Pesquisar')) + ) \ No newline at end of file diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 72fc54577..bd1e5fcae 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -27,7 +27,8 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, remove_parlamentar_composicao, reordernar_materias_expediente, reordernar_materias_ordem, - sessao_legislativa_legislatura_ajax) + sessao_legislativa_legislatura_ajax, + VotacaoEmBlocoOrdemDia, VotacaoEmBlocoExpediente) from .apps import AppConfig @@ -112,9 +113,12 @@ urlpatterns = [ url(r'^sessao/(?P\d+)/presencaordemdia$', PresencaOrdemDiaView.as_view(), name='presencaordemdia'), - url(r'^sessao/(?P\d+)/votacao-bloco$', - AdicionarVariasMateriasOrdemDia.as_view(), - name='votacao-bloco'), + url(r'^sessao/(?P\d+)/votacao_bloco_ordem_dia$', + VotacaoEmBlocoOrdemDia.as_view(), + name='votacao_bloco_ordemdia'), + url(r'^sessao/(?P\d+)/votacao_bloco_expediente$', + VotacaoEmBlocoExpediente.as_view(), + name='votacao_bloco_expediente'), url(r'^sessao/(?P\d+)/resumo$', ResumoView.as_view(), name='resumo'), url(r'^sessao/(?P\d+)/resumo_ata$', diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 0770408dc..8d46c5181 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -42,7 +42,7 @@ from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, - VotacaoNominalForm) + VotacaoNominalForm, VotacaoEmBlocoFilterSet) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, ExpedienteSessao, JustificativaAusencia, OcorrenciaSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, @@ -3217,6 +3217,168 @@ class JustificativaAusenciaCrud(MasterDetailCrud): pass -class VotacaoEmBloco(PermissionRequiredForAppCrudMixin, +class VotacaoEmBlocoExpediente(PermissionRequiredForAppCrudMixin, MateriaLegislativaPesquisaView): - pass \ No newline at end of file + + filterset_class = VotacaoEmBlocoFilterSet + template_name = 'sessao/votacao/votacao_bloco_expediente.html' + app_label = AppConfig.label + logger = logging.getLogger(__name__) + + def get_filterset_kwargs(self, filterset_class): + super(VotacaoEmBlocoExpediente, + self).get_filterset_kwargs(filterset_class) + + kwargs = {'data': self.request.GET or None} + + qs = self.get_queryset() + + if 'tramitacao__status' in self.request.GET: + if self.request.GET['tramitacao__status']: + lista_status = filtra_tramitacao_status( + self.request.GET['tramitacao__status']) + + lista_materias_adicionadas = retira_materias_ja_adicionadas( + self.kwargs['pk'], ExpedienteMateria) + + qs = qs.filter(id__in=lista_status).exclude( + id__in=lista_materias_adicionadas).distinct() + + kwargs.update({ + 'queryset': qs, + }) + + return kwargs + + def get_context_data(self, **kwargs): + context = super(MateriaLegislativaPesquisaView, + self).get_context_data(**kwargs) + + context['title'] = _('Pesquisar Matéria Legislativa') + + self.filterset.form.fields['o'].label = _('Ordenação') + + qr = self.request.GET.copy() + + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + context['pk_sessao'] = self.kwargs['pk'] + + return context + + def post(self, request, *args, **kwargs): + marcadas = request.POST.getlist('materia_id') + username = request.user.username + + for m in marcadas: + try: + tipo_votacao = request.POST['tipo_votacao_%s' % m] + msg = _('%s adicionado(a) com sucesso!' + % MateriaLegislativa.objects.get(id=m)) + messages.add_message(request, messages.SUCCESS, msg) + self.logger.info("user=" + username + ". MateriaLegislativa de id={} adicionado(a) com sucesso!".format(m)) + except MultiValueDictKeyError: + msg = _('Formulário Inválido. Você esqueceu de selecionar ' + + '%s' % + MateriaLegislativa.objects.get(id=m)) + messages.add_message(request, messages.ERROR, msg) + self.logger.error("user=" + username + '. Formulário Inválido. Você esqueceu de ' + + 'selecionar o tipo de votação de MateriaLegislativa de id={}.'.format(m)) + return self.get(request, self.kwargs) + + if tipo_votacao: + lista_materias_expediente = ExpedienteMateria.objects.filter( + sessao_plenaria_id=self.kwargs[ + 'pk']) + + materia = MateriaLegislativa.objects.get(id=m) + + expediente = ExpedienteMateria() + expediente.sessao_plenaria_id = self.kwargs['pk'] + expediente.materia_id = materia.id + if lista_materias_expediente: + posicao = lista_materias_expediente.last().numero_ordem + 1 + expediente.numero_ordem = posicao + else: + expediente.numero_ordem = 1 + expediente.data_ordem = timezone.now() + expediente.tipo_votacao = request.POST['tipo_votacao_%s' % m] + expediente.save() + + pk = self.kwargs['pk'] + + return HttpResponseRedirect( + reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': pk})) + + +class VotacaoEmBlocoOrdemDia(VotacaoEmBlocoExpediente): + filterset_class = VotacaoEmBlocoFilterSet + template_name = 'sessao/votacao/votacao_bloco_ordem.html' + app_label = AppConfig.label + logger = logging.getLogger(__name__) + + def get_filterset_kwargs(self, filterset_class): + super(VotacaoEmBlocoExpediente, + self).get_filterset_kwargs(filterset_class) + + kwargs = {'data': self.request.GET or None} + + qs = self.get_queryset() + + if 'tramitacao__status' in self.request.GET: + if self.request.GET['tramitacao__status']: + lista_status = filtra_tramitacao_status( + self.request.GET['tramitacao__status']) + + lista_materias_adicionadas = retira_materias_ja_adicionadas( + self.kwargs['pk'], OrdemDia) + + qs = qs.filter(id__in=lista_status).exclude( + id__in=lista_materias_adicionadas).distinct() + + kwargs.update({ + 'queryset': qs, + }) + return kwargs + + def post(self, request, *args, **kwargs): + marcadas = request.POST.getlist('materia_id') + username = request.user.username + + for m in marcadas: + try: + tipo_votacao = request.POST['tipo_votacao_%s' % m] + msg = _('%s adicionado(a) com sucesso!' + % MateriaLegislativa.objects.get(id=m)) + messages.add_message(request, messages.SUCCESS, msg) + self.logger.debug('user=' + username + '. MateriaLegislativa de id={} adicionado(a) com sucesso!'.format(m)) + except MultiValueDictKeyError: + msg = _('Formulário Inválido. Você esqueceu de selecionar ' + + 'o tipo de votação de %s' % + MateriaLegislativa.objects.get(id=m)) + messages.add_message(request, messages.ERROR, msg) + self.logger.error('user=' + username + '. Formulário Inválido. Você esqueceu de selecionar ' + 'o tipo de votação de MateriaLegislativa com id={}'.format(m)) + + return self.get(request, self.kwargs) + + if tipo_votacao: + lista_materias_ordem_dia = OrdemDia.objects.filter( + sessao_plenaria_id=self.kwargs[ + 'pk']) + + materia = MateriaLegislativa.objects.get(id=m) + + ordem_dia = OrdemDia() + ordem_dia.sessao_plenaria_id = self.kwargs['pk'] + ordem_dia.materia_id = materia.id + if lista_materias_ordem_dia: + posicao = lista_materias_ordem_dia.last().numero_ordem + 1 + ordem_dia.numero_ordem = posicao + else: + ordem_dia.numero_ordem = 1 + ordem_dia.data_ordem = timezone.now() + ordem_dia.tipo_votacao = tipo_votacao + ordem_dia.save() + + return HttpResponseRedirect( + reverse('sapl.sessao:ordemdia_list', kwargs=self.kwargs)) \ No newline at end of file diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml index 6d2e6b5ac..442eb92f4 100644 --- a/sapl/templates/sessao/subnav.yaml +++ b/sapl/templates/sessao/subnav.yaml @@ -23,6 +23,8 @@ url: expedientemateria_list - title: {% trans 'Oradores do Expediente' %} url: oradorexpediente_list + - title: {% trans 'Votação em Bloco' %} + url: votacao_bloco_expediente - title: {% trans 'Ordem do Dia' %} children: @@ -31,7 +33,7 @@ - title: {% trans 'Presença Ordem do Dia' %} url: presencaordemdia - title: {% trans 'Votação em Bloco' %} - url: votacao-bloco + url: votacao_bloco_ordemdia - title: {% trans 'Painel Eletrônico' %} url: painel diff --git a/sapl/templates/sessao/votacao/votacao_bloco_expediente.html b/sapl/templates/sessao/votacao/votacao_bloco_expediente.html new file mode 100644 index 000000000..6b03d7817 --- /dev/null +++ b/sapl/templates/sessao/votacao/votacao_bloco_expediente.html @@ -0,0 +1,115 @@ +{% extends "crud/detail.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% block actions %}{% endblock %} + +{% block sections_nav %} +{% endblock %} + +{% block detail_content %} + {% block buttons %} + + {% if filter_url and not filter.form.errors %} + + + + + {% endif %} + + {% endblock %} + + {% if filter.form.errors %} + {% crispy filter.form %} + {% else %} + {% if not filter_url %} + {% crispy filter.form %} + {% endif %} + {% endif %} + +

+ {% if filter_url and not filter.form.errors %} + + {% if paginator.count %} +
+ {% csrf_token %} + + + + + + + + + +

{% trans "Tipo de Votação" %}

+ +
+ +
+ +
+ + + + + + + {% if paginator.count > 1 %} +

{% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}

+ {% elif paginator.count == 1 %} +

{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}

+ {% endif %} +
+

Selecione a(s) matéria(s) desejada(s).

+ {% for m in page_obj %} + + + + {% endfor %} +

{% trans "Matérias" %}

+ + {{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}
+ Autores: + {% for a in m.autoria_set.all %} + {% if not forloop.first %} + ,    {{a.autor|default_if_none:""}} + {% else %} +  {{a.autor|default_if_none:""}} + {% endif %} + {% endfor %} +
+ Localização Atual:  {{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não informado"}}
+ Status:  {{m.tramitacao_set.last.status|default_if_none:"Não informado"}}
+ Data da última Tramitação:  {{m.tramitacao_set.last.data_tramitacao|default_if_none:"Não informado"}}
+ Ementa: {{ m.ementa|safe }}
+

+
+ +
+ {% else %} + + + + +
+

Nenhuma matéria encontrada com essas especificações

+
+ {% endif %} + +{% endif %} + +{% endblock detail_content %} + +{% block extra_js %} + +{% endblock extra_js%} diff --git a/sapl/templates/sessao/votacao/votacao_bloco_ordem.html b/sapl/templates/sessao/votacao/votacao_bloco_ordem.html new file mode 100644 index 000000000..63ef419c7 --- /dev/null +++ b/sapl/templates/sessao/votacao/votacao_bloco_ordem.html @@ -0,0 +1,19 @@ +{% extends "sessao/votacao/votacao_bloco_expediente.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block buttons %} + + {% if filter_url and not filter.form.errors %} + + + + + + {% endif %} + + {% endblock %} \ No newline at end of file