From 9d2a42c49c0582bfe433a1747f10643df8c2639b Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Fri, 14 Jul 2017 11:05:02 -0300 Subject: [PATCH] Finaliza a filtragem por tipo de autor --- sapl/materia/urls.py | 5 ++ sapl/materia/views.py | 69 +++++++++++++++++++----- sapl/templates/materia/autoria_form.html | 14 +++++ 3 files changed, 76 insertions(+), 12 deletions(-) diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index 600fadfc6..3b2cd4211 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -21,6 +21,7 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, TipoFimRelatoriaCrud, TipoMateriaCrud, TipoProposicaoCrud, TramitacaoCrud, TramitacaoEmLoteView, UnidadeTramitacaoCrud, + atualizar_autores, proposicao_texto, recuperar_materia) from .apps import AppConfig @@ -41,6 +42,10 @@ urlpatterns_materia = [ RelatoriaCrud.get_urls() + DocumentoAcessorioCrud.get_urls())), + url(r'^materia/autoria/atualizar-autores$', + atualizar_autores, + name='atualizar_autores'), + url(r'^materia/(?P[0-9]+)/create_simplificado$', CriarProtocoloMateriaView.as_view(), name='materia_create_simplificado'), diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 479abcbbd..21d3d9cd7 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1147,33 +1147,63 @@ def filtra_ativos(content_type, materia): def autores_ativos(materia, tipo=None): + """ + :param materia: é a matéria para na qual a Autoria será inserida + :param tipo: é o tipo de autor que foi selecionado + :return: Lista dos autores ativos disponíveis para serem inseridos + na matéria em questão. + Primeiramente são inseridos em uma lista uma tupla relacionando + cada TipoAutor ao seu ContentType. Posteriormente, para cada elemento + dessa lista são filtrados os autores ativos para aquele ContentType e, + por convêniencia, inseridos em um dicionário no qual a chave é o id + do TipoAutor. Após isso, com a chave 'others' são inseridos os Autores + os quais seu TipoAutor não possui ContentType. + """ + content_types_list = [] for ta in TipoAutor.objects.all(): if ta.content_type: - content_types_list.append(ta.content_type) + content_types_list.append((ta.content_type, ta)) autores_by_ct = {} - for ct in content_types_list: - autores_by_ct[str(ct.id)] = filtra_ativos(ct, materia) + for ct, ta in content_types_list: + autores_by_ct[str(ta.id)] = filtra_ativos(ct, materia) - if not tipo: - autor_qs = Autor.objects.none() - for key in autores_by_ct: - autor_qs = autor_qs | autores_by_ct[key] + autor_qs = Autor.objects.none() + for key in autores_by_ct: + autor_qs = autor_qs | autores_by_ct[key] - autores_by_ct['others'] = Autor.objects.exclude( - content_type__in=content_types_list).order_by( - 'nome' - ) + ct_list = [c[0] for c in content_types_list] + autores_by_ct['others'] = Autor.objects.exclude( + content_type__in=ct_list).order_by( + 'nome' + ) + if not tipo: return (autor_qs | autores_by_ct['others']).order_by('nome') else: + if not tipo in autores_by_ct: + tipo = 'others' + return autores_by_ct[tipo].order_by('nome') def atualizar_autores(request): - pass + if ('tipo_autor' in request.GET and 'materia_id' in request.GET and + request.GET['tipo_autor'] and request.GET['materia_id']): + tipo_autor = request.GET['tipo_autor'] + materia_id = int(request.GET['materia_id']) + + try: + materia = MateriaLegislativa.objects.get(id=materia_id) + except ObjectDoesNotExist: + autores = [] + else: + autores = autores_ativos(materia, tipo=tipo_autor) + autores_list = [(a.id, a.__str__()) for a in autores] + + return JsonResponse({'lista_autores': autores_list}) class AutoriaCrud(MasterDetailCrud): @@ -1211,6 +1241,21 @@ class AutoriaCrud(MasterDetailCrud): def layout_key(self): return 'AutoriaUpdate' + def get_context_data(self, **kwargs): + context = super(UpdateView, self).get_context_data(**kwargs) + + materia = MateriaLegislativa.objects.get( + id=int(kwargs['root_pk'])) + + autores_ativos_list = autores_ativos(materia) + + autores = [] + for a in autores_ativos_list: + autores.append([a.id, a.__str__()]) + + context['form'].fields['autor'].choices = autores + return context + class DespachoInicialCrud(MasterDetailCrud): model = DespachoInicial diff --git a/sapl/templates/materia/autoria_form.html b/sapl/templates/materia/autoria_form.html index 6fcbc4c6e..b37de27db 100644 --- a/sapl/templates/materia/autoria_form.html +++ b/sapl/templates/materia/autoria_form.html @@ -11,10 +11,24 @@ var tipo_autor = $("#id_tipo_autor").val(); var materia_id = {{ root_pk }} + // Limpa a listagem para atualizar + $("#id_autor").find("option").remove(); + $.get("/materia/autoria/atualizar-autores", {tipo_autor: tipo_autor, materia_id: materia_id}, function(data) { + // Caso não venha nenhum dado da requisição, retorna null + if ($.isEmptyObject(data)){ + return null + } + lista_autores = data['lista_autores']; + // Atualiza a listagem de autores + for (i = 0; i < lista_autores.length; i++) { + $('#id_autor').append( + ''); + } }); } $("#id_tipo_autor").change(function () {