Repository: interlegis/sapl

Issue:
Autoria em protocolo de Matéria
sendo essa pesquisa de autor utilizada nas consultas de matérias e protocolos, onde deve ser possível pesquisar por todos os autores, na tela de cadastro de protocolo de matéria, deve ser encontrada outra forma de cadastrar autoria, onde sejam somente mostrados como possíveis autores os ativos no sistema como por exemplo o que é feito para cadastrar autoria de matéria


![image](https://user-images.githubusercontent.com/13314947/28438196-b41808e8-6d73-11e7-9ebc-ecabad52ab24.png)

Autoria em protocolo de matéria obrigatoria
No sapl 2.5 é obrigatória a definição de autoria para protocolo, seria interessante que no 3.1 também fosse obrigatório


![image](https://user-images.githubusercontent.com/13314947/28421557-e72079ba-6d3b-11e7-897e-21f8c8b3d5fd.png)



Discussion:
https://github.com/interlegis/sapl/issues/1283


Resolving patch:
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -333,7 +333,10 @@ def __init__(self, *args, **kwargs):
 
 
 class ProtocoloMateriaForm(ModelForm):
-    autor = forms.IntegerField(widget=forms.HiddenInput(), required=False)
+    autor = forms.ModelChoiceField(required=True,
+                                    empty_label='------',
+                                    queryset=Autor.objects.all()
+                                    )
 
     tipo_materia = forms.ModelChoiceField(
         label=_('Tipo de Matéria'),
@@ -350,15 +353,6 @@ class ProtocoloMateriaForm(ModelForm):
     assunto_ementa = forms.CharField(required=True,
                                      widget=forms.Textarea, label='Ementa')
 
-    def clean_autor(self):
-        autor_field = self.cleaned_data['autor']
-        try:
-            autor = Autor.objects.get(id=autor_field)
-        except ObjectDoesNotExist:
-            autor_field = None
-        else:
-            autor_field = autor
-        return autor_field
 
     class Meta:
         model = Protocolo
@@ -368,19 +362,23 @@ class Meta:
                   'assunto_ementa',
                   'observacao']
 
+    def clean_autor(self):
+        autor_field = self.cleaned_data['autor']
+        try:
+            autor = Autor.objects.get(id=autor_field.id)
+        except ObjectDoesNotExist:
+            autor_field = None
+        else:
+            autor_field = autor
+        return autor_field
+
     def __init__(self, *args, **kwargs):
 
         row1 = to_row(
             [('tipo_materia', 4),
              ('numero_paginas', 4)])
         row2 = to_row(
-            [('autor', 0),
-             (Button('pesquisar',
-                     'Pesquisar Autor',
-                     css_class='btn btn-primary btn-sm'), 2),
-             (Button('limpar',
-                     'limpar Autor',
-                     css_class='btn btn-primary btn-sm'), 10)])
+            [('autor', 4)])
         row3 = to_row(
             [('assunto_ementa', 12)])
         row4 = to_row(
@@ -389,7 +387,7 @@ def __init__(self, *args, **kwargs):
         self.helper = FormHelper()
         self.helper.layout = Layout(
             Fieldset(_('Identificação da Matéria'),
-                     row1, HTML(autor_label), HTML(autor_modal), row2, row3,
+                     row1, row2, row3,
                      row4, form_actions(save_label='Protocolar Matéria')))
 
         super(ProtocoloMateriaForm, self).__init__(
diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py
--- a/sapl/protocoloadm/views.py
+++ b/sapl/protocoloadm/views.py
@@ -1,8 +1,10 @@
 from datetime import date, datetime
 
+
 from braces.views import FormValidMessageMixin
 from django.contrib import messages
 from django.contrib.auth.mixins import PermissionRequiredMixin
+from django.db.models import Q
 from django.core.exceptions import ObjectDoesNotExist
 from django.core.urlresolvers import reverse
 from django.db.models import Max
@@ -15,6 +17,7 @@
 from django_filters.views import FilterView
 
 import sapl
+from sapl.base.models import Autor
 from sapl.crud.base import Crud, CrudAux, MasterDetailCrud, make_pagination
 from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
 from sapl.utils import create_barcode, get_client_ip
@@ -27,6 +30,10 @@
 from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo,
                      Protocolo, StatusTramitacaoAdministrativo,
                      TipoDocumentoAdministrativo, TramitacaoAdministrativo)
+from sapl.parlamentares.models import Parlamentar
+from sapl.protocoloadm.models import Protocolo
+from sapl.comissoes.models import Comissao
+from django.contrib.contenttypes.models import ContentType
 
 TipoDocumentoAdministrativoCrud = CrudAux.build(
     TipoDocumentoAdministrativo, '')
@@ -438,6 +445,30 @@ def form_valid(self, form):
         protocolo.save()
         return redirect(self.get_success_url(protocolo))
 
+    def get_context_data(self, **kwargs):
+            context = super(CreateView, self).get_context_data(**kwargs)
+            autores_ativos = self.autores_ativos()
+
+            autores = []
+            autores.append(['0', '------'])
+            for a in autores_ativos:
+                autores.append([a.id, a.__str__()])
+
+            context['form'].fields['autor'].choices = autores
+            return context
+
+    def autores_ativos(self):
+            lista_parlamentares = Parlamentar.objects.filter(ativo=True).values_list('id', flat=True)
+            model_parlamentar = ContentType.objects.get_for_model(Parlamentar)
+            autor_parlamentar = Autor.objects.filter(content_type=model_parlamentar, object_id__in=lista_parlamentares)
+
+            lista_comissoes = Comissao.objects.filter(Q(data_extincao__isnull=True)|Q(data_extincao__gt=date.today())).values_list('id', flat=True)
+            model_comissao = ContentType.objects.get_for_model(Comissao)
+            autor_comissoes = Autor.objects.filter(content_type=model_comissao, object_id__in=lista_comissoes)
+            autores_outros = Autor.objects.exclude(content_type__in=[model_parlamentar, model_comissao])
+            q = autor_parlamentar | autor_comissoes | autores_outros
+            return q
+
 
 class ProtocoloMateriaTemplateView(PermissionRequiredMixin, TemplateView):
 


Test patch: