From 49291ebe7ab987d748c7a27eee347d455582dc77 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Mon, 22 May 2017 11:51:55 -0300 Subject: [PATCH] Cria a funcionalidade --- sapl/base/urls.py | 3 +- .../migrations/0005_auto_20170522_1051.py | 32 ++++++ .../migrations/0004_auto_20170522_1051.py | 22 +++++ sapl/sessao/forms.py | 81 +++++++++++++++- .../sessao/migrations/0003_resumoordenacao.py | 35 +++++++ sapl/sessao/models.py | 25 +++++ sapl/sessao/urls.py | 6 +- sapl/sessao/views.py | 97 +++++++++++++++++-- sapl/templates/sessao/resumo.html | 22 +++-- sapl/templates/sessao/resumo_ordenacao.html | 13 +++ sapl/templates/sistema.html | 2 +- 11 files changed, 317 insertions(+), 21 deletions(-) create mode 100644 sapl/materia/migrations/0005_auto_20170522_1051.py create mode 100644 sapl/norma/migrations/0004_auto_20170522_1051.py create mode 100644 sapl/sessao/migrations/0003_resumoordenacao.py create mode 100644 sapl/templates/sessao/resumo_ordenacao.html diff --git a/sapl/base/urls.py b/sapl/base/urls.py index d5e4ae98a..ea7d54a04 100644 --- a/sapl/base/urls.py +++ b/sapl/base/urls.py @@ -92,7 +92,8 @@ urlpatterns = [ # todos os sublinks de sistema devem vir acima deste url(r'^sistema/$', permission_required('base.view_tabelas_auxiliares') - (TemplateView.as_view(template_name='sistema.html'))), + (TemplateView.as_view(template_name='sistema.html')), + name='sistema'), url(r'^login/$', views.login, { 'template_name': 'base/login.html', 'authentication_form': LoginForm}, diff --git a/sapl/materia/migrations/0005_auto_20170522_1051.py b/sapl/materia/migrations/0005_auto_20170522_1051.py new file mode 100644 index 000000000..5904fa7d1 --- /dev/null +++ b/sapl/materia/migrations/0005_auto_20170522_1051.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-05-22 10:51 +from __future__ import unicode_literals + +from django.db import migrations, models +import sapl.materia.models +import sapl.utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0004_auto_20170504_1751'), + ] + + operations = [ + migrations.AlterField( + model_name='documentoacessorio', + name='arquivo', + field=models.FileField(blank=True, null=True, upload_to=sapl.materia.models.anexo_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Integral'), + ), + migrations.AlterField( + model_name='materialegislativa', + name='texto_original', + field=models.FileField(blank=True, null=True, upload_to=sapl.materia.models.materia_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Original'), + ), + migrations.AlterField( + model_name='proposicao', + name='texto_original', + field=models.FileField(blank=True, null=True, upload_to=sapl.materia.models.materia_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Original'), + ), + ] diff --git a/sapl/norma/migrations/0004_auto_20170522_1051.py b/sapl/norma/migrations/0004_auto_20170522_1051.py new file mode 100644 index 000000000..d2a3b4a8c --- /dev/null +++ b/sapl/norma/migrations/0004_auto_20170522_1051.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-05-22 10:51 +from __future__ import unicode_literals + +from django.db import migrations, models +import sapl.norma.models +import sapl.utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0003_auto_20170510_1549'), + ] + + operations = [ + migrations.AlterField( + model_name='normajuridica', + name='texto_integral', + field=models.FileField(blank=True, null=True, upload_to=sapl.norma.models.norma_upload_path, validators=[sapl.utils.restringe_tipos_de_arquivo_txt], verbose_name='Texto Integral'), + ), + ] diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 4303dabcc..cd3dc5e6a 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -28,7 +28,7 @@ def recupera_anos(): # apos a adicao do .dates(), por isso o reversed() abaixo anos = [(k.year, k.year) for k in reversed(anos_list)] return anos - except: + except Exception: return [] @@ -39,6 +39,18 @@ MES_CHOICES = [('', '---------')] + RANGE_MESES DIA_CHOICES = [('', '---------')] + RANGE_DIAS_MES +ORDENACAO_RESUMO = [('cont_mult', 'Conteúdo Multimídia'), + ('exp', 'Expedientes'), + ('id_basica', 'Identificação Básica'), + ('lista_p', 'Lista de Presença'), + ('lista_p_o_d', 'Lista de Presença Ordem do Dia'), + ('mat_exp', 'Matérias do Expediente'), + ('mat_o_d', 'Matérias da Ordem do Dia'), + ('mesa_d', 'Mesa Diretora'), + ('oradores_exped', 'Oradores do Expediente'), + ('oradores_expli', 'Oradores das Explicações Pessoais')] + + class BancadaForm(ModelForm): class Meta: @@ -359,3 +371,70 @@ class OradorExpedienteForm(ModelForm): class PautaSessaoFilterSet(SessaoPlenariaFilterSet): titulo = _('Pesquisa de Pauta de Sessão') + + +class ResumoOrdenacaoForm(forms.Form): + primeiro = forms.ChoiceField(label=_('1°'), + choices=ORDENACAO_RESUMO) + segundo = forms.ChoiceField(label=_('2°'), + choices=ORDENACAO_RESUMO) + terceiro = forms.ChoiceField(label=u'3°', + choices=ORDENACAO_RESUMO) + quarto = forms.ChoiceField(label=_('4°'), + choices=ORDENACAO_RESUMO) + quinto = forms.ChoiceField(label=_('5°'), + choices=ORDENACAO_RESUMO) + sexto = forms.ChoiceField(label=_('6°'), + choices=ORDENACAO_RESUMO) + setimo = forms.ChoiceField(label=_('7°'), + choices=ORDENACAO_RESUMO) + oitavo = forms.ChoiceField(label=_('8°'), + choices=ORDENACAO_RESUMO) + decimo = forms.ChoiceField(label=_('9°'), + choices=ORDENACAO_RESUMO) + nono = forms.ChoiceField(label=u'10°', + choices=ORDENACAO_RESUMO) + + def __init__(self, *args, **kwargs): + super(ResumoOrdenacaoForm, self).__init__(*args, **kwargs) + + row1 = to_row( + [('primeiro', 12)]) + row2 = to_row( + [('segundo', 12)]) + row3 = to_row( + [('terceiro', 12)]) + row4 = to_row( + [('quarto', 12)]) + row5 = to_row( + [('quinto', 12)]) + row6 = to_row( + [('sexto', 12)]) + row7 = to_row( + [('setimo', 12)]) + row8 = to_row( + [('oitavo', 12)]) + row9 = to_row( + [('nono', 12)]) + row10 = to_row( + [('decimo', 12)]) + + self.helper = FormHelper() + self.helper.layout = Layout( + Fieldset(_('Pesquisa de Matéria'), + row1, row2, row3, row4, row5, + row6, row7, row8, row9, row10, + form_actions(save_label='Atualizar')) + ) + + def clean(self): + cleaned_data = self.cleaned_data + + for c1 in cleaned_data: + i = 0 + for c2 in cleaned_data: + if cleaned_data[str(c1)] == cleaned_data[str(c2)]: + i = i + 1 + if i > 1: + raise ValidationError(_( + 'Não é possível ter campos repetidos')) diff --git a/sapl/sessao/migrations/0003_resumoordenacao.py b/sapl/sessao/migrations/0003_resumoordenacao.py new file mode 100644 index 000000000..ef6e990c5 --- /dev/null +++ b/sapl/sessao/migrations/0003_resumoordenacao.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2017-05-22 10:51 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0002_sessaoplenaria_interativa'), + ] + + operations = [ + migrations.CreateModel( + name='ResumoOrdenacao', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('primeiro', models.CharField(max_length=30)), + ('segundo', models.CharField(max_length=30)), + ('terceiro', models.CharField(max_length=30)), + ('quarto', models.CharField(max_length=30)), + ('quinto', models.CharField(max_length=30)), + ('sexto', models.CharField(max_length=30)), + ('setimo', models.CharField(max_length=30)), + ('oitavo', models.CharField(max_length=30)), + ('nono', models.CharField(max_length=30)), + ('decimo', models.CharField(max_length=30)), + ], + options={ + 'verbose_name': 'Ordenação do Resumo de uma Sessão', + 'verbose_name_plural': 'Ordenação do Resumo de uma Sessão', + }, + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index b76fac9f3..4d7c22ca1 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -493,3 +493,28 @@ class Bloco(models.Model): def __str__(self): return self.nome + + +@reversion.register() +class ResumoOrdenacao(models.Model): + ''' + Tabela para registrar em qual ordem serão renderizados os componentes + da tela de resumo de uma sessão + ''' + primeiro = models.CharField(max_length=30) + segundo = models.CharField(max_length=30) + terceiro = models.CharField(max_length=30) + quarto = models.CharField(max_length=30) + quinto = models.CharField(max_length=30) + sexto = models.CharField(max_length=30) + setimo = models.CharField(max_length=30) + oitavo = models.CharField(max_length=30) + nono = models.CharField(max_length=30) + decimo = models.CharField(max_length=30) + + class Meta: + verbose_name = _('Ordenação do Resumo de uma Sessão') + verbose_name_plural = _('Ordenação do Resumo de uma Sessão') + + def __str__(self): + return 'Ordenação do Resumo de uma Sessão' diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index f237bf721..93fd953bb 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -10,7 +10,8 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, PautaSessaoDetailView, PautaSessaoListView, PesquisarPautaSessaoView, PesquisarSessaoPlenariaView, - PresencaOrdemDiaView, PresencaView, ResumoView, + PresencaOrdemDiaView, PresencaView, + ResumoOrdenacaoView, ResumoView, SessaoCrud, TipoExpedienteCrud, TipoResultadoVotacaoCrud, TipoSessaoCrud, VotacaoEditView, VotacaoExpedienteEditView, @@ -68,6 +69,9 @@ urlpatterns = [ include(BlocoCrud.get_urls())), url(r'^sistema/cargo-bancada/', include(CargoBancadaCrud.get_urls())), + url(r'^sistema/resumo-ordenacao/', + ResumoOrdenacaoView.as_view(), + name='resumo_ordenacao'), url(r'^sessao/(?P\d+)/adicionar-varias-materias-expediente/', AdicionarVariasMateriasExpediente.as_view(), name='adicionar_varias_materias_expediente'), diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 980594784..1b1b95d97 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -13,7 +13,7 @@ from django.utils.decorators import method_decorator from django.utils.html import strip_tags from django.utils.translation import ugettext_lazy as _ from django.views.decorators.csrf import csrf_exempt -from django.views.generic import ListView, TemplateView +from django.views.generic import FormView, ListView, TemplateView from django.views.generic.base import RedirectView from django.views.generic.detail import DetailView from django.views.generic.edit import FormMixin @@ -36,13 +36,14 @@ from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm from .forms import (AdicionarVariasMateriasFilterSet, ExpedienteForm, ListMateriaForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, + ResumoOrdenacaoForm, SessaoPlenariaFilterSet, VotacaoEditForm, VotacaoForm, VotacaoNominalForm) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, ExpedienteSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, - PresencaOrdemDia, RegistroVotacao, SessaoPlenaria, - SessaoPlenariaPresenca, TipoExpediente, + PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, + SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, TipoResultadoVotacao, TipoSessaoPlenaria, VotoNominal, VotoParlamentar) @@ -930,6 +931,47 @@ class MesaView(FormMixin, DetailView): return reverse('sapl.sessao:mesa', kwargs={'pk': pk}) +class ResumoOrdenacaoView(FormView): + template_name = 'sessao/resumo_ordenacao.html' + form_class = ResumoOrdenacaoForm + + def get_success_url(self): + return reverse('sapl.base:sistema') + + def get_initial(self): + ordenacao = ResumoOrdenacao.objects.first() + if ordenacao: + return {'primeiro': ordenacao.primeiro, + 'segundo': ordenacao.segundo, + 'terceiro': ordenacao.terceiro, + 'quarto': ordenacao.quarto, + 'quinto': ordenacao.quinto, + 'sexto': ordenacao.sexto, + 'setimo': ordenacao.setimo, + 'oitavo': ordenacao.oitavo, + 'nono': ordenacao.nono, + 'decimo': ordenacao.decimo} + return self.initial.copy() + + def form_valid(self, form): + ordenacao = ResumoOrdenacao.objects.get_or_create()[0] + + ordenacao.primeiro = form.cleaned_data['primeiro'] + ordenacao.segundo = form.cleaned_data['segundo'] + ordenacao.terceiro = form.cleaned_data['terceiro'] + ordenacao.quarto = form.cleaned_data['quarto'] + ordenacao.quinto = form.cleaned_data['quinto'] + ordenacao.sexto = form.cleaned_data['sexto'] + ordenacao.setimo = form.cleaned_data['setimo'] + ordenacao.oitavo = form.cleaned_data['oitavo'] + ordenacao.nono = form.cleaned_data['nono'] + ordenacao.decimo = form.cleaned_data['decimo'] + + ordenacao.save() + + return HttpResponseRedirect(self.get_success_url()) + + class ResumoView(DetailView): template_name = 'sessao/resumo.html' model = SessaoPlenaria @@ -1121,13 +1163,54 @@ class ResumoView(DetailView): if not partido_sigla: partido_sigla = '' oradores = { - 'numero_ordem': orador.numero_ordem, - 'parlamentar': parlamentar, - 'sgl_partido': partido_sigla - } + 'numero_ordem': orador.numero_ordem, + 'parlamentar': parlamentar, + 'sgl_partido': partido_sigla + } oradores_explicacoes.append(oradores) context.update({'oradores_explicacoes': oradores_explicacoes}) + # ===================================================================== + # Indica a ordem com a qual o template será renderizado + ordenacao = ResumoOrdenacao.objects.first() + dict_ord_template = { + 'cont_mult': 'conteudo_multimidia.html', + 'exp': 'expedientes.html', + 'id_basica': 'identificacao_basica.html', + 'lista_p': 'lista_presenca.html', + 'lista_p_o_d': 'lista_presenca_ordem_dia.html', + 'mat_exp': 'materias_expediente.html', + 'mat_o_d': 'materias_ordem_dia.html', + 'mesa_d': 'mesa_diretora.html', + 'oradores_exped': 'oradores_expediente.html', + 'oradores_expli': 'oradores_explicacoes.html' + } + + if ordenacao: + 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]}) + else: + 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['oradores_exped'], + 'oitavo_ordenacao': dict_ord_template['lista_p_o_d'], + 'nono_ordenacao': dict_ord_template['mat_o_d'], + 'decimo_ordenacao': dict_ord_template['oradores_expli']}) + return self.render_to_response(context) diff --git a/sapl/templates/sessao/resumo.html b/sapl/templates/sessao/resumo.html index 4ec075c31..b5831bdca 100644 --- a/sapl/templates/sessao/resumo.html +++ b/sapl/templates/sessao/resumo.html @@ -19,34 +19,36 @@

- {% include 'sessao/blocos_resumo/identificacao_basica.html' %} + + {% include 'sessao/blocos_resumo/'|add:primeiro_ordenacao %}


- {% include 'sessao/blocos_resumo/conteudo_multimidia.html' %} + {% include 'sessao/blocos_resumo/'|add:segundo_ordenacao %}


- {% include 'sessao/blocos_resumo/mesa_diretora.html' %} + {% include 'sessao/blocos_resumo/'|add:terceiro_ordenacao %}


- {% include 'sessao/blocos_resumo/lista_presenca.html' %} + {% include 'sessao/blocos_resumo/'|add:quarto_ordenacao %}


- {% include 'sessao/blocos_resumo/expedientes.html' %} + {% include 'sessao/blocos_resumo/'|add:quinto_ordenacao %}


- {% include 'sessao/blocos_resumo/materias_expediente.html' %} + {% include 'sessao/blocos_resumo/'|add:sexto_ordenacao %}


- {% include 'sessao/blocos_resumo/oradores_expediente.html' %} + {% include 'sessao/blocos_resumo/'|add:setimo_ordenacao %}


- {% include 'sessao/blocos_resumo/lista_presenca_ordem_dia.html' %} + {% include 'sessao/blocos_resumo/'|add:oitavo_ordenacao %}


- {% include 'sessao/blocos_resumo/materias_ordem_dia.html' %} + {% include 'sessao/blocos_resumo/'|add:nono_ordenacao %}


- {% include 'sessao/blocos_resumo/oradores_explicacoes.html' %} + {% include 'sessao/blocos_resumo/'|add:decimo_ordenacao %}


+ {% endblock detail_content %} diff --git a/sapl/templates/sessao/resumo_ordenacao.html b/sapl/templates/sessao/resumo_ordenacao.html new file mode 100644 index 000000000..5d9fe816f --- /dev/null +++ b/sapl/templates/sessao/resumo_ordenacao.html @@ -0,0 +1,13 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block title %} +

Ordenação do Resumo

+{% endblock %} + +{% block base_content %} + +{% crispy form %} + +{% endblock %} \ No newline at end of file diff --git a/sapl/templates/sistema.html b/sapl/templates/sistema.html index 99b9c7062..72ddb240a 100644 --- a/sapl/templates/sistema.html +++ b/sapl/templates/sistema.html @@ -82,7 +82,7 @@ - +