Repository: interlegis/sapl

Issue:
Problemas para excluir TipoExpediente
<!--- Forneça um resumo geral da _issue_ no título acima -->

## Comportamento Esperado
<!--- Se você está descrevendo um _bug_, conte-nos o que deveria acontecer. -->
<!--- Se você está sugerindo uma mudança/melhoria, conte-nos como deve funcionar. -->
Espera-se que TipoExpediente possa ser excluído caso seja referenciado apenas por Sessões nas quais ele esteja com conteúdo vazio.

## Comportamento Atual
<!--- Se está descrevendo um bug, conte-nos o que acontece em vez do comportamento esperado. -->
<!--- Se está sugerindo uma mudança/melhoria, explique a diferença com o comportamento atual. -->
TipoExpediente não pode ser excluído mesmo se for referenciado só por conteúdo vazio em todas as Sessão Plenária.

## Possível Solução
<!--- Não é obrigatório, mas sugira uma possível correção/razão para o bug -->
<!--- ou ideias de como implementar a adição/mudança. -->
Remover as referências às Sessões antes de excluir o TipoExpediente, caso seja o caso de exclui-lo.

## Contexto
<!--- Como esse problema o afeta? O que você está tentando realizar? -->
<!--- Fornecer o contexto nos ajuda a encontrar uma solução que seja mais útil no mundo real -->
Foi relatado um problema semelhante por um usuário no OSTicket.

## Imagens do Ocorrido
<!--- Representação visual em vídeo ou imagem do ocorrido -->
<!--- Se está descrevendo um bug poste imagens ou vídeos na repordução do bug citado, caso se aplique -->
![Captura de tela de 2019-06-17 11-32-47](https://user-images.githubusercontent.com/20192488/59612625-c8b0e680-90f3-11e9-8d0f-f5e806162c7e.png)

![Captura de tela de 2019-06-17 11-32-53](https://user-images.githubusercontent.com/20192488/59612621-c6e72300-90f3-11e9-80ee-840a12a9cb9b.png)


## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_):3.1.157-RC5



Discussion:

Resolving patch:
diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
--- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
+++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
@@ -203,13 +203,14 @@ def expedientes(lst_expedientes):
         tmp += '\t\t\t<font color="white"> </font>\n'
         tmp += '\t\t</para>\n'
         for expediente in lst_expedientes:
-            tmp += '\t\t<para style="P2"><b>' + '<br/> ' + \
-                expediente['nom_expediente'] + ': </b></para>\n' + \
-                '<para style="P3">' + \
-                expediente['txt_expediente'] + '</para>\n'
-            tmp += '\t\t<para style="P2">\n'
-            tmp += '\t\t\t<font color="white"> </font>\n'
-            tmp += '\t\t</para>\n'
+            if expediente['txt_expediente']:
+                tmp += '\t\t<para style="P2"><b>' + '<br/> ' + \
+                    expediente['nom_expediente'] + ': </b></para>\n' + \
+                    '<para style="P3">' + \
+                    expediente['txt_expediente'] + '</para>\n'
+                tmp += '\t\t<para style="P2">\n'
+                tmp += '\t\t\t<font color="white"> </font>\n'
+                tmp += '\t\t</para>\n'
     return tmp
 
 
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -53,7 +53,6 @@
 
 
 TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria')
-TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente')
 TipoJustificativaCrud = CrudAux.build(TipoJustificativa, 'tipo_justificativa')
 CargoBancadaCrud = CrudAux.build(CargoBancada, '')
 TipoResultadoVotacaoCrud = CrudAux.build(
@@ -467,6 +466,23 @@ def get_presencas_generic(model, sessao, legislatura):
             yield (m.parlamentar, False)
 
 
+class TipoExpedienteCrud(CrudAux):
+    model = TipoExpediente
+
+    class DeleteView(CrudAux.DeleteView):
+        
+        def delete(self, *args, **kwargs):
+            self.object = self.get_object()
+            
+            # Se todas as referências a este tipo forem de conteúdo vazio, 
+            # significa que pode ser apagado
+            if self.object.expedientesessao_set.filter(conteudo='').count() == \
+                self.object.expedientesessao_set.all().count():
+                self.object.expedientesessao_set.all().delete()
+
+            return CrudAux.DeleteView.delete(self, *args, **kwargs)
+
+
 class MateriaOrdemDiaCrud(MasterDetailCrud):
     model = OrdemDia
     parent_field = 'sessao_plenaria'


Test patch: