Repository: interlegis/sapl

Issue:
Permitir a exclusão de autor, caso este não esteja vinculado a nenhuma matéria.
<!--- Forneça um resumo geral da _issue_ no título acima -->

Hoje temos um autor no nosso sistema, que não faz sentido de está lá, mas mesmo ele não estando ligado com nenhuma matéria no SAPL, não consigo excluir, o motivo da não exclusão é pq ele está vinculado a dois protocolo que foram anulados e que não estão vinculado a nenhuma matéria também.

## 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. -->
Poder excluir AUTOR que não há vinculo dele no sistema.
## 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. -->
Não permite excluir autor que não tem vinculo com outras parte do sistema
## 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. -->

## Passos para Reproduzir (para bugs)
<!--- Forneça um link para um exemplo, ou um conjunto de passos inequívocos -->
<!--- para reproduzir esse bug. Inclua código para reproduzir, se relevante. -->
1.
2.
3.
4.

## 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 -->

## Imagens do Ocorrido
<!--- Representação visual em vídeo ou imagem do ocorrido -->
<!--- Se está descrevendo um bug poste imagens ou vídeos na reprodução do bug citado, caso se aplique -->
![protocolo](https://user-images.githubusercontent.com/2423695/86786891-e3296b00-c03a-11ea-8921-4334a1a37ded.png)

## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_):
* Nome e versão do navegador:
* Nome e versão do Sistema Operacional (desktop ou mobile):
* Link para o seu projeto (Caso de fork deste projeto):



Discussion:

Resolving patch:
diff --git a/sapl/base/models.py b/sapl/base/models.py
--- a/sapl/base/models.py
+++ b/sapl/base/models.py
@@ -231,24 +231,28 @@ def __str__(self):
 
 @reversion.register()
 class Autor(models.Model):
-
-    user = models.OneToOneField(get_settings_auth_user_model(),
-                                on_delete=models.SET_NULL,
-                                null=True)
-
-    tipo = models.ForeignKey(TipoAutor, verbose_name=_('Tipo do Autor'),
-                             on_delete=models.PROTECT)
-
+    user = models.OneToOneField(
+        get_settings_auth_user_model(),
+        on_delete=models.SET_NULL,
+        null=True)
+    tipo = models.ForeignKey(
+        TipoAutor,
+        verbose_name=_('Tipo do Autor'),
+        on_delete=models.PROTECT)
     content_type = models.ForeignKey(
         ContentType,
-        blank=True, null=True, default=None)
+        blank=True,
+        null=True,
+        default=None)
     object_id = models.PositiveIntegerField(
-        blank=True, null=True, default=None)
+        blank=True,
+        null=True,
+        default=None)
     autor_related = GenericForeignKey('content_type', 'object_id')
-
     nome = models.CharField(
-        max_length=120, blank=True, verbose_name=_('Nome do Autor'))
-
+        max_length=120,
+        blank=True,
+        verbose_name=_('Nome do Autor'))
     cargo = models.CharField(max_length=50, blank=True)
 
     class Meta:
