diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index f7308f62e..3e7de95ad 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -54,7 +54,8 @@ ORDENACAO_RESUMO = [('cont_mult', 'Conteúdo Multimídia'), ('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')] + ('oradores_expli', 'Oradores das Explicações Pessoais'), + ('ocorrencia_sessao', 'Ocorrências da Sessão')] class SessaoPlenariaForm(ModelForm): @@ -411,6 +412,9 @@ class MesaForm(forms.Form): class ExpedienteForm(forms.Form): conteudo = forms.CharField(required=False, widget=forms.Textarea) +class OcorrenciaSessaoForm(forms.Form): + conteudo = forms.CharField(required=False, widget=forms.Textarea) + class VotacaoForm(forms.Form): votos_sim = forms.CharField(label='Sim') diff --git a/sapl/sessao/legacy.yaml b/sapl/sessao/legacy.yaml index 6df4dd90d..ef7f9f55e 100644 --- a/sapl/sessao/legacy.yaml +++ b/sapl/sessao/legacy.yaml @@ -34,6 +34,10 @@ ExpedienteSessao (ExpedienteSessaoPlenaria): sessao_plenaria: cod_sessao_plen tipo: cod_expediente +OcorrenciaSessao (OcorrenciaSessaoPlenaria): + conteudo: txt_ocorrencia + sessao_plenaria: cod_sessao_plen + IntegranteMesa (MesaSessaoPlenaria): cargo: cod_cargo parlamentar: cod_parlamentar diff --git a/sapl/sessao/migrations/0024_ocorrenciasessao.py b/sapl/sessao/migrations/0024_ocorrenciasessao.py new file mode 100644 index 000000000..6c612363f --- /dev/null +++ b/sapl/sessao/migrations/0024_ocorrenciasessao.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2018-09-18 13:44 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0023_auto_20180914_1315'), + ] + + operations = [ + migrations.CreateModel( + name='OcorrenciaSessao', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('conteudo', models.TextField(blank=True, verbose_name='Ocorrências da Sessão Plenária')), + ('sessao_plenaria', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sessao.SessaoPlenaria')), + ], + options={ + 'verbose_name_plural': 'Ocorrências da Sessão Plenaria', + 'verbose_name': 'Ocorrência da Sessão Plenaria', + }, + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 11047ed9e..6d885e54a 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -300,6 +300,20 @@ class ExpedienteSessao(models.Model): # ExpedienteSessaoPlenaria def __str__(self): return '%s - %s' % (self.tipo, self.sessao_plenaria) +@reversion.register() +class OcorrenciaSessao(models.Model): # OcorrenciaSessaoPlenaria + sessao_plenaria = models.ForeignKey(SessaoPlenaria, + on_delete=models.PROTECT) + conteudo = models.TextField( + blank=True, verbose_name=_('Ocorrências da Sessão Plenária')) + + class Meta: + verbose_name = _('Ocorrência da Sessão Plenaria') + verbose_name_plural = _('Ocorrências da Sessão Plenaria') + + def __str__(self): + return '%s - %s' % (self.sessao_plenaria) + @reversion.register() class IntegranteMesa(models.Model): # MesaSessaoPlenaria diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 201623824..e654c8243 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -3,7 +3,7 @@ from django.conf.urls import include, url from sapl.sessao.views import (AdicionarVariasMateriasExpediente, AdicionarVariasMateriasOrdemDia, BancadaCrud, BlocoCrud, CargoBancadaCrud, - ExpedienteMateriaCrud, ExpedienteView, + ExpedienteMateriaCrud, ExpedienteView, ocorrencia_sessaoView, MateriaOrdemDiaCrud, MesaView, OradorCrud, OradorExpedienteCrud, PainelView, PautaSessaoDetailView, PautaSessaoView, @@ -100,6 +100,8 @@ urlpatterns = [ # Subnav sessão url(r'^sessao/(?P\d+)/expediente$', ExpedienteView.as_view(), name='expediente'), + url(r'^sessao/(?P\d+)/ocorrencia_sessao$', + ocorrencia_sessaoView.as_view(), name='ocorrencia_sessao'), url(r'^sessao/(?P\d+)/presenca$', PresencaView.as_view(), name='presenca'), url(r'^sessao/(?P\d+)/painel$', diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 32813f84a..8fa2d532b 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -37,13 +37,13 @@ from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm from sapl.utils import show_results_filter_set, remover_acentos from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm, - ExpedienteForm, ListMateriaForm, MesaForm, + ExpedienteForm, OcorrenciaSessaoForm, ListMateriaForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, VotacaoNominalForm) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, - ExpedienteMateria, ExpedienteSessao, IntegranteMesa, + ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, @@ -1535,7 +1535,84 @@ class ExpedienteView(FormMixin, DetailView): def get_success_url(self): pk = self.kwargs['pk'] return reverse('sapl.sessao:expediente', kwargs={'pk': pk}) + +class ocorrencia_sessaoView(FormMixin, DetailView): + template_name = 'sessao/ocorrencia_sessao.html' + form_class = OcorrenciaSessaoForm + model = SessaoPlenaria + + def get_context_data(self, **kwargs): + context = FormMixin.get_context_data(self, **kwargs) + context['title'] = '%s (%s)' % ( + _('Ocorrências da Sessão'), self.object) + return context + + @method_decorator(permission_required('sessao.add_ocorrenciasessao')) + def post(self, request, *args, **kwargs): + self.object = self.get_object() + form = OcorrenciaSessaoForm(request.POST) + + if 'apagar-ocorrencia_sessao' in request.POST: + OcorrenciaSessao.objects.filter( + sessao_plenaria_id=self.object.id).delete() + return self.form_valid(form) + + if form.is_valid(): + 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() + + expediente = ExpedienteSessao() + expediente.sessao_plenaria_id = self.object.id + expediente.tipo_id = tipo + expediente.conteudo = conteudo + expediente.save() + + msg = _('Registro salvo com sucesso') + messages.add_message(self.request, messages.SUCCESS, msg) + return self.form_valid(form) + else: + msg = _('Erro ao salvar registro') + messages.add_message(self.request, messages.SUCCESS, msg) + return self.form_invalid(form) + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + context = self.get_context_data(object=self.object) + tipos = TipoExpediente.objects.all().order_by('nome') + expedientes_sessao = ExpedienteSessao.objects.filter( + sessao_plenaria_id=self.object.id).order_by('tipo__nome') + + expedientes_salvos = [] + for e in expedientes_sessao: + expedientes_salvos.append(e.tipo) + + tipos_null = list(set(tipos) - set(expedientes_salvos)) + tipos_null.sort(key=lambda x: x.nome) + + expedientes = [] + for e, t in zip(expedientes_sessao, tipos): + expedientes.append({'tipo': e.tipo, + 'conteudo': e.conteudo + }) + context.update({'expedientes': expedientes}) + + for e in tipos_null: + expedientes.append({'tipo': e, + 'conteudo': '' + }) + + context.update({'expedientes': expedientes}) + return self.render_to_response(context) + + def get_success_url(self): + pk = self.kwargs['pk'] + return reverse('sapl.sessao:ocorrencia_sessao', kwargs={'pk': pk}) + class VotacaoEditView(SessaoPermissionMixin): @@ -1645,7 +1722,7 @@ class VotacaoView(SessaoPermissionMixin): def post(self, request, *args, **kwargs): self.object = self.get_object() form = VotacaoForm(request.POST) - context = self.get_context_data(object=self.object) + context = self.get_context_d(object=self.object) url = request.get_full_path() # ==================================================== diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml index 236d57c4c..0a98b8a3b 100644 --- a/sapl/templates/sessao/subnav.yaml +++ b/sapl/templates/sessao/subnav.yaml @@ -10,6 +10,8 @@ url: presenca - title: {% trans 'Explicações Pessoais' %} url: orador_list + - title: {% trans 'Ocorrências da Sessão' %} + url: ocorrencia_sessao - title: {% trans 'Expedientes' %} children: