diff --git a/sapl/sessao/migrations/0048_auto_20191003_1246.py b/sapl/sessao/migrations/0048_auto_20191003_1246.py new file mode 100644 index 000000000..6c6c8de66 --- /dev/null +++ b/sapl/sessao/migrations/0048_auto_20191003_1246.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-10-03 15:46 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('painel', '0011_cronometro_last_stop_duration'), + ('parlamentares', '0035_merge_20190802_0954'), + ('sessao', '0047_auto_20191001_1115'), + ] + + operations = [ + migrations.CreateModel( + name='CronometroLista', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cronometro', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='painel.Cronometro')), + ], + ), + migrations.CreateModel( + name='ListaDiscurso', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('orador_atual', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Parlamentar')), + ('sessao_plenaria', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sessao.SessaoPlenaria', verbose_name='Sessão Plenária')), + ], + options={ + 'verbose_name': 'Lista de Discurso', + 'verbose_name_plural': 'Listas de Discurso', + 'ordering': ['tipo', 'sessao_plenaria'], + }, + ), + migrations.CreateModel( + name='ParlamentarLista', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('lista', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sessao.ListaDiscurso')), + ('parlamentar', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Parlamentar')), + ], + ), + migrations.CreateModel( + name='TipoListaDiscurso', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nome', models.CharField(max_length=100, verbose_name='Tipo')), + ], + options={ + 'verbose_name': 'Tipo de Lista de Discurso', + 'verbose_name_plural': 'Tipos de Lista de Discurso', + 'ordering': ['nome'], + }, + ), + migrations.AddField( + model_name='listadiscurso', + name='tipo', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sessao.TipoListaDiscurso', verbose_name='Tipo de Lista de Discurso'), + ), + migrations.AddField( + model_name='cronometrolista', + name='lista', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sessao.ListaDiscurso'), + ), + migrations.AlterUniqueTogether( + name='listadiscurso', + unique_together=set([('tipo', 'sessao_plenaria')]), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index c9143169c..39ca88e35 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -10,6 +10,7 @@ import reversion from sapl.base.models import Autor from sapl.materia.models import MateriaLegislativa +from sapl.painel.models import Cronometro from sapl.parlamentares.models import (CargoMesa, Legislatura, Parlamentar, Partido, SessaoLegislativa) from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation, @@ -810,3 +811,50 @@ class RetiradaPauta(models.Model): 'ReritadaPauta deve ter exatamente um dos campos ' 'ordem ou expediente preenchido. Ambos estão preenchidos: ' '{}, {}'. format(self.ordem, self.expediente)) + + +@reversion.register() +class TipoListaDiscurso(models.Model): + nome = models.CharField(max_length=100, verbose_name=_('Tipo')) + + class Meta: + verbose_name = _('Tipo de Lista de Discurso') + verbose_name_plural = _('Tipos de Lista de Discurso') + ordering = ['nome'] + + def __str__(self): + return self.nome + + +@reversion.register() +class ListaDiscurso(models.Model): + tipo = models.ForeignKey(TipoListaDiscurso, + on_delete=models.PROTECT, + verbose_name=_('Tipo de Lista de Discurso')) + sessao_plenaria = models.ForeignKey(SessaoPlenaria, + on_delete=models.PROTECT, + verbose_name=_('Sessão Plenária')) + orador_atual = models.ForeignKey(Parlamentar, + on_delete=models.PROTECT, + blank=True, + null=True) + + class Meta: + verbose_name = _('Lista de Discurso') + verbose_name_plural = _('Listas de Discurso') + ordering = ['tipo', 'sessao_plenaria'] + unique_together = (('tipo', 'sessao_plenaria'),) + + def __str__(self): + return str(self.tipo) + ' - ' + str(self.sessao_plenaria) + +@reversion.register() +class CronometroLista(models.Model): + cronometro = models.ForeignKey(Cronometro, on_delete=models.PROTECT) + lista = models.ForeignKey(ListaDiscurso, on_delete=models.PROTECT) + + +@reversion.register() +class ParlamentarLista(models.Model): + parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) + lista = models.ForeignKey(ListaDiscurso, on_delete=models.PROTECT) \ No newline at end of file diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 328c1da5e..21884cb95 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -35,7 +35,10 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, VotacaoEmBlocoSimbolicaView, VotacaoEmBlocoNominalView, resumo_ordenacao, recuperar_nome_tipo_sessao, - voto_nominal_parlamentar) + voto_nominal_parlamentar, + ListaDiscursoView, + TipoListaDiscursoCrud, + ListaDiscursoCrud) from .apps import AppConfig @@ -99,6 +102,11 @@ urlpatterns = [ include(TipoJustificativaCrud.get_urls())), url(r'^sistema/sessao-plenaria/tipo-retirada-pauta/', include(TipoRetiradaPautaCrud.get_urls())), + url(r'^sistema/sessao-plenaria/tipo-lista-discurso/', + include(TipoListaDiscursoCrud.get_urls())), + url(r'^sistema/sessao-plenaria/lista-discurso/', + include(ListaDiscursoCrud.get_urls())), + url(r'^sistema/resumo-ordenacao/', resumo_ordenacao, name='resumo_ordenacao'), @@ -194,4 +202,9 @@ urlpatterns = [ voto_nominal_parlamentar, name='votacao_nominal_parlamentar' ), + + url(r'^sessao/(?P\d+)/lista-presenca/', + ListaDiscursoView.as_view(), + name='lista_presenca') + ] diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index cbb0b4e46..c8a22ee5f 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -53,7 +53,8 @@ from .models import (CargoMesa, ExpedienteMateria, ExpedienteSessao, OcorrenciaS PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar, TipoRetiradaPauta, - RetiradaPauta, TipoJustificativa, JustificativaAusencia, OradorOrdemDia, ORDENACAO_RESUMO) + RetiradaPauta, TipoJustificativa, JustificativaAusencia, OradorOrdemDia, ORDENACAO_RESUMO, + TipoListaDiscurso, ListaDiscurso) TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') @@ -61,7 +62,8 @@ TipoJustificativaCrud = CrudAux.build(TipoJustificativa, 'tipo_justificativa') TipoResultadoVotacaoCrud = CrudAux.build( TipoResultadoVotacao, 'tipo_resultado_votacao') TipoRetiradaPautaCrud = CrudAux.build(TipoRetiradaPauta, 'tipo_retirada_pauta') - +TipoListaDiscursoCrud = CrudAux.build(TipoListaDiscurso, 'tipo_lista_discurso') +ListaDiscursoCrud = CrudAux.build(ListaDiscurso, 'lista_discurso') def reordernar_materias_expediente(request, pk): expedientes = ExpedienteMateria.objects.filter( @@ -4376,4 +4378,24 @@ def voto_nominal_parlamentar(request): voto.user = request.user voto.save() - return JsonResponse({}) \ No newline at end of file + return JsonResponse({}) + + +class ListaDiscursoView(TemplateView): + template_name = 'sessao/lista_presenca.html' + + def get(self, request, *args, **kwargs): + # import ipdb; ipdb.set_trace() + return TemplateView.get(self, request, *args, **kwargs) + + + def get_context_data(self, **kwargs): + context = TemplateView.get_context_data(self, **kwargs) + sessao_pk = kwargs['pk'] + sessao = SessaoPlenaria.objects.get(id=sessao_pk) + context.update({ + 'root_pk': sessao_pk, + 'subnav_template_name': 'sessao/subnav.yaml', + 'sessaoplenaria': sessao, + }) + return context \ No newline at end of file diff --git a/sapl/templates/menu_tabelas_auxiliares.yaml b/sapl/templates/menu_tabelas_auxiliares.yaml index e423741ee..6d4954a15 100644 --- a/sapl/templates/menu_tabelas_auxiliares.yaml +++ b/sapl/templates/menu_tabelas_auxiliares.yaml @@ -170,6 +170,12 @@ - title: {% trans 'Tipo de Justificativa' %} url: sapl.sessao:tipojustificativa_list css_class: btn btn-link + - title: {% trans 'Tipo de Lista de Discurso' %} + url: sapl.sessao:tipolistadiscurso_list + css_class: btn btn-link + - title: {% trans 'Lista de Discurso' %} + url: sapl.sessao:listadiscurso_list + css_class: btn btn-link - title: {% trans 'Módulo Painel' %} css_class: head_title children: diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml index 8e8c3916a..24c5e7a77 100644 --- a/sapl/templates/sessao/layouts.yaml +++ b/sapl/templates/sessao/layouts.yaml @@ -101,6 +101,15 @@ TipoRetiradaPauta: {% trans 'Tipo Retirada Pauta'%}: - descricao +TipoListaDiscurso: + {% trans 'Tipo de Lista de Discurso' %}: + - nome + +ListaDiscurso: + {% trans 'Lista de Discurso' %}: + - tipo + - sessao_plenaria + RetiradaPauta: {% trans 'Retirada de Pauta' %}: - tipo_de_retirada materia diff --git a/sapl/templates/sessao/lista_presenca.html b/sapl/templates/sessao/lista_presenca.html new file mode 100644 index 000000000..e00e0a33c --- /dev/null +++ b/sapl/templates/sessao/lista_presenca.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} +{% load i18n staticfiles menus %} +{% load webpack_static from webpack_loader %} + + +{% block title %} +

+ Lista de Discurso ({{sessaoplenaria}}) +

+{% endblock %} + +{% block base_content %} + +oioi + +{% endblock %} \ No newline at end of file diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml index 59a127ad3..3777df9e8 100644 --- a/sapl/templates/sessao/subnav.yaml +++ b/sapl/templates/sessao/subnav.yaml @@ -41,10 +41,15 @@ url: votacao_bloco_ordemdia check_permission: sessao.add_sessaoplenaria -- title: {% trans 'Painel Eletrônico' %} - url: painel - {% if not 'painel_aberto'|get_config_attr %}check_permission: painel.list_painel{%endif%} - check_permission: painel.list_painel +- title: {% trans 'Operador' %} + children: + - title: {% trans 'Painel Eletrônico' %} + url: painel + {% if not 'painel_aberto'|get_config_attr %}check_permission: painel.list_painel{%endif%} + check_permission: painel.list_painel + - title: {% trans 'Lista de Discurso' %} + url: lista_presenca + check_permission: painel.list_painel - title: {% trans 'Resumo' %} children: