From c42bfc70b182e95e14e222d8941253e138d39500 Mon Sep 17 00:00:00 2001 From: ricardocanela Date: Wed, 6 Nov 2019 11:48:25 -0300 Subject: [PATCH] Fix #2989 adicionado presenca em reunioes --- sapl/comissoes/forms.py | 4 + .../migrations/0022_presencareuniao.py | 30 +++++++ .../migrations/0023_auto_20191031_1232.py | 19 +++++ sapl/comissoes/models.py | 12 +++ sapl/comissoes/urls.py | 4 +- sapl/comissoes/views.py | 81 +++++++++++++++++- .../migrations/0049_auto_20191031_1231.py | 19 +++++ .../migrations/0050_auto_20191031_1232.py | 19 +++++ sapl/templates/comissoes/presenca.html | 85 +++++++++++++++++++ sapl/templates/comissoes/reuniao_detail.html | 13 +++ 10 files changed, 283 insertions(+), 3 deletions(-) create mode 100644 sapl/comissoes/migrations/0022_presencareuniao.py create mode 100644 sapl/comissoes/migrations/0023_auto_20191031_1232.py create mode 100644 sapl/sessao/migrations/0049_auto_20191031_1231.py create mode 100644 sapl/sessao/migrations/0050_auto_20191031_1232.py create mode 100644 sapl/templates/comissoes/presenca.html diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py index e395fdf90..60144a6da 100644 --- a/sapl/comissoes/forms.py +++ b/sapl/comissoes/forms.py @@ -514,3 +514,7 @@ class DocumentoAcessorioEditForm(FileFieldCheckMixin, forms.ModelForm): .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (arquivo.size/1024)/1024)) return self.cleaned_data + +class PresencaForm(forms.Form): + presenca = forms.CharField(required=False, initial=False) + parlamentar = forms.CharField(required=False, max_length=20) diff --git a/sapl/comissoes/migrations/0022_presencareuniao.py b/sapl/comissoes/migrations/0022_presencareuniao.py new file mode 100644 index 000000000..826a623b8 --- /dev/null +++ b/sapl/comissoes/migrations/0022_presencareuniao.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-10-31 15:31 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0035_merge_20190802_0954'), + ('comissoes', '0021_auto_20191001_1115'), + ] + + operations = [ + migrations.CreateModel( + name='PresencaReuniao', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('parlamentar', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Parlamentar')), + ('reuniao', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='presencareuniao_set', to='comissoes.Reuniao')), + ], + options={ + 'verbose_name_plural': 'Presenças em Sessões Plenárias', + 'verbose_name': 'Presença em Sessão Plenária', + 'ordering': ['parlamentar__nome_parlamentar'], + }, + ), + ] diff --git a/sapl/comissoes/migrations/0023_auto_20191031_1232.py b/sapl/comissoes/migrations/0023_auto_20191031_1232.py new file mode 100644 index 000000000..45b7ff9d5 --- /dev/null +++ b/sapl/comissoes/migrations/0023_auto_20191031_1232.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-10-31 15:32 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('comissoes', '0022_presencareuniao'), + ] + + operations = [ + migrations.AlterModelOptions( + name='presencareuniao', + options={'verbose_name': 'Presença em Reunião de Comissão', 'verbose_name_plural': 'Presenças em Reuniões de Comissão'}, + ), + ] diff --git a/sapl/comissoes/models.py b/sapl/comissoes/models.py index bf876b5ef..143dec187 100644 --- a/sapl/comissoes/models.py +++ b/sapl/comissoes/models.py @@ -307,6 +307,18 @@ class Reuniao(models.Model): update_fields=update_fields) +@reversion.register() +class PresencaReuniao(models.Model): + reuniao = models.ForeignKey(Reuniao, + related_name='presencareuniao_set', + on_delete=models.CASCADE) + parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) + + class Meta: + verbose_name = _('Presença em Reunião de Comissão') + verbose_name_plural = _('Presenças em Reuniões de Comissão') + + @reversion.register() class DocumentoAcessorio(models.Model): reuniao = models.ForeignKey(Reuniao, diff --git a/sapl/comissoes/urls.py b/sapl/comissoes/urls.py index 5e48ee891..257f8e488 100644 --- a/sapl/comissoes/urls.py +++ b/sapl/comissoes/urls.py @@ -2,7 +2,7 @@ from django.conf.urls import include, url from sapl.comissoes.views import (CargoCrud, ComissaoCrud, ComposicaoCrud, DocumentoAcessorioCrud, MateriasTramitacaoListView, ParticipacaoCrud, PeriodoComposicaoCrud, ReuniaoCrud, TipoComissaoCrud, get_participacoes_comissao, - AdicionaPautaView, RemovePautaView) + AdicionaPautaView, RemovePautaView, PresencaView) from .apps import AppConfig @@ -26,4 +26,6 @@ urlpatterns = [ include(PeriodoComposicaoCrud.get_urls())), url(r'^sistema/comissao/tipo/', include(TipoComissaoCrud.get_urls())), url(r'^sistema/comissao/recupera-participacoes', get_participacoes_comissao), + url(r'^comissao/(?P\d+)/presenca$', + PresencaView.as_view(), name='presenca'), ] diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py index 4d37d735a..fdb178fc6 100644 --- a/sapl/comissoes/views.py +++ b/sapl/comissoes/views.py @@ -21,7 +21,7 @@ from sapl.comissoes.forms import (ComissaoForm, ComposicaoForm, DocumentoAcessorioEditForm, ParticipacaoCreateForm, ParticipacaoEditForm, PautaReuniaoForm, PeriodoForm, ReuniaoForm, - PautaReuniaoFilterSet) + PautaReuniaoFilterSet, PresencaForm) from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud, PermissionRequiredForAppCrudMixin) @@ -29,8 +29,10 @@ from sapl.materia.models import (MateriaLegislativa, Tramitacao, PautaReuniao, MateriaEmTramitacao) from sapl.utils import show_results_filter_set +from sapl.parlamentares.models import Parlamentar + from .models import (CargoComissao, Comissao, Composicao, DocumentoAcessorio, - Participacao, Periodo, Reuniao, TipoComissao) + Participacao, Periodo, Reuniao, TipoComissao, PresencaReuniao) def pegar_url_composicao(pk): @@ -216,6 +218,11 @@ class ReuniaoCrud(MasterDetailCrud): context['docs'] = docs context['num_docs'] = len(docs) + presenca = [] + presenca_reuniao = PresencaReuniao.objects.filter(reuniao=self.kwargs['pk']) + presenca.extend(presenca_reuniao) + context['presenca'] = presenca + mats = [] materias_pauta = PautaReuniao.objects.filter(reuniao=self.kwargs['pk']) materias_pk = [materia_pauta.materia.pk for materia_pauta in materias_pauta] @@ -278,6 +285,76 @@ class ReuniaoCrud(MasterDetailCrud): return {'comissao': comissao} +class PresencaView(FormMixin, DetailView): + template_name = 'comissoes/presenca.html' + form_class = PresencaForm + model = Reuniao + logger = logging.getLogger(__name__) + + def get_presencas(self): + + pk = self.kwargs['pk'] + + presencas = PresencaReuniao.objects.filter(reuniao=pk) + presentes = [p.parlamentar for p in presencas] + + periodo = Reuniao.objects.get(pk=pk).periodo + participacao = Reuniao.objects.get(pk=pk).comissao.composicao_set.get(periodo=periodo).participacao_set.all() + + for p in participacao: + parlamentar = p.parlamentar + if parlamentar in presentes: + yield (parlamentar, True) + else: + yield (parlamentar, False) + + + def get_context_data(self, **kwargs): + context = FormMixin.get_context_data(self, **kwargs) + context['title'] = '%s (%s)' % ( + _('Presença'), self.object) + return context + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + form = self.get_form() + + if form.is_valid(): + # Pegar os presentes salvos no banco + presentes_banco = PresencaReuniao.objects.filter( + reuniao_id=self.object.id).values_list( + 'parlamentar_id', flat=True).distinct() + + # Id dos parlamentares presentes + marcados = request.POST.getlist('presenca_ativos') \ + + request.POST.getlist('presenca_inativos') + + # Deletar os que foram desmarcados + deletar = set(presentes_banco) - set(marcados) + PresencaReuniao.objects.filter( + parlamentar_id__in=deletar, + reuniao_id=self.object.id).delete() + + for p in marcados: + presenca_reuniao = PresencaReuniao() + presenca_reuniao.reuniao = Reuniao.objects.get(pk=self.kwargs['pk']) + presenca_reuniao.parlamentar = Parlamentar.objects.get(id=p) + presenca_reuniao.save() + username = request.user.username + self.logger.info( + "user=" + username + ". PresencaReuniao salva com sucesso (parlamentar_id={})!".format(p)) + msg = _('Presença em Reuniao de Comissão salva com sucesso!') + messages.add_message(request, messages.SUCCESS, msg) + + return self.form_valid(form) + else: + return self.form_invalid(form) + + def get_success_url(self): + pk = self.kwargs['pk'] + return reverse('sapl.comissoes:reuniao_detail', kwargs={'pk': pk}) + + class RemovePautaView(PermissionRequiredMixin, CreateView): model = PautaReuniao form_class = PautaReuniaoForm diff --git a/sapl/sessao/migrations/0049_auto_20191031_1231.py b/sapl/sessao/migrations/0049_auto_20191031_1231.py new file mode 100644 index 000000000..8eaaa9958 --- /dev/null +++ b/sapl/sessao/migrations/0049_auto_20191031_1231.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-10-31 15:31 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0048_auto_20190829_1253'), + ] + + operations = [ + migrations.AlterModelOptions( + name='sessaoplenariapresenca', + options={'verbose_name': 'Presença em Reunião de Comissão', 'verbose_name_plural': 'Presenças em Reuniões de Comissão'}, + ), + ] diff --git a/sapl/sessao/migrations/0050_auto_20191031_1232.py b/sapl/sessao/migrations/0050_auto_20191031_1232.py new file mode 100644 index 000000000..7c305554d --- /dev/null +++ b/sapl/sessao/migrations/0050_auto_20191031_1232.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-10-31 15:32 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0049_auto_20191031_1231'), + ] + + operations = [ + migrations.AlterModelOptions( + name='sessaoplenariapresenca', + options={'ordering': ['parlamentar__nome_parlamentar'], 'verbose_name': 'Presença em Sessão Plenária', 'verbose_name_plural': 'Presenças em Sessões Plenárias'}, + ), + ] diff --git a/sapl/templates/comissoes/presenca.html b/sapl/templates/comissoes/presenca.html new file mode 100644 index 000000000..1909b3932 --- /dev/null +++ b/sapl/templates/comissoes/presenca.html @@ -0,0 +1,85 @@ +{% extends "crud/detail.html" %} +{% load i18n %} +{% load common_tags %} + +{% block actions %}{% endblock %} + +{% block detail_content %} + {% if perms|get_add_perm:view %} +
+ {% csrf_token %} +
+
+ +
+
+
+
+ {% for parlamentar, check in view.get_presencas %} + {% if parlamentar.ativo %} +
+ +
+ {% else %} + + {% endif %} + {% endfor %} +
+
+ +
+ + {% else %} + +
+
+

Parlamentares presentes +

+
+
+ + {% for parlamentar, check in view.get_presencas %} + {% if check %} +
+
+ +
+
+ {% endif %} + {% endfor %} + {% endif %} +{% endblock detail_content %} + +{% block extra_js %} + +{% endblock %} \ No newline at end of file diff --git a/sapl/templates/comissoes/reuniao_detail.html b/sapl/templates/comissoes/reuniao_detail.html index bb6e19491..455e26b75 100644 --- a/sapl/templates/comissoes/reuniao_detail.html +++ b/sapl/templates/comissoes/reuniao_detail.html @@ -56,4 +56,17 @@ {% endif %} {% endif %}

+

Presença em Reunião

+ {% if presenca %} + + + + {% for presente in presenca %} + + {% endfor %} + +
Parlamentares presentes

{{ presente.parlamentar }}

+ {% endif %} + {% trans 'Editar Presenças' %} +

{% endblock detail_content %}