Repository: interlegis/sapl

Issue:
Pautas das Sessões / PDF
<!--- Forneça um resumo geral da _issue_ no título acima -->

## Comportamento Esperado
Que aparece os campos somente quando for preenchido

## Comportamento Atual

Campos não preenchidos poluem tanto a tela com campos vazios tanto no PDF

## Imagens do Ocorrido
![pauta](https://user-images.githubusercontent.com/1524415/81636128-63d83c00-93e9-11ea-8850-deb69b04d9b2.png)

![pautapdf](https://user-images.githubusercontent.com/1524415/81636135-676bc300-93e9-11ea-8817-9db0092556ea.png)



## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_): 3.1.160




Discussion:

Resolving patch:
diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -498,37 +498,36 @@ def remove_html_comments(text):
     return clean_text if len(clean_text) > 0 else text
 
 
+def is_empty(value):
+    if not value:
+        return True
+
+    txt = re.sub(r'\s+|<br.*/>|\n|&nbsp;', '', value)
+
+    return True if not txt.strip() else False
+
+
 def get_sessao_plenaria(sessao, casa):
-    inf_basicas_dic = {}
-    inf_basicas_dic["num_sessao_plen"] = str(sessao.numero)
-    inf_basicas_dic["nom_sessao"] = sessao.tipo.nome
-    inf_basicas_dic["num_legislatura"] = str(sessao.legislatura)
-    inf_basicas_dic["num_sessao_leg"] = sessao.sessao_legislativa.numero
-    inf_basicas_dic["dat_inicio_sessao"] = sessao.data_inicio.strftime(
-        "%d/%m/%Y")
-    inf_basicas_dic["hr_inicio_sessao"] = sessao.hora_inicio
-    if sessao.data_fim:
-        inf_basicas_dic["dat_fim_sessao"] = \
-            sessao.data_fim.strftime("%d/%m/%Y")
-    else:
-        inf_basicas_dic["dat_fim_sessao"] = ''
-    inf_basicas_dic["hr_fim_sessao"] = sessao.hora_fim
-    inf_basicas_dic["nom_camara"] = casa.nome
+    inf_basicas_dic = {
+        "num_sessao_plen": str(sessao.numero),
+        "nom_sessao": sessao.tipo.nome,
+        "num_legislatura": str(sessao.legislatura),
+        "num_sessao_leg": sessao.sessao_legislativa.numero,
+        "dat_inicio_sessao": sessao.data_inicio.strftime("%d/%m/%Y"),
+        "hr_inicio_sessao": sessao.hora_inicio,
+        "dat_fim_sessao": sessao.data_fim.strftime("%d/%m/%Y") if sessao.data_fim else '',
+        "hr_fim_sessao": sessao.hora_fim,
+        "nom_camara": casa.nome
+    }
 
     if sessao.tipo.nome == 'Solene':
         inf_basicas_dic["tema_solene"] = sessao.tema_solene
 
     # Conteudo multimidia
-    cont_mult_dic = {}
-    if sessao.url_audio:
-        cont_mult_dic['multimidia_audio'] = str(sessao.url_audio)
-    else:
-        cont_mult_dic['multimidia_audio'] = 'Indisponível'
-
-    if sessao.url_video:
-        cont_mult_dic['multimidia_video'] = str(sessao.url_video)
-    else:
-        cont_mult_dic['multimidia_video'] = 'Indisponível'
+    cont_mult_dic = {
+        "multimidia_audio": str(sessao.url_audio) if sessao.url_audio else "Indisponível",
+        "multimidia_video": str(sessao.url_video) if sessao.url_video else "Indisponível"
+    }
 
     # Lista da composicao da mesa diretora
     lst_mesa = []
@@ -537,104 +536,84 @@ def get_sessao_plenaria(sessao, casa):
                                             .order_by('cargo_id'):
         partido_sigla = Filiacao.objects.filter(parlamentar=composicao.parlamentar).first()
         sigla = '' if not partido_sigla else partido_sigla.partido.sigla
-        dic_mesa = {
+        lst_mesa.append({
             'nom_parlamentar': composicao.parlamentar.nome_parlamentar,
             'sgl_partido': sigla,
             'des_cargo': composicao.cargo.descricao
-        }
-        lst_mesa.append(dic_mesa)
+        })
 
     # Lista de presença na sessão
     lst_presenca_sessao = []
-    presenca = SessaoPlenariaPresenca.objects.filter(
-        sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar')
-
+    presenca = SessaoPlenariaPresenca.objects.filter(sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar')
     for parlamentar in [p.parlamentar for p in presenca]:
-        dic_presenca = {}
-        dic_presenca["nom_parlamentar"] = parlamentar.nome_parlamentar
-        partido_sigla = filiacao_data(parlamentar, sessao.data_inicio)
-
-        dic_presenca['sgl_partido'] = partido_sigla
-        lst_presenca_sessao.append(dic_presenca)
+        lst_presenca_sessao.append({
+            "nom_parlamentar": parlamentar.nome_parlamentar,
+            "sgl_partido": filiacao_data(parlamentar, sessao.data_inicio)
+        })
 
     # Lista de ausencias na sessão
     lst_ausencia_sessao = []
-    ausencia = JustificativaAusencia.objects.filter(
-        sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar')
+    ausencia = JustificativaAusencia.objects.filter(sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar')
     for ausente in ausencia:
-        dic_ausencia = {}
-        dic_ausencia['parlamentar'] = ausente.parlamentar
-        dic_ausencia['justificativa'] = ausente.tipo_ausencia
-        if ausente.ausencia == 1:
-            dic_ausencia['tipo'] = 'Matéria'
-        else:
-            dic_ausencia['tipo'] = 'Sessão'
-
-        lst_ausencia_sessao.append(dic_ausencia)
+        lst_ausencia_sessao.append({
+            "parlamentar": ausente.parlamentar,
+            "justificativa": ausente.tipo_ausencia,
+            "tipo": "Matéria" if ausente.ausencia == 1 else "Sessão"
+        })
 
     # Exibe os Expedientes
     lst_expedientes = []
-    expedientes = ExpedienteSessao.objects.filter(
-        sessao_plenaria=sessao).order_by('tipo__nome')
-
+    expedientes = ExpedienteSessao.objects.filter(sessao_plenaria=sessao).order_by('tipo__nome')
     for e in expedientes:
-        dic_expedientes = {}
-        dic_expedientes["nom_expediente"] = e.tipo.nome
         conteudo = e.conteudo
+        if not is_empty(conteudo):
+            # unescape HTML codes
+            # https://github.com/interlegis/sapl/issues/1046
+            conteudo = re.sub('style=".*?"', '', conteudo)
+            conteudo = re.sub('class=".*?"', '', conteudo)
+            conteudo = re.sub('align=".*?"', '', conteudo)  # OSTicket Ticket #796450
+            conteudo = re.sub('<p\s+>', '<p>', conteudo)
+            conteudo = re.sub('<br\s+/>', '<br/>', conteudo)  # OSTicket Ticket #796450
+            conteudo = html.unescape(conteudo)
+
+            # escape special character '&'
+            #   https://github.com/interlegis/sapl/issues/1009
+            conteudo = conteudo.replace('&', '&amp;')
+
+            # https://github.com/interlegis/sapl/issues/2386
+            conteudo = remove_html_comments(conteudo)
+
+            dic_expedientes = {
+                "nom_expediente": e.tipo.nome,
+                "txt_expediente": conteudo
+            }
 
-        # unescape HTML codes
-        # https://github.com/interlegis/sapl/issues/1046
-        conteudo = re.sub('style=".*?"', '', conteudo)
-        conteudo = re.sub('class=".*?"', '', conteudo)
-        conteudo = re.sub('align=".*?"', '', conteudo)  # OSTicket Ticket #796450
-        conteudo = re.sub('<p\s+>', '<p>', conteudo)
-        conteudo = re.sub('<br\s+/>', '<br/>', conteudo)  # OSTicket Ticket #796450
-        conteudo = html.unescape(conteudo)
-
-        # escape special character '&'
-        #   https://github.com/interlegis/sapl/issues/1009
-        conteudo = conteudo.replace('&', '&amp;')
-
-        # https://github.com/interlegis/sapl/issues/2386
-        conteudo = remove_html_comments(conteudo)
-
-        dic_expedientes["txt_expediente"] = conteudo
-
-        if dic_expedientes:
             lst_expedientes.append(dic_expedientes)
 
     # Lista das matérias do Expediente, incluindo o resultado das votacoes
     lst_expediente_materia = []
-    for expediente_materia in ExpedienteMateria.objects.filter(
-            sessao_plenaria=sessao):
+    for expediente_materia in ExpedienteMateria.objects.filter(sessao_plenaria=sessao):
         # seleciona os detalhes de uma matéria
         materia = expediente_materia.materia
-        dic_expediente_materia = {}
-        dic_expediente_materia["num_ordem"] = expediente_materia.numero_ordem
-        dic_expediente_materia["id_materia"] = (materia.tipo.sigla + ' ' +
-                                                materia.tipo.descricao + ' ' +
-                                                str(materia.numero) + '/' +
-                                                str(materia.ano))
-        dic_expediente_materia["des_numeracao"] = ' '
+        dic_expediente_materia = {
+            "num_ordem": expediente_materia.numero_ordem,
+            "id_materia": "{} {} {}/{}".format(materia.tipo.sigla, materia.tipo.descricao, str(materia.numero),
+                                               str(materia.ano)),
+            "des_numeracao": ' ',
+            "des_turno": get_turno(materia)[0],
+            "txt_ementa": str(materia.ementa),
+            "ordem_observacao": expediente_materia.observacao,
+            "nom_resultado": '',
+            "nom_autor": '',
+            "votacao_observacao": ' '
+        }
 
-        numeracao = Numeracao.objects.filter(
-            materia=expediente_materia.materia).first()
+        numeracao = Numeracao.objects.filter(materia=expediente_materia.materia).first()
         if numeracao:
-            dic_expediente_materia["des_numeracao"] = (
-                    str(numeracao.numero_materia) + '/' + str(
-                numeracao.ano_materia))
-
-        turno, _ = get_turno(materia)
-
-        dic_expediente_materia["des_turno"] = turno
-        dic_expediente_materia["txt_ementa"] = str(materia.ementa)
-        dic_expediente_materia["ordem_observacao"] = expediente_materia.observacao
-        dic_expediente_materia["nom_resultado"] = ''
+            dic_expediente_materia["des_numeracao"] = (str(numeracao.numero_materia) + '/' + str(numeracao.ano_materia))
 
-        dic_expediente_materia["nom_autor"] = ''
         autoria = materia.autoria_set.all()
-        dic_expediente_materia['num_autores'] = 'Autores' if len(
-            autoria) > 1 else 'Autor'
+        dic_expediente_materia['num_autores'] = 'Autores' if len(autoria) > 1 else 'Autor'
         if autoria:
             for a in autoria:
                 if a.autor.nome:
@@ -643,25 +622,25 @@ def get_sessao_plenaria(sessao, casa):
         else:
             dic_expediente_materia["nom_autor"] = 'Desconhecido'
 
-        dic_expediente_materia["votacao_observacao"] = ' '
         resultados = expediente_materia.registrovotacao_set.all()
         if resultados:
             for i in resultados:
-                dic_expediente_materia["nom_resultado"] = (
-                    i.tipo_resultado_votacao.nome)
-                dic_expediente_materia["votacao_observacao"] = (
-                    i.observacao)
+                dic_expediente_materia.update({
+                    "nom_resultado": i.tipo_resultado_votacao.nome,
+                    "votacao_observacao": i.observacao
+                })
         else:
-            dic_expediente_materia["nom_resultado"] = 'Matéria não votada'
-            dic_expediente_materia["votacao_observacao"] = ' '
+            dic_expediente_materia.update({
+                "nom_resultado": 'Matéria não votada',
+                "votacao_observacao": ' '
+            })
         lst_expediente_materia.append(dic_expediente_materia)
 
     # Lista dos votos nominais das matérias do Expediente
     lst_expediente_materia_vot_nom = []
 
-    materias_expediente_votacao_nominal = ExpedienteMateria.objects.filter(
-        sessao_plenaria=sessao,
-        tipo_votacao=2).order_by('-materia')
+    materias_expediente_votacao_nominal = ExpedienteMateria.objects.filter(sessao_plenaria=sessao,tipo_votacao=2)\
+                                                                   .order_by('-materia')
 
     for mevn in materias_expediente_votacao_nominal:
         votos_materia = []
@@ -672,79 +651,61 @@ def get_sessao_plenaria(sessao, casa):
             for vp in VotoParlamentar.objects.filter(votacao=registro).order_by('parlamentar'):
                 votos_materia.append(vp)
 
-        dic_expediente_materia_vot_nom = {
-            'titulo': titulo_materia,
-            'votos': votos_materia
-        }
-        lst_expediente_materia_vot_nom.append(dic_expediente_materia_vot_nom)
+        lst_expediente_materia_vot_nom.append({
+            "titulo": titulo_materia,
+            "votos": votos_materia
+        })
 
     # Lista dos oradores do Expediente
     lst_oradores_expediente = []
-    for orador_expediente in OradorExpediente.objects.filter(
-            sessao_plenaria=sessao).order_by('numero_ordem'):
-        parlamentar = Parlamentar.objects.get(
-            id=orador_expediente.parlamentar.id)
-        dic_oradores_expediente = {}
-        dic_oradores_expediente["num_ordem"] = (
-            orador_expediente.numero_ordem)
-        dic_oradores_expediente["nom_parlamentar"] = (
-            parlamentar.nome_parlamentar)
-        dic_oradores_expediente["observacao"] = (
-            orador_expediente.observacao)
-        partido_sigla = Filiacao.objects.filter(
-            parlamentar=parlamentar).first()
-        if not partido_sigla:
-            sigla = ''
-        else:
-            sigla = partido_sigla.partido.sigla
-        dic_oradores_expediente['sgl_partido'] = sigla
-        lst_oradores_expediente.append(dic_oradores_expediente)
+    for orador_expediente in OradorExpediente.objects.filter(sessao_plenaria=sessao).order_by('numero_ordem'):
+        parlamentar = Parlamentar.objects.get(id=orador_expediente.parlamentar.id)
+        partido_sigla = Filiacao.objects.filter(parlamentar=parlamentar).first()
+        lst_oradores_expediente.append({
+            "num_ordem": orador_expediente.numero_ordem,
+            "nom_parlamentar": parlamentar.nome_parlamentar,
+            "observacao": orador_expediente.observacao,
+            "sgl_partido": "" if not partido_sigla else partido_sigla.partido.sigla
+        })
 
     # Lista presença na ordem do dia
     lst_presenca_ordem_dia = []
-    presenca_ordem_dia = PresencaOrdemDia.objects.filter(
-        sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar')
+    presenca_ordem_dia = PresencaOrdemDia.objects.filter(sessao_plenaria=sessao)\
+                                                 .order_by('parlamentar__nome_parlamentar')
     for parlamentar in [p.parlamentar for p in presenca_ordem_dia]:
-        dic_presenca_ordem_dia = {}
-        dic_presenca_ordem_dia['nom_parlamentar'] = (
-            parlamentar.nome_parlamentar)
-        sigla = filiacao_data(parlamentar, sessao.data_inicio)
-
-        dic_presenca_ordem_dia['sgl_partido'] = sigla
-        lst_presenca_ordem_dia.append(dic_presenca_ordem_dia)
+        lst_presenca_ordem_dia.append({
+            "nom_parlamentar": parlamentar.nome_parlamentar,
+            "sgl_partido": filiacao_data(parlamentar, sessao.data_inicio)
+        })
 
     # Lista das matérias da Ordem do Dia, incluindo o resultado das votacoes
     lst_votacao = []
-    for votacao in OrdemDia.objects.filter(
-            sessao_plenaria=sessao):
+    for votacao in OrdemDia.objects.filter(sessao_plenaria=sessao):
         # seleciona os detalhes de uma matéria
         materia = votacao.materia
-        dic_votacao = {}
-        dic_votacao["nom_resultado"] = ''
-        dic_votacao["num_ordem"] = votacao.numero_ordem
-        dic_votacao["id_materia"] = (
+        dic_votacao = {
+            "nom_resultado": '',
+            "num_ordem": votacao.numero_ordem,
+            "id_materia": (
                 materia.tipo.sigla + ' ' +
                 materia.tipo.descricao + ' ' +
                 str(materia.numero) + '/' +
-                str(materia.ano))
-        dic_votacao["des_numeracao"] = ' '
+                str(materia.ano)),
+            "des_numeracao": ' '
+        }
 
         numeracao = materia.numeracao_set.first()
         if numeracao:
-            dic_votacao["des_numeracao"] = (
-                    str(numeracao.numero_materia) +
-                    '/' +
-                    str(numeracao.ano_materia))
-
-        turno, _ = get_turno(materia)
-
-        dic_votacao["des_turno"] = turno
-
-        # https://github.com/interlegis/sapl/issues/1009
-        dic_votacao["txt_ementa"] = html.unescape(materia.ementa)
-        dic_votacao["ordem_observacao"] = html.unescape(votacao.observacao)
+            dic_votacao["des_numeracao"] = (str(numeracao.numero_materia) + '/' + str(numeracao.ano_materia))
+
+        dic_votacao.update({
+            "des_turno": get_turno(materia)[0],
+            # https://github.com/interlegis/sapl/issues/1009
+            "txt_ementa": html.unescape(materia.ementa),
+            "ordem_observacao": html.unescape(votacao.observacao),
+            "nom_autor": ''
+        })
 
-        dic_votacao["nom_autor"] = ''
         autoria = materia.autoria_set.all()
         dic_votacao['num_autores'] = 'Autores' if len(autoria) > 1 else 'Autor'
         if autoria:
@@ -769,9 +730,8 @@ def get_sessao_plenaria(sessao, casa):
     # Lista dos votos nominais das matérias da Ordem do Dia
     lst_votacao_vot_nom = []
 
-    materias_ordem_dia_votacao_nominal = OrdemDia.objects.filter(
-        sessao_plenaria=sessao,
-        tipo_votacao=2).order_by('-materia')
+    materias_ordem_dia_votacao_nominal = OrdemDia.objects.filter(sessao_plenaria=sessao, tipo_votacao=2)\
+                                                         .order_by('-materia')
 
     for modvn in materias_ordem_dia_votacao_nominal:
         votos_materia_od = []
@@ -782,63 +742,41 @@ def get_sessao_plenaria(sessao, casa):
             for vp_od in VotoParlamentar.objects.filter(votacao=registro_od).order_by('parlamentar'):
                 votos_materia_od.append(vp_od)
 
-        dic_votacao_vot_nom = {
-            'titulo': t_materia,
-            'votos': votos_materia_od
-        }
-        lst_votacao_vot_nom.append(dic_votacao_vot_nom)
+        lst_votacao_vot_nom.append({
+            "titulo": t_materia,
+            "votos": votos_materia_od
+        })
 
     # Lista dos oradores da Ordem do Dia
     lst_oradores_ordemdia = []
 
-    oradores_ordem_dia = OradorOrdemDia.objects.filter(
-        sessao_plenaria=sessao
-    ).order_by('numero_ordem')
+    oradores_ordem_dia = OradorOrdemDia.objects.filter(sessao_plenaria=sessao).order_by('numero_ordem')
 
     for orador_ordemdia in oradores_ordem_dia:
-        parlamentar_orador = Parlamentar.objects.get(
-            id=orador_ordemdia.parlamentar.id
-        )
-
-        sigla_partido = Filiacao.objects.filter(
-            parlamentar=parlamentar_orador
-        ).first()
-
-        if not sigla_partido:
-            sigla_p = ""
-        else:
-            sigla_p = sigla_partido.partido.sigla
-
-        dic_oradores_ordemdia = {
-            'num_ordem': orador_ordemdia.numero_ordem,
-            'nome_parlamentar': parlamentar_orador.nome_parlamentar,
-            'observacao': orador_ordemdia.observacao,
-            'sigla': sigla_p
-        }
-        lst_oradores_ordemdia.append(dic_oradores_ordemdia)
+        parlamentar_orador = Parlamentar.objects.get(id=orador_ordemdia.parlamentar.id)
+        sigla_partido = Filiacao.objects.filter(parlamentar=parlamentar_orador).first()
+
+        lst_oradores_ordemdia.append({
+            "num_ordem": orador_ordemdia.numero_ordem,
+            "nome_parlamentar": parlamentar_orador.nome_parlamentar,
+            "observacao": orador_ordemdia.observacao,
+            "sigla": "" if not sigla_partido else sigla_partido.partido.sigla
+        })
 
     # Lista dos oradores nas Explicações Pessoais
     lst_oradores = []
-    for orador in Orador.objects.filter(
-            sessao_plenaria=sessao).order_by('numero_ordem'):
-        for parlamentar in Parlamentar.objects.filter(
-                id=orador.parlamentar.id):
-            dic_oradores = {}
-            dic_oradores["num_ordem"] = orador.numero_ordem
-            dic_oradores["nom_parlamentar"] = parlamentar.nome_parlamentar
-            partido_sigla = Filiacao.objects.filter(
-                parlamentar=parlamentar).first()
-            if not partido_sigla:
-                sigla = ''
-            else:
-                sigla = partido_sigla.partido.sigla
-            dic_oradores['sgl_partido'] = sigla
-            lst_oradores.append(dic_oradores)
+    for orador in Orador.objects.select_related('parlamentar').filter(sessao_plenaria=sessao).order_by('numero_ordem'):
+        parlamentar = orador.parlamentar
+        partido_sigla = orador.parlamentar.filiacao_set.select_related('partido', 'parlamentar').first()
+        lst_oradores.append({
+            "num_ordem": orador.numero_ordem,
+            "nom_parlamentar": parlamentar.nome_parlamentar,
+            "sgl_partido": "" if not partido_sigla else partido_sigla.partido.sigla
+        })
 
     # Ocorrências da Sessão
     lst_ocorrencias = []
-    ocorrencias = OcorrenciaSessao.objects.filter(
-        sessao_plenaria=sessao)
+    ocorrencias = OcorrenciaSessao.objects.filter(sessao_plenaria=sessao)
 
     for o in ocorrencias:
         conteudo = o.conteudo
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -3450,11 +3450,13 @@ def get(self, request, *args, **kwargs):
 
         expedientes = []
         for e in expediente:
-            tipo = e.tipo
-            conteudo = sub(
-                '&nbsp;', ' ', e.conteudo)
-            ex = {'tipo': tipo, 'conteudo': conteudo}
-            expedientes.append(ex)
+            conteudo = e.conteudo
+            from sapl.relatorios.views import is_empty
+            if not is_empty(conteudo):
+                tipo = e.tipo
+                conteudo = sub('&nbsp;', ' ', conteudo)
+                ex = {'tipo': tipo, 'conteudo': conteudo}
+                expedientes.append(ex)
 
         context.update({'expedientes': expedientes})
         # =====================================================================


Test patch: