Browse Source

Fix #2989 adicionado presenca em reunioes

pull/3034/head
ricardocanela 6 years ago
parent
commit
c42bfc70b1
  1. 4
      sapl/comissoes/forms.py
  2. 30
      sapl/comissoes/migrations/0022_presencareuniao.py
  3. 19
      sapl/comissoes/migrations/0023_auto_20191031_1232.py
  4. 12
      sapl/comissoes/models.py
  5. 4
      sapl/comissoes/urls.py
  6. 81
      sapl/comissoes/views.py
  7. 19
      sapl/sessao/migrations/0049_auto_20191031_1231.py
  8. 19
      sapl/sessao/migrations/0050_auto_20191031_1232.py
  9. 85
      sapl/templates/comissoes/presenca.html
  10. 13
      sapl/templates/comissoes/reuniao_detail.html

4
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)

30
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'],
},
),
]

19
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'},
),
]

12
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,

4
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<pk>\d+)/presenca$',
PresencaView.as_view(), name='presenca'),
]

81
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 <small>(%s)</small>' % (
_('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

19
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'},
),
]

19
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'},
),
]

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