diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 83af42eb8..0b4607bd1 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -2,15 +2,16 @@ from datetime import datetime import django_filters from crispy_forms.helper import FormHelper -from crispy_forms.layout import Fieldset, Layout +from crispy_forms.layout import HTML, Button, Fieldset, Layout from django import forms from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.forms import ModelForm from django.utils.translation import ugettext_lazy as _ from sapl.crispy_layout_mixin import form_actions, to_row +from sapl.materia.forms import MateriaLegislativaFilterSet from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa -from sapl.utils import RANGE_DIAS_MES, RANGE_MESES +from sapl.utils import RANGE_DIAS_MES, RANGE_MESES, autor_label, autor_modal from .models import Bancada, ExpedienteMateria, SessaoPlenaria @@ -171,3 +172,76 @@ class SessaoPlenariaFilterSet(django_filters.FilterSet): row1, form_actions(save_label='Pesquisar')) ) + + +class AdicionarVariasMateriasFilterSet(MateriaLegislativaFilterSet): + class Meta: + model = MateriaLegislativa + fields = ['numero', + 'numero_protocolo', + 'ano', + 'tipo', + 'data_apresentacao', + 'data_publicacao', + 'autoria__autor__tipo', + 'autoria__partido', + 'relatoria__parlamentar_id', + 'local_origem_externa', + 'em_tramitacao', + ] + + order_by = ( + ('', 'Selecione'), + ('dataC', 'Data, Tipo, Ano, Numero - Ordem Crescente'), + ('dataD', 'Data, Tipo, Ano, Numero - Ordem Decrescente'), + ('tipoC', 'Tipo, Ano, Numero, Data - Ordem Crescente'), + ('tipoD', 'Tipo, Ano, Numero, Data - Ordem Decrescente') + ) + + 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__partido'].label = 'Partido do Autor' + self.filters['relatoria__parlamentar_id'].label = 'Relatoria' + + row1 = to_row( + [('tipo', 12)]) + row2 = to_row( + [('numero', 4), + ('ano', 4), + ('numero_protocolo', 4)]) + row3 = to_row( + [('data_apresentacao', 6), + ('data_publicacao', 6)]) + row4 = 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)]) + row5 = to_row( + [('autoria__autor__tipo', 6), + ('autoria__partido', 6)]) + row6 = to_row( + [('relatoria__parlamentar_id', 6), + ('local_origem_externa', 6)]) + row7 = to_row( + [('em_tramitacao', 6), + ('o', 6)]) + row8 = 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, + form_actions(save_label='Pesquisar')) + ) diff --git a/sapl/sessao/migrations/0022_auto_20160805_0943.py b/sapl/sessao/migrations/0022_auto_20160805_0943.py new file mode 100644 index 000000000..51acbf4ef --- /dev/null +++ b/sapl/sessao/migrations/0022_auto_20160805_0943.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-05 12:43 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0021_adicionamultiplasmaterias'), + ] + + operations = [ + migrations.RemoveField( + model_name='adicionamultiplasmaterias', + name='materia', + ), + migrations.DeleteModel( + name='AdicionaMultiplasMaterias', + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 796af349b..14e961fdf 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -321,14 +321,3 @@ class SessaoPlenariaPresenca(models.Model): verbose_name = _('Presença em Sessão Plenária') verbose_name_plural = _('Presenças em Sessões Plenárias') ordering = ['parlamentar__nome_parlamentar'] - - -class AdicionaMultiplasMaterias(models.Model): - materia = models.ForeignKey(MateriaLegislativa) - - class Meta: - verbose_name = _('Tabela de Adicionar Várias Matérias') - verbose_name_plural = _('Tabela de Adicionar Várias Matérias') - - def __str__(self): - return self.materia diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 876dd6a11..d980d0206 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -1,6 +1,6 @@ from django.conf.urls import include, url -from sapl.sessao.views import (AdicionarVariasMaterias, +from sapl.sessao.views import (AdicionarVariasMateriasExpediente, BancadaCrud, CargoBancadaCrud, EditMateriaOrdemDiaView, ExpedienteMateriaCrud, ExpedienteView, ListMateriaOrdemDiaView, @@ -50,8 +50,9 @@ urlpatterns = [ include(BancadaCrud.get_urls())), url(r'^sistema/cargo-bancada/', include(CargoBancadaCrud.get_urls())), - url(r'^sessao/(?P\d+)/adicionar-varias-materias/', - AdicionarVariasMaterias.as_view(), name='adicionar_varias_materias'), + url(r'^sessao/(?P\d+)/adicionar-varias-materias-expediente/', + AdicionarVariasMateriasExpediente.as_view(), + name='adicionar_varias_materias_expediente'), # PAUTA SESSÃO url(r'^pauta-sessao$', diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 308e5197e..318db7b26 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -17,7 +17,7 @@ from sapl.crud.base import (Crud, CrudBaseMixin, CrudCreateView, CrudDetailView, CrudListView, CrudUpdateView, make_pagination) from sapl.crud.masterdetail import MasterDetailCrud -from sapl.materia.views import MateriaLegislativaFilterSet +from sapl.materia.forms import pega_ultima_tramitacao from sapl.materia.models import (Autoria, DocumentoAcessorio, TipoMateriaLegislativa, Tramitacao) from sapl.materia.views import MateriaLegislativaPesquisaView @@ -25,7 +25,8 @@ from sapl.norma.models import NormaJuridica from sapl.parlamentares.models import Parlamentar from sapl.sessao.serializers import SessaoPlenariaSerializer -from .forms import (BancadaForm, ExpedienteForm, ExpedienteMateriaForm, +from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, + ExpedienteForm, ExpedienteMateriaForm, ListMateriaForm, MateriaOrdemDiaForm, MesaForm, PresencaForm, SessaoPlenariaFilterSet, VotacaoEditForm, VotacaoForm, VotacaoNominalForm) @@ -1962,21 +1963,41 @@ class PesquisarSessaoPlenariaView(FilterView): return self.render_to_response(context) -class AdicionarVariasMaterias(MateriaLegislativaPesquisaView): +def filtra_tramitacao_ordem_dia(): + lista = pega_ultima_tramitacao() + return Tramitacao.objects.filter( + id__in=lista, + status__descricao='Ordem do Dia').distinct().values_list( + 'materia_id', flat=True) + + +def retira_materias_ja_adicionadas(id_sessao): + lista = ExpedienteMateria.objects.filter( + sessao_plenaria_id=id_sessao) + lista_id_materias = [l.materia_id for l in lista] + return lista_id_materias + + +class AdicionarVariasMateriasExpediente(MateriaLegislativaPesquisaView): model = MateriaLegislativa - filterset_class = MateriaLegislativaFilterSet - paginate_by = 10 - template_name = 'sessao/adicionar_varias_materias.html' + filterset_class = AdicionarVariasMateriasFilterSet + template_name = 'sessao/adicionar_varias_materias_expediente.html' def get_filterset_kwargs(self, filterset_class): - super(AdicionarVariasMaterias, + super(AdicionarVariasMateriasExpediente, self).get_filterset_kwargs(filterset_class) kwargs = {'data': self.request.GET or None} qs = self.get_queryset() - qs = qs.distinct() + lista_ordem_dia = filtra_tramitacao_ordem_dia() + + lista_materias_adicionadas = retira_materias_ja_adicionadas( + self.kwargs['pk']) + + qs = qs.filter(id__in=lista_ordem_dia).exclude( + id__in=lista_materias_adicionadas).distinct() kwargs.update({ 'queryset': qs, @@ -1985,60 +2006,41 @@ class AdicionarVariasMaterias(MateriaLegislativaPesquisaView): def get_context_data(self, **kwargs): # import ipdb; ipdb.set_trace() - import ipdb; ipdb.set_trace() context = super(MateriaLegislativaPesquisaView, self).get_context_data(**kwargs) context['title'] = _('Pesquisar Matéria Legislativa') - paginator = context['paginator'] - page_obj = context['page_obj'] - context['page_range'] = make_pagination( - page_obj.number, paginator.num_pages) - self.filterset.form.fields['o'].label = _('Ordenação') qr = self.request.GET.copy() - if 'page' in qr: - del qr['page'] + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' context['pk_sessao'] = self.kwargs['pk'] return context def post(self, request, *args, **kwargs): - import ipdb; ipdb.set_trace() - - sessao = SessaoPlenaria.objects.get(id=self.kwargs['pk']) - - context = self.get_context_data() - - materia_id = request.POST['materia_id'] - materia = MateriaLegislativa.objects.get(id=materia_id) - - try: - materia = MateriaLegislativa.objects.get( - numero=request.POST['numero_materia'], - tipo_id=request.POST['tipo_materia'], - ano=request.POST['ano_materia']) - except ObjectDoesNotExist: - form._errors["error_message"] = ErrorList([u""]) - context.update({'form': form}) - return self.render_to_response(context) - - # TODO: barrar matérias não existentes - # TODO: barrar criação de ordemdia para materias já incluídas - - expediente = ExpedienteMateria() - expediente.sessao_plenaria_id = self.kwargs['pk'] - expediente.materia_id = materia.id - expediente.numero_ordem = request.POST['numero_ordem'] - expediente.data_ordem = datetime.now() - expediente.observacao = sub(' ', ' ', - strip_tags(request.POST['observacao'])) - ordemdia.tipo_votacao = request.POST['tipo_votacao'] - ordemdia.save() + marcadas = request.POST.getlist('materia_id') + + for m in marcadas: + if request.POST['tipo_votacao_%s' % m]: + 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 = datetime.now() + expediente.tipo_votacao = request.POST['tipo_votacao_%s' % m] + expediente.save() - return self.form_valid(form) - else: - return self.form_invalid(form) + return self.get(request, self.kwargs) diff --git a/sapl/templates/sessao/adicionar_varias_materias.html b/sapl/templates/sessao/adicionar_varias_materias_expediente.html similarity index 62% rename from sapl/templates/sessao/adicionar_varias_materias.html rename to sapl/templates/sessao/adicionar_varias_materias_expediente.html index 16c8f9309..eee7b295e 100644 --- a/sapl/templates/sessao/adicionar_varias_materias.html +++ b/sapl/templates/sessao/adicionar_varias_materias_expediente.html @@ -9,8 +9,13 @@ {% block detail_content %} {% if filter_url %} + + + {% endif %} {% if not filter_url %} @@ -21,7 +26,10 @@ {% if filter_url %} - + + + + {% if paginator.count %} {% if paginator.count > 1 %} @@ -30,11 +38,13 @@

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

{% endif %} + + {% csrf_token %} + {% for m in page_obj %} - - {% csrf_token %} - + + + {% endfor %} {% else %} @@ -65,8 +80,9 @@

{% trans "Resultados" %}

{% trans "Matérias" %}

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

+ {{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}
Autores: {% for a in m.autoria_set.all %} @@ -50,10 +60,15 @@ Data da última Tramitação:  {{m.tramitacao_set.last.data_tramitacao|default_if_none:"Não Informada"}}
Ementa: {{ m.ementa|safe }}

- - -
+ +
+ +
+ +
+ + -{% include "paginacao.html" %} {% endif %} {% endblock detail_content %} diff --git a/sapl/templates/sessao/expedientemateria_list.html b/sapl/templates/sessao/expedientemateria_list.html index 3836447c5..01cf53b61 100644 --- a/sapl/templates/sessao/expedientemateria_list.html +++ b/sapl/templates/sessao/expedientemateria_list.html @@ -6,7 +6,7 @@ {% blocktrans with verbose_name=view.verbose_name %} Reordenar Matérias {% endblocktrans %} - + {% blocktrans with verbose_name=view.verbose_name %} Adicionar Várias Matérias {% endblocktrans %} {% endblock more_buttons %}