From a7ed403bc08729de84c55ef4585b404d0752f045 Mon Sep 17 00:00:00 2001 From: eduardocalil Date: Tue, 9 May 2017 12:54:20 -0300 Subject: [PATCH] Fix #1012 bug mesa diretora (#1022) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Inicia o bug fix * Refatora funcionalidades de inserção e remoção * Lança os possíveis erros para o usuário na tela * Otimiza o codigo --- sapl/parlamentares/urls.py | 17 +- sapl/parlamentares/views.py | 235 ++++++----- sapl/static/js/app.js | 17 + .../parlamentares/composicaomesa_form.html | 371 ++++++++++++++---- 4 files changed, 463 insertions(+), 177 deletions(-) diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py index 1d9885053..29a31adfb 100644 --- a/sapl/parlamentares/urls.py +++ b/sapl/parlamentares/urls.py @@ -1,14 +1,18 @@ from django.conf.urls import include, url -from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud, +from sapl.parlamentares.views import (altera_field_mesa, + CargoMesaCrud, ColigacaoCrud, ComposicaoColigacaoCrud, DependenteCrud, FiliacaoCrud, FrenteCrud, FrenteList, - LegislaturaCrud, MandatoCrud, + LegislaturaCrud, + insere_parlamentar_composicao, + MandatoCrud, MesaDiretoraView, NivelInstrucaoCrud, ParlamentarCrud, ParticipacaoParlamentarCrud, PartidoCrud, ProposicaoParlamentarCrud, RelatoriaParlamentarCrud, + remove_parlamentar_composicao, SessaoLegislativaCrud, TipoAfastamentoCrud, TipoDependenteCrud, TipoMilitarCrud, VotanteView) @@ -51,4 +55,13 @@ urlpatterns = [ url(r'^mesa-diretora/$', MesaDiretoraView.as_view(), name='mesa_diretora'), + + url(r'^mesa-diretora/altera-field-mesa/$', + altera_field_mesa, name='altera_field_mesa'), + + url(r'^mesa-diretora/insere-parlamentar-composicao/$', + insere_parlamentar_composicao, name='insere_parlamentar_composicao'), + + url(r'^mesa-diretora/remove-parlamentar-composicao/$', + remove_parlamentar_composicao, name='remove_parlamentar_composicao'), ] diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index afbe80ed0..3c6ac630a 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -2,6 +2,7 @@ from django.contrib import messages from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.core.urlresolvers import reverse, reverse_lazy from django.db.models import F, Q +from django.http import JsonResponse from django.http.response import HttpResponseRedirect from django.utils.datastructures import MultiValueDictKeyError from django.utils.translation import ugettext_lazy as _ @@ -434,6 +435,11 @@ class MesaDiretoraView(FormView): [p.parlamentar for p in parlamentares]) - set( parlamentares_ocupados)) + # Se todos os cargos estiverem ocupados, a listagem de parlamentares + # deve ser renderizada vazia + if not cargos_vagos: + parlamentares_vagos = [] + return self.render_to_response( {'legislaturas': Legislatura.objects.all( ).order_by('-numero'), @@ -447,107 +453,138 @@ class MesaDiretoraView(FormView): 'cargos_vagos': cargos_vagos }) - def existe_membro_mesa(self, sessao_plenaria, cargo): - return ComposicaoMesa.objects.filter( - sessao_legislativa_id=sessao_plenaria.id, - # parlamentar_id = integrante.parlamentar_id, - cargo_id=cargo.id - ).exists() - - def post(self, request, *args, **kwargs): - - if (not Legislatura.objects.exists() or - not SessaoLegislativa.objects.exists()): - return self.validation(request) - - if 'Incluir' in request.POST and request.user.has_perm( - '%s.add_%s' % ( - AppConfig.label, ComposicaoMesa._meta.model_name)): - - composicao = ComposicaoMesa() - - try: - composicao.sessao_legislativa = SessaoLegislativa.objects.get( - id=int(request.POST['sessao'])) - except MultiValueDictKeyError: - messages.error(request, _( - 'Nenhuma sessão foi inserida!')) - return self.get(request) - - try: - composicao.parlamentar = Parlamentar.objects.get( - id=int(request.POST['parlamentar'])) - except MultiValueDictKeyError: - messages.error(request, _( - 'Nenhum parlamentar foi inserido!')) - return self.get(request) - try: - composicao.cargo = CargoMesa.objects.get( - id=int(request.POST['cargo'])) - if self.existe_membro_mesa(composicao.sessao_legislativa, - composicao.cargo): - messages.error(request, _('Parlamentar já inserido!')) - return self.get(request) - - composicao.save() - except MultiValueDictKeyError: - messages.error(request, _( - 'Nenhum cargo foi inserido!')) - return self.get(request) - - messages.success(request, _( - 'Parlamentar adicionado com sucesso!')) - - elif 'Excluir' in request.POST and request.user.has_perm( - '%s.delete_%s' % ( - AppConfig.label, ComposicaoMesa._meta.model_name)): +def altera_field_mesa(request): + """ + Essa função lida com qualquer alteração nos campos + da Mesa Diretora, após qualquer + operação (Legislatura/Sessão/Inclusão/Remoção), + atualizando os campos após cada alteração + """ + + legislatura = request.GET['legislatura'] + sessoes = SessaoLegislativa.objects.filter( + legislatura=legislatura).order_by('-data_inicio') + + if not sessoes: + return JsonResponse({'msg': ('Nenhuma sessão encontrada!', 0)}) + + # Verifica se já tem uma sessão selecionada. Ocorre quando + # é alterado o campo de sessão ou feita alguma operação + # de inclusão/remoção. + if request.GET['sessao']: + sessao_selecionada = request.GET['sessao'] + # Caso a mudança tenha sido no campo legislatura, a sessão + # atual deve ser a primeira daquela legislatura + else: + sessao_selecionada = SessaoLegislativa.objects.filter( + legislatura=legislatura).order_by( + '-data_inicio').first().id + + # Atualiza os componentes da view após a mudança + composicao_mesa = ComposicaoMesa.objects.filter( + sessao_legislativa=sessao_selecionada) + + cargos_ocupados = [m.cargo for m in composicao_mesa] + cargos = CargoMesa.objects.all() + cargos_vagos = list(set(cargos) - set(cargos_ocupados)) + + parlamentares = Legislatura.objects.get( + id=legislatura).mandato_set.all() + parlamentares_ocupados = [m.parlamentar for m in composicao_mesa] + parlamentares_vagos = list( + set( + [p.parlamentar for p in parlamentares]) - set( + parlamentares_ocupados)) + + lista_sessoes = [(s.id, s.__str__()) for s in sessoes] + lista_composicao = [(c.id, c.parlamentar.__str__(), + c.cargo.__str__()) for c in composicao_mesa] + lista_parlamentares = [( + p.id, p.__str__()) for p in parlamentares_vagos] + lista_cargos = [(c.id, c.__str__()) for c in cargos_vagos] + + return JsonResponse( + {'lista_sessoes': lista_sessoes, + 'lista_composicao': lista_composicao, + 'lista_parlamentares': lista_parlamentares, + 'lista_cargos': lista_cargos, + 'sessao_selecionada': sessao_selecionada, + 'msg': ('', 1)}) + + +def insere_parlamentar_composicao(request): + """ + Essa função lida com qualquer operação de inserção + na composição da Mesa Diretora + """ + + if request.user.has_perm( + '%s.add_%s' % ( + AppConfig.label, ComposicaoMesa._meta.model_name)): + + composicao = ComposicaoMesa() + + try: + composicao.sessao_legislativa = SessaoLegislativa.objects.get( + id=int(request.POST['sessao'])) + except MultiValueDictKeyError: + return JsonResponse({'msg': ('Nenhuma sessão foi inserida!', 0)}) + + try: + composicao.parlamentar = Parlamentar.objects.get( + id=int(request.POST['parlamentar'])) + except MultiValueDictKeyError: + return JsonResponse({ + 'msg': ('Nenhum parlamentar foi inserido!', 0)}) + + try: + composicao.cargo = CargoMesa.objects.get( + id=int(request.POST['cargo'])) + parlamentar_ja_inserido = ComposicaoMesa.objects.filter( + sessao_legislativa_id=composicao.sessao_legislativa.id, + cargo_id=composicao.cargo.id).exists() + + if parlamentar_ja_inserido: + return JsonResponse({'msg': ('Parlamentar já inserido!', 0)}) + + composicao.save() + + except MultiValueDictKeyError: + return JsonResponse({'msg': ('Nenhum cargo foi inserido!', 0)}) + + return JsonResponse({'msg': ('Parlamentar inserido com sucesso!', 1)}) + + else: + return JsonResponse( + {'msg': ('Você não tem permissão para esta operação!', 0)}) + + +def remove_parlamentar_composicao(request): + """ + Essa função lida com qualquer operação de remoção + na composição da Mesa Diretora + """ + + if request.POST and request.user.has_perm( + '%s.delete_%s' % ( + AppConfig.label, ComposicaoMesa._meta.model_name)): if 'composicao_mesa' in request.POST: - ids = request.POST['composicao_mesa'].split(':') - composicao = ComposicaoMesa.objects.get( - sessao_legislativa_id=int(request.POST['sessao']), - parlamentar_id=int(ids[0]), - cargo_id=int(ids[1]) - ) - composicao.delete() - messages.success(request, _( - 'Parlamentar excluido com sucesso!')) - else: - messages.error(request, _( - 'Selecione um parlamentar para ser excluido!')) - - mesa = ComposicaoMesa.objects.filter( - sessao_legislativa=request.POST['sessao']) - - cargos_ocupados = [m.cargo for m in mesa] - cargos = CargoMesa.objects.all() - cargos_vagos = list(set(cargos) - set(cargos_ocupados)) - - parlamentares = Legislatura.objects.get( - id=int(request.POST['legislatura'])).mandato_set.all() - parlamentares_ocupados = [m.parlamentar for m in mesa] - parlamentares_vagos = list( - set( - [p.parlamentar for p in parlamentares]) - set( - parlamentares_ocupados)) - - sessao_sel = SessaoLegislativa.objects.get( - id=int(request.POST['sessao'])) + try: + composicao = ComposicaoMesa.objects.get( + id=request.POST['composicao_mesa']) + except ObjectDoesNotExist: + return JsonResponse( + {'msg': ( + 'Composição da Mesa não pôde ser removida!', 0)}) - if str(sessao_sel.legislatura_id) != request.POST['legislatura']: - sessao_sel = SessaoLegislativa.objects.filter( - legislatura=Legislatura.objects.first()).first() + composicao.delete() - return self.render_to_response( - {'legislaturas': Legislatura.objects.all( - ).order_by('-numero'), - 'legislatura_selecionada': Legislatura.objects.get( - id=int(request.POST['legislatura'])), - 'sessoes': SessaoLegislativa.objects.filter( - legislatura_id=int(request.POST['legislatura'])), - 'sessao_selecionada': sessao_sel, - 'composicao_mesa': mesa, - 'parlamentares': parlamentares_vagos, - 'cargos_vagos': cargos_vagos - }) + return JsonResponse( + {'msg': ( + 'Parlamentar excluido com sucesso!', 1)}) + else: + return JsonResponse( + {'msg': ( + 'Selecione algum parlamentar para ser excluido!', 0)}) diff --git a/sapl/static/js/app.js b/sapl/static/js/app.js index d96090f5e..bbb54171a 100644 --- a/sapl/static/js/app.js +++ b/sapl/static/js/app.js @@ -217,3 +217,20 @@ $(document).ready(function(){ OptionalCustomFrontEnd(); }); + + +function getCookie(name) { + var cookieValue = null; + if (document.cookie && document.cookie !== '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) === (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; +} \ No newline at end of file diff --git a/sapl/templates/parlamentares/composicaomesa_form.html b/sapl/templates/parlamentares/composicaomesa_form.html index af261facc..855313442 100644 --- a/sapl/templates/parlamentares/composicaomesa_form.html +++ b/sapl/templates/parlamentares/composicaomesa_form.html @@ -8,82 +8,301 @@ {{legislatura_selecionada}} não possui nenhuma Sessão Legislativa cadastrada.
Clique aqui para cadastrar uma nova. + {% else %} -
- {% csrf_token %} -
- Escolha da Legislatura e da Sessão Legislativa -
-
- - -
-
- - -
-
-
-
-
- Escolha da Composição da Mesa Diretora -
-
- - -
- -
-

- {% if cargos_vagos %} - {% if perms.parlamentares.add_cargomesa %} - - {% endif %} - {% endif %} -
-
- {% if perms.parlamentares.add_composicaomesa %} - - {% endif %} -
- - {% if cargos_vagos %} -
- - -
- -
- {% endif %} - -
-
-
+ + + + +
+ Escolha da Legislatura e da Sessão Legislativa +
+
+ + +
+
+ + +
+
+
+
+
+ Escolha da Composição da Mesa Diretora +
+
+ + +
+ +
+

+ {% if perms.parlamentares.add_cargomesa %} + + {% endif %} +
+
+ {% if perms.parlamentares.add_composicaomesa %} + + {% endif %} +
+ +
+ + +
+ +
+ +
+
{% endif %} {% endblock detail_content %} + + +{% block extra_js %} + + + +{% endblock %}