diff --git a/sapl/protocoloadm/migrations/0033_auto_20200708_1312.py b/sapl/protocoloadm/migrations/0033_auto_20200708_1312.py
new file mode 100644
--- /dev/null
+++ b/sapl/protocoloadm/migrations/0033_auto_20200708_1312.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.29 on 2020-07-08 16:12
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('protocoloadm', '0032_auto_20200416_1538'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='protocolo',
+            name='autor',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='base.Autor'),
+        ),
+    ]
diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py
--- a/sapl/protocoloadm/models.py
+++ b/sapl/protocoloadm/models.py
@@ -53,43 +53,55 @@ def texto_upload_path(instance, filename):
 @reversion.register()
 class Protocolo(models.Model):
     numero = models.PositiveIntegerField(
-        blank=False, null=False, verbose_name=_('Número de Protocolo'))
-    ano = models.PositiveSmallIntegerField(blank=False,
-                                           null=False,
-                                           choices=RANGE_ANOS,
-                                           verbose_name=_('Ano do Protocolo'))
-    data = models.DateField(null=True, blank=True,
-                            verbose_name=_('Data do Protocolo'),
-                            help_text=_('Informado manualmente'))
-    hora = models.TimeField(null=True, blank=True,
-                            verbose_name=_('Hora do Protocolo'),
-                            help_text=_('Informado manualmente'))
+        blank=False,
+        null=False,
+        verbose_name=_('Número de Protocolo'))
+    ano = models.PositiveSmallIntegerField(
+        blank=False,
+        null=False,
+        choices=RANGE_ANOS,
+        verbose_name=_('Ano do Protocolo'))
+    data = models.DateField(
+        null=True,
+        blank=True,
+        verbose_name=_('Data do Protocolo'),
+        help_text=_('Informado manualmente'))
+    hora = models.TimeField(
+        null=True,
+        blank=True,
+        verbose_name=_('Hora do Protocolo'),
+        help_text=_('Informado manualmente'))
     timestamp_data_hora_manual = models.DateTimeField(default=timezone.now)
     user_data_hora_manual = models.CharField(
-        max_length=256, blank=True,
+        max_length=256,
+        blank=True,
         verbose_name=_('IP'),
-        help_text=_('Usuário que está realizando Protocolo e informando '
-                    'data e hora manualmente.'))
+        help_text=_('Usuário que está realizando Protocolo e informando data e hora manualmente.'))
     ip_data_hora_manual = models.CharField(
-        max_length=256, blank=True,
+        max_length=256,
+        blank=True,
         verbose_name=_('IP'),
-        help_text=_('Endereço IP da estação de trabalho '
-                    'do usuário que está realizando Protocolo e informando '
-                    'data e hora manualmente.'))
-
-    # Não foi utilizado auto_now_add=True em timestamp porque
-    # ele usa datetime.now que não é timezone aware.
+        help_text=_('Endereço IP da estação de trabalho do usuário que está realizando Protocolo e '
+                    'informando data e hora manualmente.'))
+    # Não foi utilizado auto_now_add=True em timestamp porque ele usa datetime.now que não é timezone aware.
     timestamp = models.DateTimeField(
-        default=timezone.now, null=True, blank=True)
+        null=True,
+        blank=True,
+        default=timezone.now)
     tipo_protocolo = models.PositiveIntegerField(
-        blank=True, null=True, verbose_name=_('Tipo de Protocolo'))
+        blank=True,
+        null=True,
+        verbose_name=_('Tipo de Protocolo'))
     tipo_processo = models.PositiveIntegerField()
     interessado = models.CharField(
-        max_length=200, blank=True, verbose_name=_('Interessado'))
-    autor = models.ForeignKey(Autor,
-                              blank=True,
-                              null=True,
-                              on_delete=models.PROTECT)
+        max_length=200,
+        blank=True,
+        verbose_name=_('Interessado'))
+    autor = models.ForeignKey(
+        Autor,
+        blank=True,
+        null=True,
+        on_delete=models.SET_NULL)
     assunto_ementa = models.TextField(blank=True)
     tipo_documento = models.ForeignKey(
         TipoDocumentoAdministrativo,
@@ -104,14 +116,17 @@ class Protocolo(models.Model):
         on_delete=models.PROTECT,
         verbose_name=_('Tipo de Matéria'))
     numero_paginas = models.PositiveIntegerField(
-        blank=True, null=True, verbose_name=_('Número de Páginas'))
-    observacao = models.TextField(
-        blank=True, verbose_name=_('Observação'))
+        blank=True,
+        null=True,
+        verbose_name=_('Número de Páginas'))
+    observacao = models.TextField(blank=True, verbose_name=_('Observação'))
     anulado = models.BooleanField(default=False)
     user_anulacao = models.CharField(max_length=20, blank=True)
     ip_anulacao = models.CharField(max_length=15, blank=True)
     justificativa_anulacao = models.CharField(
-        max_length=260, blank=True, verbose_name=_('Motivo'))
+        max_length=260,
+        blank=True,
+        verbose_name=_('Motivo'))
     timestamp_anulacao = models.DateTimeField(blank=True, null=True)
 
     class Meta:


Test patch: