Browse Source

Refazendo pr da issue 2989 para 3.1.x

pull/3244/head
ulyssesBML 4 years ago
parent
commit
a709aa5173
  1. 3
      sapl/comissoes/forms.py
  2. 29
      sapl/comissoes/migrations/0026_presencareuniaocomissao.py
  3. 11
      sapl/comissoes/models.py
  4. 4
      sapl/comissoes/urls.py
  5. 79
      sapl/comissoes/views.py
  6. 1
      sapl/rules/map_rules.py
  7. 85
      sapl/templates/comissoes/presenca.html
  8. 13
      sapl/templates/comissoes/reuniao_detail.html

3
sapl/comissoes/forms.py

@ -486,6 +486,9 @@ class PautaReuniaoForm(forms.ModelForm):
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):

29
sapl/comissoes/migrations/0026_presencareuniaocomissao.py

@ -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
sapl/comissoes/models.py

@ -374,3 +374,14 @@ class DocumentoAcessorio(models.Model):
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
sapl/comissoes/urls.py

@ -3,7 +3,7 @@ from sapl.comissoes.views import (AdicionaPautaView, CargoComissaoCrud, Comissao
ComposicaoCrud, DocumentoAcessorioCrud,
MateriasTramitacaoListView, ParticipacaoCrud,
get_participacoes_comissao, PeriodoComposicaoCrud,
RemovePautaView, ReuniaoCrud, TipoComissaoCrud)
RemovePautaView, ReuniaoCrud, TipoComissaoCrud,PresencaReuniaoComissaoView)
from .apps import AppConfig
@ -27,4 +27,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<pk>\d+)/presenca$',
PresencaReuniaoComissaoView.as_view(), name='presenca'),
]

79
sapl/comissoes/views.py

@ -22,7 +22,7 @@ from sapl.comissoes.forms import (ComissaoForm, ComposicaoForm,
ParticipacaoCreateForm,
ParticipacaoEditForm,
PautaReuniaoFilterSet, PautaReuniaoForm,
PeriodoForm, ReuniaoForm)
PeriodoForm, ReuniaoForm, PresencaReuniaoComissaoForm)
from sapl.crud.base import (Crud, CrudAux, MasterDetailCrud,
PermissionRequiredForAppCrudMixin, RP_DETAIL,
RP_LIST)
@ -31,8 +31,9 @@ from sapl.materia.models import (MateriaEmTramitacao, MateriaLegislativa,
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)
@ -224,6 +225,11 @@ class ReuniaoCrud(MasterDetailCrud):
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)
@ -421,6 +427,75 @@ class DocumentoAcessorioCrud(MasterDetailCrud):
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 = []

1
sapl/rules/map_rules.py

@ -110,6 +110,7 @@ rules_group_comissoes = {
(materia.Relatoria, __base__, __perms_publicas__),
(comissoes.Reuniao, __base__, __perms_publicas__),
(comissoes.DocumentoAcessorio, __base__, __perms_publicas__),
(comissoes.PresencaReuniaoComissao, __base__, __perms_publicas__),
]
}

85
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 %}
<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
sapl/templates/comissoes/reuniao_detail.html

@ -56,4 +56,17 @@
{% 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 %}

Loading…
Cancel
Save