Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refazendo pr da issue 2989 para 3.1.x #3244

Open
wants to merge 1 commit into
base: 3.1.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions sapl/comissoes/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,9 @@ class Meta:
model = PautaReuniao
exclude = ['reuniao']

class PresencaReuniaoComissaoForm(forms.Form):
presenca = forms.CharField(required=False, initial=False)
parlamentar = forms.CharField(required=False, max_length=20)

class DocumentoAcessorioCreateForm(FileFieldCheckMixin, forms.ModelForm):

Expand Down
29 changes: 29 additions & 0 deletions sapl/comissoes/migrations/0026_presencareuniaocomissao.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-08-12 23:59
from __future__ import unicode_literals

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('parlamentares', '0031_auto_20200407_1406'),
('comissoes', '0025_auto_20200605_1051'),
]

operations = [
migrations.CreateModel(
name='PresencaReuniaoComissao',
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='presencareuniaocomissao_set', to='comissoes.Reuniao')),
],
options={
'verbose_name': 'Presença em Reunião de Comissão',
'verbose_name_plural': 'Presenças em Reuniões de Comissão',
},
),
]
11 changes: 11 additions & 0 deletions sapl/comissoes/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -374,3 +374,14 @@ def save(self, force_insert=False, force_update=False, using=None,
force_update=force_update,
using=using,
update_fields=update_fields)

@reversion.register()
class PresencaReuniaoComissao(models.Model):
reuniao = models.ForeignKey(Reuniao,
related_name='presencareuniaocomissao_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')
4 changes: 3 additions & 1 deletion sapl/comissoes/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
ComposicaoCrud, DocumentoAcessorioCrud,
MateriasTramitacaoListView, ParticipacaoCrud,
get_participacoes_comissao, PeriodoComposicaoCrud,
RemovePautaView, ReuniaoCrud, TipoComissaoCrud)
RemovePautaView, ReuniaoCrud, TipoComissaoCrud,PresencaReuniaoComissaoView)

from .apps import AppConfig

Expand All @@ -27,4 +27,6 @@
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<pk>\d+)/presenca$',
PresencaReuniaoComissaoView.as_view(), name='presenca'),
]
79 changes: 77 additions & 2 deletions sapl/comissoes/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
ParticipacaoCreateForm,
ParticipacaoEditForm,
PautaReuniaoFilterSet, PautaReuniaoForm,
PeriodoForm, ReuniaoForm)
PeriodoForm, ReuniaoForm, PresencaReuniaoComissaoForm)
from sapl.crud.base import (Crud, CrudAux, MasterDetailCrud,
PermissionRequiredForAppCrudMixin, RP_DETAIL,
RP_LIST)
Expand All @@ -31,8 +31,9 @@
from sapl.utils import show_results_filter_set

from .models import (CargoComissao, Comissao, Composicao, DocumentoAcessorio,
Participacao, Periodo, Reuniao, TipoComissao)
Participacao, Periodo, Reuniao, TipoComissao, PresencaReuniaoComissao)

from sapl.parlamentares.models import Parlamentar

def pegar_url_composicao(pk):
participacao = Participacao.objects.get(id=pk)
Expand Down Expand Up @@ -224,6 +225,11 @@ def get_context_data(self, **kwargs):
documentos = DocumentoAcessorio.objects.filter(reuniao=self.kwargs['pk']).order_by('nome')
docs.extend(documentos)

presenca = []
presenca_reuniao = PresencaReuniaoComissao.objects.filter(reuniao=self.kwargs['pk'])
presenca.extend(presenca_reuniao)
context['presenca'] = presenca

context['docs'] = docs
context['num_docs'] = len(docs)

Expand Down Expand Up @@ -421,6 +427,75 @@ def delete(self, *args, **kwargs):
kwargs={'pk': obj.reuniao.pk}))


class PresencaReuniaoComissaoView(FormMixin, DetailView):
template_name = 'comissoes/presenca.html'
form_class = PresencaReuniaoComissaoForm
model = Reuniao
logger = logging.getLogger(__name__)

def get_presencas(self):

pk = self.kwargs['pk']

presencas = PresencaReuniaoComissao.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 <small>(%s)</small>' % (
_('Presença em Reunião de Comissão'), 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 = PresencaReuniaoComissao.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)
PresencaReuniaoComissao.objects.filter(
parlamentar_id__in=deletar,
reuniao_id=self.object.id).delete()

for p in marcados:
presenca_reuniao = PresencaReuniaoComissao()
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 + ". PresencaReuniaoComissao 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})

def get_participacoes_comissao(request):
parlamentares = []

Expand Down
1 change: 1 addition & 0 deletions sapl/rules/map_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@
(materia.Relatoria, __base__, __perms_publicas__),
(comissoes.Reuniao, __base__, __perms_publicas__),
(comissoes.DocumentoAcessorio, __base__, __perms_publicas__),
(comissoes.PresencaReuniaoComissao, __base__, __perms_publicas__),
]
}

Expand Down
85 changes: 85 additions & 0 deletions sapl/templates/comissoes/presenca.html
Original file line number Diff line number Diff line change
@@ -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 %}
<form method="POST">
{% csrf_token %}
<div class="controls">
<div class="checkbox">
<label for="id_check_all">
<input type="checkbox" id="id_check_all" onchange="checkAll(event)" /> Marcar/Desmarcar Todos
</label>
</div>
</div>
<br />
<div class="controls ">
{% for parlamentar, check in view.get_presencas %}
{% if parlamentar.ativo %}
<div class="checkbox">
<label for="id_presenca_{{forloop.counter}}">
<input type="checkbox" id="id_presenca_{{forloop.counter}}" name="presenca_ativos" value="{{ parlamentar.id }}"
{% if check %} checked {% endif %}>
{{ parlamentar.nome_parlamentar }} / {% if parlamentar|filiacao_data_filter:object.data_inicio %} {{ parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}
</label>
</div>
{% else %}
<div class="checkbox inativos" style="display:none;">
<label for="id_presenca_{{forloop.counter}}" class="inativos" style="display:none;">
<input type="checkbox" id="id_presenca_{{forloop.counter}}" name="presenca_inativos" value="{{ parlamentar.id }}"
{% if check %} checked {% endif %}>
{{ parlamentar.nome_parlamentar }} / {% if parlamentar|filiacao_data_filter:object.data_inicio %} {{ parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}
</label>
</div>
{% endif %}
{% endfor %}
</div>
<br />
<input type="submit" value="Salvar" class="btn btn-primary" />
</form>

{% else %}

<div class="row">
<div class="col-md-6">
<h2>Parlamentares presentes
</div>
</div>
<br />

{% for parlamentar, check in view.get_presencas %}
{% if check %}
<div class="row">
<div class="col-md-6">
<label for="parlamentar"> - {{ parlamentar.nome_parlamentar }} / {% if parlamentar|filiacao_data_filter:object.data_inicio %} {{ parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}
</label>
</div>
</div>
{% endif %}
{% endfor %}
{% endif %}
{% endblock detail_content %}

{% block extra_js %}
<script language="JavaScript">
function checkAll(event) {
$('[name=presenca_ativos]').each(function () {
$(this).prop('checked', event.target.checked ? null : 'checked');
$(this).trigger('click');
});
if (($('[name=ativos]').is(':checked')) == false) {
$('[name=presenca_inativos]').each(function () {
$(this).prop('checked', event.target.checked ? null : 'checked');
$(this).trigger('click');
});
}
}

function escondeInativos() {
$(".inativos").toggle();
}
</script>
{% endblock %}
13 changes: 13 additions & 0 deletions sapl/templates/comissoes/reuniao_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,17 @@ <h2 class="legend">Documentos Acessórios</h2>
{% endif %}
{% endif %}
<br /><br />
<h2 class="legend">Presença em Reunião</h2>
{% if presenca %}
<table class="table table-striped table-hover">
<thead><tr><th>Parlamentares presentes</th></tr></thead>
<tbody>
{% for presente in presenca %}
<tr><td><p>{{ presente.parlamentar }}</p></td></tr>
{% endfor %}
</tbody>
</table>
{% endif %}
<a href="{% url 'sapl.comissoes:presenca' reuniao_pk %}" class="btn btn-outline-primary">{% trans 'Editar Presenças' %}</a>
<br /><br />
{% endblock detail_content %}